机器学习—SVM原理及简单代码实现(matlab)

 传统的SVM做的事情其实就是找到一个超平面,实现二分类,一类+1,一类-1。如上所示。它的目的就是使得两类的间隔最大。只要确定了间隔最大两边距离相等,就能确定唯一平面。黑色的块表示距离分割面最近的样本向量,称为支持向量

机器学习—SVM原理及简单代码实现(matlab)_第1张图片

对于不可分问题,引入核函数,将数据点由二维向三维映射,从而在空间上进行分离和寻找超平面

 机器学习—SVM原理及简单代码实现(matlab)_第2张图片

 图片来源https://www.bilibili.com/video/BV1o64y1i7yw

K就是核函数,做一个内积的运算。SVM中核函数保证了低维空间里的计算量,输出到高维空间里。K相当于隐含层的神经元

机器学习—SVM原理及简单代码实现(matlab)_第3张图片

在学习书上代码发现已经很旧了,更新一下,根据Matlab2018b 自带SVM算法函数fitcsvm(svmtrain已被删除)实现,并依靠predict(svmclassify)对建立的SVM模型对测试数据进行分类。
以往的绘图选项plot(true)也找不到了,根据https://www.freesion.com/article/980718683/绘图分界线


clc;
clear;
close all;
traindata=[0,1;-1,0;2,2;3,1;-2,-2;-4,2;2,-1;-1,-3]; %生成样本的属性数据
lable=[1;1;-1;-1;1;1;-1;-1]; %样本标签
testdata=[5,2;3,1;-4,2]; %测试数据的属性数据
svm_struct=fitcsvm(traindata,lable);%训练SVM模型
testlable=predict(svm_struct,testdata); %依据测试样本对模型进行测试
sb= svm_struct.SupportVectors;%将Sb指定为支持向量
gscatter(traindata(:,1),traindata(:,2),lable,'br','..',8);
hold on;
gscatter(testdata(:,1),testdata(:,2),testlable,'br','..',20);
hold on;
[Xa,Xb] = meshgrid(-5:0.2:5,-5:0.2:5);
% 这是我的取点范围, 感觉效果不错, 也可以自己改改
[~,score] = predict(svm_struct,[Xa(:),Xb(:)]);
% 对网格进行分类结果的计算
scoreGrid = reshape(score(:,2),size(Xa,1),size(Xb,2));
% 改变score的行数和列数, 使之和网格[X1,X2]中的点一一对应
contour(Xa,Xb,scoreGrid,[0 0]);% 绘制等高线, 最后一个参数[0 0] 就是只绘制出score值为0的点的等高线, 也就是分界线.
hold on;
plot(sb(:,1),sb(:,2),'r>','MarkerSize',10);
legend('-1(train)','1(train)','-1(test)','1(test)','分界线','Support Vector');
hold off

你可能感兴趣的:(matlab,svm,机器学习)