机器学习之SMO、SVR


序列最小优化算法SMO

        SVM的学习问题可以形式化为求解凸二次规划问题,这样的问题具有全局最优解。但是当训练集样本数量很大时,计算开销正比于样本数,并且在实现上也十分复杂。因此引入SMO(Sequential Minimal Optimization)算法,将大的复杂的优化问题分解为多个小的简单的优化问题,最终的结果完全相同且求解时间缩短很多。

        SMO算法是一种启发式(heuristic)算法,基本思路是:使所有变量的解都满足最优化问题的KKT条件,否则每次循环中选择两个变量进行优化,固定其他变量,只针对这两个变量构建二次规划的子问题,可以通过解析的方法快速求解,循环将原问题不断分解为子问题并对子问题求解,从而达到求解原问题的目的。SMO算法包括两个部分:求解两个变量二次规划的解析方法和选择变量的启发式方法。

         

        SMO算法要解决凸二次规划的对偶问题:

        

        软间隔SVMKKT条件:

        

        检验训练样本点(x(i),y(i))是否满足KKT条件

        

        认为α1α2是变量,其他α为常量,从而将目标函数转换为:

        

        对第一个限制条件,可以消去α1的值:

        

        

        带入目标函数,可得:

       

        W对α2求偏导=0得到:

        

        将带入上式得到:

        

       

        令Ei=g(x(i))-y(i),可得α无约束下的解:

        

        考虑约束条件:

        

         

        最优解必须要在方框内的直线上取到,

        当y(1)=y(2)时,α12=k:

        

        当y(1)≠ y(2)时,α12=k:

        

        结合α的取值范围,可得最优解为:

        

        根据α1α2的关系,可得:

        

        在更新两个α后,需要重新计算b和差值Ei。当0<α1new<C时,有:

        

        同理当0<α2new<C时可得b2new

        如果α1newα2new同时满足0<αnew<C,那么b1new=b2new;如果α1newα2new0或者C,那么b1newb2new和以及它们之间的数都是符合KKT条件的阈值,这时选择它们的中点作为bnew

       

        更新两个变量对应的差值Ei为,需要用到bnew以及所有支持向量对应的αj

        

        

子问题两个的变量选择方法:

        (1)外层循环选择的第一个变量是违反KKT条件程度最大的,即y(i)g(x(i))最小的变量。遍历所有满足条件0<α<C的支持向量样本点,检验它们是否满足KKT条件;如果都满足则遍历整个样本集,检验它们是否满足KKT条件。

        (2)内层循环选择的第二个变量应是使目标函数值减小最快的变量,但由于计算过于复杂,因此选择优化程度最大的、能使α2有足够大的变化的变量作为第二个变量。简单的做法是选择|E1-E2|足够大的变量,即当E1为正时,选择最小的Ei作为E2;当E1为负时,选择最大的Ei作为E2

        注意,如果选择的第二个变量不能够让目标函数值有足够的下降,那么可以通过遍历支持向量点乃至所有样本点来寻找第二个变量,如果都没有足够下降的话,跳出内层循环,重新选择第一个变量。

SMO算法流程总结

        (1)输入样本数据{(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}xn维特征向量,y=1-1;精度为ε

        (2)初始化α0=0,最大迭代次数maxIterk=0

        (3)选择需要进行优化的两个变量α1kα2k,计算新的α2new,unclipped

        (4)求出有约束下的α2newα2k+1

        (5)α1α2的关系求出α1k+1

        (6)计算bk+1Ei的值

        (7)检查y(i)Ei的绝对值是否在精度范围内,即目标函数值有足够的下降,并且求解出来的α满足KKT相关约束条件,则结束循环返回α1newα2new的解,令k=0。否则令k+=1继续迭代计算α2new,unclipped的值,直到k达到设置的最大迭代次数maxIter或者遍历整个集合都未对任意α对进行修改时,停止循环返回最终的αb

SVR(回归问题的SVM)

        SVM和决策树类似,可以将模型应用到回归问题中。与传统回归模型损失函数不同的是,SVR能容忍预测值与真实值最多有ε的偏差,即如果二者之间的偏差的绝对值小于等于ε,则认为误差为零;当二者之间的偏差的绝对值大于ε时才计算损失。

        ε-不敏感损失函数可以写成如下形式:

        

        在不敏感区域外,会有一个与损失相关的线性代价:

         

        因此可以将SVR问题形式化为:

        

        由间隔带两侧的松弛程度可以不同,引入两个松弛变量ξi≥0和ξ^i≥0,其中ξi>0对应于的数据点,ξ^i>0对应于的数据点。考虑松弛变量后每个数据点x(i)位于管道内的条件为:

        

         

        因此SVR回归加入松弛因子的误差函数和限制条件可以写为:

        

        构造Lagrange函数:

        

        原始函数转化为对偶函数:

        

        求优化函数对于w、b、ξ的极小值:

        

        将上面四个式子带入L,即可得到只含αSVR的对偶问题:

        

        KKT条件

        

        当且仅当f(x(i))-y(i)-ε-ξi=0时,αi能取非零值,当且仅当y(i)-f(x(i))-ε-ξ^i=0时,α^i能取非零值;即当样本不落入ε-间隔带中,相应的αiα^i才能取得非零值。此外,约束f(x(i))-y(i)-ε-ξi=0、y(i)-f(x(i))-ε-ξ^i=0不能同时成立,因此αiα^i中至少有一个为零。

        SVR的解形如:

        

        其中^ii)≠0的样本为SVR的支持向量,它们必落在ε-间隔带外,可知SVR的解具有稀疏性。对于α的解可以使用SMO算法来求解,若0<αi<C,由(C-αii=0可知ξi=0,可以得到b的值:

        

        取所有满足条件0<αi<C的样本求解b后取平均值,SVR的最终解为:

        

Scikit-learn SVM算法库

        sklearn中SVM算法库主要分为两类,一类是分类算法:SVC、NuSVC、LinearSVC;另一类是回归算法:SVR、NuSVR、LinearSVR;此外OneClassSVM可以用于异常点检测。

        详见:http://scikit-learn.org/dev/modules/svm.html

        

 

猜你喜欢

转载自blog.csdn.net/liuy9803/article/details/80734116