MatLab-SVM |
|
|
SVM整理
1各种svm程序包
1.1matlab高级版本中自带的svm函数
我现在使用的matlab版本为matlab7.6.0(R2008a)这个版本中已经自带svm算法,分别为生
物信息工具箱(bioinformaticstoolbox)中svmclassify函数和svmtrain函数,为上下级关系。
SVMStruct=svmtrain(Training,Group)%svmtrain的输入为样本点training和样本的分类情况
group,输出为一个分类器svmstruct.
核函数,核参数,和计算方法等都是可选的,如SVMStruct=svmtrain(…,‘Kernel_Function’,
Kernel_FunctionValue,…)
但是切记切记一定要成对出现。
然后,将分类器和testingsample带入svmclassify中,可以得到分类结果和准确度。
举个例子
svmStruct=svmtrain(data(train,:),groups(train),’Kernel_Function’,''rbf’,''Kernel_FunctionValue’,’
5′,’showplot’,true);
%用了核宽为5的径向基核,且要求作图
%这里我觉得原作者的写法有误,应该是svmStruct=svmtrain(data(train,:),groups(train),...
''Kernel_Function'',''rbf'',''RBF_Sigma'',5,''showplot'',true);
classes=svmclassify(svmStruct,data(test,:),’showplot’,true);
%要求输出检测样本点的分类结果,且画图表示。
tip1:有归一化scale功能,可以通过调参数实现
tip2:计算方法可选qp,smo,ls
tip3:有个关于softmargin的盒子条件,我不太明白是干嘛的,谁懂得话,就给我讲讲哈
tip4:画出来的图很难看
tosumup:挺好的
1.2较早使用的工具箱SVMandKernelMethodsMatlabToolbox
2005年法国人写的,最近的更新为20/02/2008
下载的地址为http://asi.insa-rouen.fr/enseignants/~arakotom/toolbox/index.html
这是我最早开始用的一个工具箱,我很喜欢,到现在还是,对于svm的初学者是个很好的
toolbox.
有详细的说明和很多的demo和例子,
包含现今几乎所有的有关svm的成熟算法和数据预处理方法(pca及小波等)。
最最重要的是有回归!!!
且函数简单,容易改动延伸。
最近我在弄模糊支持向量机,弄不出来,折腾的快死人了,那天突然发现其实在这个包的一
个程序中改动下就可以达到模糊的效果了,开心啊。。。
且有多分类
且画出来的图好看。
强烈推荐
说下包中最重要的几个函数svmregsvmclasssvmval
其中,svmreg和svmclass的功能分别为训练出回归函数和分类器
Svmval将回归函数或分类器带入,对新样本点进行估计
1.3最富盛名的libsvm
本文来自:高校自动化网(Www.zdh1909.com)详细出处参考(转载请保留本链接):
http://www.zdh1909.com/html/matlab/15830.html
业界很有名的一个包,主要是有各种各样的借口,现在最新的到python
主页及下载地址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/
但是,说实话呢,我真是用的不怎么上手
首先,实在是不怎么好篡改
其次,参数调起来挺麻烦。
但是有很详细的guidebook和例子
且主页上的例子很生动,随便点几下,就可以看到分类器产生的过程和效果。
业界用的非常多,应该svm在应用领域影响力最大的一个包了
据说(accordingto诺,井博士)linux下非常非常好使。
1.4osu-svmmatlabtoolbox
下载地址:http://sourceforge.net/projects/svm/
觉得和libsvm没什么太大的差别
有多分类且可以生成个阶梯图,我觉得这种图要比普通的分类平面图好些,好像可以看到更
多的信息。、
1.5spidermachinelearningmatlabtoolbox
主页:http://sourceforge.net/projects/svm/
那个是相当cool~啊
包括了迄今为止较为常用的machinelearningalgorithms
还有无监督的一些算法,如谱聚类
我研究了一小下,不太好篡改,但是很好用,我做多分类是就用了这个包,效果不好,但是
挺好调整
本文来自:高校自动化网(Www.zdh1909.com)详细出处参考(转载请保留本链接):
http://www.zdh1909.com/html/matlab/15830_2.html
1.6svc(注意版本)
包已经解压到文件夹F:\R2009b\toolbox\svm
matlab中SVM工具箱的使用方法
1,下载SVM工具箱:http://see.xidian.edu.cn/faculty/chzheng/bishe/indexfiles/indexl.htm
2,安装到matlab文件夹中
1)将下载的SVM工具箱的文件夹放在\matlab71\toolbox\下
2)打开matlab->File->SetPath中添加SVM工具箱的文件夹
现在,就成功的添加成功了.
可以测试一下:在matlab中输入whichsvcoutput回车,如果可以正确显示路径,就证明添加
成功了,例如:
C:\ProgramFiles\MATLAB71\toolbox\svm\svcoutput.m
3,用SVM做分类的使用方法
1)在matlab中输入必要的参数:X,Y,ker,C,p1,p2
我做的测试中取的数据为:
N=50;
n=2N;
randn(''state'',6);
x1=randn(2,N)
y1=ones(1,N);
x2=5+randn(2,N);
y2=-ones(1,N);
figure;
plot(x1(1,:),x1(2,:),''bx'',x2(1,:),x2(2,:),''k.'');
axis([-38-38]);
title(''C-SVC'')
holdon;
X1=[x1,x2];
Y1=[y1,y2];
X=X1'';
Y=Y1'';
其中,X是1002的矩阵,Y是1001的矩阵
C=Inf;
ker=''linear'';
globalp1p2
p1=3;
p2=1;
然后,在matlab中输入:[nsvalphabias]=svc(X,Y,ker,C),回车之后,会显示:
SupportVectorClassification
_____________________________
Constructing...
Optimising...
Executiontime:1.9seconds
Status:OPTIMAL_SOLUTION
|w0|^2:0.418414
Margin:3.091912
Sumalpha:0.418414
SupportVectors:3(3.0%)
nsv=
3
alpha=
0.0000
0.0000
0.0000
0.0000
0.0000
2)输入预测函数,可以得到与预想的分类结果进行比较.
输入:predictedY=svcoutput(X,Y,X,ker,alpha,bias),回车后得到:
predictedY=
1
1
1
1
1
1
1
1
1
3)画图
输入:svcplot(X,Y,ker,alpha,bias),回车
补充:
X和Y为数据,mn:m为样本数,n为特征向量数
比如:取20组训练数据X,10组有故障,10组无故障的,每个训练数据有13个特征参数,则
m=20,n=13
Y为201的矩阵,其中,10组为1,10组为-1.
对于测试数据中,如果取6组测试数据,3组有故障,3组无故障的,则m=6,n=13
Y中,m=6,n=1
http://www.support-vector-machines.org/SVM_soft.html
2原理详解
2.1SVM.ppt
2.2陆振波的SVM的MATLAB代码的解释
%构造训练样本
n=50;
randn(''state'',6);
x1=randn(2,n);%2行N列矩阵
y1=ones(1,n);%1N个1
x2=5+randn(2,n);%2N矩阵
y2=-ones(1,n);%1N个-1
figure;
plot(x1(1,:),x1(2,:),''bx'',x2(1,:),x2(2,:),''k.'');
%x1(1,:)为x1的第一行,x1(2,:)为x1的第二行
axis([-38-38]);
title(''C-SVC'')
holdon;
X=[x1,x2];%训练样本dn矩阵,n为样本个数,d为特征向量个数
Y=[y1,y2];%训练目标1n矩阵,n为样本个数,值为+1或-1
%训练支持向量机
functionsvm=svmTrain(svmType,X,Y,ker,p1,p2)
options=optimset;%Options是用来控制算法的选项参数的向量
options.LargeScale=''off'';
options.Display=''off'';
switchsvmType
case''svc_c'',
C=p1;
n=length(Y);
H=(Y''Y).kernel(ker,X,X);
f=-ones(n,1);%f为1n个-1,f相当于Quadprog函数中的c
A=[];
b=[];
Aeq=Y;%相当于Quadprog函数中的A1,b1
beq=0;
lb=zeros(n,1);%相当于Quadprog函数中的LB,UB
ub=Cones(n,1);
a0=zeros(n,1);%a0是解的初始近似值
[a,fval,eXitflag,output,lambda]=quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);%a
是输出变量,它是问题的解
%Fval是目标函数在解a处的值
%Exitflag>0,则程序收敛于解x
Exitflag=0,则函数的计算达到了最大次数
Exitflag<0,则问题无可行解,或程序运行失败
%Output输出程序运行的某些信息
%Lambda为在解a处的值Lagrange乘子
%支持向量机的数学表达式:????
C
yst
XXKyyW
i
i
l
i
i
jijij
l
ji
i
l
i
i
??
?
???
?
??
?
??
?
?
????
0
0:
,
2
1min
1
1,1
(i=1toL)
Quadprog函数:
cxHxxT?21min
St:
????
??有界约束等式约束
不等式约束
UBxLB
bxA
bAx
??
?
?
11
因此,H=(Y''Y).kernel(ker,X,X)
支持向量机的数学表达式中的最优解为Tl),...,(1????,???
l
iiiixyW1
?,
)2/()(11??????
iy
i
l
iiixWB??
%寻找支持向量
a=svm.a;
epsilon=1e-8;
i_sv=find(abs(a)>epsilon);%0 plot(X(1,i_sv),X(2,i_sv),''ro'');
%构造测试数本
[x1,x2]=meshgrid(-2:0.05:7,-2:0.05:7);%x1和x2都是181181的矩阵
[rows,cols]=size(x1);%M=size(x1,1):返回x数组的行数181
%N=size(x1,2):返回x数组的列数181
nt=rowscols;
Xt=[reshape(x1,1,nt);reshape(x2,1,nt)];
%reshape(x1,1,nt)是将x1转成1(181181)的矩阵;所以Xt是一个2(181181)的矩阵
%测试输出
tmp=(a.Y)kernel(ker,X,X(:,i_sv));%???
l
iiiixXKyatmp1
),(
b=1./Y(i_sv)-tmp;
b=mean(b);%????
l
ijiiixxKyiyb1
),(?
tmp=(a.Y)kernel(ker,X,Xt);%???
l
iiiixXKyatmp1
),(Xt是要进行判别
Yd=sign(tmp+b);%}),(sgn{)(1????
l
iiiibXxKayxf
%分界面
Yd=reshape(Yd,rows,cols)
contour(x1,x2,Yd,[00],''m'');%Contour函数:曲面的等高线图
2.3svm自己实现
在当前数据挖掘和机器学习领域,最为热门的话题莫过于SVM和Boosting方法了。只要是
涉及到这两个主题,那么论文就会容易被杂志和会议接受了。看来不管做什么,都讲究眼球
效应啊。搞研究其实也有点类似超级女声,呵呵。
以前我的论文中用的SVMCode都来自于台湾的林智仁教授的LibSVM。真的是佩服有些
大家,自己做出了重要的发现和成果,想到的不是把自己的成果保密起来(像C4.5一样),
让自己独享自己的成果;而是让自己的成果最大程度的被人所利用,给后来的研究人员打下
一个坚实的基础。说实话,他的代码很好,用起来很方便,而且不同的语言版本实现都有,
即使是对于初学者都很容易掌握。不过用的久了,我就想自己也实现SVM,现在的数学计
算工具太多了,而且功能齐全,用起来方便。今天鼓捣了一会,终于用Matlab实现了第一
个SVM。虽然比较简单,但是包含了大多数SVM的必要步骤。
这个实现是线性可分支持向量分类机,不考虑非线性分类引入核函数的情况,也不考虑推广
条件下引入PenaltyLoss的情况。
问题描述:平面上有如下点A=[11.5;21.5;31.5;41.5;10.5;20.5;30.5;40.5]及其对应的标
号flag=[1111-1-1-1-1];用SVM方法构造一个决策函数实现正确分类。
如果我们在二维坐标上描点,就会发现这是个很简单的线性可分问题。实现方法,用SVM
的对偶问题,转换为Matlab的有约束非线性规划问题。
构建m文件:
functionf=ffsvm(x)
A=[11.5;21.5;31.5;41.5;10.5;20.5;30.5;40.5];
flag=[1111-1-1-1-1];
fori=1:1:length(A)
forj=1:1:length(A)
normA(i,j)=A(i,:)A(j,:)'';
normFlag(i,j)=flag(1,i)flag(1,j);
end
end
f=0;
fori=1:1:length(A)
forj=1:1:length(A)
f=f+1/2(normA(i,j)x(i)x(j)normFlag(i,j));
end
f=f-x(i);
end
在命令窗口输入:
Aeq=[1111-1-1-1-1];
beq=0;
lb=[00000000];
调用MatLab内置优化函数fmincon;
[x,favl,exitflag]=fmincon(@ffsvm,x0,[],[],Aeq,beq,lb,[])
得到如下结果:
Optimizationterminatedsuccessfully:
Magnitudeofdirectionalderivativeinsearchdirection
lessthan2options.TolFunandmaximumconstraintviolation
islessthanoptions.TolCon
ActiveConstraints:
1
x=
0.50000.50000.50000.50000.50000.50000.50000.5000
favl=
-2.0000
exitflag=
1
x的分量都不为0,说明这些点都是支持向量;
计算w;
w=[00];
fori=1:1:length(A)
w=w+flag(i)x(i)A(i,:);
end
结果:
w=[0,2];
计算b;
b=0;
fori=1:1:8
b=b-flag(i)x(i)normA(i,1);
end
b=flag(1)+b;
结果:
b=-2;
最终的决策函数为:
f=sign([0,2]xT-2)
可以验证,这个学习到的决策函数能够对这些平面上的点实现很好的分类;
基本思路是这样的,如果要考虑引入核函数和PenaltyLoss的情况,只需要修改优化函数和
约束就可以实现。而且自己可以根据需求任意构造自己的SVM目标函数,然后用Lagrange
方法转换为对偶形式,然后当作一个有约束线性规划问题用Matlab来解。至于有约束线性
规划问题,这是个大概半个世纪前就解决的问题,学过OR的人都知道它的解决方法。网上
也有很多的OpenSource来解决这个问题,直接Call那些代码就可以了。虽然林智仁教授也
提供SourceCode,是C++风格的,可读性不是太好。
3工具箱简易教程
3.1matlab自带的函数
(matlab帮助文件里的例子)[只有较新版本的matlab中
有这两个SVM的函数]
=====
svmtrainsvmclassify
=====简要语法规则====
svmtrain
Trainsupportvectormachineclassifier
Syntax
SVMStruct=svmtrain(Training,Group)
SVMStruct=svmtrain(...,''Kernel_Function'',Kernel_FunctionValue,...)
SVMStruct=svmtrain(...,''RBF_Sigma'',RBFSigmaValue,...)
SVMStruct=svmtrain(...,''Polyorder'',PolyorderValue,...)
SVMStruct=svmtrain(...,''Mlp_Params'',Mlp_ParamsValue,...)
SVMStruct=svmtrain(...,''Method'',MethodValue,...)
SVMStruct=svmtrain(...,''QuadProg_Opts'',QuadProg_OptsValue,...)
SVMStruct=svmtrain(...,''SMO_Opts'',SMO_OptsValue,...)
SVMStruct=svmtrain(...,''BoxConstraint'',BoxConstraintValue,...)
SVMStruct=svmtrain(...,''Autoscale'',AutoscaleValue,...)
SVMStruct=svmtrain(...,''Showplot'',ShowplotValue,...)
---------------------
svmclassify
Classifydatausingsupportvectormachine
Syntax
Group=svmclassify(SVMStruct,Sample)
Group=svmclassify(SVMStruct,Sample,''Showplot'',ShowplotValue)
============================实例研究====================
loadfisheriris
%载入matlab自带的数据[有关数据的信息可以自己到UCI查找,这是UCI的经典
数据之一],得到的数据如下图:
tu1
其中meas是1504的矩阵代表着有150个样本每个样本有4个属性描述,species
代表着这150个样本的分类.
data=[meas(:,1),meas(:,2)];
%在这里只取meas的第一列和第二列,即只选取前两个属性.
groups=ismember(species,''setosa'');
%由于species分类中是有三个分类:setosa,versicolor,virginica,为了使问题简单,我
们将其变为二分类问题:Setosaandnon-Setosa.
[train,test]=crossvalind(''holdOut'',groups);
cp=classperf(groups);
%随机选择训练集合测试集[有关crossvalind的使用请自己help一下]
其中cp作用是后来用来评价分类器的.
svmStruct=svmtrain(data(train,:),groups(train),''showplot'',true);
%使用svmtrain进行训练,得到训练后的结构svmStruct,在预测时使用.
训练结果如图:
tu2
classes=svmclassify(svmStruct,data(test,:),''showplot'',true);
%对于未知的测试集进行分类预测,结果如图:
tu3
classperf(cp,classes,test);
cp.CorrectRate
ans=
0.9867
%分类器效果测评,就是看测试集分类的准确率的高低.
3.2台湾林智仁的libsvm工具箱
该工具箱下载[libsvm-mat-2.86-1]:libsvm-mat-2.86-1.rar(73.75KB)
安装方法也很简单,解压文件,把当前工作目录调整到libsvm所在的文件夹下,再
在setpath里将libsvm所在的文件夹加到里面.然后
在命令行里输入
mex-setup%选择一下编译器
make
这样就可以了.
建议大家使用libsvm工具箱,这个更好用一些.可以进行分类[多类别],预测....
=========
svmtrain
svmpredict
================
简要语法:
Usage
=====
matlab>model=svmtrain(training_label_vector,training_instance_matrix[,
''libsvm_options'']);
-training_label_vector:
Anmby1vectoroftraininglabels(typemustbedouble).
-training_instance_matrix:
Anmbynmatrixofmtraininginstanceswithnfeatures.
Itcanbedenseorsparse(typemustbedouble).
-libsvm_options:
AstringoftrainingoptionsinthesameformatasthatofLIBSVM.
matlab>[predicted_label,accuracy,decision_values/prob_estimates]=
svmpredict(testing_label_vector,testing_instance_matrix,model[,''libsvm_options'']);
-testing_label_vector:
Anmby1vectorofpredictionlabels.Iflabelsoftest
dataareunknown,simplyuseanyrandomvalues.(typemustbedouble)
-testing_instance_matrix:
Anmbynmatrixofmtestinginstanceswithnfeatures.
Itcanbedenseorsparse.(typemustbedouble)
-model:
Theoutputofsvmtrain.
-libsvm_options:
AstringoftestingoptionsinthesameformatasthatofLIBSVM.
ReturnedModelStructure
========================
实例研究:
loadheart_scale.mat
%工具箱里自带的数据
如图:
tu4
其中heart_scale_inst是样本,heart_scale_label是样本标签
model=svmtrain(heart_scale_label,heart_scale_inst,''-c1-g0.07'');
%训练样本,具体参数的调整请看帮助文件
[predict_label,accuracy,dec_values]=svmpredict(heart_scale_label,heart_scale_inst,
model);
%分类预测,这里把训练集当作测试集,验证效果如下:
>>[predict_label,accuracy,dec_values]=svmpredict(heart_scale_label,
heart_scale_inst,model);%testthetrainingdata
Accuracy=86.6667%(234/270)(classification)
==============
这回把SVM这点入门的东西都说完了,大家可以参照着上手了,有关SVM的原理
我下面有个简易的PPT,是以前做项目时我做的[当时我负责有关SVM这一块代
码实现讲解什么的],感兴趣的你可以看看,都是上手较快的东西,想要深入学习
SVM,你的学习统计学习理论什么的....挺多的呢..
SVM.ppt(391KB)
-----------有关SVM和libsvm的非常好的资料,想要详细研究SVM看这个------
libsvm_guide.pdf(194.53KB)
libsvm_library.pdf(316.82KB)
OptimizationSupportVectorMachinesandMachine
4常用整理(libsvm)
4.1训练函数svmtrain
SVMStruct=svmtrain(Training,Group)
Training:输入矩阵,每行对应一组变量,每列对应一个属性或变量
Group:输出列向量(数值或字符)
SVMStruct=svmtrain(Training,Group,’Kernel_FunctionValue’,polynomial,
‘MethodValue’,qp,’ShowplotValue’,true)
属性设置:
【Kernel_FunctionValue】:核函数
linear(默认)quadraticrbfpolynomialmlp@functionname(自定义)
RBFSigmaValue
Positivenumberthatspecifiesthescalingfactor,sigma,intheradialbasisfunction
kernel.Defaultis1.
PolyorderValue
Positivenumberthatspecifiestheorderofapolynomialkernel.Defaultis3.
Mlp_ParamsValue
Two-elementvector,[p1,p2],thatspecifiesthescaleandbiasparametersofthe
multilayerperceptron(mlp)kernel.K=tanh(p1UV''+p2).p1mustbe>0,andp2
mustbe<0.Defaultis[1,-1].
【MethodValue】:求解二次规划方法
qpsmols
QuadProg_OptsValue
Anoptionsstructurecreatedbytheoptimsetfunction(OptimizationToolbox
software).ThisstructurespecifiesoptionsusedbytheQPmethod.Formore
informationoncreatingthisstructure,seetheoptimsetandquadprogreferencepages.
SMO_OptsValue
Anoptionsstructurecreatedbythesvmsmosetfunction.Thisstructurespecifies
optionsusedbytheSMOmethod.Formoreinformationoncreatingthisstructure,see
thesvmsmosetfunction.
BoxConstraintValue:软边缘约束值(线性不可分时放宽w条件),默认1
Boxconstraintsforthesoftmargin.Choicesare:
Strictlypositivenumericscalar.
Arrayofstrictlypositivevalueswiththenumberofelementsequaltothe
numberofrowsintheTrainingmatrix.
【ShowplotValue】:是否显示分类图
truefalse默认
SVMStruct:分类器结果(结构体)
#SupportVectors
#Alpha
#Bias
#KernelFunction
#KernelFunctionArgs
#GroupNames
#SupportVectorIndices
#ScaleData
#FigureHandles
4.2分类函数svmclassify
Group=svmclassify(SVMStruct,Sample)
classes=svmclassify(svmStruct,data(test,:),''showplot'',true);
4.3回归函数svmpredict
[predict_label,accuracy,dec_values]=svmpredict(heart_scale_label,heart_scale_inst,model);
%分类预测,这里把训练集当作测试集,验证效果如下:
>>[predict_label,accuracy,dec_values]=svmpredict(heart_scale_label,heart_scale_inst,
model);%testthetrainingdata
Accuracy=86.6667%(234/270)(classification)
4.4常用技巧
#载入数据5150
loadfisheriris
#Createdata,atwo-columnmatrixcontainingsepallengthandsepalwidth
measurementsfor150irises.
data=[meas(:,1),meas(:,2)];
#Fromthespeciesvector,createanewcolumnvector,groups,toclassifydatainto
twogroups:Setosaandnon-Setosa.
groups=ismember(species,''setosa'');
#随机选择训练/测试集
[train,test]=crossvalind(''holdOut'',groups);
cp=classperf(groups);
#线性核函数训练SVM分类器并画分类图
svmStruct=svmtrain(data(train,:),groups(train),''showplot'',true);
#将核函数类型添加到标题
title(sprintf(''KernelFunction:%s'',...
func2str(svmStruct.KernelFunction)),...
''interpreter'',''none'');
#使用分类函数将测试集分类
classes=svmclassify(svmStruct,data(test,:),''showplot'',true);
#评价分类水平(正确率)
classperf(cp,classes,test);
cp.CorrectRate
ans=
0.9867
#Useaone-norm,hardmarginsupportvectormachineclassifierbychangingthe
boxconstraintproperty.
figure
svmStruct=svmtrain(data(train,:),groups(train),...
''showplot'',true,''boxconstraint'',1e6);
classes=svmclassify(svmStruct,data(test,:),''showplot'',true);
|
|
|
|
|
|
|
|