机器学习:详细推导序列最小优化SMO算法+Python实现
目录
- 0 写在前面
- 1 为什么需要SMO算法?
- 2 优化变量的选择
- 3 优化目标的约简
- 4 参数可行性修剪
- 5 权重与偏置更新
- 6 收敛性分析
- 7 Python实现
- 7.1 整体算法流程
- 7.2 挑选优化变量
- 7.3 裁剪并更新alpha
- 7.4 更新权重与偏置
- 7.5 可视化
0 写在前面
机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。
🚀详情:机器学习强基计划(附几十种经典模型源码合集)
1 为什么需要SMO算法?
详细推导支持向量机SVM原理+Python实现中列出的SVM对偶问题的求解是二次规划问题,可使用二次规划算法进行数值解,但解的复杂度正比于拉格朗日乘子 的维度,造成很大的训练开销。
序列最小优化(Sequential Minimal Optimization)算法是结合SVM算法实际提出的高效优化方法,可以将支持向量机的训练速度提升一个量级。
SMO的优化目标就是上一篇文章介绍的软间隔SVM的优化目标,约束中略去与算法无关的KKT条件重新写在下方
{ a r g max α ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j x i T x j ∑ i = 1 m α i y i = 0 0 ⩽ α i ⩽ C } ( i = 1 , 2 , ⋯ , m ) , K K T 约束 \begin{cases} \underset{\boldsymbol{\alpha }}{\mathrm{arg}\max}\,\,\sum_{i=1}^m{\alpha _i}-\frac{1}{2}\sum_{i=1}^m{\sum_{j=1}^m{\alpha _i\alpha _jy_iy_j\boldsymbol{x}_{i}^{T}\boldsymbol{x}_j}}\\ \left. \begin{array}{r} \sum_{i=1}^m{\alpha _iy_i}=0\\ 0\leqslant \alpha _i\leqslant C\\\end{array} \right\} \left( i=1,2,\cdots ,m \right) , KKT\text{约束}\\\end{cases} ⎩ ⎨ ⎧αargmax∑i=1mαi−21∑i=1m∑j=1mαiαjyiyjxiTxj∑i=1mαiyi=00⩽αi⩽C}(i=1,2,⋯,m),KKT约束
注意: 本文理论难度与编程难度较大,请耐心阅读,仔细思考。
2 优化变量的选择
考虑到约束 ∑ i = 1 m α i y i = 0 \sum\nolimits_{i=1}^m{\alpha _iy_i}=0 ∑i=1mαiyi=0,故每次迭代至少更新一对变量 ( α l , α t ) \left( \alpha _l,\alpha _t \right) (αl,αt),否则会破坏约束条件,设 ( α l , α t ) \left( \alpha _l,\alpha _t \right) (αl,αt)满足:
{ α l y l + α t y t = k α l , u y l + α t , u y t = k ∑ i ≠ l , t m α i y i = − k \begin{cases} \alpha _ly_l+\alpha _ty_t=k\\ \alpha _{l,u}y_l+\alpha _{t,u}y_t=k\\ \sum\nolimits_{i\ne l,t}^m{\alpha _iy_i}=-k\\\end{cases} ⎩ ⎨ ⎧αlyl+αtyt=kαl,uyl+αt,uyt=k∑i=l,tmαiyi=−k
其中 ( α l , α t ) \left( \alpha _l,\alpha _t \right) (αl,αt)是上一轮迭代的参数值,是常量; ( α l , u , α t , u ) \left( \alpha _{l,u},\alpha _{t,u} \right) (αl,u,αt,u)是本轮优化变量,称为未修剪参数,因为其不一定满足KKT约束,需要根据可行域进一步修剪;将 ( α l , u , α t , u ) \left( \alpha _{l,u},\alpha _{t,u} \right) (αl,u,αt,u)修剪为符合约束的 ( α l , ∗ , α t , ∗ ) \left( \alpha _{l,*},\alpha _{t,*} \right) (αl,∗,αt,∗)即为所求。
3 优化目标的约简
只考虑这一对待优化变量 ( α l , u , α t , u ) \left( \alpha _{l,u},\alpha _{t,u} \right) (αl,u,αt,u),其他参数固定为常数,此时优化目标变为
Γ ( α l , u , α t , u ) = ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j x i T x j = ( α l , u + α t , u ) + ∑ i ≠ l , t m α i − 1 2 α l , u 2 x l T x l − 1 2 α t , u 2 x t T x t − α l , u α t , u y l y t x l T x t − α l , u y l x l T ∑ i ≠ l , t m α i y i x i − α t , u y t x t T ∑ i ≠ l , t m α i y i x i \varGamma \left( \alpha _{l,u},\alpha _{t,u} \right) =\sum_{i=1}^m{\alpha _i}-\frac{1}{2}\sum_{i=1}^m{\sum_{j=1}^m{\alpha _i\alpha _jy_iy_j\boldsymbol{x}_{i}^{T}\boldsymbol{x}_j}}\\=\left( \alpha _{l,u}+\alpha _{t,u} \right) +\sum_{i\ne l,t}^m{\alpha _i}-\frac{1}{2}\alpha _{l,u}^{2}\boldsymbol{x}_{l}^{T}\boldsymbol{x}_l-\frac{1}{2}\alpha _{t,u}^{2}\boldsymbol{x}_{t}^{T}\boldsymbol{x}_t\\\,\, -\alpha _{l,u}\alpha _{t,u}y_ly_t\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t-\alpha _{l,u}y_l\boldsymbol{x}_{l}^{T}\sum_{i\ne l,t}^m{\alpha _iy_i}\boldsymbol{x}_i-\alpha _{t,u}y_t\boldsymbol{x}_{t}^{T}\sum_{i\ne l,t}^m{\alpha _iy_i}\boldsymbol{x}_i Γ(αl,u,αt,u)=i=1∑mαi−21i=1∑mj=1∑mαiαjyiyjxiTxj=(αl,u+αt,u)+i=l,t∑mαi−21αl,u2xlTxl−21αt,u2xtTxt−αl,uαt,uylytxlTxt−αl,uylxlTi=l,t∑mαiyixi−αt,uytxtTi=l,t∑mαiyixi
记 v l = x l T ∑ i ≠ l , t m α i y i x i v_l=\boldsymbol{x}_{l}^{T}\sum\nolimits_{i\ne l,t}^m{\alpha _iy_i}\boldsymbol{x}_i vl=xlT∑i=l,tmαiyixi, v t = x t T ∑ i ≠ l , t m α i y i x i v_t=\boldsymbol{x}_{t}^{T}\sum\nolimits_{i\ne l,t}^m{\alpha _iy_i}\boldsymbol{x}_i vt=xtT∑i=l,tmαiyixi,略去常数项 ∑ i ≠ l , t m α i \sum\nolimits_{i\ne l,t}^m{\alpha _i} ∑i=l,tmαi,并代入 α l , u = ( k − α t , u y t ) y l \alpha _{l,u}=\left( k-\alpha _{t,u}y_t \right) y_l αl,u=(k−αt,uyt)yl可得
Γ ( α t , u ) = ( k − α t , u y t ) y l + α t , u − 1 2 ( k − α t , u y t ) 2 x l T x l − 1 2 α t , u 2 x t T x t − ( k − α t , u y t ) α t , u y t x l T x t − ( k − α t , u y t ) v l − α t , u y t v t \varGamma \left( \alpha _{t,u} \right) =\left( k-\alpha _{t,u}y_t \right) y_l+\alpha _{t,u}-\frac{1}{2}\left( k-\alpha _{t,u}y_t \right) ^2\boldsymbol{x}_{l}^{T}\boldsymbol{x}_l-\frac{1}{2}\alpha _{t,u}^{2}\boldsymbol{x}_{t}^{T}\boldsymbol{x}_t\\\,\, -\left( k-\alpha _{t,u}y_t \right) \alpha _{t,u}y_t\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t-\left( k-\alpha _{t,u}y_t \right) v_l-\alpha _{t,u}y_tv_t Γ(αt,u)=(k−αt,uyt)yl+αt,u−21(k−αt,uyt)2xlTxl−21αt,u2xtTxt−(k−αt,uyt)αt,uytxlTxt−(k−αt,uyt)vl−αt,uytvt
化为单变量二次规划问题,可直接求导获得极值。SMO算法正是通过将一组参数的组合优化问题分解为一系列变量的单优化问题获得高效性。
∂ Γ ( α t , u ) ∂ α t , u = − y t y l + 1 + y t ( k − α t , u y t ) x l T x l − α t , u x t T x t − k y t x l T x t + 2 α t , u x l T x t + y t v l − y t v t = 0 \frac{\partial \varGamma \left( \alpha _{t,u} \right)}{\partial \alpha _{t,u}}=-y_ty_l+1+y_t\left( k-\alpha _{t,u}y_t \right) \boldsymbol{x}_{l}^{T}\boldsymbol{x}_l-\alpha _{t,u}\boldsymbol{x}_{t}^{T}\boldsymbol{x}_t-ky_t\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t+2\alpha _{t,u}\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t+y_tv_l-y_tv_t\\\,\, =0 ∂αt,u∂Γ(αt,u)=−ytyl+1+yt(k−αt,uyt)xlTxl−αt,uxtTxt−kytxlTxt+2αt,uxlTxt+ytvl−ytvt=0
代入上一轮迭代常数 ( α l , α t ) \left( \alpha _l,\alpha _t \right) (αl,αt)消去 k k k
( x l T x l + x t T x t − 2 x l T x t ) α t , u = − y t y l + 1 + y t v l − y t v t + y t ( x l T x l − x l T x t ) k = − y t y l + 1 + y t v l − y t v t + y t ( x l T x l − x l T x t ) ( α l y l + α t y t ) = ( x l T x l + x t T x t − 2 x l T x t ) α t + y t [ α l y l x l T x l + α t y t x l T x t + v l + b − y l ] − y t [ α l y l x l T x t + α t y t x t T x t + v t + b − y t ] = ( x l T x l + x t T x t − 2 x l T x t ) α t + y t [ ∑ i = 1 m α i y i x i T x l + b − y l ] − y t [ ∑ i = 1 m α i y i x i T x t + b − y t ] = w = ∑ i = 1 m α i y i x i ( x l T x l + x t T x t − 2 x l T x t ) α t + y t ( y ^ l − y l ) − y t ( y ^ t − y t ) \left( \boldsymbol{x}_{l}^{T}\boldsymbol{x}_l+\boldsymbol{x}_{t}^{T}\boldsymbol{x}_t-2\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t \right) \alpha _{t,u}=-y_ty_l+1+y_tv_l-y_tv_t+y_t\left( \boldsymbol{x}_{l}^{T}\boldsymbol{x}_l-\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t \right) k\\\,\, =-y_ty_l+1+y_tv_l-y_tv_t+y_t\left( \boldsymbol{x}_{l}^{T}\boldsymbol{x}_l-\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t \right) \left( \alpha _ly_l+\alpha _ty_t \right) \\\,\, =\left( \boldsymbol{x}_{l}^{T}\boldsymbol{x}_l+\boldsymbol{x}_{t}^{T}\boldsymbol{x}_t-2\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t \right) \alpha _t\\\,\, +y_t\left[ \alpha _ly_l\boldsymbol{x}_{l}^{T}\boldsymbol{x}_l+\alpha _ty_t\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t+v_l+b-y_l \right] \\\,\, -y_t\left[ \alpha _ly_l\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t+\alpha _ty_t\boldsymbol{x}_{t}^{T}\boldsymbol{x}_t+v_t+b-y_t \right] \\=\left( \boldsymbol{x}_{l}^{T}\boldsymbol{x}_l+\boldsymbol{x}_{t}^{T}\boldsymbol{x}_t-2\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t \right) \alpha _t\\\,\, +y_t\left[ \sum_{i=1}^m{\alpha _iy_i\boldsymbol{x}_{i}^{T}\boldsymbol{x}_l}+b-y_l \right] -y_t\left[ \sum_{i=1}^m{\alpha _iy_i\boldsymbol{x}_{i}^{T}\boldsymbol{x}_t}+b-y_t \right] \\\xlongequal{{ \boldsymbol{w}=\sum_{i=1}^m{\alpha _iy_i\boldsymbol{x}_i}}}\left( \boldsymbol{x}_{l}^{T}\boldsymbol{x}_l+\boldsymbol{x}_{t}^{T}\boldsymbol{x}_t-2\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t \right) \alpha _t+y_t\left( \hat{y}_l-y_l \right) -y_t\left( \hat{y}_t-y_t \right) (xlTxl+xtTxt−2xlTxt)αt,u=−ytyl+1+ytvl−ytvt+yt(xlTxl−xlTxt)k=−ytyl+1+ytvl−ytvt+yt(xlTxl−xlTxt)(αlyl+αtyt)=(xlTxl+xtTxt−2xlTxt)αt+yt[αlylxlTxl+αtytxlTxt+vl+b−yl]−yt[αlylxlTxt+αtytxtTxt+vt+b−yt]=(xlTxl+xtTxt−2xlTxt)αt+yt[i=1∑mαiyixiTxl+b−yl]−yt[i=1∑mαiyixiTxt+b−yt]w=∑i=1mαiyixi(xlTxl+xtTxt−2xlTxt)αt+yt(y^l−yl)−yt(y^t−yt)
设样本预测类别与真实类别的误差项为
{ E l = w T x l + b − y l E t = w T x t + b − y t \begin{cases} E_l=\boldsymbol{w}^T\boldsymbol{x}_l+b-y_l\\ E_t=\boldsymbol{w}^T\boldsymbol{x}_t+b-y_t\\\end{cases} {El=wTxl+b−ylEt=wTxt+b−yt
即得
α t , u = α t + y t ( E l − E t ) ( x l T x l + x t T x t − 2 x l T x t ) { \alpha _{t,u}=\alpha _t+\frac{y_t\left( E_l-E_t \right)}{\left( \boldsymbol{x}_{l}^{T}\boldsymbol{x}_l+\boldsymbol{x}_{t}^{T}\boldsymbol{x}_t-2\boldsymbol{x}_{l}^{T}\boldsymbol{x}_t \right)}} αt,u=αt+(xlTxl+xtTxt−2xlTxt)yt(El−Et)
4 参数可行性修剪
第3节求导计算得到的 α t , u \alpha _{t,u} αt,u有可能不符合约束条件
α l , u y l + α t , u y t = k \alpha _{l,u}y_l+\alpha _{t,u}y_t=k αl,uyl+αt,uyt=k
始终需要记住,我们能进行单变量求解,一定是在满足上面的约束的前提下,否则就会破坏KKT条件,解得的结果也不是最优。所以我们需要对不符合约束的变量进行修剪,修剪至可行域
对于二分类情形,无非就两种情况
- y l = y t y_l=y_t yl=yt,则 α l , u + α t , u = k \alpha _{l,u}+\alpha_{t,u}=k αl,u+αt,u=k
- y l ≠ y t y_l\ne y_t yl=yt,则 α l , u − α t , u = k \alpha _{l,u}-\alpha_{t,u}=k αl,u−αt,u=k
可视化如图所示
这张图是什么意思呢?由于优化参数的定义域是
[
0
,
C
]
[0,C]
[0,C],所以它们被限制在以
C
C
C为边长的方形中。以
y
l
≠
y
t
y_l\ne y_t
yl=yt的情形为例,实际上就是直线
α
t
,
u
=
α
l
,
u
+
k
\alpha_{t,u}=\alpha_{l,u}+k
αt,u=αl,u+k在方形中移动的过程。考虑
k
k
k的正负就有图中红、蓝两种情况,所以
α
t
,
u
\alpha_{t,u}
αt,u在
y
l
≠
y
t
y_l\ne y_t
yl=yt时的取值范围是
{ L = max ( 0 , α t − α l ) H = min ( C , C + α t − α l ) \begin{cases} L=\max \left( 0,\alpha _t-\alpha _l \right)\\ H=\min \left( C,C+\alpha _t-\alpha _l \right)\\ \end{cases} {L=max(0,αt−αl)H=min(C,C+αt−αl)
另一种情况同理,最终我们可以得到
α t , ∗ = { H , α t , u > H α t , u , L ⩽ α t , u ⩽ H L , α t , u < L , 其中 L = { max ( 0 , α t − α l ) , y l ≠ y t max ( 0 , α t + α l − C ) , y l = y t H = { min ( C , C + α t − α l ) , y l ≠ y t min ( C , α t + α l ) , y l = y t \alpha _{t,*}=\begin{cases} H, \alpha _{t,u}>H\\ \alpha _{t,u}, L\leqslant \alpha _{t,u}\leqslant H\\ L, \alpha _{t,u}<L\\ \end{cases}\,\,,\text{其中}\begin{array}{c} L=\begin{cases} \max \left( 0,\alpha _t-\alpha _l \right) , y_l\ne y_t\\ \max \left( 0,\alpha _t+\alpha _l-C \right) , y_l=y_t\\ \end{cases}\\ H=\begin{cases} \min \left( C,C+\alpha _t-\alpha _l \right) , y_l\ne y_t\\ \min \left( C,\alpha _t+\alpha _l \right) , y_l=y_t\\ \end{cases}\\ \end{array} αt,∗=⎩ ⎨ ⎧H,αt,u>Hαt,u,L⩽αt,u⩽HL,αt,u<L,其中L={max(0,αt−αl),yl=ytmax(0,αt+αl−C),yl=ytH={min(C,C+αt−αl),yl=ytmin(C,αt+αl),yl=yt
5 权重与偏置更新
接着更新超平面参数 w = ∑ i = 1 m α i y i x i T \boldsymbol{w}=\sum\nolimits_{i=1}^m{\alpha _iy_i\boldsymbol{x}_{i}^{T}} w=∑i=1mαiyixiT与 b b b以供下一轮迭代使用。
对于 b b b的更新,若 0 < α l , ∗ < C 0<\alpha _{l,*}<C 0<αl,∗<C或 0 < α t , ∗ < C 0<\alpha _{t,*}<C 0<αt,∗<C则样本位于超平面上
y l ( w ∗ T x + b l , ∗ ) = 1 ⇒ b l , ∗ = y l − ∑ i = 1 m α i y i x i T x l y_l\left( \boldsymbol{w}_{*}^{T}\boldsymbol{x}+b_{l,*} \right) =1\Rightarrow b_{l,*}=y_l-\sum\nolimits_{i=1}^m{\alpha _iy_i\boldsymbol{x}_{i}^{T}\boldsymbol{x}_l} yl(w∗Tx+bl,∗)=1⇒bl,∗=yl−∑i=1mαiyixiTxl
提出更新过的优化参数可得到迭代式
b l , ∗ = y l − ∑ i ≠ l , t α i y i x i T x l − α l , ∗ y l x l T x l − α t , ∗ y t x t T x l = y l − ∑ i α i y i x i T x l − b + b + α l y l x l T x l + α t y t x t T x l − α l , ∗ y l x l T x l − α t , ∗ y t x t T x l = b − E l + ( α l − α l , ∗ ) y l x l T x l + ( α t − α t , ∗ ) y t x t T x l b_{l,*}=y_l-\sum_{i\ne l,t}{\alpha _iy_i\boldsymbol{x}_{i}^{T}\boldsymbol{x}_l}-\alpha _{l,*}y_l\boldsymbol{x}_{l}^{T}\boldsymbol{x}_l-\alpha _{t,*}y_t\boldsymbol{x}_{t}^{T}\boldsymbol{x}_l\\=y_l-\sum_i{\alpha _iy_i\boldsymbol{x}_{i}^{T}\boldsymbol{x}_l}-b+b+\alpha _ly_l\boldsymbol{x}_{l}^{T}\boldsymbol{x}_l+\alpha _ty_t\boldsymbol{x}_{t}^{T}\boldsymbol{x}_l-\alpha _{l,*}y_l\boldsymbol{x}_{l}^{T}\boldsymbol{x}_l-\alpha _{t,*}y_t\boldsymbol{x}_{t}^{T}\boldsymbol{x}_l\\=b-E_l+\left( \alpha _l-\alpha _{l,*} \right) y_l\boldsymbol{x}_{l}^{T}\boldsymbol{x}_l+\left( \alpha _t-\alpha _{t,*} \right) y_t\boldsymbol{x}_{t}^{T}\boldsymbol{x}_l bl,∗=yl−i=l,t∑αiyixiTxl−αl,∗ylxlTxl−αt,∗ytxtTxl=yl−i∑αiyixiTxl−b+b+αlylxlTxl+αtytxtTxl−αl,∗ylxlTxl−αt,∗ytxtTxl=b−El+(αl−αl,∗)ylxlTxl+(αt−αt,∗)ytxtTxl
b t , ∗ b_{t,*} bt,∗的计算同理,综合为
{ b ∗ = b l , ∗ , 0 < α l , ∗ < C b ∗ = b t , ∗ , 0 < α t , ∗ < C b ∗ = ( b l , ∗ + b t , ∗ ) / 2 , o t h e r w i s e \begin{cases} b_*=b_{l,*}\,\, ,0<\alpha _{l,*}<C\\ b_*=b_{t,*}\,\, ,0<\alpha _{t,*}<C\\ b_*={{\left( b_{l,*}+b_{t,*} \right)}/{2 }},\mathrm{otherwise}\\ \end{cases} ⎩ ⎨ ⎧b∗=bl,∗,0<αl,∗<Cb∗=bt,∗,0<αt,∗<Cb∗=(bl,∗+bt,∗)/2,otherwise
6 收敛性分析
SMO算法的收敛性由Osuna定理保证
若将一个大规模二次规划问题分解为一系列小规模二次规划子问题,且子问题总是加入至少一个违反KKT条件的变量,那么原二次规划问题求解一定收敛。
从算法收敛的角度SMO算法设置了内外两层循环,外循环挑选违反KKT条件的第一个变量 α t \alpha_t αt,怎么挑选呢?首先我们知道不违反KKT条件的变量满足
{ α i = 0 ⇒ y i ( w T x i + b ) > 1 0 < α i < C ⇒ y i ( w T x i + b ) = 1 α i = C ⇒ y i ( w T x i + b ) < 1 \begin{cases} \,\, \alpha _i=0\Rightarrow y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) >1\\ 0<\alpha _i<C\Rightarrow y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) =1\\ \,\, \alpha _i=C\Rightarrow y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) <1\\\end{cases} ⎩ ⎨ ⎧αi=0⇒yi(wTxi+b)>10<αi<C⇒yi(wTxi+b)=1αi=C⇒yi(wTxi+b)<1
在工程上引入精度常数避免浮点误差
{ α i = 0 ⇒ y i ( w T x i + b ) ⩾ 1 − ε 0 < α i < C ⇒ 1 − ε ⩽ y i ( w T x i + b ) ⩽ 1 + ε α i = C ⇒ y i ( w T x i + b ) ⩽ 1 + ε ⇒ { α i = 0 ⇒ y i E i ⩾ − ε 0 < α i < C ⇒ − ε ⩽ y i E i ⩽ ε α i = C ⇒ y i E i ⩽ ε \begin{cases} \,\, \alpha _i=0\Rightarrow \,\, y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) \geqslant 1-\varepsilon\\ 0<\alpha _i<C\Rightarrow 1-\varepsilon \leqslant y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) \leqslant 1+\varepsilon\\ \,\, \alpha _i=C\Rightarrow \,\, y_i\left( \boldsymbol{w}^T\boldsymbol{x}_i+b \right) \leqslant 1+\varepsilon\\\end{cases}\Rightarrow \begin{cases} \,\, \alpha _i=0\Rightarrow \,\, y_iE_i\geqslant -\varepsilon\\ 0<\alpha _i<C\Rightarrow -\varepsilon \leqslant y_iE_i\leqslant \varepsilon\\ \,\, \alpha _i=C\Rightarrow \,\, y_iE_i\leqslant \varepsilon\\\end{cases} ⎩ ⎨ ⎧αi=0⇒yi(wTxi+b)⩾1−ε0<αi<C⇒1−ε⩽yi(wTxi+b)⩽1+εαi=C⇒yi(wTxi+b)⩽1+ε⇒⎩ ⎨ ⎧αi=0⇒yiEi⩾−ε0<αi<C⇒−ε⩽yiEi⩽εαi=C⇒yiEi⩽ε
所以不符合KKT约束的变量满足
v i o l a t o r : ( α i < C a n d y i E i < − ε ) o r ( α i > 0 a n d y i E i > ε ) \mathbf{violator}: \left( \alpha _i<C\,\,\mathbf{and}\,\,y_iE_i<-\varepsilon \right) \,\,\mathbf{or}\,\,\left( \alpha _i>0 \mathbf{and}\,\,y_iE_i>\varepsilon \right) violator:(αi<CandyiEi<−ε)or(αi>0andyiEi>ε)
第二个变量 α l \alpha_l αl我们可以启发式地选择与 α t \alpha_t αt相差最远的,这样更新效率最高,即
m a x ∣ E l − E t ∣ max|E_l-E_t| max∣El−Et∣
7 Python实现
7.1 整体算法流程
7.2 挑选优化变量
外层循环选择不满足KKT条件的变量
for t in range(self.m):
Et = self.E[t]
# 判断是否符合KKT条件
if (self.alpha[t] < self.C and self.y[t] * Et < -self.tol) or \
(self.alpha[t] > 0 and self.y[t] * Et > self.tol):
# 启发式选择参数l
l = self.__selectL(t)
if l >= 0 and self.updateAlpha(t, l):
changed = True
# 符合KKT条件则跳过
else: continue
内层循环选择满足 m a x ∣ E l − E t ∣ max|E_l-E_t| max∣El−Et∣条件的变量
def __selectL(self, t):
validIndex = self.alpha.nonzero()[0]
if validIndex.size > 0:
deltaE = np.abs(self.E[t] - self.E[validIndex])
return validIndex[np.argmax(deltaE)]
else:
return -1
7.3 裁剪并更新alpha
def updateAlpha(self, t, l):
# 保留旧值
alpha_t, alpha_l = self.alpha[t].copy(), self.alpha[l].copy()
# 计算学习率
eta = np.dot(self.X[:, l].T, self.X[:, l]) + np.dot(self.X[:, t].T, self.X[:, t]) \
- 2 * np.dot(self.X[:, l].T, self.X[:, t])
# 保持其中一个变量的更新方向
if eta <= 0:
return False
# 计算未裁剪参数
alpha_tu = self.alpha[t] + self.y[t] * (self.E[l] - self.E[t]) / eta
# 裁剪取值上下界
if (self.y[t] != self.y[l]):
L = max(0, self.alpha[t] - self.alpha[l])
H = min(self.C, self.C + self.alpha[t] - self.alpha[l])
else:
L = max(0, self.alpha[t] + self.alpha[l] - self.C)
H = min(self.C, self.alpha[t] + self.alpha[l])
if L==H:
return False
# 裁剪
if alpha_tu < L:
self.alpha[t] = L
elif alpha_tu > H:
self.alpha[t] = H
else:
self.alpha[t] = alpha_tu
self.alpha[l] = self.alpha[l] + self.y[l] * self.y[t] * (alpha_t - self.alpha[t])
# 计算优化参数变化量
deltaAlphaT, deltaAlphaL = self.alpha[t] - alpha_t, self.alpha[l] - alpha_l
if abs(deltaAlphaT) < 0.0001 or abs(deltaAlphaL) < 0.0001:
return False
# 更新权重、偏置和误差参数
self.updateW()
self.updateB(t, l, deltaAlphaT, deltaAlphaL)
self.updateE()
return True
7.4 更新权重与偏置
def updateW(self):
self.w = np.sum((self.alpha * self.y).T * self.X, axis=1, keepdims=True)
def updateB(self, t:int, l:int, deltaAlphaT:float, deltaAlphaL:float):
bL = -self.E[l] - self.y[t] * np.dot(self.X[:, l].T, self.X[:, t]) * (deltaAlphaT) \
- self.y[l] * np.dot(self.X[:, l].T, self.X[:, l]) * (deltaAlphaL) + self.b
bT = -self.E[t] - self.y[l] * np.dot(self.X[:, l].T, self.X[:, t]) * (deltaAlphaL) \
- self.y[t] * np.dot(self.X[:, t].T, self.X[:, t]) * (deltaAlphaT) + self.b
if 0 < self.alpha[t] < self.C:
self.b = bT
elif 0 < self.alpha[l] < self.C:
self.b = bL
else:
self.b = (bL + bT)/2
7.5 可视化
完整代码请联系下方博主名片
🔥 更多精彩专栏:
- 《ROS从入门到精通》
- 《机器人原理与技术》
- 《机器学习强基计划》
- 《计算机视觉教程》
- …