资料参考来源:
清华大学出版社 李航 《统计学习方法》 第七章 支持向量机
SMO的基本思路
我们在这一章将讨论的是一个高效实现支持向量机学习的算法序列最小最优化(sequential minimal optimization,SMO)算法。
假设我们有如下凸二次规划的对偶问题:
在这个问题中,变量是拉格朗日乘子,一个变量对应一个样本点;变量的总数等于训练样本容量N。
SMO算法是一种启发式算法(指一个基于直观或经验构造的算法,在可接受的花费(计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般无法被预计,来源:启发式算法),它的基本思路是:先随机选择一组变量值,如果所有变量的解都满足此优化问题的KKT条件(Karush-Kuhn-Tucker conditions),那么这个最优化问题的解就得到了。因为KKT条件是该最优化问题的充分必要条件。
如果有变量不满足,我们就选择两个变量并固定其它变量(选择两个而不是仅选择一个变量进行优化是因为约束条件使得若有个变量被确定,那么剩下的一个变量也会确定),仅针对这两个变量构建一个二次规划问题。该二次规划问题关于这两个变量的解会更接近原始二次规划问题的解,因为这个解得出的两个变量可以让让原始二次规划问题的目标函数值变得更小。更重要的是,这时的子问题可以通过解析方法(即用代数解决非代数问题)求解,从而大大提高整个算法的精确度。
子问题只有两个变量,一个是违反KKT条件最严重的变量(因为这些违反KKT条件的变量是我们最需要修正的),另一个由约束条件自动确定:
假设为两个变量,固定,那么由约束条件可得:
因此,我们在子问题中可以同时更新两个变量。
由此我们得到,整个SMO算法包括两个部分:
- 求解两个变量二次规划的解析方法
- 选择变量的启发式方法
SMO结构示意图
两个变量二次规划的求解方法
首先假设我们选择的两个变量是,其它变量是固定的(即已知标量),于是我们可以将原凸二次规划的对偶问题的子问题写成:
其中,是一个常数,目标函数式(7.101)中省略了不包含的常数项。
要求解这个问题,我们首先要分析约束条件,然后在这个约束条件下求极小。
由于只有两个变量,我们可以建立二维平面上的坐标系来直观地看到约束情况:
此处资料来源:Sin的专栏 SMO算法介绍
这幅图是异号的情况,图中有两条斜线,上面那条表示是负数,下面那条表示是正数。从图中可以看到,和必须同时在矩形内和其中一条斜线上取值,例如假设是正数,则变量在图中黑色阴影部分取值。
(如果同号,则图片中直线的斜率为当前斜率的相反数,因为此时)
现在我们假设要考虑变量的优化问题,假设这两个变量的二次规划问题的初始可行解为,最优解为,并且假设在沿着约束方向未经剪辑(未经剪辑就是说不考虑条件)时的最优解为。
因为需满足不等式约束,所以我们可以得到最优值的取值范围:
L与H分别是所在的对角线段端点的界。像下图一样,
如果则有
若像下图一样:
则有:
实际上我们可以很容易看出来,这两个式子是表明的取值范围是由的正负决定的。
下面,我们首先沿着约束方向,即不考虑约束条件的情况下求的最优解。
为了叙述简单,记目标函数
并令
当时,为函数对输入样本的预测值与真实输出的差。
规定这两个函数之后,我们有如下定理:
求解两个变量最优化问题的最优解定理
两个变量的最优化问题沿着约束方向未经剪辑的解为
其中是输入空间到特征空间的映射,,上式由的表达式得到。
经剪辑后的解是
由求得为
下面给出证明
证明
首先引进记号:
于是,目标函数可以写成:
由以及,可以将表示为(记得):
把这个式子代入到上面的表达式中,得到仅由作参数的函数的目标函数:
对求导:
令导数为0,得到
将代入式中,得到
再将代入,最终得到
若要使满足不等式约束则必须将其限制在区间内,于是我们得到的表达式:
再由等式约束得到的表达式:
从而得到两个变量最优化问题的解
变量的选择方法
SMO算法在每个子问题中选择两个变量优化,其中至少一个变量是违反KKT条件的(因为两个没有违反KKT条件的变量本身就是这两个变量组成的二次规划问题的最优解)。
1.第一个变量的选择
SMO通过一个外层循环检索出训练样本中违反KKT条件最为严重的样本点,并将其对应的变量()作为第一个变量。
检验样本点是否满足KKT条件:
其中
(意思就是说按双向箭头左边设定的值,然后计算的值,看是否与对应的范围值()匹配)
该检验在(预设精度)范围内进行,在检验过程中 外层循环将首先遍历所有满足条件的样本点,即在间隔边界上的支持向量。如果支持向量点都满足KKT条件,就遍历整个训练集,检验它们是否都满足KKT条件。
第二个变量的选择
SMO的第二个变量的选择通过内层循环实现,即第一个变量已经被找到的情况下寻找,寻找的的条件是希望能使有足够大的变化。
由式子
和
我们知道,和有很大的关系,为了加快计算速度,一种比较简单的做法是,选择一个能让最大的(如其所述,这个选择方式的唯一意义就是为了加快计算速度)。因为已经定下来,所以也是确定的,因此如果是正的,我们只要选择能使最小的;反之如果是负的,就选一个最大的,为了节省时间,我们可以将所有的的值都保存在一个列表中。
在特殊情况下,上述内层循环的选择方式选出的有可能无法使目标函数有足够的下降(就是让目标函数值变的足够小,我们的目标就是让目标函数值变小),此时我们就可以采用下面的启发式规则来选择:
遍历在间隔边界上的支持向量点,依次将其对应的变量作为试用,直到目标函数有足够的下降。如果找不到合适的,那么就遍历整个训练数据集;若仍然找不到合适的,那么我们就放弃第一个变量,通过外层循环找下一个。
计算阈值b和差值
每次当我们完成两个变量的优化之后,都要重新计算阈值b(为了更新我们的输出函数然后让新的输出函数参与下两个变量的优化)。
当时,由KKT条件得到:
因此我们可以得到的更新式:
又因为由E的定义式我们可以得到:
由此我们得到表达式的前两项可以展开成:
将这个式子代回表达式可以得到:
同理,如果,那么同样可以得到:
如果同时满足,那么必然有(因为这说明两个变量对应的样本点都是支持向量,这个时候支持向量机的位置就在两者之间,是不会有疑问的)。如果是0或者C,那么和以及它们之间的数都符合KKT条件的阈值,(因为此时两个变量对应的样本点在间隔边界之外(为0)或者是在间隔边界之内(为C)),这个时候和以及它们之间的数都是符合KKT条件的阈值,一般在这种时候我们选择它们的中点作为阈值。
每一次当我们完成了两个变量的优化之后,还必须更新对应的值并将它们保存在列表中。值的更新需要用到值与所有的支持向量对应的:
其中S是所有支持向量的集合。
SMO算法
最后老样子,让我们来定义一下SMO的算法。
SMO算法
输入:训练集T(训练集合,不再展开赘述),精度ε(标量)
输出:近似解
步骤:
1.取初值(将全部α初始化为0),令(这是个计数器) 2.选取优化变量,解析求解两个变量的最优化问题,求得最优解,更新为 3.若在精度ε范围内或满足停机条件(原文没有“或”字,此处为个人理解):
其中
并转到步骤4;否则令k=k+1并转回步骤2
4.取