1. 程式人生 > >基於SVM的數據分類預測——意大利葡萄酒種類識別

基於SVM的數據分類預測——意大利葡萄酒種類識別

div num 自帶 ack xpl ict 意大利 -- src

update:把程序源代碼和數據集也附上http://download.csdn.net/detail/zjccoder/8832699

2015.6.24

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

wine數據來自於UCI數據庫。記錄的是意大利同一地區3中不同品種的葡萄酒13中化學成分含量,以期通過科學的方法,達到自己主動分類葡萄酒的目的。

本次分類的數據共同擁有178個樣本,每一個樣本有13個屬性,並提供每一個樣本的正確分類,用於檢驗SVM分類的準確定。

首先我們畫出數據的可視化圖:

% 加載測試數據wine,當中包括的數據為classnumber = 3,wine:178*13的矩陣,wine_labes:178*1的列向量
load chapter_WineClass.mat;

% 畫出測試數據的box可視化圖
figure;
boxplot(wine,‘orientation‘,‘horizontal‘,‘labels‘,categories);
title(‘wine數據的box可視化圖‘,‘FontSize‘,12);
xlabel(‘屬性值‘,‘FontSize‘,12);
grid on;

% 畫出測試數據的分維可視化圖
figure
subplot(3,5,1);
hold on
for run = 1:178
    plot(run,wine_labels(run),‘*‘);
end
xlabel(‘樣本‘,‘FontSize‘,10);
ylabel(‘類別標簽‘,‘FontSize‘,10);
title(‘class‘,‘FontSize‘,10);
for run = 2:14
    subplot(3,5,run);
    hold on;
    str = [‘attrib ‘,num2str(run-1)];
    for i = 1:178
        plot(i,wine(i,run-1),‘*‘);
    end
    xlabel(‘樣本‘,‘FontSize‘,10);
    ylabel(‘屬性值‘,‘FontSize‘,10);
    title(str,‘FontSize‘,10);
end

技術分享

(圖1)

技術分享

(圖2)


圖1是wine數據的box可視化圖。圖2是wine的箱式圖。從圖上我們非常難分出每一種葡萄酒是哪種類型。以下我們嘗試用SVM來分類。


數據的預處理

% 選定訓練集和測試集

% 將第一類的1-30,第二類的60-95,第三類的131-153做為訓練集
train_wine = [wine(1:30,:);wine(60:95,:);wine(131:153,:)];
% 對應的訓練集的標簽也要分離出來
train_wine_labels = [wine_labels(1:30);wine_labels(60:95);wine_labels(131:153)];
% 將第一類的31-59,第二類的96-130,第三類的154-178做為測試集
test_wine = [wine(31:59,:);wine(96:130,:);wine(154:178,:)];
% 對應的測試集的標簽也要分離出來
test_wine_labels = [wine_labels(31:59);wine_labels(96:130);wine_labels(154:178)];

<strong>%% 數據預處理</strong>
% 數據預處理,將訓練集和測試集歸一化到[0,1]區間

[mtrain,ntrain] = size(train_wine);
[mtest,ntest] = size(test_wine);

dataset = [train_wine;test_wine];
% mapminmax為MATLAB自帶的歸一化函數
[dataset_scale,ps] = mapminmax(dataset‘,0,1);
dataset_scale = dataset_scale‘;

train_wine = dataset_scale(1:mtrain,:);
test_wine = dataset_scale( (mtrain+1):(mtrain+mtest),: );


SVM網絡建立、訓練和預測

<span style="font-size:12px;">%% SVM網絡訓練
model = svmtrain(train_wine_labels, train_wine, ‘-c 2 -g 1‘);

%% SVM網絡預測
[predict_label, accuracy,dec_value1] = svmpredict(test_wine_labels, test_wine, model);</span>


結果分析

%% 結果分析

% 測試集的實際分類和預測分類圖
% 通過圖能夠看出僅僅有一個測試樣本是被錯分的
figure;
hold on;
plot(test_wine_labels,‘o‘);
plot(predict_label,‘r*‘);
xlabel(‘測試集樣本‘,‘FontSize‘,12);
ylabel(‘類別標簽‘,‘FontSize‘,12);
legend(‘實際測試集分類‘,‘預測測試集分類‘);
title(‘測試集的實際分類和預測分類圖‘,‘FontSize‘,12);
grid on;
技術分享

技術分享

利用svm分類的準確率達到了98.8764%,在89個測試樣本中僅有一個被分類錯誤。可見SVM在數據分類方面的強大!

END

??

基於SVM的數據分類預測——意大利葡萄酒種類識別