基于支持向量机SVM的二分类问题(fitcsvm函数)
matlab2018及之后的版本取消了svmtrain和svmclassify函数,取而代之的更多的fitcsvm和predict函数。但是也使得决策边界无法直接生成,需要根据fitcsvm中得到的参数画出决策边界。
线性二分类
问题1:编写程序,用SVM方法解决线性二分类问题
数据集:testSet-linear.txt。
要求:给出代码、数据集分布示意图、支撑向量坐标及图示、决策边界图示
数据集为100*3,前两列为数据的坐标,第三列为数据标签(1、-1)。保存在文本文件中。
代码实现
close all
clear
clc
%% 数据部分
data=load('testSet-linear.txt');
sd=data(:,1:2);
y=data(:,3);
Y=nominal(y); %标签
%% 原始数据图像
subplot(1,2,1)
gscatter(sd(:,1),sd(:,2),Y,'rg','+*');
%% SVM
SVMModel=fitcsvm(sd,Y,'KernelFunction','linear');
[lable,score]=predict(SVMModel,sd);
%% 画图
subplot(1,2,2)
h = nan(3,1);
h(1:2) = gscatter(sd(:,1),sd(:,2),Y,'rg','+*');
hold on
h(3) =plot(sd(SVMModel.IsSupportVector,1),sd(SVMModel.IsSupportVector,2), 'ko');%画出支持向量
%画出决策边界
w=-SVMModel.Beta(1,1)/SVMModel.Beta(2,1);%斜率
b=-SVMModel.Bias/SVMModel.Beta(2,1);%截距
x_ = 0:0.01:10;
y_ = w*x_+b;
plot(x_,y_)
hold on
legend(h,{'-1','+1','Support Vectors'},'Location','Southeast');
axis equal
hold off
实验结果
图1 实验原始数据分布图 图2 SVM二分类结果
非线性二分类
问题2:编写程序,用SVM方法解决非线性二分类问题
数据集:test_nonlinear_SVM.csv
要求:给出代码、数据集分布示意图、决策边界图示。
数据集说明:数据集大小为600*3,前两列为数据的坐标,第三列为数据标签(1、-1)。保存在csv文件中
代码实现
close all
clear
clc
%% 数据部分
data=csvread('test_nonlinear_SVM.csv');
sd=data(:,1:2);
y=data(:,3);
Y=nominal(y);
%% 原始数据图像
subplot(1,2,1)
gscatter(sd(:,1),sd(:,2),Y,'rg','+*');
%% SVM
SVMModel=fitcsvm(sd,Y,'BoxConstraint',10,'KernelFunction','rbf','KernelScale',2^0.5*2);%使用高斯核函数
%%SVMModel=fitcsvm(sd,Y,'KernelFunction','rbf','OptimizeHyperparameters',{'BoxConstraint','KernelScale'}, 'HyperparameterOptimizationOptions',struct('ShowPlots',false));%使用超参数优化
%% 画图
subplot(1,2,2)
h = nan(3,1);
h(1:2) = gscatter(sd(:,1),sd(:,2),Y,'rg','+*');
hold on
h(3) = plot(sd(SVMModel.IsSupportVector,1),sd(SVMModel.IsSupportVector, 2),'ko'); %画出支持向量
%画出决策边界
h = 0.2;
[X1,X2] = meshgrid(min(sd(:,1)):h:max(sd(:,1)),min(sd(:,2)):h:max(sd(:,2)));
%得到所有取点的矩阵
[lable,score]=predict(SVMModel,[X1(:),X2(:)]);
scoreGrid = reshape(score(:,2),size(X1,1),size(X2,2));
contour(X1,X2,scoreGrid,[0 0]);%绘制等高线
hold on
legend('-1','+1','Support Vectors','分界线');
axis equal
hold off
实验采用两种方法进行SVM训练。一种是未使用超参数优化的高斯核函数,另一种使用超参数优化。
实验结果
图3 实验原始数据分布图 图4 SVM高斯核函数二分类结果
图5 实验原始数据分布图 图6 SVM超参数优化二分类结果
SVM超参数优化仅显示了其中一种结果,得到支持向量支持向量个数为20时的数据点。优化得到BoxConstraint(框约束)最优值为171.22,KernelScale值为24.418。
图7 超参数优化结果
注
非线性二分类在绘制决策边界时采用了绘制等高线的思想,通过设定参数,使得绘制出score值为0的点的的等高线,也就是分界线。