序列最小优化算法

序列最小优化算法（, SMO）是一种用于解决支持向量机训练过程中所产生优化问题的算法。SMO由微软研究院的約翰·普拉特于1998年发明，目前被广泛使用于SVM的训练过程中，并在通行的SVM库LIBSVM中得到实现。Chih-Chung Chang and Chih-Jen Lin (2001). LIBSVM: a Library for Support Vector Machines .Luca Zanni (2006). Parallel Software for Training Large Scale Support Vector Machines on Multiprocessor Systems .1998年，SMO算法发表在SVM研究领域内引起了轰动，因为先前可用的SVM训练方法必须使用复杂的方法，并需要昂贵的第三方二次规划工具。而SMO算法较好地避免了这一问题。

 问题定义 

SMO算法主要用于解决支持向量机目标函数的最优化问题。考虑数据集的二分类问题，其中是输入向量，是向量的类别标签，只允许取两个值。一个软间隔支持向量机的目标函数最优化等价于求解以下二次规划问题的最大值：

满足：

其中，是SVM的参数，而是核函数。这两个参数都需要使用者制定。

 算法 
SMO是一种解决此类支持向量机优化问题的迭代算法。由于目标函数为凸函数，一般的优化算法都通过梯度方法一次优化一个变量求解二次规划问题的最大值，但是，对于以上问题，由于限制条件存在，当某个从更新到时，上述限制条件即被打破。为了克服以上的困难，SMO采用一次更新两个变量的方法。

 数学推导 
假设算法在某次更新时更新的变量为和，则其余变量都可以视为常量。为了描述方便，规定

因而，二次规划目标值可以写成

由于限制条件存在，将看作常数，则有成立（为常数）。由于，从而（为变量，）。取为优化变量，则上式又可写成

对求偏导以求得最大值，有

因此，可以得到

规定误差项，取，并规定，上述结果可以化简为

再考虑限制条件，的取值只能为直线落在矩形中的部分。因此，具体的SMO算法需要检查的值以确认这个值落在约束区间之内。

 算法框架 
SMO算法是一个迭代优化算法。在每一个迭代步骤中，算法首先选取两个待更新的向量，此后分别计算它们的误差项，并根据上述结果计算出和。最后再根据SVM的定义计算出偏移量。对于误差项而言，可以根据、和的增量进行调整，而无需每次重新计算。具体的算法如下：

 1 随机数初始化向量权重，并计算偏移
 2 初始化误差项
 3 选取两个向量作为需要调整的点
 4 令
 5 如果
 6     令
 7 如果
 8     令
 9 令
 10 利用更新的和修改和的值
 11 如果达到终止条件，则停止算法，否则转3

其中，和为的下界和上界。特别地，有

这一约束的意义在于使得和均位于矩形域中。

 优化向量选择方法 
可以采用启发式的方法选择每次迭代中需要优化的向量。第一个向量可以选取不满足支持向量机KKT条件的向量，亦即不满足

的向量。而第二个向量可以选择使得最大的向量。

 终止条件 
SMO算法的终止条件可以为KKT条件对所有向量均满足，或者目标函数增长率小于某个阈值，即

 参考资料 

 参见 
 支持向量机
 核方法


 预测分析

Category:最优化算法
Category:机器学习
Category:支持向量機