转自http://www.cnblogs.com/pinard/p/6111471.html
在SVM的前三篇里,我们优化的目标函数最终都是一个关于 α α向量的函数。而怎么极小化这个函数,求出对应的 α α向量,进而求出分离超平面我们没有讲。本篇就对优化这个关于 α α向量的函数的SMO算法做一个总结。
1. 回顾SVM优化目标函数
我们首先回顾下我们的优化目标函数:
我们的解要满足的KKT条件的对偶互补条件为:
根据这个KKT条件的对偶互补条件,我们有:
由于 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 ∗ ,则有:
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 都成了常量,所有的常量我们都从目标函数去除,这样我们上一节的目标优化函数变成下式:
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和H,我们也有限制条件如果是上面左图中的情况,则
如果是上面右图中的情况,我们有:
也就是说,假如我们通过求导得到的 α new,unc 2 ,则最终的 α new 2 应该为:
那么如何求出 α new,unc 2 呢?很简单,我们只需要将目标函数对 α 2 求偏导数即可。
首先我们整理下我们的目标函数。
为了简化叙述,我们令
其中 g(x) 就是我们在第一节里面的提到的
我们令
这样我们的优化目标函数进一步简化为:
由于 α 1 y 1 +α 2 y 2 =ς ,并且 y 2 i =1 ,可以得到 α 1 用α 2 表达的式子为:
将上式带入我们的目标优化函数,就可以消除 α 1 ,得到仅仅包含 α 2 的式子。
忙了半天,我们终于可以开始求 α new,unc 2 了,现在我们开始通过求偏导数来得到 α new,unc 2 。
整理上式有:
将 ς=α 1 y 1 +α 2 y 2 带入上式,我们有:
我们终于得到了 α new,unc 2 的表达式:
利用上面讲到的 α new,unc 2 和 α new 2 的关系式,我们就可以得到我们新的 α new 2 了。利用 α new 2 和 α new 1 的线性关系,我们也可以得到新的 α new 1 。
4. SMO算法两个变量的选择
SMO算法需要选择合适的两个变量做迭代,其余的变量做常量来进行优化,那么怎么选择这两个变量呢?
4.1 第一个变量的选择
SMO算法称选择第一个变量为外层循环,这个变量需要选择在训练集中违反KKT条件最严重的样本点。对于每个样本点,要满足的KKT条件我们在第一节已经讲到了:
一般来说,我们首先选择违反 0≤α ∗ i ≤C⇒y i g(x i )=1 这个条件的点。如果这些支持向量都满足KKT条件,再选择违反 α ∗ i =0⇒y i g(x i )≥1 和 α ∗ i =C⇒y i g(x i )≤1 的点。
4.2 第二个变量的选择
SMO算法称选择第二一个变量为内层循环,假设我们在外层循环已经找到了 α 1 , 第二个变量 α 2 的选择标准是让 |E1−E2| 有足够大的变化。由于 α 1 定了的时候, E 1 也确定了,所以要想 |E1−E2| 最大,只需要在 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 时,我们有
于是新的 b new 1 为:
计算出 E 1 为:
可以看到上两式都有 y 1 −∑ i=3 m α i y i K i1 ,因此可以将 b new 1 用 E 1 表示为:
同样的,如果 0≤α new 2 ≤C , 那么有:
最终的 b new 为:
得到了 b new 我们需要更新 E 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 。
3)按照下式求出 α k+1 2
4)利用 α k+1 2 和 α k+1 1 的关系求出 α k+1 1
5)按照4.3节的方法计算 b k+1 和 E i
6)在精度e范围内检查是否满足如下的终止条件:
7)如果满足则结束,返回 α k+1 ,否则转到步骤2)。
SMO算法终于写完了,这块在以前学的时候是非常痛苦的,不过弄明白就豁然开朗了。希望大家也是一样。写完这一篇, SVM系列就只剩下支持向量回归了,胜利在望!