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)
    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;
%生成密集测试点
[denseX, denseY] = meshgrid(minX:gridX:maxX, minY:gridY:maxY);
[m,n]=size(denseX);
dense_data=[reshape(denseX,m*n, 1), reshape(denseY,m*n,1)];
dense_label = ones(m*n,1);
%密集点分类
model.Parameters(1) = 3;
[lab] =libsvmpredict(dense_label,dense_data, model);
dense_pre_lab = reshape(lab, m,n);
%画非严格意义上的分类面
[C,h] = contour(denseX, denseY, dense_pre_lab,-1:1);
clabel(C,h,'Color','b');
title('分类结果可视化','FontSize',15);
legend([a,b,c],'类别1','类别2','支持向量');

 代码运行结果如下:

 

 部分代码参考源:http://www.ilovematlab.cn/thread-58926-1-1.html ,来自某SVM大神的论坛,思路非常巧妙,借鉴学习一下。

 

  • 11
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值