线性分类和SVM原理
网上有很多写的好的博客讲解线性分类和SVM,本人讲解能力差,就给个链接。
http://blog.youkuaiyun.com/mm_bit/article/details/46988925
SVM实现代码
训练svm分类器实际上是解二次规划问题,matlab里用到的是quadprog函数,其使用用法可参见matlab官方文档:
http://cn.mathworks.com/help/optim/ug/quadprog.html
或者不想读英文文档的人可以看别人写的博客:
http://blog.youkuaiyun.com/jbb0523/article/details/50598641
会使用quadprog函数基本上就会写svm分类器了,这里贴上源码:
svmTrain.m
function [ svm ] = svmTrain( trainData,trainLabel,kertype,C )
options=optimset;
options.LargerScale='off';
options.Display='off';
n=length(trainLabel);
H=(trainLabel'*trainLabel).*kernel(trainData,trainData,kertype);
f=-ones(n,1);
A=[];
b=[];
Aeq=trainLabel;
beq=0;
lb=zeros(n,1);
ub=C*ones(n,1);
a0=zeros(n,1);
[a,fval,eXitflag,output,lambda]=quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);
epsilon=1e-8;
sv_label=find(abs(a)>epsilon);
svm.a=a(sv_label);
svm.Xsv=trainData(:,sv_label);
svm.Ysv=trainLabel(sv_label);
svm.svnum=length(sv_label);
end
kernel.m(更新)
function K = kernel( X,Y,type )
switch type
case 'linear'
K=X'*Y;
case 'rbf'
delta=5;
delta=delta*delta;
XX=sum(X'.*X',2);
YY=sum(Y'.*Y',2);
XY=X'.*Y;
K=abs(repmat(XX,[1 size(YY,1)])+repmat