支持向量机SVM(五)
2016-04-03 11:51
295 查看
11 SMO优化算法(Sequential minimal optimization)
SMO算法由Microsoft Research的John C. Platt在1998年提出,并成为最快的二次规划优化算法,特别针对线性SVM和数据稀疏时性能更优。关于SMO最好的资料就是他本人写的《Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machines》了。
我拜读了一下,下面先说讲义上对此方法的总结。
首先回到我们前面一直悬而未解的问题,对偶函数最后的优化问题:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042433179.png)
要解决的是在参数
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042445098.png)
上求最大值W的问题,至于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042441095.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042451868.png)
都是已知数。C由我们预先设定,也是已知数。
按照坐标上升的思路,我们首先固定除
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042467866.png)
以外的所有参数,然后在
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042477767.png)
上求极值。等一下,这个思路有问题,因为如果固定
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042482128.png)
以外的所有参数,那么
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042496522.png)
将不再是变量(可以由其他值推出),因为问题中规定了
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042495060.png)
因此,我们需要一次选取两个参数做优化,比如
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042503009.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042516847.png)
,此时
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042529256.png)
可以由
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042534697.png)
和其他参数表示出来。这样回带到W中,W就只是关于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042556418.png)
的函数了,可解。
这样,SMO的主要步骤如下:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204257680.png)
意思是,第一步选取一对
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042584169.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042582118.png)
,选取方法使用启发式方法(后面讲)。第二步,固定除
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204259383.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043006380.png)
之外的其他参数,确定W极值条件下的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043016314.png)
,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204302675.png)
由
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043036672.png)
表示。
SMO之所以高效就是因为在固定其他参数后,对一个参数优化过程很高效。
下面讨论具体方法:
假设我们选取了初始值
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043033051.png)
满足了问题中的约束条件。接下来,我们固定
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043038001.png)
,这样W就是
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043042395.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043058393.png)
的函数。并且
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043066342.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043072655.png)
满足条件:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043073145.png)
由于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204308604.png)
都是已知固定值,因此为了方面,可将等式右边标记成实数值
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043086950.png)
。
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043093536.png)
当
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043107897.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043102258.png)
异号时,也就是一个为1,一个为-1时,他们可以表示成一条直线,斜率为1。如下图:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204311764.png)
横轴是
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043124253.png)
,纵轴是
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043165776.png)
,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043177661.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043185610.png)
既要在矩形方框内,也要在直线上,因此
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043181117.png)
,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043183036.png)
同理,当
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043192937.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204320886.png)
同号时,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204321853.png)
,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043212772.png)
然后我们打算将
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043229085.png)
用
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043232607.png)
表示:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043233097.png)
然后反代入W中,得
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043246935.png)
展开后W可以表示成
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043248854.png)
。其中a,b,c是固定值。这样,通过对W进行求导可以得到
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043251263.png)
,然而要保证
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043265624.png)
满足
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043262767.png)
,我们使用
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043273050.png)
表示求导求出来的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043277652.png)
,然而最后的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043285949.png)
,要根据下面情况得到:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043299471.png)
这样得到
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043294945.png)
后,我们可以得到
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043304846.png)
的新值
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043311159.png)
。
下面进入Platt的文章,来找到启发式搜索的方法和求b值的公式。
这边文章使用的符号表示有点不太一样,不过实质是一样的,先来熟悉一下文章中符号的表示。
文章中定义特征到结果的输出函数为
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043321649.png)
与我们之前的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043325520.png)
实质是一致的。
原始的优化问题为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043337406.png)
求导得到:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043338976.png)
经过对偶后为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043347274.png)
s.t.
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043349400.png)
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043356303.png)
这里与W函数是一样的,只是符号求反后,变成求最小值了。
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043363728.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043361677.png)
是一样的,都表示第i个样本的输出结果(1或-1)。
经过加入松弛变量
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043371578.png)
后,模型修改为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043383464.png)
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204339366.png)
由公式(7)代入(1)中可知,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204339857.png)
这个过程和之前对偶过程一样。
重新整理我们要求的问题为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043419056.png)
与之对应的KKT条件为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043416166.png)
这个KKT条件说明,在两条间隔线外面的点,对应前面的系数
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043424115.png)
为0,在两条间隔线里面的对应
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043436001.png)
为C,在两条间隔线上的对应的系数
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204344362.png)
在0和C之间。
将我们之前得到L和H重新拿过来:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043442247.png)
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043457198.png)
之前我们将问题进行到这里,然后说将
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043465147.png)
用
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043465081.png)
表示后代入W中,这里将代入
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204347522.png)
中,得
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043487391.jpg)
其中
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043495373.png)
这里的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043509734.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043513539.png)
代表某次迭代前的原始值,因此是常数,而
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043522568.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043538881.png)
是变量,待求。公式(24)中的最后一项是常数。
由于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043546830.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043541191.png)
满足以下公式
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043558093.png)
因为
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043559140.png)
的值是固定值,在迭代前后不会变。
那么用s表示
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043562662.png)
,上式两边乘以
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043572596.png)
时,变为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043577862.png)
其中
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043582497.png)
代入(24)中,得
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043582431.png)
这时候只有
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204359728.png)
是变量了,求导
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043599790.jpg)
如果
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044009691.png)
的二阶导数大于0(凹函数),那么一阶导数为0时,就是极小值了。
假设其二阶导数为0(一般成立),那么上式化简为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044016037.png)
将w和v代入后,继续化简推导,得(推导了六七行推出来了)
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044022383.jpg)
我们使用
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044025349.png)
来表示:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044062477.png)
通常情况下目标函数是正定的,也就是说,能够在直线约束方向上求得最小值,并且
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044078475.png)
。
那么我们在(30)两边都除以
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044077852.png)
可以得到
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044083326.png)
这里我们使用
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044093260.png)
表示优化后的值,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044091558.png)
是迭代前的值,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044107065.png)
。
与之前提到的一样
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044106126.png)
不是最终迭代后的值,需要进行约束:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044119964.png)
那么
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044126866.png)
在特殊情况下,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204413355.png)
可能不为正,如果核函数K不满足Mercer定理,那么目标函数可能变得非正定,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044132765.png)
可能出现负值。即使K是有效的核函数,如果训练样本中出现相同的特征x,那么
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044148762.png)
仍有可能为0。SMO算法在
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044151487.png)
不为正值的情况下仍有效。为保证有效性,我们可以推导出
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044166994.png)
就是
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044178531.png)
的二阶导数,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044176795.png)
,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044184745.png)
没有极小值,最小值在边缘处取到(类比
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044192694.png)
),
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044203467.png)
时更是单调函数了,最小值也在边缘处取得,而
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044219987.png)
的边缘就是L和H。这样将
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044227969.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044228252.png)
分别代入
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044231774.png)
中即可求得
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044231708.png)
的最小值,相应的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044249657.png)
还是
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044257955.png)
也可以知道了。具体计算公式如下:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044278313.jpg)
至此,迭代关系式出了b的推导式以外,都已经推出。
b每一步都要更新,因为前面的KKT条件指出了
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044289850.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044283688.png)
的关系,而
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044297559.png)
和b有关,在每一步计算出
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044305508.png)
后,根据KKT条件来调整b。
b的更新有几种情况:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044327752.jpg)
来自罗林开的ppt
这里的界内指
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044323259.png)
,界上就是等于0或者C了。
前面两个的公式推导可以根据
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044333749.png)
和对于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044335668.png)
有
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044341142.png)
的KKT条件推出。
这样全部参数的更新公式都已经介绍完毕,附加一点,如果使用的是线性核函数,我们就可以继续使用w了,这样不用扫描整个样本库来作内积了。
w值的更新方法为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044351076.png)
根据前面的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044356550.png)
公式推导出。
12 SMO中拉格朗日乘子的启发式选择方法
终于到了最后一个问题了,所谓的启发式选择方法主要思想是每次选择拉格朗日乘子的时候,优先选择样本前面系数
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044366832.png)
的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044372273.png)
作优化(论文中称为无界样例),因为在界上(
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044385762.png)
为0或C)的样例对应的系数
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044384060.png)
一般不会更改。
这条启发式搜索方法是选择第一个拉格朗日乘子用的,比如前面的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044392009.png)
。那么这样选择的话,是否最后会收敛。可幸的是Osuna定理告诉我们只要选择出来的两个
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044409958.png)
中有一个违背了KKT条件,那么目标函数在一步迭代后值会减小。违背KKT条件不代表
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044405465.png)
,在界上也有可能会违背。是的,因此在给定初始值
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044415399.png)
=0后,先对所有样例进行循环,循环中碰到违背KKT条件的(不管界上还是界内)都进行迭代更新。等这轮过后,如果没有收敛,第二轮就只针对
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044417318.png)
的样例进行迭代更新。
在第一个乘子选择后,第二个乘子也使用启发式方法选择,第二个乘子的迭代步长大致正比于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044422824.png)
,选择第二个乘子能够最大化
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044429170.png)
。即当
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044431023.png)
为正时选择负的绝对值最大的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204444118.png)
,反之,选择正值最大的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/2011031820444452.png)
。
最后的收敛条件是在界内(
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044455559.png)
)的样例都能够遵循KKT条件,且其对应的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044467412.png)
只在极小的范围内变动。
至于如何写具体的程序,请参考John C. Platt在论文中给出的伪代码。
13 总结
这份SVM的讲义重点概括了SVM的基本概念和基本推导,中规中矩却又让人醍醐灌顶。起初让我最头疼的是拉格朗日对偶和SMO,后来逐渐明白拉格朗日对偶的重要作用是将w的计算提前并消除w,使得优化函数变为拉格朗日乘子的单一参数优化问题。而SMO里面迭代公式的推导也着实让我花费了不少时间。
对比这么复杂的推导过程,SVM的思想确实那么简单。它不再像logistic回归一样企图去拟合样本点(中间加了一层sigmoid函数变换),而是就在样本中去找分隔线,为了评判哪条分界线更好,引入了几何间隔最大化的目标。
之后所有的推导都是去解决目标函数的最优化上了。在解决最优化的过程中,发现了w可以由特征向量内积来表示,进而发现了核函数,仅需要调整核函数就可以将特征进行低维到高维的变换,在低维上进行计算,实质结果表现在高维上。由于并不是所有的样本都可分,为了保证SVM的通用性,进行了软间隔的处理,导致的结果就是将优化问题变得更加复杂,然而惊奇的是松弛变量没有出现在最后的目标函数中。最后的优化求解问题,也被拉格朗日对偶和SMO算法化解,使SVM趋向于完美。
另外,其他很多议题如SVM背后的学习理论、参数选择问题、二值分类到多值分类等等还没有涉及到,以后有时间再学吧。其实朴素贝叶斯在分类二值分类问题时,如果使用对数比,那么也算作线性分类器。
SMO算法由Microsoft Research的John C. Platt在1998年提出,并成为最快的二次规划优化算法,特别针对线性SVM和数据稀疏时性能更优。关于SMO最好的资料就是他本人写的《Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machines》了。
我拜读了一下,下面先说讲义上对此方法的总结。
首先回到我们前面一直悬而未解的问题,对偶函数最后的优化问题:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042433179.png)
要解决的是在参数
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042445098.png)
上求最大值W的问题,至于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042441095.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042451868.png)
都是已知数。C由我们预先设定,也是已知数。
按照坐标上升的思路,我们首先固定除
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042467866.png)
以外的所有参数,然后在
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042477767.png)
上求极值。等一下,这个思路有问题,因为如果固定
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042482128.png)
以外的所有参数,那么
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042496522.png)
将不再是变量(可以由其他值推出),因为问题中规定了
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042495060.png)
因此,我们需要一次选取两个参数做优化,比如
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042503009.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042516847.png)
,此时
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042529256.png)
可以由
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042534697.png)
和其他参数表示出来。这样回带到W中,W就只是关于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042556418.png)
的函数了,可解。
这样,SMO的主要步骤如下:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204257680.png)
意思是,第一步选取一对
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042584169.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182042582118.png)
,选取方法使用启发式方法(后面讲)。第二步,固定除
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204259383.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043006380.png)
之外的其他参数,确定W极值条件下的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043016314.png)
,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204302675.png)
由
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043036672.png)
表示。
SMO之所以高效就是因为在固定其他参数后,对一个参数优化过程很高效。
下面讨论具体方法:
假设我们选取了初始值
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043033051.png)
满足了问题中的约束条件。接下来,我们固定
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043038001.png)
,这样W就是
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043042395.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043058393.png)
的函数。并且
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043066342.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043072655.png)
满足条件:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043073145.png)
由于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204308604.png)
都是已知固定值,因此为了方面,可将等式右边标记成实数值
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043086950.png)
。
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043093536.png)
当
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043107897.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043102258.png)
异号时,也就是一个为1,一个为-1时,他们可以表示成一条直线,斜率为1。如下图:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204311764.png)
横轴是
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043124253.png)
,纵轴是
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043165776.png)
,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043177661.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043185610.png)
既要在矩形方框内,也要在直线上,因此
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043181117.png)
,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043183036.png)
同理,当
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043192937.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204320886.png)
同号时,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204321853.png)
,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043212772.png)
然后我们打算将
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043229085.png)
用
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043232607.png)
表示:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043233097.png)
然后反代入W中,得
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043246935.png)
展开后W可以表示成
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043248854.png)
。其中a,b,c是固定值。这样,通过对W进行求导可以得到
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043251263.png)
,然而要保证
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043265624.png)
满足
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043262767.png)
,我们使用
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043273050.png)
表示求导求出来的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043277652.png)
,然而最后的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043285949.png)
,要根据下面情况得到:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043299471.png)
这样得到
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043294945.png)
后,我们可以得到
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043304846.png)
的新值
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043311159.png)
。
下面进入Platt的文章,来找到启发式搜索的方法和求b值的公式。
这边文章使用的符号表示有点不太一样,不过实质是一样的,先来熟悉一下文章中符号的表示。
文章中定义特征到结果的输出函数为
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043321649.png)
与我们之前的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043325520.png)
实质是一致的。
原始的优化问题为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043337406.png)
求导得到:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043338976.png)
经过对偶后为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043347274.png)
s.t.
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043349400.png)
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043356303.png)
这里与W函数是一样的,只是符号求反后,变成求最小值了。
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043363728.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043361677.png)
是一样的,都表示第i个样本的输出结果(1或-1)。
经过加入松弛变量
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043371578.png)
后,模型修改为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043383464.png)
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204339366.png)
由公式(7)代入(1)中可知,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204339857.png)
这个过程和之前对偶过程一样。
重新整理我们要求的问题为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043419056.png)
与之对应的KKT条件为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043416166.png)
这个KKT条件说明,在两条间隔线外面的点,对应前面的系数
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043424115.png)
为0,在两条间隔线里面的对应
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043436001.png)
为C,在两条间隔线上的对应的系数
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204344362.png)
在0和C之间。
将我们之前得到L和H重新拿过来:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043442247.png)
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043457198.png)
之前我们将问题进行到这里,然后说将
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043465147.png)
用
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043465081.png)
表示后代入W中,这里将代入
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204347522.png)
中,得
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043487391.jpg)
其中
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043495373.png)
这里的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043509734.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043513539.png)
代表某次迭代前的原始值,因此是常数,而
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043522568.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043538881.png)
是变量,待求。公式(24)中的最后一项是常数。
由于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043546830.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043541191.png)
满足以下公式
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043558093.png)
因为
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043559140.png)
的值是固定值,在迭代前后不会变。
那么用s表示
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043562662.png)
,上式两边乘以
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043572596.png)
时,变为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043577862.png)
其中
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043582497.png)
代入(24)中,得
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043582431.png)
这时候只有
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204359728.png)
是变量了,求导
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182043599790.jpg)
如果
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044009691.png)
的二阶导数大于0(凹函数),那么一阶导数为0时,就是极小值了。
假设其二阶导数为0(一般成立),那么上式化简为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044016037.png)
将w和v代入后,继续化简推导,得(推导了六七行推出来了)
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044022383.jpg)
我们使用
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044025349.png)
来表示:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044062477.png)
通常情况下目标函数是正定的,也就是说,能够在直线约束方向上求得最小值,并且
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044078475.png)
。
那么我们在(30)两边都除以
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044077852.png)
可以得到
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044083326.png)
这里我们使用
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044093260.png)
表示优化后的值,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044091558.png)
是迭代前的值,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044107065.png)
。
与之前提到的一样
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044106126.png)
不是最终迭代后的值,需要进行约束:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044119964.png)
那么
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044126866.png)
在特殊情况下,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204413355.png)
可能不为正,如果核函数K不满足Mercer定理,那么目标函数可能变得非正定,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044132765.png)
可能出现负值。即使K是有效的核函数,如果训练样本中出现相同的特征x,那么
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044148762.png)
仍有可能为0。SMO算法在
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044151487.png)
不为正值的情况下仍有效。为保证有效性,我们可以推导出
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044166994.png)
就是
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044178531.png)
的二阶导数,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044176795.png)
,
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044184745.png)
没有极小值,最小值在边缘处取到(类比
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044192694.png)
),
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044203467.png)
时更是单调函数了,最小值也在边缘处取得,而
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044219987.png)
的边缘就是L和H。这样将
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044227969.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044228252.png)
分别代入
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044231774.png)
中即可求得
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044231708.png)
的最小值,相应的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044249657.png)
还是
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044257955.png)
也可以知道了。具体计算公式如下:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044278313.jpg)
至此,迭代关系式出了b的推导式以外,都已经推出。
b每一步都要更新,因为前面的KKT条件指出了
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044289850.png)
和
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044283688.png)
的关系,而
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044297559.png)
和b有关,在每一步计算出
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044305508.png)
后,根据KKT条件来调整b。
b的更新有几种情况:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044327752.jpg)
来自罗林开的ppt
这里的界内指
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044323259.png)
,界上就是等于0或者C了。
前面两个的公式推导可以根据
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044333749.png)
和对于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044335668.png)
有
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044341142.png)
的KKT条件推出。
这样全部参数的更新公式都已经介绍完毕,附加一点,如果使用的是线性核函数,我们就可以继续使用w了,这样不用扫描整个样本库来作内积了。
w值的更新方法为:
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044351076.png)
根据前面的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044356550.png)
公式推导出。
12 SMO中拉格朗日乘子的启发式选择方法
终于到了最后一个问题了,所谓的启发式选择方法主要思想是每次选择拉格朗日乘子的时候,优先选择样本前面系数
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044366832.png)
的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044372273.png)
作优化(论文中称为无界样例),因为在界上(
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044385762.png)
为0或C)的样例对应的系数
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044384060.png)
一般不会更改。
这条启发式搜索方法是选择第一个拉格朗日乘子用的,比如前面的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044392009.png)
。那么这样选择的话,是否最后会收敛。可幸的是Osuna定理告诉我们只要选择出来的两个
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044409958.png)
中有一个违背了KKT条件,那么目标函数在一步迭代后值会减小。违背KKT条件不代表
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044405465.png)
,在界上也有可能会违背。是的,因此在给定初始值
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044415399.png)
=0后,先对所有样例进行循环,循环中碰到违背KKT条件的(不管界上还是界内)都进行迭代更新。等这轮过后,如果没有收敛,第二轮就只针对
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044417318.png)
的样例进行迭代更新。
在第一个乘子选择后,第二个乘子也使用启发式方法选择,第二个乘子的迭代步长大致正比于
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044422824.png)
,选择第二个乘子能够最大化
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044429170.png)
。即当
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044431023.png)
为正时选择负的绝对值最大的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/20110318204444118.png)
,反之,选择正值最大的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/2011031820444452.png)
。
最后的收敛条件是在界内(
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044455559.png)
)的样例都能够遵循KKT条件,且其对应的
![](http://images.cnblogs.com/cnblogs_com/jerrylead/201103/201103182044467412.png)
只在极小的范围内变动。
至于如何写具体的程序,请参考John C. Platt在论文中给出的伪代码。
13 总结
这份SVM的讲义重点概括了SVM的基本概念和基本推导,中规中矩却又让人醍醐灌顶。起初让我最头疼的是拉格朗日对偶和SMO,后来逐渐明白拉格朗日对偶的重要作用是将w的计算提前并消除w,使得优化函数变为拉格朗日乘子的单一参数优化问题。而SMO里面迭代公式的推导也着实让我花费了不少时间。
对比这么复杂的推导过程,SVM的思想确实那么简单。它不再像logistic回归一样企图去拟合样本点(中间加了一层sigmoid函数变换),而是就在样本中去找分隔线,为了评判哪条分界线更好,引入了几何间隔最大化的目标。
之后所有的推导都是去解决目标函数的最优化上了。在解决最优化的过程中,发现了w可以由特征向量内积来表示,进而发现了核函数,仅需要调整核函数就可以将特征进行低维到高维的变换,在低维上进行计算,实质结果表现在高维上。由于并不是所有的样本都可分,为了保证SVM的通用性,进行了软间隔的处理,导致的结果就是将优化问题变得更加复杂,然而惊奇的是松弛变量没有出现在最后的目标函数中。最后的优化求解问题,也被拉格朗日对偶和SMO算法化解,使SVM趋向于完美。
另外,其他很多议题如SVM背后的学习理论、参数选择问题、二值分类到多值分类等等还没有涉及到,以后有时间再学吧。其实朴素贝叶斯在分类二值分类问题时,如果使用对数比,那么也算作线性分类器。
相关文章推荐
- 2016年网易春招软件测试实习生面试
- [转] 记住这14条 关键时刻可以救命!学着保护好自己!
- memset函数
- web进修之—Hibernate 继承映射(5)
- 支持向量机SVM(四)
- Python Discuz 7.2 faq.php 注入漏洞全自动利用工具
- jquery uploadify在IE上传报406HttpError
- NumPy学习笔记
- sublime中输入法输入框只能在一个位置
- Otto使用记录
- 支持向量机SVM(三)
- 解析XML:DOM,SAX,PULL
- iOS开发总结之项目开发中使用UITableView几百行代码搞定级联表格
- pandas学习笔记
- c语言下的通用数据库接口(之sqlite消化,模拟c#,java的反射)
- 输入字符,输出字符时加行号
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- NumPy学习笔记
- 1035 Lunch Rush (水题)