关于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为实例.
相关文章推荐
- [Java5新特性]可变参数
- WorldWind源码剖析系列:四元数类Quaternion
- 评教——一个让我得到锻炼的平台
- Java设计模式——Facade(外观)模式
- PHP PSR-2 代码风格规范 (中文版)
- 有序二叉树链式存储结构1——插入与遍历
- Visitor Pattern -- 基于编译试验抽象语法树 (C++)
- OC--import和宏定义
- 使用Python自动下载妹子图的图片到本地
- <开发调试>一次bug的启示
- c++基础学习(04AM)
- 代理服务器安全配置
- 结构体位域的含义
- Oracle 中存储过程的建立
- 5.7.1.3 Global 对象的属性
- WorldWind源码剖析系列:视景体类Frustum
- hdu 5253(最小生成树)
- Java构造和解析Json数据的两种方法详解一
- Android面试题整理
- html标签元素分类