运用自带的SVM分类器
1)svmtrain函数,其是一个训练分类模型的函数:SVMStruct = svmtrain(Training,Group,Name,Value),其输入参数为(训练数据,训练数据相应组属性,可选参数名,可选参数的值),输出为一个结构体。
可选参数有很多,包括boxconstraint,kernel_function,kernelcachelimit,kktviolationlevel,method,kktviolationlevel,mlp_params,options,polyorder,rbf_sigma,showplot,tolkkt,
1、kernel_function(核函数类型):可选的核函数有linear,quadratic,polynomial,rbf,mlp,@kfun ,如果不设置核函数类型,那么默认的选用线性核函数linear。
2、showplot(绘图):是一个布尔值,用来指示是否绘制分类数据(这里是训练数据)和分类线。但是这个绘图功能只支持绘制有两个特征值的数据,也就是二维的点数据。(默认为false),在svmtrain函数中,如果将showplot设置为true,程序会自动在figure中用不同的颜色绘制出训练数据中两个类的点以及通过训练数据获得的分类线,并标注出哪些点是支持向量。
3、boxconstraint
svmtrain函数输出的结构体中包含训练出的分类器的信息,包括支持向量机,偏置b的值等等。
(2)svmclassify函数,其实一个应用训练的分类模型和测试数据进行分类测试的函数:Group = svmclassify(SVMStruct,Sample,’Showplot’,true),其最多只有这四个输入参数,包括(训练出的分类模型结构体,测试数据,绘图显示,’true’)。在svmclassify函数中用Showplot绘图,会绘制出svmclassify函数中输入的测试数据点,如下图所示,粉色的+为被分到类1中的测试数据,蓝色星号是被分到类2中的测试数据)
% 进行SVM线性可分的二分类处理 % 1、首先需要一组训练数据train,并且已知训练数据的类别属性,在这里,属性只有两类,并用1,2来表示。 % 2、通过svmtrain(只能处理2分类问题)函数,来进行分类器的训练 % 3、通过svmclassify函数,根据训练后获得的模型svm_struct,来对测试数据test进行分类 train=[0 0;2 4;3 3;3 4;4 2;4 4;4 3;6 2;7 1;5 4;2 9;3 8;4 6;4 7;5 6;5 8;6 6;7 4;8 4;10 10]; %训练数据点 group=[1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]'; %训练数据已知分类情况 %与train顺序对应 test=[3 2;4 8;6 5;7 6;2 5;5 2]; %测试数据 %训练分类模型 svmModel = svmtrain(train,group,'kernel_function','linear','showplot',true); %分类测试 classification=svmclassify(svmModel,test,'Showplot',true);
>> classification classification = 1 2 2 2 1 1
classification输出的是测试数据的分类
%SVM对线性不可分的数据进行处理 %在选择核函数时,尝试用linear以外的rbf核函数,quadratic,polynomial等,观察获得的分类情况 %训练数据 train=[5 5;6 4;5 6;5 4;4 5;8 5;8 8;4 5;5 7;7 8;1 2;1 4;4 2;5 1.5;7 3;10 4;4 9;2 8;8 9;8 10]; %训练数据分类情况 group=[1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]; %测试数据 test=[6 6;5.5 5.5;7 6;12 14;7 11;2 2;9 9;8 2;2 6;5 10;4 7;7 4]; %训练分类模型 svmModel = svmtrain(train,group,'kernel_function','rbf','showplot',true); %分类 classification=svmclassify(svmModel,test,'showplot',true);
load fisheriris meas=meas(:,1:2); train=[meas(51:90,:);meas(101:140,:)]; test=[meas(91:100,:);meas(141:150,:)]; group=[(species(51:90));(species(101:140))];%选取类别标识前40个数据作为训练数据 svmModel=svmtrain(train,group,'kernel_function','rbf','showplot',true); %svmModel=svmtrain(train,group,'kernel') classfication=svmclassify(svmModel,test,'showplot',true); %正确分类情况为groupTest groupTest=[species(91:100);species(141:150)]; %计算分类精度 count=0; for i=1:20 if strcmp(classfication(i),groupTest(i)) count=count+1; end end title(['分类精度为:' num2str(count/20)]);
SVM原理: