第七章 支持向量机(第4节 序列最小最优化算法 第2,3小节)

2.变量的选择方法

SMO算法在每个子问题中选择两个变量进行优化,其中至少一个变量是违反KKT条件的。

这一小节,将告诉我们,到底选取哪两个变量最合适?也就是说,选择的标准是什么?

我们将这一小节分三步来讲:第一步,如何选择第一个变量?第二步,如何选择第二个变量?第三步,更新阈值 b 和差值 E_i

(1)第1个变量的选择

SMO称选择第1个变量的过程为外层循环。

外层循环在训练样本中选取违反KKT条件最严重的样本点,并将其对应的变量作为第1个变量。具体地,检验训练样本点 (x_i,y_i) 是否满足KKT条件,即

\alpha_i=0\Leftrightarrow y_ig(x_i)\ge 1

0<\alpha_i<C \Leftrightarrow y_ig(x_i)= 1

\alpha_i=C\Leftrightarrow y_ig(x_i)\le1

其中, g(x_i)=\sum_{j=1}^N\alpha_jy_jK(x_i,x_j)+b

该检验是在 \varepsilon 范围内进行的。在检验过程中,外层循环首先遍历所有满足条件 0<\alpha_i<C 的样本点,即在间隔边界上的支持向量点,检验它们是否满足KKT条件。如果这些样本点都满足KKT条件,那么遍历整个训练集,检验它们是否满足KKT条件。

(2)第2个变量的选择

SMO称选择第2个变量的过程为内层循环。

假设在外层循环中已经找到第1个变量 \alpha_1 ,现在要在内层循环中找到第2个变量 \alpha_2 。第2个变量选择的标准是希望能使 \alpha_2足够大的变化

由上一小节内容,我们知道, \alpha_2^{new} 是依赖于 |E_1,E_2| 的,为了加快计算速度,一种简单地做法是选择 \alpha_2 ,使其对应的 |E_1,E_2| 最大。因为 \alpha_1 已定, E_1 也确定了。由于 E_i 取值可正可负,故如果 E_1 是正的,那么选择最小的 E_i 作为 E_2 ;如果 E_1 是负的,那么选择最大的 E_i 作为 E_2

特殊情况下,如果内层循环通过以上方法选择的 \alpha_2 不能使目标函数有足够的下降,那么采用以下启发式规则继续选择 \alpha_2 。——遍历在间隔边界上的支持向量点,一次将其对应的变量作为 \alpha_2 试用,直到目标函数有足够的下降。如果遍历完了所有的支持向量点,仍然找不到合适的 \alpha_2 ,那么遍历整个训练数据集;如果遍历整个数据集还找不到,则放弃第1个 \alpha_1 ,再通过外层循环重新寻求另外的 \alpha_1

(3)计算阈值 b 和差值 E_i

经过前两步,我们选择了合适的两个变量,然后用上一篇介绍的两个变量二次规划的求解方法,求出两个变量的最优解 \alpha_1^{new},\alpha_2^{new} 。每次完成两个变量的优化后,都要重新计算阈值 b ,进而再计算出对应的 E_i

0<\alpha_1^{new}<C 时,由KKT条件可知:

\sum_{i=1}^N\alpha_iy_iK_{i1}=y_1

于是,有

b_1^{new}=y_1-\sum_{i=3}^N\alpha_iy_iK_{i1}-\alpha_1^{new}y_1K_{11}-\alpha_2^{new}y_2K_{21}

而由 E_1 的定义式(参考上一篇)可得,未更新的 E_1 满足:

E_1=\sum_{i=3}^N\alpha_iy_iK_{i1}+\alpha_1^{old}y_1K_{11}+\alpha_2^{old}y_2K_{21}+b^{old}-y_1

上式可以写成:

y_1-\sum_{i=3}^N\alpha_iy_iK_{i1}=-E_1+\alpha_1^{old}y_1K_{11}+\alpha_2^{old}y_2K_{21}+b^{old}

带入到上面 b_1^{new} 的表达式中,可得:

b_1^{new}=-E_1-y_1K_{11}(\alpha_1^{new}-\alpha_1^{old})-y_2K_{21}(\alpha_2^{new}-\alpha_2^{old})+b^{old}

同样,如果 0<\alpha_2^{new}<C ,那么:

b_2^{new}=-E_2-y_1K_{12}(\alpha_1^{new}-\alpha_1^{old})-y_2K_{22}(\alpha_2^{new}-\alpha_2^{old})+b^{old}

如果 \alpha_1^{new},\alpha_2^{new} 同时满足条件 0<\alpha_i^{new}<C,i=1,2 ,那么 b_1^{new}=b_2^{new}

如果 \alpha_1^{new},\alpha_2^{new} 是0或者是 C ,那么 b_1^{new}和b_2^{new} 以及它们之间的数都是符合KKT条件的阈值,这时选择它们的中点作为 b^{new}

上面就完成了阈值 b 的更新。还必须更新对应的 E_i 值。 E_i 值的更新需要用到 b^{new} 值,以及所有支持向量对应的 \alpha_j :

E_i^{new}=\sum_Sy_j\alpha_jK(x_i,x_j)+b^{new}-y_i

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

3.SMO算法

输入:训练数据集 T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} ,其中, x_i\in X=R^ny_i\in Y=\{-1,+1\}i=1,2,..,N ,精度 \varepsilon

输出:近似解 \tilde{\alpha}

(1)取初值 \alpha^{(0)}=0 ,令 k=0

(2)选取优化变量 \alpha_1^{(k)},\alpha_2^{(k)} ,解析求解两个变量的最优化问题(按照上一篇所述的两个变量二次规划的求解方法求解),求得最优解 \alpha_1^{(k+1)},\alpha_2^{(k+1)} ,更新 \alpha\alpha^{(k+1)}

(3)若在精度 \varepsilon 范围内满足停机条件:

其中, g(x_i)=\sum_{j=1}^N\alpha_jy_jK(x_j,x_i)+b

则转(4);否则令 k=k+1 ,转(2);

(4)取 \tilde{\alpha}=\alpha^{(k+1)}

如果从前面顺着看到了这里,相信不难理解的~当然可能是因为我之前也学习过,如果那里有疑问,直接百度博客知乎哈~

到此,第3重境界也修炼好了,SVM心法很强大,恭喜你等级达到了——宗师

发布于 2019-08-20

文章被以下专栏收录