机器学习之SMO算法
SMO算法
什么是SMO算法
SMO(Sequential Minmal Optimization)序列最小化算法,是一种对SVM的高效的优化算法。
坐标上升法
在SMO算法之前,还是需要总结下坐标上升算法(Coordinate Ascent),因为SMO算法的思想与坐标上升算法的思想类似。
Content:
img坐标上升算法每次通过更新多元函数中的一维,经过多次迭代直到收敛来达到优化函数的目的。简单的讲就是不断地选中一个变量做一维最优化直到函数达到局部最优点。
也就是说,每次只对一个维度进行调整,从而使目标函数在这一维度的范围内达到最优(局部)。
举个例子:
如果我们要优化一个二元函数:
我们先给一个初值,然后开始迭代
我们先固定住, 对求偏导,等于零来得到相对最小值:
$$
\frac{\partial f}{\partial x_1} = -2x_1 + 2x_2 = 0\x_1 = x_2
$$然后,固定, 对求偏导,等于零:
持续迭代,直至收敛
通过下面的图就可以看出,优化的过程,因为每次只优化一个变量,每次迭代的方向都是沿着坐标轴方向的。
img因为每次只是做一维优化,所以每个循环中的优化过程的效率是很高的, 但是迭代的次数会比较多。
SMO算法
SMO的思想类似坐标上升算法,我们需要优化一系列的α的值,我们每次选择尽量少的 来优化,不断迭代直到函数收敛到最优值。
但是怎么证明他的正确性:
因为最优解一定满足KKT条件,所以,我们只需要让所有的样本都满足KKT条件,我们就一定可以找到最优解.
我们回到SVM的对偶问题上:
看到求和符号,我们知道如果我们要直接优化的话,我们需要优化,n个变量,但是我们使用platt提出的SMO算法我们可以高效的求解上面的对偶问题,SMO把N个规划问题分解成多个二次规划算法求解,每个子问题只需要求解两个参数,节省了时间成本。
但是,与坐标上升法不同的是:
我们在SMO算法中我们每次需要选择一对变量。而且SVM中我们的并不是独立的,因为具有约束的:
所以,一个 改变,另一个也要随之变化以满足条件。
于是就变成了一个二元函数的优化:
然后,根据我们之前的约束条件,我们可以将这个二元函数在转换成一元函数:
这里为了方便表示,设:
同时带入,得:
然后,求导,等于0:
变化成迭代形式:
但是,显然我们没有考虑约束条件,所以:
这个约束条件就是方形约束,这个是SMO论文中的图,但是,我第一次看看的是一脸懵逼。这里,我简单地说一下,然后给大家推荐一个博客
首先,我们知道 ,所以只有那么几种情况:
然后,根据的大小,我们可以得到最终的可行域:
img其实,我们不光要考虑可行域,还得考虑二次项系数。
具体的请参考这篇博客:博客
最后,我们还需要更新b的值,为了让满足KKT条件。
当 时:
同理,当 :
如果同时满足条件,
如果有一个 是 0 或是C
最后计算
代码:
再等等吧,真TM的难。