matlab自带svm函数进行二分类

今天讲一讲支持向量机(svm)二分类的用法。

1 原理

具体的推导笔者就不说了,可以自行百度。SVM本质就是找出最小类间距离并使其最大化。分离面称作超平面。核函数本质上决定了它的分类精度,包括多项式核(polynomial kernel),径向基函数核(RBF kernel),拉普拉斯核(Laplacian kernel),Sigmoid核(Sigmoid kernel)。svm有很多类型。libsvm是其中使用最为广泛的。现在matlab有自带的svm包,但是只能用于二分类,如果需要三分类或者多分类,则要使用libsvm,必须下载其软件包。

下载链接:https://www.csie.ntu.edu.tw/~cjlin/libsvm/#matlab

安装教程:https://blog.****.net/cherry4500/article/details/71257973

libsvm实例:https://blog.****.net/weixin_42296976/article/details/81160114

2 matlab自带的svm函数

主要是svmtrain和svmclassify函数。可以在svmtrain中选择核函数类型,曲线拟合程度(c与sigma参数的选择)等。

贴参数选择实例:https://blog.****.net/red_stone1/article/details/54313821

https://blog.****.net/weiqiwu1986/article/details/56056860

3 实例

我这个是对小麦白粉病和条锈病做分类。

function [accuracy,predict_group] =FITCSVM_classification(training,training_group,test,test_group)
%training数据行是样本数目,列是样本特征数目(维数),此处我的每个样本特征是40维。训练样本60个。
%group 分为0和1,1正例,0反例,行是样本数目,列是标签,就一列。

SVMStruct=svmtrain(training,training_group,'kernel_function','linear','showplot',true);%FITCSVM
% sigma=0.5;
% sigma=3;%sigma越小曲线越复杂,越容易过拟合,对测试集的预测越不准
% SVMStruct=svmtrain(training,training_group,'kernel_function','rbf','rbf_sigma',...
%      sigma,'showplot',true);
% C = 1;%c越大曲线越复杂,越容易过拟合,对测试集的预测越不准,也不是绝对。sigma的影响更普遍。
% SVMStruct = svmtrain(training,training_group,'kernel_function','rbf','boxconstraint',...
%     C,'showplot',true);
%样本的行是样本数目,列是样本特征数,与training数据一致
predict_group=svmclassify(SVMStruct,test,'showplot',true);%ClassificationSVM,默认是线性分类函数
accuracy = (1-sum(abs(predict_group-test_group))/length(test_group))*100;
figure(6)
a = randperm(30);%测试集30个样本
b = sort(a);
plot(b,predict_group,'r*');
hold on
plot(b,test_group,'go');%,'MarkerFaceColor','g'
title('SVM分类结果')
%加一个预测标签和测试集标签的回归分析图

%超过3维分类超平面就无法画出。
%xlswrite('output.xlsx',group)

结果图如下所示:

matlab自带svm函数进行二分类

红色*表示预测标签,绿色圆表示真实的标签。用linear能达到93.33%的精度。