前言
机器学习实战系列之学习笔记主要是本人进行学习机器学习的整理。本系列所有代码是用python3编写,并使用IDE Pycharm在Windows平台上编译通过。本系列所涉及的所有代码和资料可在我的github或者码云上下载到,gitbub地址:https://github.com/mcyJacky/MachineLearning,码云地址:https://gitee.com/mcyHome/MachineLearning,如有问题,欢迎指出~。
一、SMO算法概述
1.1 简述
SMO(Sequential minimal optimization)算法,即序列最小最优化算法,是一种用于解决支持向量机训练过程中所产生优化问题的算法。1998年由微软研究院Platt提出,目前被广泛使用于SVM的训练过程中,并在通行的SVM库LIBSVM中得以实现。在上一篇文章中,我们知道支持向量机的学习问题可以形式化为求解凸二次规划问题,这样的凸二次规划问题具有全局最优解,并且有许多最优化算法可以用于这一问题的求解,但是当训练样本容量很大时,这些算法就变得非常低效,以致无法使用。所有才使用SMO这种快速实现的算法。
SMO算法要求解如下凸二次规划的对偶问题:
⎩⎪⎨⎪⎧αmin21∑i=1N∑j=1NαiαjyiyjK(xixj)−∑i=1Nαis.t.∑j=1Nαiyi=00≤αi≤C,i=1,2,...,N(1.1)
在这个问题中,变量是拉格朗日乘子,一个变量
αi对应于一个样本点
(xi,yi);变量的总数等于训练样本容量
N。
1.2 基本思路
SMO算法是一种启发式算法,其基本思路是:如果所有变量的解都满足此最优化问题的KKT条件,那么这个最优化问题的解就得到了。因为KKT条件是该最优化问题的充分必要条件。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变得更小。重要的是,这时子问题可以通过解析方法求解,这样就可以大大提高整个算法的计算速度。子问题有两个变量,一个是违反KKT最严重的一个,另一个由约束条件自动确定。如此,SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。
注意,子问题的两个变量中只有一个是自由变量。假设
α1,α2为两个变量,
α3,α4,...,αN固定,那么由式(1.1)等式约束可知:
α1=−y1i=2∑Nαiyi
所以如果
α2确定,那么
α1也随之确定,所以子问题中同时更新两个变量。
整个SMO算法包括两个部分:求解两个变量二次规划的解析方法和选择变量启发式方法。
二、SMO算法求解
2.1 两个变量二次规划的求解方法
我们假设选择的两个变量是
α1,α2,其它变量
αi(i=3,4,...,N)是固定的。于是SMO算法的最优化问题式(1.1)的子问题可以写成:
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧α1,α2minW(α1,α2)=21K11α12+21K22α22+y1y2K12α1α2−(α1−α2)+y1α1∑i=3NyiαiKi1+y2α2∑i=3NyiαiKi2s.t.α1y1+α2y2=−∑i=3Nyiαi=ζ0≤αi≤C,i=1,2(2.1)
其中,
Kij=K(xi,xj),i,j=1,2,..,N,ζ是常数,目标函数式(2.1)中省略了常数项。
为了求解两个变量的二次规划问题式(2.1),首先分析约束条件,然后在此约束条件下求极小值。由于只有两个变量
(α1,α2),可以用二维空间中的图形表示。假设问题(2.1)的初始可行解为
α1old,α2old,最优解为
α1new,α2new ,且假设沿着约束方向未经剪辑时约束
α2的最优解为
α2new,unc。
①当
y1̸=y2=>α1−α2=k
图2.1 二次变量优化约束第一种情况
②当
y1=y2=>α1+α2=k
图2.2 二次变量优化约束第二种情况
分析: 不等式约束使得
(α1,α2)在矩形盒[0,C]x[0,C]内,等式约束使得
(α1,α2)在平行于盒子的对角线的直线上,因此要求的是目标函数在一条平行于对角线的线段上的最优值,这使得两个变量的最优化问题成为实质上的单变量的最优化问题,不妨考虑为变量
α2的最优化问题:
由于
α2new需满足式(2.1)中不等式约束,所以
α2new的取值范围必须满足条件:
L≤α2new≤H
其中,
L与H是
α2new所在的对角线端点的界。如果
y1̸=y2,如图2.1所以,则:
L=max(0,α2old−α1old),H=min(C,C+α2old−α1old)
如果
y1=y2,如图2.2所以,则:
L=max(0,α2old+α1old−C),H=min(C,α2old+α1old)
下面,首先求沿着约束方向未经过剪辑即未考虑不等式约束时
α2的最优解
α2new,func;然后再求剪辑后
α2的最优解
α2new。为了叙述简单,我们记:
g(x)=i=1∑NαiyiK(xi,x)+b(2.2)
令:
Ei=g(xi)−yi=(j=1∑NαiyiK(xj,xi)+b)−yi,i=1,2(2.3)
当
i=1,2时,
Ei为函数
g(x)对输入
xi的预测值与真实输出
yi之差。
下面是公式推导过程:
我们记:
vi=j=3∑NαjyjK(xi,xj)=g(xi)−j=1∑2αjyjK(xi,xj)−b
则目标函数式(2.1)可写成:
W(α1,α2)=21K11α12+21K22α22+y1y2K12α1α2−(α1−α2)+y1v1α1+y2v2α2(2.4)
又由
α1y1=ζ−α2y2及
yi2=1,可将
α1表示为
α1=(ζ−α2y2)y1
将其带入式(2.4),得到只是关于
α2函数的目标函数:
W(α2)=21K11(ζ−α2y2)2+21K22α22+y2K12(ζ−α2y2)α2−(ζ−α2y2)y1−α2+v1(ζ−α2y2)+y2v2α2(2.5)
式(2.5)对
α2求导:
∂α2∂W=K11α2+K22α2−2K12α2−K11ζy2+K12ζy2+y1y2−1−v1y2+y2v2(2.6)
令式(2.6)为0,得:
(K11+K22−2K12)α2=y2(y2−y1+ζK11−ζK12+v1−v2)=y2[y2−y1+ζK11−ζK12+(g(x1)−j=1∑2yjαjK1j−b)−(g(x2)−j=1∑2yjαjK2j−b)]
将
ζ=α1oldy1+α2oldy2代入,得到:
(K11+K22−2K12)α2new,unc=y2((K11+K22−2K12)α2oldy2+y2−y1+g(x1)−g(x2))=(K11+K22−2K12)α2old+y2(E1−E2)
将
η=K11+K22−2K12代入,于是得到:
α2new,unc=α2old+ηy2(E1−E2)(2.7)
所以要使其满足不等式约束必须将限制在区间[L,H]内,从而得到新的
α2new的表达式:
α2new=⎩⎨⎧H,α2new,unc,L,α2new,unc>HL≤α2new,unc≤Hα2new,unc<L(2.8)
由
α2new求得
α1new是:
α1new=α1old+y1y2(α2old−α2new)(2.9)
2.2 变量的选择方法
SMO算法在每个子问题中选择两个变量优化,其中至少一个变量是违反KKT条件的。
①第一个变量选择
SMO称选择第一个变量的过程为外层循环。外层循环在训练样本中选取违反KKT条件最严重的样本点,并将其对应的变量作为第1个变量。具体地,检验训练样本点
(xi,yi)是否满足KKT条件,即:
αi=0⇒yig(xi)≥1(2.10)
0<αi<C⇒yig(xi)=1(2.11)
αi=C⇒yig(xi)≤1(2.12)
其中,
g(xi)=∑j=1NαjyjK(xi,xj)+b。
该检测是在
ε范围内进行的,在检测过程中,外层循环首先遍历所有满足条件
0<αi<C的样本点,即在间隔边界上的支持向量点,检验它们是否满足KKT条件。如果这些样本点都满足KKT条件,那么遍历整个训练集,检验它们是否满足KKT条件。
②第二个变量选择
SMO称选择第2个变量过程为内层循环。假设在外层循环中已经找到第1个变量
α1,现在要在内层循环中找第2个变量
α2。第2个变量选择的标准是希望能使
α2有足够大的变化。
由式(2.7)和(2.8)可知,
α2new是依赖于
∣E1−E2∣的,为了加快计算速度,一种简单的做法是选择
α2,使其对应的
∣E1−E2∣最大。因为
α1已定,
E1也确定了。如果
E1是正的,那么选择最小的
Ei作为
E2;如果
E1是负的,那么选择最大的
Ei作为
E2。为了节省计算时间,我们将所有
Ei值都保存在一个列表中。
在某种特殊情况下,如果内层循环通过以上方法选择的
α2不能使目标函数有足够大的下降,那么采用以下启发式规则继续选择
α2:遍历在间隔边界上的支持向量点,依次将其对应的变量作为
α2试用,直到目标函数有足够的下降,若找不到合适的
α2,那么遍历训练数据集;若仍找不到合适的
α2,则放弃第一个
α1,再通过外层循环寻找另外的
α1。
③计算阈值
b和差值
Ei
在每次完成两个变量的优化后,都要重新计算阈值
b。当
0<α1new<C时,由KKT条件可知:
i=1∑NαiyiKi1+b=y1
于是:
b1new=y1−i=3∑NαiyiKi1−α1newy1K11−α2newy2K21(2.13)
根据
E1的定义式(2.3)有:
E1=i=3∑NαiyiKi1+α1oldy1K11+α2oldy2K21+bold−y1
式(2.13)前两项可以写成:
y1−i=3∑NαiyiKi1=−E1+α1oldy1K11+α2oldy2K21+bold
带入式(2.13)得:
b1new=−E1−y1K11(α1new−α1old)−y2K21(α2new−α2old)+bold(2.14)
同样的,如果
0<α2new<C时,那么:
b2new=−E2−y1K12(α1new−α1old)−y2K22(α2new−α2old)+bold(2.15)
所以如果
α1new,α2new同时满足
0<αinew<C,i=1,2,那么
b1new=b2new。如果
α1new,α2new是0或者
C,那么
b1new和
b2new以及它们之间的数都符合KKT条件的阈值,这时选择它们的中点作为
bnew。
在每次完成两个变量的优化之后,还必须更新对应的
Ei值,并将它们保存在列表中。
Ei值的更新要用到
bnew值,以及所有支持向量对应的
αj:
Einew=S∑yjαjK(xi,xj)+bnew−yi(2.16)
其中,
S是所有支持向量
xj的集合。
2.3 SMO伪算法
输入:训练数据集
T={(x1,y1),(x2,y2),⋯,(xN,yN)},其中,
xi∈Rn,
yi∈{−1,+1},i=1,2,⋯,N,精度为
ε;
输出:近似解
α^.
(1) 取
α(0)=0,令k=0;
(2) 选取优化变量
α1(k),α2(k),解析求解两个变量的最优化问题式(2.1),求得最优解
α1(k+1),α2(k+1),更新
α为
αk+1;
(3) 若在精度
ε范围内满足停机条件:
i=1∑Nαiyi=0
0≤αi≤C,i=1,2,⋯,N
yig(xi)=⎩⎨⎧≥1,=1,≤1,{xi∣αi=0}{xi∣0≤αi≤C}{xi∣αi=C}
其中
g(xi)=j=1∑NαjyjK(xj,xi)+b.
则转(4);否则令
k=k+1,则转(2);
(4) 取
α^=α(k+1);
三、小结
本章介绍了SMO算法推导过程,支持向量机及SMO算法实现,是学习到目前为止最为复杂的算法,因此也耗费了我很多的时间。理论推导还是需要运用于实践,下面一篇将具体介绍如果用Python实现支持向量机及SMO算法。
【参考】:
1. 《统计学习方法》作者:李航 第7章 支持向量机中SMO算法
转载声明:
版权声明:非商用自由转载-保持署名-注明出处
署名 :mcyJacky
文章出处:https://blog.csdn.net/mcyJacky