SVM简单⾮线性分类,画出分类⾯与⽀持向量(MATLAB) 创造两类⼆维⾮线性可分点,使⽤SVM进⾏分类,同时画出⽀持向量和分类⾯,其实在⼆维的情况下就是个分界线,这个分类⾯并不是⾼维的,因为SVM的映射是个⿊箱,画不出⾼维映射后的分类⾯。
代码中调⽤了台湾⼤学林智仁教授的libsvm包,因为怕与MATLAB⾃带的SVM函数名重了,所以改成了libsvmtrain和libsvmpredict。
libsvm 3.22版本的包可以到去下载
解压后把windows⽂件夹下的svmtrain和svmpredict改为libsvmtrain和libsvmpredict,然后在MATLAB的主页下菜单栏⾥的设置路径⾥把windows的路径添加进去,代码就可以运⾏了。
clc
clear all
%创造样本点
k=1;
l=1;
%第⼀类数据
为难拼音for i=1:0.3:10
for j=1:0.3:10
if (i-5)^2+(j-5)^2<1.5
上访data1(k,1)=1;
data1(k,2)=i;
data1(k,3)=j;
k=k+1;
end
end
end
%第⼆类数据
for i=1:0.6:10
for j=1:0.6:10
if (i-5)^2+(j-5)^2>2
if (i-5)^2+(j-5)^2<9
data2(l,1)=-1;
data2(l,2)=i;
data2(l,3)=j;
l=l+1;
end
end
安玛卫浴end
end
%合并样本数据
data0=[data1;data2];
train_data=data0(:,2:3);
train_label=data0(:,1);
%原始样本分布图
figure('NumberTitle', 'on', 'Name','给点分个家_马存诗');
hold on;
grid on;
plot(data1(:,2),data1(:,3),'*'),
plot(data2(:,2),data2(:,3),'+'),
title('训练样本数据');
%训练及预测
model=libsvmtrain(train_label,train_data,'-t 2 -c 100'); %径向基函数
test_label=train_label;
新禧是什么意思
test_data=train_data;
[predict_label,accuracy,dec_values] = libsvmpredict(test_label,test_data, model);
%画分类后的点及SV
figure('NumberTitle', 'on', 'Name','给点分个家_马存诗');
hold on;
grid on;
m=length(predict_label);
for i=1:m
if (predict_label(i)==1)
if (predict_label(i)==1)
火腿蒸蛋a= plot(test_data(i, 1), test_data(i, 2), 'r.');
end
if (predict_label(i)==-1)
b= plot(test_data(i, 1), test_data(i, 2), 'g*');
end
end
c= plot( model.SVs(:,1),model.SVs(:,2),'o' );
%找到数据范围边⾓
minX = min(test_data(:, 1));
maxX = max(test_data(:, 1));
minY = min(test_data(:, 2));
maxY = max(test_data(:, 2));
%⽹格单位长度
gridX = (maxX - minX) ./ 1000;
寓言手抄报gridY = (maxY - minY) ./ 1000;
%⽹格包含原数据范围
家庭的英语单词minX = minX - 10 * gridX;
maxX = maxX + 10 * gridX;
minY = minY - 10 * gridY;
maxY = maxY + 10 * gridY;
%⽣成密集测试点
幼儿园月计划表[denX, denY] = meshgrid(minX:gridX:maxX, minY:gridY:maxY); [m,n]=size(denX);
den_data=[reshape(denX,m*n, 1), reshape(denY,m*n,1)]; den_label = ones(m*n,1);
%密集点分类
model.Parameters(1) = 3;
[lab] =libsvmpredict(den_label,den_data, model);
den_pre_lab = reshape(lab, m,n);
%画⾮严格意义上的分类⾯
[C,h] = contour(denX, denY, den_pre_lab,-1:1);
clabel(C,h,'Color','b');
title('分类结果可视化','FontSize',15);
legend([a,b,c],'类别1','类别2','⽀持向量');
代码运⾏结果如下: