2.变量的选择方法
SMO算法在每个子问题中选择两个变量进行优化,其中至少一个变量是违反KKT条件的。
这一小节,将告诉我们,到底选取哪两个变量最合适?也就是说,选择的标准是什么?
我们将这一小节分三步来讲:第一步,如何选择第一个变量?第二步,如何选择第二个变量?第三步,更新阈值
![]()
和差值
![]()
。
(1)第1个变量的选择
SMO称选择第1个变量的过程为外层循环。
外层循环在训练样本中选取违反KKT条件最严重的样本点,并将其对应的变量作为第1个变量。具体地,检验训练样本点
![]()
是否满足KKT条件,即
其中,
![]()
。
该检验是在
![]()
范围内进行的。在检验过程中,外层循环首先遍历所有满足条件
![]()
的样本点,即在间隔边界上的
支持向量点,检验它们是否满足KKT条件。如果这些样本点都满足KKT条件,那么遍历整个训练集,检验它们是否满足KKT条件。
(2)第2个变量的选择
SMO称选择第2个变量的过程为内层循环。
假设在外层循环中已经找到第1个变量
![]()
,现在要在内层循环中找到第2个变量
![]()
。第2个变量选择的标准是希望能使
![]()
有
足够大的变化。
由上一小节内容,我们知道,
![]()
是依赖于
![]()
的,为了加快计算速度,一种简单地做法是选择
![]()
,使其对应的
![]()
最大。因为
![]()
已定,
![]()
也确定了。由于
![]()
取值可正可负,故如果
![]()
是正的,那么选择最小的
![]()
作为
![]()
;如果
![]()
是负的,那么选择最大的
![]()
作为
![]()
。
特殊情况下,如果内层循环通过以上方法选择的
![]()
不能使目标函数有足够的下降,那么采用以下启发式规则继续选择
![]()
。——遍历在间隔边界上的
支持向量点,一次将其对应的变量作为
![]()
试用,直到目标函数有足够的下降。如果遍历完了所有的支持向量点,仍然找不到合适的
![]()
,那么遍历整个
训练数据集;如果遍历整个数据集还找不到,则放弃第1个
![]()
,再通过
外层循环重新寻求另外的
![]()
。
(3)计算阈值
和差值 经过前两步,我们选择了合适的两个变量,然后用上一篇介绍的两个变量二次规划的求解方法,求出两个变量的最优解
![]()
。每次完成两个变量的优化后,都要
重新计算阈值 ![]()
,进而再计算出对应的
![]()
。
当
![]()
时,由KKT条件可知:
于是,有
而由
![]()
的定义式(参考上一篇)可得,未更新的
![]()
满足:
上式可以写成:
带入到上面
![]()
的表达式中,可得:
同样,如果
![]()
,那么:
如果
![]()
同时满足条件
![]()
,那么
![]()
。
如果
![]()
是0或者是
![]()
,那么
![]()
以及它们之间的数都是
符合KKT条件的阈值,这时选择它们的中点作为
![]()
。
上面就完成了阈值
![]()
的更新。还必须更新对应的
![]()
值。
![]()
值的更新需要用到
![]()
值,以及所有支持向量对应的
![]()
:
其中,S是所有支持向量
![]()
的集合。
3.SMO算法
输入:训练数据集
![]()
,其中,
![]()
,
![]()
,
![]()
,精度
![]()
;
输出:近似解
![]()
。
(1)取初值
![]()
,令
![]()
;
(2)选取优化变量
![]()
,解析求解两个变量的最优化问题(按照上一篇所述的
两个变量二次规划的求解方法求解),求得最优解
![]()
,更新
![]()
为
![]()
;
(3)若在精度
![]()
范围内满足停机条件:
其中,
则转(4);否则令
![]()
,转(2);
(4)取
![]()
。
如果从前面顺着看到了这里,相信不难理解的~当然可能是因为我之前也学习过,如果那里有疑问,直接百度博客知乎哈~
到此,第3重境界也修炼好了,SVM心法很强大,恭喜你等级达到了——宗师