SVM支持向量机原理(四)SMO算法原理

转自http://www.cnblogs.com/pinard/p/6111471.html


在SVM的前三篇里,我们优化的目标函数最终都是一个关于α α向量的函数。而怎么极小化这个函数,求出对应的α α向量,进而求出分离超平面我们没有讲。本篇就对优化这个关于α α向量的函数的SMO算法做一个总结。

1. 回顾SVM优化目标函数

    我们首先回顾下我们的优化目标函数:

min        α 12  i=1,j=1 m α i α j y i y j K(x i ,x j ) i=1 m α i  
s.t. i=1 m α i y i =0 
0α i C 

    我们的解要满足的KKT条件的对偶互补条件为:

α  i (y i (w  ϕ(x i )+b  )1)=0 

    根据这个KKT条件的对偶互补条件,我们有:

α  i =0y i (w  ϕ(x i )+b)1 
0α  i Cy i (w  ϕ(x i )+b)=1 
α  i =Cy i (w  ϕ(x i )+b)1 

     由于w  = j=1 m α  j y j ϕ(x j ) ,我们令g(x)=w  ϕ(x)+b= j=1 m α  j y j K(x,x j )+b   ,则有:

α  i =0y i g(x i )1 
0α  i Cy i g(x i )=1 
α  i =Cy i g(x i )1 

2. SMO算法的基本思想

    上面这个优化式子比较复杂,里面有m个变量组成的向量α 需要在目标函数极小化的时候求出。直接优化时很难的。SMO算法则采用了一种启发式的方法。它每次只优化两个变量,将其他的变量都视为常数。由于 i=1 m α i y i =0 .假如将α 3 ,α 4 ,...,α m      固定,那么α 1 ,α 2  之间的关系也确定了。这样SMO算法将一个复杂的优化算法转化为一个比较简单的两变量优化问题。

    为了后面表示方便,我们定义K ij =ϕ(x i )ϕ(x j ) 

    由于α 3 ,α 4 ,...,α m          都成了常量,所有的常量我们都从目标函数去除,这样我们上一节的目标优化函数变成下式:

min        α 1 ,α 1  12 K 11 α 2 1 +12 K 22 α 2 2 +y 1 y 2 K 12 α 1 α 2 (α 1 +α 2 )+y 1 α 1  i=3 m y i α i K i1 +y 2 α 2  i=3 m y i α i K i2  
s.t.α 1 y 1 +α 2 y 2 = i=3 m y i α i =ς 
0α i Ci=1,2 

3. SMO算法目标函数的优化

    为了求解上面含有这两个变量的目标优化问题,我们首先分析约束条件,所有的α 1 ,α 2  都要满足约束条件,然后在约束条件下求最小。

    根据上面的约束条件α 1 y 1 +α 2 y 2 =ς0α i Ci=1,2 ,又由于y 1 ,y 2  均只能取值1或者-1, 这样α 1 ,α 2  在[0,C]和[0,C]形成的盒子里面,并且两者的关系直线的斜率只能为1或者-1,也就是说α 1 ,α 2  的关系直线平行于[0,C]和[0,C]形成的盒子的对角线,如下图所示:

     由于α 1 ,α 2  的关系被限制在盒子里的一条线段上,所以两变量的优化问题实际上仅仅是一个变量的优化问题。不妨我们假设最终是α 2  的优化问题。由于我们采用的是启发式的迭代法,假设我们上一轮迭代得到的解是α old 1 ,α old 2  ,假设沿着约束方向α 2  未经剪辑的解是α new,unc 2  .本轮迭代完成后的解为α new 1 ,α new 2  

    由于α new 2  必须满足上图中的线段约束。假设L和H分别是上图中α new 2  所在的线段的边界。那么很显然我们有:

Lα new 2 H 

    而对于L和H,我们也有限制条件如果是上面左图中的情况,则

L=max(0,α old 2 α old 1 )H=min(C,C+α old 2 α old 1 ) 

    如果是上面右图中的情况,我们有:

L=max(0,α old 2 +α old 1 C)H=min(C,α old 2 +α old 1 ) 

     也就是说,假如我们通过求导得到的α new,unc 2  ,则最终的α new 2  应该为:

α new 2 =⎧ ⎩ ⎨ ⎪ ⎪ Hα new,unc 2 L Lα new,unc 2 >HLα new,unc 2 Hα new,unc 2 <L  
   

    那么如何求出α new,unc 2  呢?很简单,我们只需要将目标函数对α 2  求偏导数即可。

    首先我们整理下我们的目标函数。

    为了简化叙述,我们令

E i =g(x i )y i = j=1 m α  j y j K(x i ,x j )+by i  

    其中g(x) 就是我们在第一节里面的提到的

g(x)=w  ϕ(x)+b= j=1 m α  j y j K(x,x j )+b   

    我们令

v i = i=3 m y j α j K(x i ,x j )=g(x i ) i=1 2 y j α j K(x i ,x j )b 

    这样我们的优化目标函数进一步简化为:

W(α 1 ,α 2 )=12 K 11 α 2 1 +12 K 22 α 2 2 +y 1 y 2 K 12 α 1 α 2 (α 1 +α 2 )+y 1 α 1 v 1 +y 2 α 2 v 2  

    由于α 1 y 1 +α 2 y 2 =ς ,并且y 2 i =1 ,可以得到α 1 α 2  表达的式子为:

α 1 =y 1 (ςα 2 y 2 ) 

    将上式带入我们的目标优化函数,就可以消除α 1  ,得到仅仅包含α 2  的式子。

W(α 2 )=12 K 11 (ςα 2 y 2 ) 2 +12 K 22 α 2 2 +y 2 K 12 (ςα 2 y 2 )α 2 (α 1 +α 2 )+(ςα 2 y 2 )v 1 +y 2 α 2 v 2  

    忙了半天,我们终于可以开始求α new,unc 2  了,现在我们开始通过求偏导数来得到α new,unc 2  

Wα 2  =K 11 α 2 +K 22 α 2 2K 12 α 2 K 11 ςy 2 +K 12 ςy 2 +y 1 y 2 1v 1 y 2 +y 2 v 2 =0 

    整理上式有:

(K 11 +K 22 2K 12 )α 2 =y 2 (y 2 y 1 +ςK 11 ςK 12 +v 1 v 2 ) 

=y 2 (y 2 y 1 +ςK 11 ςK 12 +(g(x 1 ) j=1 2 y j α j K 1j b)(g(x 2 ) j=1 2 y j α j K 2j b)) 

    将ς=α 1 y 1 +α 2 y 2  带入上式,我们有:

(K 11 +K 22 2K 12 )α new,unc 2 =y 2 ((K 11 +K 22 2K 12 )α old 2 y 2 +y 2 y 1 +g(x 1 )g(x 2 )) 

=(K 11 +K 22 2K 12 )α old 2 +y2(E 1 E 2 ) 

    我们终于得到了α new,unc 2  的表达式:

α new,unc 2 =α old 2 +y2(E 1 E 2 )K 11 +K 22 2K 12 )  

    利用上面讲到的α new,unc 2  α new 2  的关系式,我们就可以得到我们新的α new 2  了。利用α new 2  α new 1  的线性关系,我们也可以得到新的α new 1  

4. SMO算法两个变量的选择

    SMO算法需要选择合适的两个变量做迭代,其余的变量做常量来进行优化,那么怎么选择这两个变量呢?

4.1 第一个变量的选择

    SMO算法称选择第一个变量为外层循环,这个变量需要选择在训练集中违反KKT条件最严重的样本点。对于每个样本点,要满足的KKT条件我们在第一节已经讲到了: 

α  i =0y i g(x i )1 
0α  i Cy i g(x i )=1 
α  i =Cy i g(x i )1 

    一般来说,我们首先选择违反0α  i Cy i g(x i )=1 这个条件的点。如果这些支持向量都满足KKT条件,再选择违反α  i =0y i g(x i )1  和 α  i =Cy i g(x i )1 的点。

4.2 第二个变量的选择

     SMO算法称选择第二一个变量为内层循环,假设我们在外层循环已经找到了α 1  , 第二个变量α 2  的选择标准是让|E1E2| 有足够大的变化。由于α 1  定了的时候,E 1  也确定了,所以要想|E1E2| 最大,只需要在E 1  为正时,选择最小的E i  作为E 2  , 在E 1  为负时,选择最大的E i  作为E 2  ,可以将所有的E i  保存下来加快迭代。

    如果内存循环找到的点不能让目标函数有足够的下降, 可以采用遍历支持向量点来做α 2  ,直到目标函数有足够的下降, 如果所有的支持向量做α 2  都不能让目标函数有足够的下降,可以跳出循环,重新选择α 1   

4.3 计算阈值b和差值E i   

    在每次完成两个变量的优化之后,需要重新计算阈值b。当0α new 1 C   时,我们有

y 1  i=1 m α i y i K i1 b 1 =0 

    于是新的b new 1  为:

b new 1 =y 1  i=3 m α i y i K i1 α new 1 y 1 K 11 α new 2 y 2 K 21  

    计算出E 1  为:

E 1 =g(x 1 )y 1 = i=3 m α i y i K i1 +α old 1 y 1 K 11 +α old 2 y 2 K 21 +b old y 1  

    可以看到上两式都有y 1  i=3 m α i y i K i1  ,因此可以将b new 1  E 1  表示为:

b new 1 =E 1 y 1 K 11 (α new 1 α old 1 )y 2 K 21 (α new 2 α old 2 )+b old  

    同样的,如果0α new 2 C , 那么有:

b new 2 =E 2 y 1 K 12 (α new 1 α old 1 )y 2 K 22 (α new 2 α old 2 )+b old  

    最终的b new  为:

b new =b new 1 +b new 2 2  

    得到了b new  我们需要更新E i  :

E i = S y j α j K(x i ,x j )+b new y i  

    其中,S是所有支持向量x j  的集合。

    好了,SMO算法基本讲完了,我们来归纳下SMO算法。

5. SMO算法总结

    输入是m个样本(x 1 ,y 1 ),(x 2 ,y 2 ),...,(x m ,y m ), ,                其中x为n维特征向量。y为二元输出,值为1,或者-1.精度e。

    输出是近似解α 

    1)取初值α 0 =0,k=0 

    2)按照4.1节的方法选择α k 1  ,接着按照4.2节的方法选择α k 2  ,求出新的α new,unc 2  

α new,unc 2 =α k 2 +y 2 (E 1 E 2 )K 11 +K 22 2K 12 )  

    3)按照下式求出α k+1 2  

α k+1 2 =⎧ ⎩ ⎨ ⎪ ⎪ Hα new,unc 2 L Lα new,unc 2 >HLα new,unc 2 Hα new,unc 2 <L  

    4)利用α k+1 2  α k+1 1  的关系求出α k+1 1  

    5)按照4.3节的方法计算b k+1  E i  

    6)在精度e范围内检查是否满足如下的终止条件:

 i=1 m α i y i =0 
0α i C,i=1,2...m 
α k+1 i =0y i g(x i )1 
0α k+1 i Cy i g(x i )=1 
α k+1 i =Cy i g(x i )1 

    7)如果满足则结束,返回α k+1  ,否则转到步骤2)。

 

    SMO算法终于写完了,这块在以前学的时候是非常痛苦的,不过弄明白就豁然开朗了。希望大家也是一样。写完这一篇, SVM系列就只剩下支持向量回归了,胜利在望!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章