转载请注明出处:
参考网址:
代码如下:
clcclear allclose alldata = 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; endendfprintf('一个一个计算,正确率:%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.24.9 3.0 1.4 0.24.7 3.2 1.3 0.24.6 3.1 1.5 0.25.0 3.6 1.4 0.25.4 3.9 1.7 0.44.6 3.4 1.4 0.35.0 3.4 1.5 0.24.4 2.9 1.4 0.24.9 3.1 1.5 0.15.4 3.7 1.5 0.24.8 3.4 1.6 0.24.8 3.0 1.4 0.14.3 3.0 1.1 0.15.8 4.0 1.2 0.25.7 4.4 1.5 0.45.4 3.9 1.3 0.45.1 3.5 1.4 0.35.7 3.8 1.7 0.35.1 3.8 1.5 0.35.4 3.4 1.7 0.25.1 3.7 1.5 0.44.6 3.6 1.0 0.25.1 3.3 1.7 0.54.8 3.4 1.9 0.25.0 3.0 1.6 0.25.0 3.4 1.6 0.45.2 3.5 1.5 0.25.2 3.4 1.4 0.24.7 3.2 1.6 0.24.8 3.1 1.6 0.25.4 3.4 1.5 0.45.2 4.1 1.5 0.15.5 4.2 1.4 0.24.9 3.1 1.5 0.15.0 3.2 1.2 0.25.5 3.5 1.3 0.24.9 3.1 1.5 0.14.4 3.0 1.3 0.25.1 3.4 1.5 0.25.0 3.5 1.3 0.34.5 2.3 1.3 0.34.4 3.2 1.3 0.25.0 3.5 1.6 0.65.1 3.8 1.9 0.44.8 3.0 1.4 0.35.1 3.8 1.6 0.24.6 3.2 1.4 0.25.3 3.7 1.5 0.25.0 3.3 1.4 0.27.0 3.2 4.7 1.46.4 3.2 4.5 1.56.9 3.1 4.9 1.55.5 2.3 4.0 1.36.5 2.8 4.6 1.55.7 2.8 4.5 1.36.3 3.3 4.7 1.64.9 2.4 3.3 1.06.6 2.9 4.6 1.35.2 2.7 3.9 1.45.0 2.0 3.5 1.05.9 3.0 4.2 1.56.0 2.2 4.0 1.06.1 2.9 4.7 1.45.6 2.9 3.6 1.36.7 3.1 4.4 1.45.6 3.0 4.5 1.55.8 2.7 4.1 1.06.2 2.2 4.5 1.55.6 2.5 3.9 1.15.9 3.2 4.8 1.86.1 2.8 4.0 1.36.3 2.5 4.9 1.56.1 2.8 4.7 1.26.4 2.9 4.3 1.36.6 3.0 4.4 1.46.8 2.8 4.8 1.46.7 3.0 5.0 1.76.0 2.9 4.5 1.55.7 2.6 3.5 1.05.5 2.4 3.8 1.15.5 2.4 3.7 1.05.8 2.7 3.9 1.26.0 2.7 5.1 1.65.4 3.0 4.5 1.56.0 3.4 4.5 1.66.7 3.1 4.7 1.56.3 2.3 4.4 1.35.6 3.0 4.1 1.35.5 2.5 4.0 1.35.5 2.6 4.4 1.26.1 3.0 4.6 1.45.8 2.6 4.0 1.25.0 2.3 3.3 1.05.6 2.7 4.2 1.35.7 3.0 4.2 1.25.7 2.9 4.2 1.36.2 2.9 4.3 1.35.1 2.5 3.0 1.15.7 2.8 4.1 1.36.3 3.3 6.0 2.55.8 2.7 5.1 1.97.1 3.0 5.9 2.16.3 2.9 5.6 1.86.5 3.0 5.8 2.27.6 3.0 6.6 2.14.9 2.5 4.5 1.77.3 2.9 6.3 1.86.7 2.5 5.8 1.87.2 3.6 6.1 2.56.5 3.2 5.1 2.06.4 2.7 5.3 1.96.8 3.0 5.5 2.15.7 2.5 5.0 2.05.8 2.8 5.1 2.46.4 3.2 5.3 2.36.5 3.0 5.5 1.87.7 3.8 6.7 2.27.7 2.6 6.9 2.36.0 2.2 5.0 1.56.9 3.2 5.7 2.35.6 2.8 4.9 2.07.7 2.8 6.7 2.06.3 2.7 4.9 1.86.7 3.3 5.7 2.17.2 3.2 6.0 1.86.2 2.8 4.8 1.86.1 3.0 4.9 1.86.4 2.8 5.6 2.17.2 3.0 5.8 1.67.4 2.8 6.1 1.97.9 3.8 6.4 2.06.4 2.8 5.6 2.26.3 2.8 5.1 1.56.1 2.6 5.6 1.47.7 3.0 6.1 2.36.3 3.4 5.6 2.46.4 3.1 5.5 1.86.0 3.0 4.8 1.86.9 3.1 5.4 2.16.7 3.1 5.6 2.46.9 3.1 5.1 2.35.8 2.7 5.1 1.96.8 3.2 5.9 2.36.7 3.3 5.7 2.56.7 3.0 5.2 2.36.3 2.5 5.0 1.96.5 3.0 5.2 2.06.2 3.4 5.4 2.35.9 3.0 5.1 1.8