关于SVM

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

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为实例.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值