MATLAB fitcsvm 绘制分类超平面及支持向量
代码如下:
close all
clear
clc
%% 数据部分
%请自行更换数据
data= xlsread('E:\2021科研\sci_research_2021\小论文\试验\2021_11_24_firelose\基于频谱_均方频率频率方差_归一化训练数据.xlsx');
sd=data(:,1:2);%归一化的二维样本
y=data(:,3);
Y=nominal(y);%标签
%% 原始数据图像
figure(1);
a=gscatter(sd(:,1),sd(:,2),Y,'rb','^.');%绘制散点图,r-红色;b-蓝色;^-三角形;.-点
legend(a,{'\fontname{宋体}失火故障工况特征样本','\fontname{宋体}正常工况特征样本','Support Vectors'},'Location','Northwest');%给折线加上图例,并放在西北角
xlim([0 0.8]);%限制x轴显示范围
ylim([0 0.7]);%限制y轴显示范围
xlabel('\fontname{宋体}均方频率(归一化)');%设置x轴标签名称
ylabel('\fontname{宋体}频率方差(归一化)');%设置y轴标签名称
set(gca,'Fontname', 'Times New Roman','FontSize',12);%设置字体为Times New Roman,大小为12
%% SVM训练
optimal_C=1.9;%可以看成是一个约束,这个值默认是1,这个值越小,则margin越大,说明在训练中允许的错误样本数越多,支持向量个数也越多,泛化能力越强。
%当这个值很大的时候,那么margin越小,支持向量的数目也越小,同时过拟合的风险也会增大
% SVMModel=fitcsvm(sd, Y, 'KernelFunction', 'linear', ...
% 'BoxConstraint', optimal_C, 'KernelScale', optimal_gamma);
SVMModel=fitcsvm(sd, Y, 'KernelFunction', 'linear', 'BoxConstraint', optimal_C);%选择线性核函数
[lable,score]=predict(SVMModel,sd);
%% 画图
figure(2);
h = nan(3,1);
h(1:2) = gscatter(sd(:,1),sd(:,2),Y,'rb','^.');
hold on
h(3) =plot(sd(SVMModel.IsSupportVector,1),sd(SVMModel.IsSupportVector,2),'ko','MarkerSize',10);%画出支持向量
%画出决策边界
w=-SVMModel.Beta(1,1)/SVMModel.Beta(2,1);%斜率
b=-SVMModel.Bias/SVMModel.Beta(2,1);%截距
x_ = 0:0.01:1;
y_ = w*x_+b;
y2=y_+1/SVMModel.Beta(2,1);%支持向量所在边界
y3=y_-1/SVMModel.Beta(2,1);%支持向量所在边界
plot(x_,y_,'k-',x_,y2,'k--',x_,y3,'k--','MarkerSize',10)
hold on
legend(h,{'\fontname{宋体}失火故障工况特征样本','\fontname{宋体}正常工况特征样本','Support Vectors'},'Location','Northwest');
xlim([0 0.8]);
ylim([0 0.7]);
xlabel('\fontname{宋体}均方频率(归一化)');
ylabel('\fontname{宋体}频率方差(归一化)');
set(gca,'Fontname', 'Times New Roman','FontSize',12);
hold off