轉載請注明出處:
http://www.cnblogs.com/darkknightzh/p/5554551.html
參考網址:
http://www.cnblogs.com/zhangchaoyang/articles/2222048.html
代碼如下:
clc clear all close all data = load('data.txt'); % 為了svmtrain能使用'showplot',true,此處使用數據的前2維。 data = data(:, 1:2); % 由於svmtrain只能處理二分類問題,因而此處使用前100個數據。 data = data(1:100, :); label = [ones(50, 1); zeros(50, 1)]; trainData = data(1:40, :); % 每組前40個用於訓練 trainData = [trainData; data(51:90, :)]; % 每組前40個用於訓練 testData = data(41:50, :); % 每組后10個用於測試 testData = [testData; data(91:100, :)]; % 每組后10個用於測試 trainLabel = label(1:40, :); % 每組前40個用於訓練 trainLabel = [trainLabel; label(51:90, :)]; % 每組前40個用於訓練 testLabel = label(41:50, :); % 每組后10個用於測試 testLabel = [testLabel; label(91:100, :)]; % 每組后10個用於測試 % 將距離和類別傳入svm中,trainLabel為標簽,即類別,trainData為特征 svmModel = svmtrain(trainData, trainLabel,'kernel_function','linear','showplot',true); predict_label = svmclassify(svmModel,testData,'showplot',true); fprintf('使用svmclassify,正確率:%f\n' ,sum(predict_label==testLabel)/size(testLabel,1)); %% 以下兩種方式均使用linear核,其他的核還不清楚怎么算 testScale = []; for c = 1:size(testData, 2) testScale = [testScale, svmModel.ScaleData.scaleFactor(c) * (testData(:,c) + svmModel.ScaleData.shift(c))]; end % 方式1:使用矩陣形式 predictValMat = (svmModel.SupportVectors * testScale')' * svmModel.Alpha + svmModel.Bias; % 測試樣本個數*1的列矩陣 predictValMat1 = ones(size(predictValMat)); predictValMat1(predictValMat>0) = 0; fprintf('使用矩陣形式,正確率:%f\n' ,sum(predictValMat1==testLabel)/size(testLabel,1)); % 方式2:一個一個計算 [m,n]=size(testScale); predict_label2=zeros(m,1); for k = 1:size(testScale, 1) % svmModel.SupportVectors為 支持向量個數*特征維數 的矩陣 % testScale(k, :)為 1*特征維數 的行向量。 % svmModel.SupportVectors * testScale(k, :)'為 支持向量個數*1 的列矩陣 % (svmModel.SupportVectors * testScale(k, :)')' * svmModel.Alpha 即為 sum(w*x) % predictVal為 sum(w*x)+b predictVal = (svmModel.SupportVectors * testScale(k, :)')' * svmModel.Alpha + svmModel.Bias; if predictVal>0 predict_label2(k) = 0; else predict_label2(k) = 1; end end fprintf('一個一個計算,正確率:%f\n' ,sum(predict_label2==testLabel)/size(testLabel,1));
分類結果:
svmtrain后的結果(包含了svmclassify的結果),其中藍色圈出來的點為分錯的點。
實際上,如果4個特征都使用的話,對上面的程序,正確率為100%。
ps:測試數據為參考網址中給出的數據。
鷲尾花數據集共分為3類花(前50個樣本為一類,中間50個樣本為一類,后50個樣本為一類。由於matlab的svmtrain只能處理二分類問題,因而程序中使用了前100個數據。其中,每組前40個用作訓練,后10個用作測試。因而,訓練樣本80個,測試樣本20個。除此之外,為了在調用svmtrain時能顯示分類結果,該函數參數'showplot'設置為true。
data.txt如下:
5.1 3.5 1.4 0.2 4.9 3.0 1.4 0.2 4.7 3.2 1.3 0.2 4.6 3.1 1.5 0.2 5.0 3.6 1.4 0.2 5.4 3.9 1.7 0.4 4.6 3.4 1.4 0.3 5.0 3.4 1.5 0.2 4.4 2.9 1.4 0.2 4.9 3.1 1.5 0.1 5.4 3.7 1.5 0.2 4.8 3.4 1.6 0.2 4.8 3.0 1.4 0.1 4.3 3.0 1.1 0.1 5.8 4.0 1.2 0.2 5.7 4.4 1.5 0.4 5.4 3.9 1.3 0.4 5.1 3.5 1.4 0.3 5.7 3.8 1.7 0.3 5.1 3.8 1.5 0.3 5.4 3.4 1.7 0.2 5.1 3.7 1.5 0.4 4.6 3.6 1.0 0.2 5.1 3.3 1.7 0.5 4.8 3.4 1.9 0.2 5.0 3.0 1.6 0.2 5.0 3.4 1.6 0.4 5.2 3.5 1.5 0.2 5.2 3.4 1.4 0.2 4.7 3.2 1.6 0.2 4.8 3.1 1.6 0.2 5.4 3.4 1.5 0.4 5.2 4.1 1.5 0.1 5.5 4.2 1.4 0.2 4.9 3.1 1.5 0.1 5.0 3.2 1.2 0.2 5.5 3.5 1.3 0.2 4.9 3.1 1.5 0.1 4.4 3.0 1.3 0.2 5.1 3.4 1.5 0.2 5.0 3.5 1.3 0.3 4.5 2.3 1.3 0.3 4.4 3.2 1.3 0.2 5.0 3.5 1.6 0.6 5.1 3.8 1.9 0.4 4.8 3.0 1.4 0.3 5.1 3.8 1.6 0.2 4.6 3.2 1.4 0.2 5.3 3.7 1.5 0.2 5.0 3.3 1.4 0.2 7.0 3.2 4.7 1.4 6.4 3.2 4.5 1.5 6.9 3.1 4.9 1.5 5.5 2.3 4.0 1.3 6.5 2.8 4.6 1.5 5.7 2.8 4.5 1.3 6.3 3.3 4.7 1.6 4.9 2.4 3.3 1.0 6.6 2.9 4.6 1.3 5.2 2.7 3.9 1.4 5.0 2.0 3.5 1.0 5.9 3.0 4.2 1.5 6.0 2.2 4.0 1.0 6.1 2.9 4.7 1.4 5.6 2.9 3.6 1.3 6.7 3.1 4.4 1.4 5.6 3.0 4.5 1.5 5.8 2.7 4.1 1.0 6.2 2.2 4.5 1.5 5.6 2.5 3.9 1.1 5.9 3.2 4.8 1.8 6.1 2.8 4.0 1.3 6.3 2.5 4.9 1.5 6.1 2.8 4.7 1.2 6.4 2.9 4.3 1.3 6.6 3.0 4.4 1.4 6.8 2.8 4.8 1.4 6.7 3.0 5.0 1.7 6.0 2.9 4.5 1.5 5.7 2.6 3.5 1.0 5.5 2.4 3.8 1.1 5.5 2.4 3.7 1.0 5.8 2.7 3.9 1.2 6.0 2.7 5.1 1.6 5.4 3.0 4.5 1.5 6.0 3.4 4.5 1.6 6.7 3.1 4.7 1.5 6.3 2.3 4.4 1.3 5.6 3.0 4.1 1.3 5.5 2.5 4.0 1.3 5.5 2.6 4.4 1.2 6.1 3.0 4.6 1.4 5.8 2.6 4.0 1.2 5.0 2.3 3.3 1.0 5.6 2.7 4.2 1.3 5.7 3.0 4.2 1.2 5.7 2.9 4.2 1.3 6.2 2.9 4.3 1.3 5.1 2.5 3.0 1.1 5.7 2.8 4.1 1.3 6.3 3.3 6.0 2.5 5.8 2.7 5.1 1.9 7.1 3.0 5.9 2.1 6.3 2.9 5.6 1.8 6.5 3.0 5.8 2.2 7.6 3.0 6.6 2.1 4.9 2.5 4.5 1.7 7.3 2.9 6.3 1.8 6.7 2.5 5.8 1.8 7.2 3.6 6.1 2.5 6.5 3.2 5.1 2.0 6.4 2.7 5.3 1.9 6.8 3.0 5.5 2.1 5.7 2.5 5.0 2.0 5.8 2.8 5.1 2.4 6.4 3.2 5.3 2.3 6.5 3.0 5.5 1.8 7.7 3.8 6.7 2.2 7.7 2.6 6.9 2.3 6.0 2.2 5.0 1.5 6.9 3.2 5.7 2.3 5.6 2.8 4.9 2.0 7.7 2.8 6.7 2.0 6.3 2.7 4.9 1.8 6.7 3.3 5.7 2.1 7.2 3.2 6.0 1.8 6.2 2.8 4.8 1.8 6.1 3.0 4.9 1.8 6.4 2.8 5.6 2.1 7.2 3.0 5.8 1.6 7.4 2.8 6.1 1.9 7.9 3.8 6.4 2.0 6.4 2.8 5.6 2.2 6.3 2.8 5.1 1.5 6.1 2.6 5.6 1.4 7.7 3.0 6.1 2.3 6.3 3.4 5.6 2.4 6.4 3.1 5.5 1.8 6.0 3.0 4.8 1.8 6.9 3.1 5.4 2.1 6.7 3.1 5.6 2.4 6.9 3.1 5.1 2.3 5.8 2.7 5.1 1.9 6.8 3.2 5.9 2.3 6.7 3.3 5.7 2.5 6.7 3.0 5.2 2.3 6.3 2.5 5.0 1.9 6.5 3.0 5.2 2.0 6.2 3.4 5.4 2.3 5.9 3.0 5.1 1.8