我想验证一下,在 SVM 中是不是支持向量离分类线越近,权重越大。
matlab代码如下:
function [sv_num, err_rate] = play_svm(class_sample_num)
%缺省类样本数是10。
if nargin == 0
class_sample_num = 10;
end
%生成满足二维高斯分布的两类数据,为了能让它们分开,假设一类均值是5,另一类是8。
x1 = randn(class_sample_num,2) + 5;
x2 = randn(class_sample_num,2) + 8;
%把两类数据装入一个训练集x和一个标签集y。
for i=1:class_sample_num
x(i,1) = x1(i,1);
x(i,2) = x1(i,2);
x(i+class_sample_num,1) = x2(i,1);
x(i+class_sample_num,2) = x2(i,2);
y(i,1) = 1;
y(i+class_sample_num,1) = -1;
end
%使用缺省参数做svm训练。
svmModel = svmtrain(x, y, 'showplot', true);
sv_num = size(svmModel.SupportVectors, 1);
%使用缺省参数做svm测试,为了简单用训练集充当测试集。
z = svmclassify(svmModel, x, 'showplot', true);
err_rate = sum(y ~= z)/size(y,1);
%写出支持向量的权重。
hold on;
for i=1:sv_num
idx = svmModel.SupportVectorIndices(i);
if idx < class_sample_num
weightstr = ['\color{red}',num2str(svmModel.Alpha(i))];
else
weightstr = ['\color{blue}',num2str(svmModel.Alpha(i))];
end
%这里加0.1是让文字和数据点不要重合。
text(x(idx,1)+0.1, x(idx,2), weightstr);
end
hold off;
end