一、SVM概述

支持向量机(support vector machine)是一系列的监督学习算法,能用于分类、回归分析。原本的SVM是个二分类算法,通过引入“OVO”或者“OVR”可以扩展到多分类问题。其学习策略是使间隔最大化,也就是常说的基于结构风险最小化寻找最优的分割超平面。SVM学习问题可以表示为凸优化问题,也可以转变为其对偶问题,使用SMO算法求解。线性SVM与LR有很多相似的地方,分类的准确性能也差不多,当数据量比较少时SVM可能会占据优势,但是SVM不方便应用于软分类(probability estimates)。SVM的另一优势是灵活的核函数用于学习非线性问题,常用的核函数是高斯核(rbf)、多项式核(poly),也可以自己定义核函数。SVM的算法的复杂度是,所以当数据量比较大时,SVM的效率比较低。尽管有人说SVM在工业界大数据量应用中很少使用,但是其思想还是非常优秀的,在笔试、面试非常常见,需要认真学习。

二、SVM简单推导

1. SVM原始问题

原始的SVM问题是在线性可分的情况下,根据“最大化最小间距”的原则寻找最优的超平面w,b。抽象成如下数学优化问题。首先要知道点到超平面的距离公式,可以联想以前学过的点到直线的距离,距离公式见下图红色框框。为了便于求解,同时缩放w,b使得最小的函数间隔为1(函数间隔、几何间隔见参考链接1),最后将最大问题转变为最小优化问题,整理出标准的SVM的数学形式。SVM原始的标准形式可以从正则化的角度看成是在Ein=0的L2正则化。基于SVM最大化边界条件得到的模型有更好的范化能力。SVM标准问题是二次凸目标函数加线性的限制条件,可以使用现成的二次规划程式求解(QP)。

2. SVM的对偶问题

SVM原始问题使用QP求解,复杂度和样本特征属性成正比,在处理线性问题时尚可忍受。但是使用线性模型处理非线性问题是,需要将原始特征转换到更高的维度才能使用线性模型,SVM也不例外。原始特征转到线性可分的高维特征会导致特征维度爆炸式增长,例如原始特征维度为2,转换后为5,如果原始空间是3维的,转换后会得到19维的新空间,,使得QP求解变得很麻烦。SVM满足KKT条件,通过拉格朗日算子将原始问题转变为其等价的对偶问题。对偶问题会更容易求解,可以很自然的引入核函数,进而将SVM推广到非线性分类问题。求解对偶SVM问题首先分别令w,b的偏导为0,得到w,b和alpha之间的关系式,最后变成只含有alpha的优化问题,可以使用SMO算法求解alpha,最后根据之前的关系式得到w,b。

3 .SVM核函数

        文章开头讲过SVM的一大优势是可以使用的kernel处理线性不可分的情况。回顾之前使用特征转换的方式线性分类器处理非线性问题,将原始数据转到高维空间,在高维空间进行分类的操作。这种方式的缺点是转换后维度爆炸增长,效率太低。核函数处理线性不可分问题本质上也是转换到可线性处理的高维空间,但是核函数的方式是“隐式”的。核函数直接在低纬空间进行向量内积的运算,不需要显示地写出映射到高维空间的结过,避免了高维空间的复杂计算。解决了之前的维度爆炸问题。常见的核函数有高斯核这个核函数号称能将原始空间映射到无穷维度,调节gamma,gamma越小高次特征权重衰减越快,gamma越大,模型越复杂,越容易过拟合;多项式核,gama越大,模型越复杂。线性核是,原始空间中的内积,就是在原始空间分类。除此之外还可以自己定义核函数。下右图比较了使用SVM核函数、LR、决策树分类的区别,后面两个都是直线或者是直线的组合,说明SVM在非线性分类的优势。

4 .SVM松弛变量(软边界)

         基于最大边界距离的SVM相比以前的线性分类器有更好的泛化能力,引入核函数能处理线性不可分的问题。但是这种“始终坚持线性可分的SVM”很容易受噪声、异常点的影响,异常点的存在会使超平面发生变化,甚至造成原本线性可分的数据变得不在可分,模型变得复杂,严重的会造成过拟合,影响模型的泛化能力。为了处理这种情况,SVM在实际使用中会加入松弛变量,允许数据点在一定程度上偏离超平面。软边界SVM,松弛变量体现在惩罚系数C上,C越大,对错误点的惩罚越大,最大边距越小,模型越复杂。带有松弛变量的SVM,同样有其对偶问题,并能使用核函数。通过对偶问题,可以看出,优化问题没变,只是对alpha增加了一个上界C。这样现在的SVM可以处理线性、非线性、并能容忍噪声和outliers。

5. 从L2正则化理解SVM

SVM与LR有很多相似的地方,可以表示为L2正则化模型的形式。下左图简单的罗列了Soft SVM转化为L2形式的过程。一种新的误差测量函数hinge loss=max(1-ys,0)。标准L2形式中的lamda用C表示,lamda = 1/2C,C越大,lamda越小,正则化项越小。右边那张图是台大林的课件中的原图,比较了zero_one,SCE,hingeloss之间的区别,hinge Loss是zero one的上界。除此之外kernel SVM可以看做是在转换后Z空间的logReg,SVM确实和正则化的LR是非常近似的。实际中LR和线性SVM的性能也相近。

6. SVR(support vector Regression)

       SVR是基于epsilon-insensitive error 损失函数的回归模型,准确的说是一种Tube Regression。在Tube之内不算错误,在Tube之外根据距离Tube的远近计算错误。相比基于平方错误的一般回归模型,Tube在很大范围与一般回归模型相似,而且Tube模型受异常样本的影响更小。L2 正则化的Tube Regression模型是一种稀疏的回归模型,模型参数w有很多为0。模仿SVM能将L2正则化的Tube Regression写成SVM的形式,称为SVR。SVR使用二次规划求解(QP),也可以模仿SVM引入Lagrange Multipliers写成SVM的对偶形式求解。参数C调节Regularization 的程度,C越大,相当于正则化系数lamda越小。参数epsilon表示Tube的宽度。

    

       

三、凸二次规划和SMO算法

1. 二次规划

原始SVM能带入QP问题求解,对偶问题使用特殊的QP问题求解。百科中有一段很短的话介绍二次规划,二次规划的标准形式如下,当G=0时,退化为线性规划;G为半正定时,称为凸二次规划,至少存在一个向量满足约束条件并且在可行域有下界,存在一个全局最小值;G为正定时,称为严格的凸二次规划,全局最小值存在且唯一。SVM属于半正定的情况。SVM的QP解法就是将SVM化为QP形式,带入现成的QP求解包求解。

2. SMO算法

QP问题求解二次规划,QP的复杂度与样本的特征维度有关。在数据量比较大时,需要较大的计算能力支撑。SMO算法是Platt在1996年提出的,用于解决SVM的对偶问题,SVM的对偶问题是在一堆alpha中求目标函数的最小值。SMO算法的核心是将大的优化问题分解为多个小优化问题求解。为了求解那么多的alpha算子,SMO每次任意抽取两个乘子alpha1和alpha2,固定其它的算子。不断迭代求解出所有的alpha,最终求b。SMO算法没有想象中的那么难,july的支持向量通俗导论中介绍得很详细。

参考资料:

1.支持向量机系列:http://blog.pluskid.org/?page_id=683

2.支持向量机通俗导论pdf:http://pan.baidu.com/s/1eQrgiOU

3.台大林老师机器学习技法SVM六讲:https://class.coursera.org/ntumltwo-002/lecture

SVM学习笔记的更多相关文章

  1. SVM学习笔记(一)

    支持向量机即Support Vector Machine,简称SVM.一听这个名字,就有眩晕的感觉.支持(Support).向量(Vector).机器(Machine),这三个毫无关联的词,硬生生地凑 ...

  2. SVM学习笔记(二)----手写数字识别

    引言 上一篇博客整理了一下SVM分类算法的基本理论问题,它分类的基本思想是利用最大间隔进行分类,处理非线性问题是通过核函数将特征向量映射到高维空间,从而变成线性可分的,但是运算却是在低维空间运行的.考 ...

  3. SVM学习笔记(一):libsvm参数说明(转)

    LIBSVM 数据格式需要---------------------- 决策属性 条件属性a 条件属性b ... 2 1:7 2:5 ... 1 1:4 2:2 ... 数据格式转换--------- ...

  4. SVM学习笔记-线性支撑向量机

    对于PLA算法来说,最终得到哪一条线是不一定的,取决于算法scan数据的过程. 从VC bound的角度来说,上述三条线的复杂度是一样的 Eout(w)≤Ein0+Ω(H)dvc= ...

  5. SVM学习笔记5-SMO

    首先拿出最后要求解的问题:$\underset{\alpha}{min}W(\alpha)=\frac{1}{2} \sum_{i,j=1}^{n}y^{(i)}y^{(j)}\alpha_{i}\a ...

  6. SVM学习笔记4-核函数和离群点的处理

    核函数在svm里,核函数是这样定义的.核函数是一个n*n(样本个数)的矩阵,其中:$K_{ij}=exp(-\frac{||x^{(i)}-x^{(j)}||^{2}}{2\sigma ^{2}})$ ...

  7. SVM学习笔记1-问题定义

    问题定义: 给出一些样本,包含两类.svm试图找到一个超平面,将数据分开,并且每种样本到超平面的距离的最小值最大. 输入样本:$\{x_{i},y_{i}| 1\leq i\leq n \}$,$y_ ...

  8. 机器学习6—SVM学习笔记

    机器学习牛人博客 机器学习实战之SVM 三种SVM的对偶问题 拉格朗日乘子法和KKT条件 支持向量机通俗导论(理解SVM的三层境界) 解密SVM系列(一):关于拉格朗日乘子法和KKT条件 解密SVM系 ...

  9. SVM学习笔记(二):什么是交叉验证

    交叉验证:拟合的好,同时预测也要准确 我们以K折交叉验证(k-folded cross validation)来说明它的具体步骤.{A1,A2,A3,A4,A5,A6,A7,A8,A9} 为了简化,取 ...

随机推荐

  1. 盘点十大最流行的Linux服务器发行版

    随着Linux不断发展,Linux所支持的文件系统类型也在迅速扩充.很多的数据中心服务器上都运行着Linux,可以节省大量的许可证费用及维护费用.但伴随着Linux新版本的发行,其中每一个不同版本的L ...

  2. ACTIVITI 源码研究之命令模式执行

    ACTIVITI 是一个优秀开源软件,通过阅读源码,我们不但可以了解工作流引擎执行的原理还可以增加个人的编码功力. ACTIVITI 所有执行过程都是采用命令模式进行执行. 本文主要描述流程引擎数据保 ...

  3. bzoj3594: [Scoi2014]方伯伯的玉米田

    dp新优化姿势... 首先,当我们拔高时,一定右端点是n最优.因为如果右端点是r,相当于降低了r之后玉米的高度.显然n更优. 那么可以dp.dp[i][j]表示前i个拔高j次的LIS.dp[i][j] ...

  4. How to setup SVN?

    2014-01-08 11:43:50 如何简单设置SVN(前提是SVN已经安装) 1. 创建一个目录: mkdir -p ~/svn/2.1.J.1.1 2. 进入新创建的目录: cd svn/2. ...

  5. C++封装库

    1.新建项目 -> Win32项目    选择DLL , 勾选 空项目 , 点击完成. 2.本例程,使用一个CPP文件 , 及一个头文件. 其中头文件包含函数声明,CPP文件实现函数声明. 3. ...

  6. 使用jsTree动态加载节点

    因为项目的需要,需要做一个树状菜单,并且节点是动态加载的,也就是只要点击父节点,就会加载该节点下的子节点. 大致的效果实现如下图: 以上的实现就是通过jsTree实现的,一个基于JQuery的树状菜单 ...

  7. Linux摄像头驱动学习之:(二)通过虚拟驱动vivi分析摄像头驱动

    一.通过指令 "strace -o xawtv.log xawtv" 得到以下调用信息:// 1~7都是在v4l2_open里调用1. open2. ioctl(4, VIDIOC ...

  8. 压力测试工具——Galting

    为什么要写Gatling呢?网上已经有一些介绍Gatling的好文章了,比如两位TW同事的文章,可以看这里(我知道Gatling也是因为这位作者介绍的),还有这里.主要是因为最近在使用Gatling做 ...

  9. [转][C/C++]函数名字修饰(Decorated Name)方式

    1.C/C++函数修饰名: 对于我们的C/C++源程序而言,函数名只是函数的一小部分,函数还有调用方式(参数入栈方式).返回值类型.参数个数和各参数类型等信息,对于C++类成员函数,还有更多信息.这些 ...

  10. [Windows驱动]流媒体驱动开发

    从Windows98开始,Windows流媒体驱动遵循Windows Driver Model(WDM)模型并使用Kernel Streaming(KS)组件.Kernel Streaming(KS) ...