机器学习-分类-支持向量机

SVM概述

基于最大间隔来对数据进行分类
优点: 泛化错误率低,计算开销不大,结果易解释。
缺点: 对参数调节和核函数的选择敏感

下图中蓝色直线为分隔超平面,用 W T x + b = 0 W^Tx+b=0 WTx+b=0 来表示,其中 W T W^T WT b b b 要求解的,在支持向量机的求解中,需要找到离分隔面最近的那些点,这些点叫做支持向量,然后确保它们离分隔面的距离尽量的远,支持向量到分隔面的距离称为margin= W T x + b ∣ ∣ W ∣ ∣ \frac{W^Tx+b}{||W||} WWTx+b,其中 ∣ ∣ W ∣ ∣ ||W|| W 是向量 W W W L 2 L2 L2 范数,即: ∑ i = 1 m W i 2 \sqrt{\sum_{i=1}^{m}W_i^2} i=1mWi2

预测函数为: f ( x ) = W T x + b f(x)=W^Tx+b f(x)=WTx+b

对于输出 y y y,定义 y = { 1 , f ( x ) &gt; 0 − 1 , f ( x ) &lt; 0 = s g n ( f ( x ) ) y=\left\{ \begin{aligned} 1, f(x)&gt;0 \\ -1, f(x)&lt;0\\ \end{aligned} \right.=sgn(f(x)) y={1,f(x)>01,f(x)<0=sgn(f(x))

那么可以得到: y i ( W T x i + b ) ⩾ 1 y_i(W^Tx_i+b)\geqslant 1 yi(WTxi+b)1,这个是约束条件函数

总结:求解SVM算法,目标就是找出模型参数 W W W b b b,为此,必须找到具有最小margin的数据点,也就是支持向量。一旦找到具有最小间隔的数据点,我们就需要对该margin最大化,那么优化目标函数可以写作:
max ⁡ w , b { min ⁡ m ( y ⋅ ( W T x + b ) ) ⋅ 1 ∣ ∣ W ∣ ∣ } \max_{w,b}\left \{ \min_{m}(y\cdot (W^Tx+b))\cdot \frac{1}{||W||}\right\} w,bmax{mmin(y(WTx+b))W1}

为了方便对上面公式的求解,令所有支持向量 y ⋅ ( W T x + b ) ) y\cdot (W^Tx+b)) y(WTx+b)) 都为1,那么求解margin的最大值就是求解 ∣ ∣ W ∣ ∣ ||W|| W 的最小值了,即:
min ⁡ w , b ∣ ∣ W ∣ ∣ \min_{w,b}||W|| w,bminW

为了方便计算,我们将上面的式子积分一下,然后写成向量的形式:

min ⁡ w , b ∣ ∣ W ∣ ∣ = &gt; min ⁡ w , b ∣ ∣ W ∣ ∣ 2 2 = min ⁡ w , b 1 2 W T W \min_{w,b}||W||=&gt;\min_{w,b} \frac{||W||^2}{2}=\min_{w,b} \frac{1}{2}W^TW w,bminW=>w,bmin2W2=w,bmin21WTW

在上述优化问题中,给定了一个跟 W W W b b b 相关的约束条件,然后求最优值,因此该问题是一个带约束条件的优化问题,即:
{ min ⁡ w , b 1 2 W T W s . t .   y i ( W T x i + b ) ⩾ 1 \left \{ \begin{aligned} &amp; \min_{w,b}\frac{1}{2}W^TW \\ &amp;s.t. \ y_i(W^Tx_i+b)\geqslant 1\\ \end{aligned} \right. w,bmin21WTWs.t. yi(WTxi+b)1

对于此类问题,我们用 拉格朗日乘子法 来对其进行求解,将约束条件函数优化目标函数联立,从而求出使原函数取得极值时,各个变量的解。使用拉格朗日乘子法时,需满足:乘子 λ ⩾ 0 \lambda \geqslant 0 λ0,原约束条件函数小于0,所以我们将约束条件函数写成 1 − y i ( W T x i + b ) ⩽ 0 1-y_i(W^Tx_i+b)\leqslant 0 1yi(WTxi+b)0,那么上述原优化目标函数就可以写成:

L ( W , b , λ ) = 1 2 W T W + ∑ i = 1 m λ i ( 1 − y i ( W T x i + b ) ) L(W,b,\lambda) = \frac{1}{2}W^TW +\sum_{i=1}^{m}\lambda_i(1-y_i(W^Tx_i+b)) L(W,b,λ)=21WTW+i=1mλi(1yi(WTxi+b))

那么,对于原优化问题,就转化为如下优化问题了:

{ min ⁡ w , b max ⁡ λ   L ( W , b , λ ) s . t .   λ ⩾ 0 \left \{ \begin{aligned} &amp; \min_{w,b} \max_{\lambda}\ L(W,b,\lambda) \\ &amp;s.t.\ \lambda \geqslant 0 \end{aligned} \right. w,bminλmax L(W,b,λ)s.t. λ0

这样我们就将原函数中关于 W W W b b b 的约束条件转化为关于 λ \lambda λ 的约束条件了,二者在解释上是等价的,该优化问题的对偶问题为:

{ max ⁡ λ min ⁡ w , b   L ( W , b , λ ) s . t .   λ ⩾ 0 \left \{ \begin{aligned} &amp; \max_{\lambda} \min_{w,b}\ L(W,b,\lambda) \\ &amp;s.t.\ \lambda \geqslant 0 \end{aligned} \right. λmaxw,bmin L(W,b,λ)s.t. λ0

对偶问题存在弱对偶关系:

min ⁡ w , b max ⁡ λ   L ( W , b , λ ) ⩾ max ⁡ λ min ⁡ w , b   L ( W , b , λ ) \min_{w,b} \max_{\lambda}\ L(W,b,\lambda) \geqslant \max_{\lambda} \min_{w,b}\ L(W,b,\lambda) w,bminλmax L(W,b,λ)λmaxw,bmin L(W,b,λ)

但是在这里, min ⁡ w , b 1 2 W T W \min_{w,b}\frac{1}{2}W^TW minw,b21WTW 是二次的,同时 y i ( W T x i + b ) ⩾ 1 y_i(W^Tx_i+b)\geqslant 1 yi(WTxi+b)1 满足线性关系,那么这个优化问题就是一个凸优化问题了,那么这两个对偶问题满足强对偶关系,即:
min ⁡ w , b max ⁡ λ   L ( W , b , λ ) = max ⁡ λ min ⁡ w , b   L ( W , b , λ ) \min_{w,b} \max_{\lambda}\ L(W,b,\lambda) = \max_{\lambda} \min_{w,b}\ L(W,b,\lambda) w,bminλmax L(W,b,λ)=λmaxw,bmin L(W,b,λ)

原问题 L ( W , b , λ ) L(W,b,\lambda) L(W,b,λ) 和它的对偶问题之间具有强对偶关系,它的充要条件为满足KKT条件,即:

{ ∂ L ∂ W = 0 ,   ∂ L ∂ b = 0 ,   ∂ L ∂ λ = 0 ( 梯 度 为 0 ) λ i ( 1 − y i ( W T x i + b ) ) = 0 ( 互 补 松 弛 条 件 ) λ i ⩾ 0 ,   1 − y i ( W T x i + b ) ⩽ 0 ( 可 行 条 件 ) \left \{ \begin{aligned} &amp;\frac{\partial L}{\partial W}=0,\ \frac{\partial L}{\partial b}=0,\ \frac{\partial L}{\partial \lambda}=0(梯度为0)\\ &amp;\lambda_i(1-y_i(W^Tx_i+b))=0(互补松弛条件)\\ &amp;\lambda_i\geqslant0, \ 1-y_i(W^Tx_i+b)\leqslant0(可行条件)\\ \end{aligned} \right. WL=0, bL=0, λL=00λi(1yi(WTxi+b))=0λi0, 1yi(WTxi+b)0

因此,对于最开始的优化问题,我们求解 max ⁡ λ min ⁡ w , b   L ( W , b , λ ) \max_{\lambda} \min_{w,b}\ L(W,b,\lambda) maxλminw,b L(W,b,λ) 就可以了

先求 L ( W , b , λ ) L(W,b,\lambda) L(W,b,λ) b b b 的偏导数:

∂ L ( W , b , λ ) ∂ b = ∂ ∂ b [ 1 2 W T W + ∑ i = 1 m λ i ( 1 − y i ( W T x i + b ) ) ] = ∂ ∂ b [ ∑ i = 1 m λ i ( 1 − y i ( W T x i + b ) ) ] = ∂ ∂ b [ ∑ i = 1 m λ i ( 1 − y i W T x i − y i b ) ] = ∂ ∂ b ∑ i = 1 m − λ i y i b = − ∑ i = 1 m λ i y i \begin{aligned} \frac{\partial L(W,b,\lambda)}{\partial b} &amp;= \frac{\partial}{\partial b} \left [\frac{1}{2}W^TW +\sum_{i=1}^{m}\lambda_i(1-y_i(W^Tx_i+b)) \right ] \\ &amp;= \frac{\partial}{\partial b} \left [\sum_{i=1}^{m}\lambda_i(1-y_i(W^Tx_i+b)) \right ] \\ &amp;= \frac{\partial}{\partial b} \left [\sum_{i=1}^{m}\lambda_i(1-y_iW^Tx_i-y_ib) \right ] \\ &amp;= \frac{\partial}{\partial b} \sum_{i=1}^{m}-\lambda_iy_ib \\ &amp;=-\sum_{i=1}^{m}\lambda_iy_i \end{aligned} bL(W,b,λ)=b[21WTW+i=1mλi(1yi(WTxi+b))]=b[i=1mλi(1yi(WTxi+b))]=b[i=1mλi(1yiWTxiyib)]=bi=1mλiyib=i=1mλiyi

再求 L ( W , b , λ ) L(W,b,\lambda) L(W,b,λ) W W W 的偏导数:

∂ l ( W , b , λ ) ∂ W = 1 2 W T W + ∑ i = 1 m λ i − ∑ i = 1 m λ i y i W T x i = 1 2 ⋅ 2 ⋅ W − ∑ i = 1 m λ i y i x i = W − ∑ i = 1 m λ i y i x i \begin{aligned} \frac{\partial l(W,b,\lambda)}{\partial W} &amp;=\frac{1}{2}W^TW +\sum_{i=1}^{m}\lambda_i-\sum_{i=1}^{m}\lambda_iy_iW^Tx_i \\ &amp;=\frac{1}{2}\cdot 2 \cdot W-\sum_{i=1}^{m}\lambda_iy_ix_i\\ &amp;=W-\sum_{i=1}^{m}\lambda_iy_ix_i \end{aligned} Wl(W,b,λ)=21WTW+i=1mλii=1mλiyiWTxi=212Wi=1mλiyixi=Wi=1mλiyixi

由于这是一个凸优化问题,那么根据其的性质:凸优化的任一局部最优解都是它的整体最优解,我们做如下处理:

∂ L ( W , b , λ ) ∂ b = 0 \frac{\partial L(W,b,\lambda)}{\partial b}=0 bL(W,b,λ)=0,则 ∑ i = 1 m λ i y i = 0 \sum_{i=1}^{m}\lambda_iy_i=0 i=1mλiyi=0

∂ L ( W , b , λ ) ∂ W = 0 \frac{\partial L(W,b,\lambda)}{\partial W}=0 WL(W,b,λ)=0,则 W = ∑ i = 1 m λ i y i x i W=\sum_{i=1}^{m}\lambda_iy_ix_i W=i=1mλiyixi

将上面两个等式代入 L ( W , b , λ ) L(W,b,\lambda) L(W,b,λ) 函数:

L ( W , b , λ ) = 1 2 W T W + ∑ i = 1 m λ i ( 1 − y i ( W T x i + b ) ) = 1 2 W T W − W T ∑ i = 1 m λ i y i x i − b ∑ i = 1 m λ i y i + ∑ i = 1 m λ i = 1 2 W T ∑ i = 1 m λ i y i x i − W T ∑ i = 1 m λ i y i x i − b × 0 + ∑ i = 1 m λ i = ∑ i = 1 m λ i − 1 2 ( ∑ i = 1 m λ i y i x i ) T ∑ i = 1 m λ i y i x i = ∑ i = 1 m λ i − 1 2 ∑ i , j = 1 m λ i λ j y i y j x i T x j \begin{aligned} L(W,b,\lambda) &amp;= \frac{1}{2}W^TW +\sum_{i=1}^{m}\lambda_i(1-y_i(W^Tx_i+b)) \\ &amp;=\frac{1}{2}W^TW-W^T\sum_{i=1}^{m}\lambda_iy_ix_i-b\sum_{i=1}^{m}\lambda_iy_i+\sum_{i=1}^{m}\lambda_i \\ &amp;=\frac{1}{2}W^T\sum_{i=1}^{m}\lambda_iy_ix_i-W^T\sum_{i=1}^{m}\lambda_iy_ix_i-b\times0+\sum_{i=1}^{m}\lambda_i \\ &amp;=\sum_{i=1}^{m}\lambda_i-\frac{1}{2}\left(\sum_{i=1}^{m}\lambda_iy_ix_i\right)^T\sum_{i=1}^{m}\lambda_iy_ix_i\\ &amp;=\sum_{i=1}^{m}\lambda_i-\frac{1}{2}\sum_{i,j=1}^{m}\lambda_i\lambda_jy_iy_jx_i^Tx_j \end{aligned} L(W,b,λ)=21WTW+i=1mλi(1yi(WTxi+b))=21WTWWTi=1mλiyixibi=1mλiyi+i=1mλi=21WTi=1mλiyixiWTi=1mλiyixib×0+i=1mλi=i=1mλi21(i=1mλiyixi)Ti=1mλiyixi=i=1mλi21i,j=1mλiλjyiyjxiTxj

因为上面的两个等式是在 W 、 b W、b Wb 偏导数为 0 时取得的,为局部最优解,那么根据凸优化问题的性质,代入后得到结果就一定是整体最优解,即 min ⁡ w , b   L ( W , b , λ ) \min_{w,b}\ L(W,b,\lambda) minw,b L(W,b,λ),那么,最终优化问题可以地写成:

{ max ⁡ λ [ ∑ i = 1 m λ i − 1 2 ∑ i , j = 1 m λ i λ j y i y j x i T x j ] s . t .   λ ⩾ 0 ∑ i = 1 m λ i y i = 0 \left \{ \begin{aligned} &amp;\max_{\lambda}\left[\sum_{i=1}^{m}\lambda_i-\frac{1}{2}\sum_{i,j=1}^{m}\lambda_i\lambda_jy_iy_jx_i^Tx_j\right]\\ &amp;s.t. \ \lambda \geqslant0\\ &amp;\quad \sum_{i=1}^{m}\lambda_iy_i=0 \end{aligned} \right. λmax[i=1mλi21i,j=1mλiλjyiyjxiTxj]s.t. λ0i=1mλiyi=0

W = ∑ i = 1 m λ i y i x i W=\sum_{i=1}^{m}\lambda_iy_ix_i W=i=1mλiyixi 代入 预测函数 f ( x ) = W T X + b f(x)=W^TX+b f(x)=WTX+b

f ( x ) = W T x + b = ( ∑ i = 1 m λ i y i x i ) T x + b = ∑ i = 1 m λ i y i &lt; x i T , x &gt; + b = ∑ i = 1 m λ i y i &lt; x i , x T &gt; + b = ∑ i = 1 m λ i y i K ( x i , x j ) + b \begin{aligned} f(x) &amp;=W^Tx+b \\ &amp; =\left(\sum_{i=1}^{m}\lambda_iy_ix_i\right)^Tx+b\\ &amp;=\sum_{i=1}^{m}\lambda_iy_i&lt;x_i^T,x&gt;+b\\ &amp;=\sum_{i=1}^{m}\lambda_iy_i&lt;x_i,x^T&gt;+b\\ &amp;=\sum_{i=1}^{m}\lambda_iy_iK(x_i,x_j)+b \end{aligned} f(x)=WTx+b=(i=1mλiyixi)Tx+b=i=1mλiyi<xiT,x>+b=i=1mλiyi<xi,xT>+b=i=1mλiyiK(xi,xj)+b

其中 x i x_i xi 为第 i i i 个样本向量, x x x 为待预测的输入样本向量, &lt; x i , x T &gt; &lt;x_i,x^T&gt; <xi,xT> 为两个向量的内积(行向量 × \times ×列向量),它的物理含义是衡量两个向量的相似性,这里我们把 K ( x i , x j ) = &lt; x i , x j &gt; K(x_i,x_j)=&lt;x_i,x_j&gt; K(xi,xj)=<xi,xj> 称为核函数

当数据集为线性不可分时,我们可以使用一个非线性特征映射函数 Φ ( x ) \Phi(x) Φ(x) ,将全部原始数据特征低维空间映射到高维空间,然后在高维空间找出分隔超平面,我们称 Φ ( x ) \Phi(x) Φ(x)相似性函数

常见的核函数有以下几种:

1.线性核函数:最简单的核函数,直接计算两个向量的内积,优点是简单、运行效率高,不涉及复杂的变换,总能生成一个线性分隔超平面,结果易于解释,缺点是对线性不可分数据集无法进行有效的分类
K ( x i , x j ) = x i T x j K(x_i,x_j)=x_i^Tx_j K(xi,xj)=xiTxj

2.多项式核函数:通过多项式来作为特征映射函数 Φ ( x ) \Phi(x) Φ(x), 优点是可以拟合出复杂的分隔超平面,缺点是参数太多,有 γ 、 c 、 n \gamma、c、n γcn 这3个参数要选择,实际操作中选择一组合适的参数会比较困难,同时阶数不宜太高,不然,当 x i T x j &lt; 1 x_i^Tx_j&lt;1 xiTxj<1 时,经过 n n n 次运算会接近于0,当 x i T x j &gt; 1 x_i^Tx_j &gt;1 xiTxj>1 时,又会变得非常大,这样就造成核函数不太稳定

K ( x i , x j ) = ( γ x i T x j + c ) n K(x_i,x_j)=(\gamma x_i^Tx_j+c)^n K(xi,xj)=(γxiTxj+c)n

3.高斯核函数:可将输入特征映射到无限多维,所以它的优点是,比 线性核函数 强大的多,同时它比 多项式核函数 更容易计算,因为它计算出来的值永远在 [0, 1] 之间,还有就是它只有一个参数 σ \sigma σ,易于参数调优,缺点是映射到无限多维不易于解释。对于 σ \sigma σ,如果选得过大,高次特征上的权重会衰减的特别快,核函数会变为一个低维的子空间,反之,如果 σ \sigma σ 选得很小,则可将任意数据映射为线性可分,造成严重的过拟合问题

K ( x i , x j ) = exp ⁡ ( − ( x i − x j ) 2 2 σ 2 ) K(x_i,x_j)=\exp\left(-\frac{(x_i-x_j)^2}{2\sigma^2}\right) K(xi,xj)=exp(2σ2(xixj)2)

然而数据集中,往往存在一些数据点偏离正确的分隔面很远,对于处理这种情况,我们引入一个松弛系数(slack variable)来允许这些错误的数据点可以处于分隔面的错误一侧,也就是允许分类面的间隔会小于1

我们定义一个 l o s s loss loss 函数,用 l o s s loss loss 函数表示超出超平面的距离:
如果 y i ( W T x i + b ) ⩾ 1 y_i(W^Tx_i+b)\geqslant1 yi(WTxi+b)1,那么 l o s s = 0 loss=0 loss=0
如果 y i ( W T x i + b ) &lt; 1 y_i(W^Tx_i+b)&lt;1 yi(WTxi+b)<1,那么 l o s s = 1 − y i ( W T x i + b ) loss=1-y_i(W^Tx_i+b) loss=1yi(WTxi+b)
这个 l o s s loss loss 被称为 h i n g e   l o s s hinge\ loss hinge loss,这个 l o s s loss loss 函数可以写成:

l o s s ( x ) = max ⁡ { 0 , 1 − y i ( W T x i + b ) } loss(x)=\max \left \{0, 1-y_i(W^Tx_i+b) \right \} loss(x)=max{0,1yi(WTxi+b)}

那么优化目标函数就可以写成:

min ⁡ w , b ( 1 2 W T W + C ∑ i = 1 m max ⁡ { 0 , 1 − y i ( W T x i + b ) } ) \min_{w,b}\left(\frac{1}{2}W^TW +C\sum_{i=1}^{m} \max \{0, 1-y_i(W^Tx_i+b)\} \right)\\ w,bmin(21WTW+Ci=1mmax{0,1yi(WTxi+b)})

C C C 表示惩罚因子,不过一般不写成上面 max ⁡ \max max 的形式,这里引入一个变量 ξ \xi ξ,令 ξ = 1 − y i ( W T x i + b ) \xi=1-y_i(W^Tx_i+b) ξ=1yi(WTxi+b) ξ ⩾ 0 \xi \geqslant0 ξ0

那么优化目标函数就可以简化成:

min ⁡ w , b ( 1 2 W T W + C ∑ i = 1 m ξ i ) \min_{w,b}\left(\frac{1}{2}W^TW +C\sum_{i=1}^{m} \xi_i\right) w,bmin(21WTW+Ci=1mξi)

这个 ∑ i = 1 m ξ i \sum_{i=1}^{m} \xi_i i=1mξi 被称为软间隔,此时优化问题为:

{ max ⁡ [ min ⁡ w , b ( 1 2 W T W + C ∑ i = 1 m ξ i ) ] s . t .   y i ( W T x i + b ) ⩾ 1 − ξ ξ i ⩾ 0 \left \{ \begin{aligned} &amp;\max\left [ \min_{w,b}\left(\frac{1}{2}W^TW +C\sum_{i=1}^{m} \xi_i\right)\right]\\ &amp;s.t.\ y_i(W^Tx_i+b)\geqslant 1-\xi \\ &amp;\qquad \xi_i\geqslant0 \end{aligned} \right. max[w,bmin(21WTW+Ci=1mξi)]s.t. yi(WTxi+b)1ξξi0

经过拉格朗日乘子对偶变换后,最终优化问题就变成了:

{ max ⁡ λ [ ∑ i = 1 m λ i − 1 2 ∑ i , j = 1 m λ i λ j y i y j x i T x j ] s . t .   C ⩾ λ ⩾ 0 ∑ i = 1 m λ i y i = 0 \left \{ \begin{aligned} &amp;\max_{\lambda}\left[\sum_{i=1}^{m}\lambda_i-\frac{1}{2}\sum_{i,j=1}^{m}\lambda_i\lambda_jy_iy_jx_i^Tx_j\right]\\ &amp;s.t. \ C\geqslant \lambda \geqslant0\\ &amp;\quad \sum_{i=1}^{m}\lambda_iy_i=0 \end{aligned} \right. λmax[i=1mλi21i,j=1mλiλjyiyjxiTxj]s.t. Cλ0i=1mλiyi=0

可以看到和之前没有引入软间隔优化目标函数是一样的,只是约束条件函数中由原来的 λ ⩾ 0 \lambda \geqslant0 λ0 变成了 C ⩾ λ ⩾ 0 C\geqslant \lambda \geqslant0 Cλ0

如果 λ i = 0 \lambda_i=0 λi=0,那么表示为正确分类,样本点在分类边界内部, y i ( W T x i + b ) &gt; 1 y_i(W^Tx_i+b)&gt;1 yi(WTxi+b)>1
如果 C &gt; λ i &gt; 0 C&gt;\lambda_i&gt;0 C>λi>0,那么表示为支持向量,样本点在分类边界上, y i ( W T x i + b ) = 1 y_i(W^Tx_i+b)=1 yi(WTxi+b)=1
如果 λ i = C \lambda_i=C λi=C,那么表示为离群点,样本点在两条边界之间, y i ( W T x i + b ) &lt; 1 y_i(W^Tx_i+b)&lt;1 yi(WTxi+b)<1

下面用SMO来求解 λ \lambda λ,现将上面的优化问题改一下,换成求最小值,然后用核函数 K ( x i , x j ) K(x_i,x_j) K(xi,xj) 表示 x i T x j x_i^Tx_j xiTxj 即:

{ min ⁡ λ [ 1 2 ∑ i , j = 1 m λ i λ j y i y j K ( x i , x j ) − ∑ i = 1 m λ i ] s . t .   C ⩾ λ ⩾ 0 ∑ i = 1 m λ i y i = 0 \left \{ \begin{aligned} &amp;\min_{\lambda}\left[\frac{1}{2}\sum_{i,j=1}^{m}\lambda_i\lambda_jy_iy_jK(x_i,x_j)-\sum_{i=1}^{m}\lambda_i\right]\\ &amp;s.t. \ C\geqslant \lambda \geqslant0\\ &amp;\quad \sum_{i=1}^{m}\lambda_iy_i=0 \end{aligned} \right. λmin[21i,j=1mλiλjyiyjK(xi,xj)i=1mλi]s.t. Cλ0i=1mλiyi=0

上面的式子比较复杂,里面有 m m m 个变量组成的向量 λ \lambda λ 需要在目标函数极小化的时候求出,直接求比较难。SMO算法则采用了一种启发式的方法,它每次只优化两个变量,将其他的变量都视为常数,比如,如果选择了 λ 1 、 λ 2 \lambda_1、\lambda_2 λ1λ2 作为变量,那么 λ 3 、 λ 4 . . . λ m \lambda_3、\lambda_4 ... \lambda_m λ3λ4...λm 就视作常数,这样SMO算法就将一个复杂的优化算法转化为一个比较简单的二变量优化问题了,为了直观理解,将 1 2 ∑ i , j = 1 m λ i λ j y i y j K ( x i , x j ) \frac{1}{2}\sum_{i,j=1}^{m}\lambda_i\lambda_jy_iy_jK(x_i,x_j) 21i,j=1mλiλjyiyjK(xi,xj) 的展开式用表格表示,用 K 11 K_{11} K11 表示 K ( x 1 , x 1 ) K(x_1,x_1) K(x1,x1)

1 2 λ 1 λ 1 y 1 y 1 K 11 \frac{1}{2}\lambda_1\lambda_1y_1y_1K_{11} 21λ1λ1y1y1K11 1 2 λ 2 λ 1 y 2 y 1 K 21 \frac{1}{2}\lambda_2\lambda_1y_2y_1K_{21} 21λ2λ1y2y1K21 1 2 λ 3 λ 1 y 3 y 1 K 31 \frac{1}{2}\lambda_3\lambda_1y_3y_1K_{31} 21λ3λ1y3y1K31 1 2 λ m λ 1 y m y 1 K m 1 \frac{1}{2}\lambda_m\lambda_1y_my_1K_{m1} 21λmλ1ymy1Km1
1 2 λ 1 λ 2 y 1 y 2 K 12 \frac{1}{2}\lambda_1\lambda_2y_1y_2K_{12} 21λ1λ2y1y2K12 1 2 λ 2 λ 2 y 2 y 2 K 22 \frac{1}{2}\lambda_2\lambda_2y_2y_2K_{22} 21λ2λ2y2y2K22 1 2 λ 3 λ 2 y 3 y 2 K 32 \frac{1}{2}\lambda_3\lambda_2y_3y_2K_{32} 21λ3λ2y3y2K32 1 2 λ m λ 2 y m y 2 K m 2 \frac{1}{2}\lambda_m\lambda_2y_my_2K_{m2} 21λmλ2ymy2Km2
1 2 λ 1 λ 3 y 1 y 3 K 13 \frac{1}{2}\lambda_1\lambda_3y_1y_3K_{13} 21λ1λ3y1y3K13 1 2 λ 2 λ 3 y 2 y 3 K 23 \frac{1}{2}\lambda_2\lambda_3y_2y_3K_{23} 21λ2λ3y2y3K23 1 2 λ 3 λ 3 y 3 y 3 K 33 \frac{1}{2}\lambda_3\lambda_3y_3y_3K_{33} 21λ3λ3y3y3K33 1 2 λ m λ 3 y m y 3 K m 3 \frac{1}{2}\lambda_m\lambda_3y_my_3K_{m3} 21λmλ3ymy3Km3
1 2 λ 1 λ m y 1 y m K 1 m \frac{1}{2}\lambda_1\lambda_my_1y_mK_{1m} 21λ1λmy1ymK1m 1 2 λ 2 λ m y 2 y m K 2 m \frac{1}{2}\lambda_2\lambda_my_2y_mK_{2m} 21λ2λmy2ymK2m 1 2 λ 3 λ m y 3 y m K 3 m \frac{1}{2}\lambda_3\lambda_my_3y_mK_{3m} 21λ3λmy3ymK3m 1 2 λ m λ m y m y m K m m \frac{1}{2}\lambda_m\lambda_my_my_mK_{mm} 21λmλmymymKmm

我们只要跟跟 λ 1 、 λ 2 \lambda_1、\lambda_2 λ1λ2 相关的,其他的 λ 3 、 λ 4 . . . λ n \lambda_3、\lambda_4 ... \lambda_n λ3λ4...λn 统统不需要,简单的讲,我们只需要前两行前两列,那么:

1 2 λ 1 λ 1 y 1 y 1 K 11 = 1 2 λ 1 2 y 1 2 K 11 = 1 2 λ 1 2 K 11 \frac{1}{2}\lambda_1\lambda_1y_1y_1K_{11}=\frac{1}{2}\lambda_1^2y_1^2K_{11}=\frac{1}{2}\lambda_1^2K_{11} 21λ1λ1y1y1K11=21λ12y12K11=21λ12K11

1 2 λ 2 λ 2 y 2 y 2 K 22 = 1 2 λ 2 2 y 2 2 K 11 = 1 2 λ 2 2 K 22 \frac{1}{2}\lambda_2\lambda_2y_2y_2K_{22}=\frac{1}{2}\lambda_2^2y_2^2K_{11}=\frac{1}{2}\lambda_2^2K_{22} 21λ2λ2y2y2K22=21λ22y22K11=21λ22K22

1 2 λ 1 λ 2 y 1 y 2 K 12 + 1 2 λ 2 λ 1 y 2 y 1 K 21 = λ 1 λ 2 y 1 y 2 K 12 \frac{1}{2}\lambda_1\lambda_2y_1y_2K_{12}+\frac{1}{2}\lambda_2\lambda_1y_2y_1K_{21}=\lambda_1\lambda_2y_1y_2K_{12} 21λ1λ2y1y2K12+21λ2λ1y2y1K21=λ1λ2y1y2K12

1 2 λ 1 λ 3 y 1 y 3 K 13 + 1 2 λ 3 λ 1 y 3 y 1 K 31 + . . . + 1 2 λ 1 λ m y 1 y m K 1 m + 1 2 λ m λ 1 y m y 1 K m 1 = λ 1 y 1 ∑ i = 3 m λ i y i K 1 i \frac{1}{2}\lambda_1\lambda_3y_1y_3K_{13}+\frac{1}{2}\lambda_3\lambda_1y_3y_1K_{31}+...+\frac{1}{2}\lambda_1\lambda_my_1y_mK_{1m}+\frac{1}{2}\lambda_m\lambda_1y_my_1K_{m1}=\lambda_1y_1\sum_{i=3}^{m}\lambda_iy_iK_{1i} 21λ1λ3y1y3K13+21λ3λ1y3y1K31+...+21λ1λmy1ymK1m+21λmλ1ymy1Km1=λ1y1i=3mλiyiK1i

1 2 λ 2 λ 3 y 2 y 3 K 23 + 1 2 λ 3 λ 2 y 3 y 2 K 32 + . . . + 1 2 λ 2 λ m y 2 y m K 2 m + 1 2 λ m λ 2 y m y 2 K m 2 = λ 2 y 2 ∑ i = 3 m λ i y i K 2 i \frac{1}{2}\lambda_2\lambda_3y_2y_3K_{23}+\frac{1}{2}\lambda_3\lambda_2y_3y_2K_{32}+...+\frac{1}{2}\lambda_2\lambda_my_2y_mK_{2m}+\frac{1}{2}\lambda_m\lambda_2y_my_2K_{m2}=\lambda_2y_2\sum_{i=3}^{m}\lambda_iy_iK_{2i} 21λ2λ3y2y3K23+21λ3λ2y3y2K32+...+21λ2λmy2ymK2m+21λmλ2ymy2Km2=λ2y2i=3mλiyiK2i

相对而言, − ∑ i = 1 m λ i -\sum_{i=1}^{m}\lambda_i i=1mλi 就比较简单了:

− ∑ i = 1 m λ i = − λ 1 − λ 2 − λ 3 − . . . − λ m = − ( λ 1 + λ 2 ) -\sum_{i=1}^{m}\lambda_i=-\lambda_1-\lambda_2-\lambda_3-...-\lambda_m=-(\lambda_1+\lambda_2) i=1mλi=λ1λ2λ3...λm=(λ1+λ2)

那么只用 λ 1 、 λ 2 \lambda_1、\lambda_2 λ1λ2 来表示上面的优化目标函数就是:

min ⁡ w , b [ 1 2 λ 1 2 K 11 + 1 2 λ 2 2 K 22 + λ 1 λ 2 y 1 y 2 K 12 + λ 1 y 1 ∑ i = 3 m λ i y i K 1 i + λ 2 y 2 ∑ i = 3 m λ i y i K 2 i − λ 1 − λ 2 ] \min_{w,b}\left [ \frac{1}{2}\lambda_1^2K_{11}+\frac{1}{2}\lambda_2^2K_{22}+ \lambda_1\lambda_2y_1y_2K_{12}+\lambda_1y_1\sum_{i=3}^{m}\lambda_iy_iK_{1i}+\lambda_2y_2\sum_{i=3}^{m}\lambda_iy_iK_{2i}-\lambda_1-\lambda_2\right]\\ w,bmin[21λ12K11+21λ22K22+λ1λ2y1y2K12+λ1y1i=3mλiyiK1i+λ2y2i=3mλiyiK2iλ1λ2]

v i = ∑ j = 3 m λ j o l d y j K i j , s = y 1 y 2 v_i=\sum_{j=3}^{m}\lambda_j^{old}y_jK_{ij},s=y_1y_2 vi=j=3mλjoldyjKijs=y1y2,那么优化目标函数再次简写为:

min ⁡ w , b [ 1 2 λ 1 2 K 11 + 1 2 λ 2 2 K 22 + λ 1 λ 2 s K 12 + λ 1 y 1 v 1 + λ 2 y 2 v 2 − λ 1 − λ 2 ] \min_{w,b}\left [ \frac{1}{2}\lambda_1^2K_{11}+\frac{1}{2}\lambda_2^2K_{22}+ \lambda_1\lambda_2sK_{12}+\lambda_1y_1v_1+\lambda_2y_2v_2-\lambda_1-\lambda_2\right]\\ w,bmin[21λ12K11+21λ22K22+λ1λ2sK12+λ1y1v1+λ2y2v2λ1λ2]

因为 ∑ i = 1 m λ i y i = 0 \sum_{i=1}^{m}\lambda_iy_i=0 i=1mλiyi=0,那么:

λ 1 y 1 + λ 2 y 2 = λ 1 o l d y 1 + λ 2 o l d y 2 = − ∑ i = 3 m λ i y i \lambda_1y_1+\lambda_2y_2=\lambda_1^{old}y_1+\lambda_2^{old}y_2=-\sum_{i=3}^{m}\lambda_iy_i λ1y1+λ2y2=λ1oldy1+λ2oldy2=i=3mλiyi

两边同时乘以 y 1 y_1 y1

λ 1 + s λ 2 = λ 1 o l d + s λ 2 o l d = w \lambda_1+s\lambda_2=\lambda_1^{old}+s\lambda_2^{old}=w λ1+sλ2=λ1old+sλ2old=w

其中, w = − y 1 ∑ i = 3 m λ i o l d y i w=-y_1\sum_{i=3}^{m}\lambda_i^{old}y_i w=y1i=3mλioldyi ,那么就能用 λ 2 \lambda_2 λ2 来表示 λ 1 \lambda_1 λ1了:

λ 1 = w − s λ 2 \lambda_1=w-s\lambda_2 λ1=wsλ2

将上式子代入优化目标函数,得:

min ⁡ w , b [ 1 2 K 11 ( w − s λ 2 ) 2 + 1 2 K 22 λ 2 2 + s K 12 ( w − s λ 2 ) λ 2 + y 1 ( w − s λ 2 ) v 1 + λ 2 y 2 v 2 − w + s λ 2 − λ 2 ] \min_{w,b}\left [ \frac{1}{2}K_{11}(w-s\lambda_2)^2+\frac{1}{2}K_{22}\lambda_2^2+ sK_{12}(w-s\lambda_2)\lambda_2+y_1(w-s\lambda_2)v_1+\lambda_2y_2v_2-w+s\lambda_2-\lambda_2\right]\\ w,bmin[21K11(wsλ2)2+21K22λ22+sK12(wsλ2)λ2+y1(wsλ2)v1+λ2y2v2w+sλ2λ2]

λ 2 \lambda_2 λ2 求导:

∂ L ( λ 2 ) ∂ λ 2 = ∂ ∂ λ 2 [ 1 2 K 11 ( w − s λ 2 ) 2 + 1 2 K 22 λ 2 2 + s K 12 ( w − s λ 2 ) λ 2 + y 1 ( w − s λ 2 ) v 1 + λ 2 y 2 v 2 − w + s λ 2 − λ 2 ] = ∂ ∂ λ 2 [ 1 2 K 11 ( w 2 + s 2 λ 2 2 − 2 w s λ 2 ) + 1 2 K 22 λ 2 2 + w s K 12 λ 2 − s 2 K 12 λ 2 2 + y 1 w − s y 1 v 1 λ 2 + y 2 v 2 λ 2 − w + s λ 2 − λ 2 ] = K 11 s 2 λ 2 − k 11 w s + K 22 λ 2 + K 12 w s − 2 K 12 s 2 λ 2 − s y 1 v 1 + y 2 v 2 + s − 1 = K 11 λ 2 − K 11 w s + K 22 λ 2 + K 12 w s − 2 K 12 λ 2 − y 2 v 1 + y 2 v 2 + s − 1 = λ 2 ( K 11 + K 22 − 2 K 12 ) − w s ( K 11 − K 12 ) − y 2 ( v 1 − v 2 ) − ( 1 − s ) \begin{aligned} \frac{\partial L(\lambda_2)}{\partial\lambda_2} &amp;=\frac{\partial}{\partial\lambda_2} \left [ \frac{1}{2}K_{11}(w-s\lambda_2)^2+\frac{1}{2}K_{22}\lambda_2^2+ sK_{12}(w-s\lambda_2)\lambda_2+y_1(w-s\lambda_2)v_1+\lambda_2y_2v_2-w+s\lambda_2-\lambda_2\right]\\ &amp;=\frac{\partial}{\partial\lambda_2} \left [ \frac{1}{2}K_{11}(w^2+s^2\lambda_2^2-2ws\lambda_2)+\frac{1}{2}K_{22}\lambda_2^2+wsK_{12}\lambda_2-s^2K_{12}\lambda_2^2+y_1w-sy_1v_1\lambda_2+y_2v_2\lambda_2-w+s\lambda_2-\lambda_2\right]\\ &amp;=K_{11}s^2\lambda_2-k_{11}ws+K_{22}\lambda_2+K_{12}ws-2K_{12}s^2\lambda_2-sy_1v_1+y_2v_2+s-1\\ &amp;=K_{11}\lambda_2-K_{11}ws+K_{22}\lambda_2+K_{12}ws-2K_{12}\lambda_2-y_2v_1+y_2v_2+s-1\\ &amp;=\lambda_2(K_{11}+K_{22}-2K_{12})-ws(K_{11}-K_{12})-y_2(v_1-v_2)-(1-s) \end{aligned} λ2L(λ2)=λ2[21K11(wsλ2)2+21K22λ22+sK12(wsλ2)λ2+y1(wsλ2)v1+λ2y2v2w+sλ2λ2]=λ2[21K11(w2+s2λ222wsλ2)+21K22λ22+wsK12λ2s2K12λ22+y1wsy1v1λ2+y2v2λ2w+sλ2λ2]=K11s2λ2k11ws+K22λ2+K12ws2K12s2λ2sy1v1+y2v2+s1=K11λ2K11ws+K22λ2+K12ws2K12λ2y2v1+y2v2+s1=λ2(K11+K222K12)ws(K11K12)y2(v1v2)(1s)

∂ L ( λ 2 ) ∂ λ 2 = 0 \frac{\partial L(\lambda_2)}{\partial\lambda_2}=0 λ2L(λ2)=0,则:

λ 2 ( K 11 + K 22 − 2 K 12 ) = w s ( K 11 − K 12 ) + y 2 ( v 1 − v 2 ) + ( 1 − s ) \lambda_2(K_{11}+K_{22}-2K_{12})=ws(K_{11}-K_{12})+y_2(v_1-v_2)+(1-s) λ2(K11+K222K12)=ws(K11K12)+y2(v1v2)+(1s)

因为 v i = ∑ j = 3 m λ j o l d y j K i j , f ( x i ) = ∑ j = 1 m λ j y j K i j v_i=\sum_{j=3}^{m}\lambda_j^{old}y_jK_{ij},f(x_i)=\sum_{j=1}^{m}\lambda_jy_jK_{ij} vi=j=3mλjoldyjKijf(xi)=j=1mλjyjKij,那么其实 v 1 v_1 v1 可以写成: v i = f ( x i ) − b − λ 1 o l d y 1 K 1 i − λ 2 o l d y 2 K 2 i v_i=f(x_i)-b-\lambda_1^{old}y_1K_{1i}-\lambda_2^{old}y_2K_{2i} vi=f(xi)bλ1oldy1K1iλ2oldy2K2i

w = λ 1 o l d + s λ 2 o l d , v i = f ( x i ) − b − λ 1 y 1 K 1 i − λ 2 y 2 K 2 i w=\lambda_1^{old}+s\lambda_2^{old},v_i=f(x_i)-b-\lambda_1y_1K_{1i}-\lambda_2y_2K_{2i} w=λ1old+sλ2oldvi=f(xi)bλ1y1K1iλ2y2K2i 代入:

λ 2 ( K 11 + K 22 − 2 K 12 ) = w s ( K 11 − K 12 ) + y 2 ( v 1 − v 2 ) + ( 1 − s ) = s ( λ 1 o l d + s λ 2 o l d ) ( K 11 − K 12 ) + y 2 ( f ( x 1 ) − b − λ 1 o l d y 1 K 11 − λ 2 o l d y 2 K 21 − f ( x 2 ) + b + λ 1 o l d y 1 K 12 + λ 2 o l d y 2 K 22 ) + 1 − s = s K 11 λ 1 o l d + K 11 λ 2 o l d − s K 12 λ 1 o l d − K 12 λ 2 o l d + y 2 ( f ( x 1 ) − f ( x 2 ) ) + 1 − s − s K 11 λ 1 o l d − K 21 λ 2 o l d + s K 12 λ 1 o l d + K 22 λ 2 o l d = K 11 λ 2 o l d + K 22 λ 2 o l d − 2 K 12 λ 2 o l d + y 2 ( f ( x 1 ) − f ( x 2 ) + y 2 − y 1 ) = λ 2 o l d ( K 11 + K 22 − 2 K 12 ) + y 2 ( f ( x 1 ) − y 1 − ( f ( x 2 ) − y 2 ) ) \begin{aligned} \lambda_2(K_{11}+K_{22}-2K_{12}) &amp;=ws(K_{11}-K_{12})+y_2(v_1-v_2)+(1-s)\\ &amp;=s(\lambda_1^{old}+s\lambda_2^{old})(K_{11}-K_{12})+y_2(f(x_1)-b-\lambda_1^{old}y_1K_{11}-\lambda_2^{old}y_2K_{21}-f(x_2)+b+\lambda_1^{old}y_1K_{12}+\lambda_2^{old}y_2K_{22})+1-s\\ &amp;=sK_{11}\lambda_1^{old} +K_{11}\lambda_2^{old}-sK_{12}\lambda_1^{old}-K_{12}\lambda_2^{old}+y_2(f(x_1)-f(x_2))+1-s\\ &amp;\quad-sK_{11}\lambda_1^{old}-K_{21}\lambda_2^{old}+sK_{12}\lambda_1^{old}+K_{22}\lambda_2^{old}\\ &amp;=K_{11}\lambda_2^{old}+K_{22}\lambda_2^{old}-2K_{12}\lambda_2^{old}+y_2(f(x_1)-f(x_2)+y_2-y_1)\\ &amp;=\lambda_2^{old}(K_{11}+K_{22}-2K_{12})+y_2(f(x_1)-y_1-(f(x_2)-y_2)) \end{aligned} λ2(K11+K222K12)=ws(K11K12)+y2(v1v2)+(1s)=s(λ1old+sλ2old)(K11K12)+y2(f(x1)bλ1oldy1K11λ2oldy2K21f(x2)+b+λ1oldy1K12+λ2oldy2K22)+1s=sK11λ1old+K11λ2oldsK12λ1oldK12λ2old+y2(f(x1)f(x2))+1ssK11λ1oldK21λ2old+sK12λ1old+K22λ2old=K11λ2old+K22λ2old2K12λ2old+y2(f(x1)f(x2)+y2y1)=λ2old(K11+K222K12)+y2(f(x1)y1(f(x2)y2))

( K 11 + K 22 − 2 K 12 ) = η , E i = f ( x i ) − y i (K_{11}+K_{22}-2K_{12})=\eta, E_i=f(x_i)-y_i (K11+K222K12)=ηEi=f(xi)yi,然后两边同时除以 ( K 11 + K 22 − 2 K 12 ) (K_{11}+K_{22}-2K_{12}) (K11+K222K12),得:

λ 2 = λ 2 o l d + y 2 ( E 1 − E 2 ) η \lambda_2=\lambda_2^{old}+\frac{y_2(E_1-E_2)}{\eta} λ2=λ2old+ηy2(E1E2)

最终,上面的式子就是对 λ 2 \lambda_2 λ2更新公式了 (心累~)

然后由于 λ 1 + s λ 2 = λ 1 o l d + s λ 2 o l d \lambda_1+s\lambda_2=\lambda_1^{old}+s\lambda_2^{old} λ1+sλ2=λ1old+sλ2old,我们可以求得:

λ 1 = λ 1 o l d + s λ 2 o l d − s λ 2 = λ 1 o l d + y 1 y 2 ( λ 2 o l d − λ 2 ) \begin{aligned} \lambda_1 &amp;=\lambda_1^{old}+s\lambda_2^{old}-s\lambda_2\\ &amp;=\lambda_1^{old}+y_1y_2(\lambda_2^{old}-\lambda_2) \end{aligned} λ1=λ1old+sλ2oldsλ2=λ1old+y1y2(λ2oldλ2)

不过由于 C ⩾ λ 1 ⩾ 0 、 C ⩾ λ 2 ⩾ 0 C\geqslant \lambda1\geqslant0、C\geqslant \lambda_2\geqslant0 Cλ10Cλ20,且 λ 1 y 1 + λ 2 y 2 = ξ \lambda_1y_1+\lambda2y_2=\xi λ1y1+λ2y2=ξ,( ξ \xi ξ 为自定义常数),当 y 1 、 y 2 y_1、y_2 y1y2 异号时,有 λ 1 − λ 2 = ξ \lambda_1-\lambda_2=\xi λ1λ2=ξ,如下图所示, λ 1 、 λ 2 \lambda_1、\lambda_2 λ1λ2 的解在直线上,且在矩形内部,我们用 λ 2 \lambda_2 λ2 来表示 λ 1 \lambda_1 λ1,先优化的是 λ 2 \lambda_2 λ2,那么我们就看纵轴 λ 2 \lambda_2 λ2

当为左上条直线时,最小值为 − ξ -\xi ξ,当为右下角的直线时,最小值为0,由于 λ 2 \lambda_2 λ2必须严格满足大于等于最小值,因此我们需要大于最小值里最大的那一个,所以我们这时候选择较大的那个 − ξ -\xi ξ,根据 λ 1 − λ 2 = ξ \lambda_1-\lambda_2=\xi λ1λ2=ξ 可得: − ξ = λ 2 − λ 1 -\xi=\lambda_2-\lambda_1 ξ=λ2λ1

当为左上条直线时,最大值为 C C C,当为右下角的直线时,最大值为 C − ξ C-\xi Cξ,由于 λ 2 \lambda_2 λ2必须严格满足小于等于最大值,因此我们需要小于最大值里最小的那一个,所以我们这时候选择较小的那个 C − ξ C-\xi Cξ,根据 λ 1 − λ 2 = ξ \lambda_1-\lambda_2=\xi λ1λ2=ξ 可得: C − ξ = C + λ 2 − λ 1 C-\xi=C+\lambda_2-\lambda_1 Cξ=C+λ2λ1

y 1 、 y 2 y_1、y_2 y1y2 同号时, λ 1 + λ 2 = ξ \lambda_1+\lambda_2=\xi λ1+λ2=ξ,整理如下:

y 1 ≠ y 2 { L = max ⁡ { 0 , λ 2 − λ 1 } H = min ⁡ { C , C + λ 2 − λ 1 } y_1 \neq y_2 \left \{ \begin{aligned} &amp;L=\max\{0, \lambda_2-\lambda_1\}\\ &amp;H=\min\{C, C+\lambda_2-\lambda_1\} \end{aligned} \right. y1̸=y2{L=max{0,λ2λ1}H=min{C,C+λ2λ1}

y 1 = y 2 { L = max ⁡ { 0 , λ 2 + λ 1 − C } H = min ⁡ { C , λ 2 + λ 1 } y_1=y_2 \left \{ \begin{aligned} &amp;L=\max\{0, \lambda_2+\lambda_1-C\}\\ &amp;H=\min\{C, \lambda_2+\lambda_1\} \end{aligned} \right. y1=y2{L=max{0,λ2+λ1C}H=min{C,λ2+λ1}

每次计算出来的 λ 2 \lambda_2 λ2,根据对应的 y 1 、 y 2 y_1、y_2 y1y2 同号或异号的情况中对于的 H H H L L L,进行判断,当 H &gt; λ &gt; L H&gt;\lambda&gt;L H>λ>L 时,我们才让 λ 2 \lambda_2 λ2 进行更新,超出 H H H 则更新为 H H H,低于 L L L 则更新为 L L L

然后再计算 b b b,在每次完成两个变量的优化之后,当 C &gt; λ 1 n e w &gt; 0 C&gt;\lambda_1^{new}&gt;0 C>λ1new>0 时,有 f ( x 1 ) = y 1 f(x_1)=y_1 f(x1)=y1,即: ∑ i = 1 m λ i y i K i 1 + b 1 = y 1 \sum_{i=1}^{m}\lambda_iy_iK_{i1}+b_1=y_1 i=1mλiyiKi1+b1=y1,那么:

b 1 n e w = y 1 − ∑ i = 1 m λ i y i K i 1 = y 1 − ∑ i = 3 m λ i y i K i 1 − λ 1 n e w y 1 K 11 − λ 2 n e w y 2 K 21 \begin{aligned} b_1^{new} &amp;=y_1-\sum_{i=1}^{m}\lambda_iy_iK_{i1}\\ &amp;=y_1-\sum_{i=3}^{m}\lambda_iy_iK_{i1}-\lambda_1^{new}y_1K_{11}-\lambda_2^{new}y_2K_{21} \end{aligned} b1new=y1i=1mλiyiKi1=y1i=3mλiyiKi1λ1newy1K11λ2newy2K21

因为 E i = f ( x i ) − y i E_i=f(x_i)-y_i Ei=f(xi)yi,那么:

E 1 = ∑ i = 1 m λ i y i K i 1 + b 1 − y 1 = ∑ i = 3 m λ i y i K i 1 + λ 1 o l d y 1 K 11 + λ 2 o l d y 2 K 21 + b 1 o l d − y 1 \begin{aligned} E_1 &amp;=\sum_{i=1}^{m}\lambda_iy_iK_{i1}+b_1-y_1\\ &amp;=\sum_{i=3}^{m}\lambda_iy_iK_{i1}+\lambda_1^{old}y_1K_{11}+\lambda_2^{old}y_2K_{21}+b_1^{old}-y_1 \end{aligned} E1=i=1mλiyiKi1+b1y1=i=3mλiyiKi1+λ1oldy1K11+λ2oldy2K21+b1oldy1

那么可以得到:

y 1 − ∑ i = 3 m λ i y i K i 1 = b 1 o l d − E 1 + λ 1 o l d y 1 K 11 + λ 2 o l d y 2 K 21 y_1-\sum_{i=3}^{m}\lambda_iy_iK_{i1}=b_1^{old}-E_1+\lambda_1^{old}y_1K_{11}+\lambda_2^{old}y_2K_{21} y1i=3mλiyiKi1=b1oldE1+λ1oldy1K11+λ2oldy2K21

将上式代入 b 1 n e w b_1^{new} b1new,得:

b 1 n e w = b 1 o l d − E 1 + λ 1 o l d y 1 K 11 + λ 2 o l d y 2 K 21 − λ 1 n e w y 1 K 11 − λ 2 n e w y 2 K 21 = b 1 o l d − E 1 − y 1 K 11 ( λ 1 n e w − λ 1 o l d ) − y 2 K 21 ( λ 2 n e w − λ 2 o l d ) \begin{aligned} b_1^{new} &amp;=b_1^{old}-E_1+\lambda_1^{old}y_1K_{11}+\lambda_2^{old}y_2K_{21}-\lambda_1^{new}y_1K_{11}-\lambda_2^{new}y_2K_{21}\\ &amp;=b_1^{old}-E_1-y_1K_{11}(\lambda_1^{new}-\lambda_1^{old})-y_2K_{21}(\lambda_2^{new}-\lambda_2^{old}) \end{aligned} b1new=b1oldE1+λ1oldy1K11+λ2oldy2K21λ1newy1K11λ2newy2K21=b1oldE1y1K11(λ1newλ1old)y2K21(λ2newλ2old)

如果 C &gt; λ 2 &gt; 0 C&gt;\lambda_2&gt;0 C>λ2>0,同理可得:
b 2 n e w = b 2 o l d − E 2 + λ 1 o l d y 1 K 12 + λ 2 o l d y 2 K 22 − λ 1 n e w y 1 K 12 − λ 2 n e w y 2 K 22 = b 2 o l d − E 2 − y 1 K 12 ( λ 1 n e w − λ 1 o l d ) − y 2 K 22 ( λ 2 n e w − λ 2 o l d ) \begin{aligned} b_2^{new} &amp;=b_2^{old}-E_2+\lambda_1^{old}y_1K_{12}+\lambda_2^{old}y_2K_{22}-\lambda_1^{new}y_1K_{12}-\lambda_2^{new}y_2K_{22}\\ &amp;=b_2^{old}-E_2-y_1K_{12}(\lambda_1^{new}-\lambda_1^{old})-y_2K_{22}(\lambda_2^{new}-\lambda_2^{old}) \end{aligned} b2new=b2oldE2+λ1oldy1K12+λ2oldy2K22λ1newy1K12λ2newy2K22=b2oldE2y1K12(λ1newλ1old)y2K22(λ2newλ2old)

最后来根据 λ 1 、 λ 2 \lambda_1、\lambda_2 λ1λ2 来确定最终 b n e w b^{new} bnew 的值:

b n e w = { b 1 n e w , C &gt; λ 1 &gt; 0 b 2 n e w , C &gt; λ 2 &gt; 0 b 1 n e w + b 2 n e w 2 ,   o t h e r w i s e b^{new}= \left \{ \begin{aligned} &amp;b_1^{new},\qquad \quad C&gt;\lambda_1&gt;0\\ &amp;b_2^{new},\qquad \quad C&gt;\lambda_2&gt;0\\ &amp;\frac{b_1^{new}+b_2^{new}}{2},\ otherwise \end{aligned} \right. bnew=b1new,C>λ1>0b2new,C>λ2>02b1new+b2new, otherwise

Ok,终于将所有的公式推完了,上代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np


def load_dataset(file_name):
    data_mat, label_mat = [], []
    fr = open(file_name)
    for line in fr.readlines():
        line_arr = line.strip().split('\t')
        data_mat.append([float(line_arr[0]), float(line_arr[1])])
        label_mat.append(float(line_arr[2]))
    return data_mat, label_mat


def select_random_j(i, m):
    j = i
    while j == i:
        j = int(np.random.uniform(0, m))
    return j


def clip_alpha(aj, H, L):
    if aj > H:
        aj = H
    if L > aj:
        aj = L
    return aj


def smo_simple(data_mat_in, class_labels, C, toler, max_cycle):  # C:常数   toler:容错率
    data_matrix = np.mat(data_mat_in)
    label_matrix = np.mat(class_labels).transpose()
    b = 0
    m, n = np.shape(data_matrix)  # (100, 2)
    lambdas = np.mat(np.zeros((m, 1)))  # (100, 1)
    cycle = 0
    while cycle < max_cycle:
        lambda_pairs_changed = 0  # 记录 lambda 是否已经进行优化
        for i in range(m):  # 遍历每行数据集
            xi, yi = data_matrix[i, :], label_matrix[i]
            fxi = float(np.multiply(lambdas, label_matrix).T * (data_matrix * xi.T)) + b  # 预测类别: f(x)=∑λⁱyⁱ<xⁱ·xᵀ> + b
            Ei = fxi - float(yi)  # 基于xi的预测结果和真实结果的比对,就可以计算误差Ei
            # 如果误差超出容错率和错误分类允许的边界,lambda值不能等于0或C,等于这两个值的话,它们就已经在"边界"上了,因而不能够再减小或增大,因此也就不值得再对它们进行优化了
            if (yi * Ei < -toler) and (lambdas[i] < C) or (yi * Ei > toler) and (lambdas[i] > 0):
                j = select_random_j(i, m)  # 返回一个随机数
                xj, yj = data_matrix[j, :], label_matrix[j]  # 随机向量xj
                fxj = float(np.multiply(lambdas, label_matrix).T * (data_matrix * xj.T)) + b  # 预测类别: f(x)=∑λⁱyⁱ<xⁱ·xᵀ> + b
                Ej = fxj - float(yj)  # 基于xj的预测结果和真实结果的比对,就可以计算误差Ej
                lambda_i_old = lambdas[i].copy()  # 原 λⁱ
                lambda_j_old = lambdas[j].copy()  # 原 λʲ
                if yi != yj:  # yi与yj异号,即一个为+1,另一个为-1
                    L = max(0, lambdas[j] - lambdas[i])  # 大于最小值中较大的一个
                    H = min(C, C + lambdas[j] - lambdas[i])  # 小于最大值中较小的一个
                else:  # yi与yj同号,都为+1或-1
                    L = max(0, lambdas[j] + lambdas[i] - C)
                    H = min(C, lambdas[j] + lambdas[i])
                if L == H:
                    print("L==H")
                    continue
                eta = 2.0 * xi * xj.T - xi * xi.T - xj * xj.T  # η: 最优修改量
                if eta >= 0:
                    print("eta>=0")
                    continue
                lambdas[j] -= yj * (Ei - Ej) / eta  #
                lambdas[j] = clip_alpha(lambdas[j], H, L)  # 更新: H > lambda_j > L
                if abs(lambdas[j] - lambda_j_old) < 0.00001:  # lambdas[j]变化很小则执行跳过
                    print("j not moving enough")
                    continue
                lambdas[i] += yj * yi * (lambda_j_old - lambdas[j])  # 更新lambda_i
                b1 = b - Ei - yi * (lambdas[i] - lambda_i_old) * xi * xi.T - yj * (lambdas[j] - lambda_j_old) * xi * xj.T  # 更新b1
                b2 = b - Ej - yi * (lambdas[i] - lambda_i_old) * xi * xj.T - yj * (lambdas[j] - lambda_j_old) * xj * xj.T  # 更新b2
                if 0 < lambdas[i] < C:
                    b = b1
                elif 0 < lambdas[j] < C:
                    b = b2
                else:
                    b = (b1 + b2) / 2.0
                lambda_pairs_changed += 1  # lambda修正次数+1
                print("cycle: %d i:%d, pairs changed %d" % (cycle, i, lambda_pairs_changed))
        if lambda_pairs_changed == 0:  # 本轮循环中lambda没有被改变 (lambda已优化)
            cycle += 1
        else:  # 本轮循环中lambda被改变了 (lambda存在继续优化的可能)
            cycle = 0
        print("iteration number: %d" % cycle)
    return b, lambdas


if __name__ == '__main__':
    data_mat, label_mat = load_dataset('testSet.txt')
    b, lambdas = smo_simple(data_mat, label_mat, 0.6, 0.001, 40)
    print(lambdas)
    print(b)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值