您的位置:首页 > 其它

关于SVM

2015-05-31 22:15 176 查看

1.SVM相关知识

首先我们知道线性SVM是这样一个分类器,它寻找具有最大边缘的超平面。考虑一个包含N个训练样本的二元分类问题,类标签为-1或者1。 SVM分类器的决策边界为:




即为下图虚线所示:



其中w的方向与虚线垂直(可证明)。通过调整决策边界的参数w和b,得到两个超平面。

其中在虚线上方且与虚线平行的超平面L1为:



其中在虚线下方且与虚线平行的超平面L2为:

w*x+b=-1

令x1是L1上的一个数据点,令x2是L2上的一个数据点,将x1和x2代入以上公式中,则有:



两式相减可得:



其中d为超平面L1与超平面L2之间的直线距离。 我们的目标是使得d最小。

2.学习线性SVM模型

SVM的训练阶段即从训练数据中估计参数w跟b。选择的参数必须满足:


下面的1改为-1 (1)

即类标签为1的训练实例都必须位于超平面L1上或者位于它的上方,而那些类标签为-1的训练实例必须位于超平面L2上或者L2的下方。

对上述两个不等式可概括为:


(2)

我们的目标是最大化d,即最小化||w||,等价于最小化下面的目标函数:



那么SVM的任务即可以描述为如下优化问题:


(3)

利用拉格朗日乘子方法进行求解,首先得到拉格朗日函数:


(4)

其中

为拉格朗日乘子,为了最小化拉格朗日函数,对(1)式关于w跟b求偏导,并令它们等于0,则有:


(5)

因为拉格朗日乘子是未知的,我们仍然不能得到w和b的解。

这里我们考虑将不等式约束变换为等式约束,称为KKT:


(6)

将式(5)代入(4)转换为对偶问题:


(7)

即原来最小化

转换为最大化







SVM代码

创建函数ffsvm即

,保留为.m格式,代码如下:

function f=ffsvm(x)
A=[1 1.5;2 1.5;3 1.5;4 1.5;1 0.5;2 0.5;3 0.5;4 0.5]; %特征向量
flag =[1 1 1 1 -1 -1 -1 -1];  %类标签
for i=1:1:length(A)
for j=1:1:length(A)
normA(i,j)=A(i,:)*A(j,:)';
normFlag(i,j)=flag(1,i)*flag(1,j);
end
end
f=0;
for i=1:1:length(A)
for j=1:1:length(A)
f=f+1/2*(normA(i,j)*x(i)*x(j)*normFlag(i,j));
end
f=f-x(i);
end


求解SVM参数w和b的代码:

clear;
clc;
A=[1 1.5;2 1.5;3 1.5;4 1.5;1 0.5;2 0.5;3 0.5;4 0.5]; %特征向量
flag=[1 1 1 1 -1 -1 -1 -1];  %类标签
beq=0;
lb=zeros(1,length(flag));
x0=zeros(1,length(flag));
%初始值%% 求解二次规划问题
%   min f
%   st.   flag.x=0   (这里的x即lanmda)
%         0<=x

[x,fval,exitflag]=fmincon(@ffsvm,x0,[],[],flag,beq,lb,[]);
%% 计算w
w=zeros(1,size(A,2));
for i=1:length(A)
w=w+flag(i)*x(i)*A(i,:);
end
%% 计算b:利用支持向量
b=0;
num=0;
for i=1:length(A)
if(x(i)~=0)
b=b+flag(i)-w*A(i,:)';
num=num+1;
end
end
b=b/num;


求得的结果为w=[-2.53319746512659e-07,2],b=-2;

那么分类器为:


,其中z为实例.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: