当前位置: 首页 > news >正文

机器学习:详细推导序列最小优化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} αargmaxi=1mαi21i=1mj=1mαiαjyiyjxiTxji=1mαiyi=00αiC}(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=ki=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=1mαi21i=1mj=1mαiαjyiyjxiTxj=(αl,u+αt,u)+i=l,tmαi21αl,u2xlTxl21αt,u2xtTxtαl,uαt,uylytxlTxtαl,uylxlTi=l,tmαiyixiαt,uytxtTi=l,tmα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=xlTi=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=xtTi=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,u21(kαt,uyt)2xlTxl21α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,uxtTxtkytxlTxt+2αt,uxlTxt+ytvlytvt=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+xtTxt2xlTxt)αt,u=ytyl+1+ytvlytvt+yt(xlTxlxlTxt)k=ytyl+1+ytvlytvt+yt(xlTxlxlTxt)(αlyl+αtyt)=(xlTxl+xtTxt2xlTxt)αt+yt[αlylxlTxl+αtytxlTxt+vl+byl]yt[αlylxlTxt+αtytxtTxt+vt+byt]=(xlTxl+xtTxt2xlTxt)αt+yt[i=1mαiyixiTxl+byl]yt[i=1mαiyixiTxt+byt]w=i=1mαiyixi (xlTxl+xtTxt2xlTxt)αt+yt(y^lyl)yt(y^tyt)

设样本预测类别与真实类别的误差项为

{ 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+bylEt=wTxt+byt

即得

α 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+xtTxt2xlTxt)yt(ElEt)

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,uHL,αt,u<L,其中L={max(0,αtαl),yl=ytmax(0,αt+αlC),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(wTx+bl,)=1bl,=yli=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,=yli=l,tαiyixiTxlαl,ylxlTxlαt,ytxtTxl=yliαiyixiTxlb+b+αlylxlTxl+αtytxtTxlαl,ylxlTxlαt,ytxtTxl=bEl+(α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=0yi(wTxi+b)>10<αi<Cyi(wTxi+b)=1αi=Cyi(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=0yi(wTxi+b)1ε0<αi<C1εyi(wTxi+b)1+εαi=Cyi(wTxi+b)1+ε αi=0yiEiε0<αi<CεyiEiεαi=CyiEiε

所以不符合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| maxElEt

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| maxElEt条件的变量

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从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

相关文章:

  • Flask 学习-20. route 路由中的 endpoint 参数
  • bp神经网络反向传播推导,bp神经网络的传递函数
  • Flask 学习-21. 项目配置通过.env环境变量启动开发/生产环境
  • 图像识别和机器视觉区别,比较两幅图像的相似度
  • Jetson Orin平台Jetpack5.0.2 VIFALC_TDSTATE问题调试
  • Elastic search的日期问题
  • DOM基础应用
  • 足疗APP
  • 一张图进阶 RocketMQ - 消息存储
  • kafka生产者如何提高吞吐量
  • 基于神经网络的智能系统,神经元网络控制的作用
  • npm——整理前端包管理工具(cnpm、yarn、pnpm)
  • 基于Vue+Element UI+Node+MongoDB的医院门诊预约挂号系统
  • Linux系统中使用vim编写C语言代码实现过程
  • Spire.Cloud 私有化部署教程(三) - Windows 系统
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • dva中组件的懒加载
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript设计模式系列一:工厂模式
  • LeetCode18.四数之和 JavaScript
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Redis的resp协议
  • Redis在Web项目中的应用与实践
  • SwizzleMethod 黑魔法
  • V4L2视频输入框架概述
  • vue 配置sass、scss全局变量
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 闭包--闭包作用之保存(一)
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 小李飞刀:SQL题目刷起来!
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 异步
  • ​批处理文件中的errorlevel用法
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (排序详解之 堆排序)
  • (原創) 未来三学期想要修的课 (日記)
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .Net CF下精确的计时器
  • .net core 6 redis操作类
  • .Net Core 中间件验签
  • .NET Framework杂记
  • .Net MVC4 上传大文件,并保存表单
  • .NET 回调、接口回调、 委托
  • .NET/C# 使用反射注册事件
  • .net访问oracle数据库性能问题
  • @JoinTable会自动删除关联表的数据