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为实例.
本文介绍了支持向量机(SVM)的基本概念,特别是线性SVM寻找最大边缘的超平面。在二元分类问题中,SVM的目标是找到使间隔最大的超平面。通过拉格朗日乘子法,将原始优化问题转化为对偶问题,最终求解SVM的参数w和b。文章还展示了SVM的简单代码实现。
2085

被折叠的 条评论
为什么被折叠?



