本文主要是梳理之前看到过的支持向量机中SMO算法,大概记录整个SMO算法的流程和最后的结果,如有错误欢迎大家指正。
首先整理一下上一篇支持向量机的主要内容:
支持向量机分类的原理在于构造超平面将不同类别的事物进行划分,超平面的构建可以通过将其转化为最大化间隔的优化问题,最大化间隔的凸优化问题可以通过现成的QP(Quadratic Programming)优化包进行求解,但是通过拉格朗日乘子法和KKT条件将其转化为对偶函数进行求解要更高效得多,即对对偶函数的最优化问题是用SMO算法进行求解。
SMO(Sequential Minimal Optimization)算法是John C.Platt提出来的。
根据之前的支持向量机提出的函数最优化问题。
利用拉格朗日乘子法和KKT条件得到以下结果。
根据求导得到的结果,可以将w带回到F的公式中,得到以下的结果。
在Patt提出的优化方程中有一点小的变动,即
符号有所变化,但是实质是一样的,转化为拉格朗日乘子的对偶函数如下式。
对于由于噪声影响的线性不可分的数据点,引入带有惩罚因子的软边缘函数形式如下所示。
之前在KKT条件中有提到下面一个条件
在该条件中,要使a*b=0,则需要a=0或者b=0。因此可以推导下面的结论。
该公式主要说明了一个在两条间隔之外的数据点,其对应的为0,在两条间隔之内的点其对应的为C,在两条间隔上的点,其对应的在0与C之间。从这里我们也可以了解到为什么说SVM的优化问题也是一个稀疏矩阵的求解,
将原来的凸二次优化问题转化为拉格朗日乘子的对偶函数问题后,可以利用Patt提出的SMO算法对其进行求解。
Patt的SMO算法的思想在于在所有的乘子中,固定除了以外的所有变量,然后将由表示,带回到F的方程中去,则方程F就变成关于的方程了。SMO算法高效的原因就在于在固定其他参数以后,对一个参数进行优化的过程很高效。为方便起见,假设我们选择,进行优化,基本方程推导如下所示。
将,带入到原方程中得到对偶函数F如下所示。
结合上面两个式子,将,由表示,得到以下结果。
如上式中已将目标函数表述为的方程式,整个方程就变成对一个参数的优化方程。具体优化求解过程如下所示。
其中,代表、的迭代值,代表迭代的原始值。由此,已经推导出,的更新值。
但是在特殊情况下,如果核函数K不满足Mercer定理,那么目标函数可能变得非正定,可能出现负值。即使K为有效地核函数,样本也可能出现相同特征的x1,x2使得为0。等式可以推出就是函数F的二阶导数,所以当时,F没有极小值,极小值在边缘处取到,=0时,也是单调函数,F的最小值也是在边缘处取得,的边缘即是L、H,将L和H带入原方程就可以取得原方程F的最小值。
当非正时,目标函数的极值如下求解。
在上式中的L与H根据以下公式进行确定。
1.当,对应的y1,y2不相等时。
2.当,对应的y1,y2相等时。
最后关于阈值b的求解如下所示
阈值b在每一步中都会进行更新,当新值不在界上时,b_new的计算规则如下所示。
当新值不在界上时,b_new的计算规则如下所示。
当和都不在界上时,b1=b2;
当和都在界上时,并且L与H不相等,那么任意在b1-b2区间内的值都符合KKT条件,一般而言,SMO选择[b1,b2]的中间值作为阈值b。
权值w的更新方式如下所示
启发式选择拉格朗日乘子方法
给定初值=0。对于第一个拉格朗日乘子,首先对整个训练集进行迭代,若在循环中碰到违背KKT条件的样例就对其进行更新;直到所有的案例都符合KKT条件;
对第二个拉格朗日乘子进行更新主要是选择使得迭代步长最大化,迭代步长: