SVM算法原理与实现

一、线性可分SVM最大硬间隔

1.1 SVM简单介绍

  支持向量机(support vector machines, SVM) 是一种二分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器。对于线性不可分数据,可以运用核技巧来分类,下面我们分别介绍线性可分模型和线性不可分模型。

1.2 符号约定

  假设给定一个特征空间上的训练数据集:
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\} T={(x1,y1),(x2,y2),...,(xm,ym)}
其中, x i ∈ χ = R d x_i \in \chi =R^d xiχ=Rd y i ∈ Y = { + 1 , − 1 } y_i \in Y=\{+1,-1\} yiY={+1,1} x i x_i xi表示第i个特征向量。

图1 SVM分类示意图

1.3 函数间隔

  对于给定的训练数据集T和超平面 ( w , b ) (w,b) (w,b),定义超平面 ( w , b ) (w,b) (w,b)关于T样本点 ( x i , y i ) (x_i,y_i) (xi,yi)的函数间隔 γ i ^ \hat{\gamma_i} γi^与几何间隔 γ i \gamma_i γi分别为:
γ ^ i = y i ( w T x i + b ) (1.1) \hat \gamma_i = y_i(w^Tx_i + b) \tag{1.1} γ^i=yi(wTxi+b)(1.1)
γ i = y i ( w T x i + b ) ∣ ∣ w ∣ ∣ (1.2) \gamma_i = \frac{y_i(w^Tx_i+b)}{||w||} \tag{1.2} γi=wyi(wTxi+b)(1.2)
  定义超平面 ( w , b ) (w,b) (w,b)关于训练数据集T 的函数间隔为超平面 ( w , b ) (w,b) (w,b)关于T中所有样本点 ( x i , y i ) (x_i,y_i) (xi,yi)的函数间隔之最小值,即:
γ ^ = min ⁡ i = 1 , . . . , m γ ^ i (1.3) \hat \gamma = \min_{i=1,...,m}\hat \gamma_i \tag{1.3} γ^=i=1,...,mminγ^i(1.3)
  同理,定义超平面 ( w , b ) (w,b) (w,b)关于训练数据集T 的函数间隔为:
γ = min ⁡ i = 1 , . . . , m γ i (1.4) \gamma =\min_{i=1,...,m} \gamma_i \tag{1.4} γ=i=1,...,mminγi(1.4)
  通过上面的定义可以得到函数间隔和几何间隔存在如下关系:
γ ^ = γ ∣ ∣ w ∣ ∣ (1.5) \hat \gamma = \gamma ||w|| \tag{1.5} γ^=γw(1.5)

1.4 硬间隔最大化

  支持向量机学习的基本想法是:求解能够正确划分训练数据集并且几何间隔最大的分离超平面。具体地, 这个问题可以表示为下面的约束最优化问题:
max ⁡ w , b γ s . t y i w T x i + b ∣ ∣ w ∣ ∣ ≥ γ i = 1 , 2 , . . . , m (1.6) \max_{w,b} \gamma \\ s.t \qquad y_i \frac{w^Tx_i+b}{||w||} \geq \gamma \qquad i=1,2,...,m \tag{1.6} w,bmaxγs.tyiwwTxi+bγi=1,2,...,m(1.6)
  考虑几何间隔和函数间的关系,公式 ( 1.6 ) (1.6) (1.6)可以改写为:
max ⁡ w , b γ ^ ∣ ∣ w ∣ ∣ s . t y i ( w T x i + b ) ≥ γ ^ i = 1 , 2 , . . . , m (1.7) \max_{w,b} \frac{\hat \gamma}{||w||} \\ s.t \qquad y_i(w^Tx_i+b) \geq \hat \gamma \qquad i=1,2,...,m \tag{1.7} w,bmaxwγ^s.tyi(wTxi+b)γ^i=1,2,...,m(1.7)
  显然,函数间隔 γ ^ \hat \gamma γ^的取值并不影响最优化问题的解,令 γ ^ = 1 \hat \gamma=1 γ^=1,注意到最大化 1 ∣ ∣ w ∣ ∣ \frac1{||w||} w1和最小化 1 2 ∣ ∣ w ∣ ∣ 2 \frac12||w||^2 21w2是等价的,所以(1.7)式可写为:
min ⁡ w , b 1 2 ∣ ∣ w ∣ ∣ 2 s . t y i ( w T x i + b ) ≥ 1 i = 1 , 2 , . . . , m (1.8) \min_{w,b} \frac12||w||^2 \\ s.t \qquad y_i(w^Tx_i+b) \geq 1 \qquad i=1,2,...,m \tag{1.8} w,bmin21w2s.tyi(wTxi+b)1i=1,2,...,m(1.8)
  式(1.8)就是我们要求解的SVM分类问题,同时这也是一个二次凸规划问题,并将(1.8)式叫做SVM模型的原问题。这个问题的直接求解可以使用动态规划求解,但我们一般不这么做,因为样本数量过大时,时间复杂度太大。但是将这个问题转换为拉格朗日对偶问题,可以得到许多有趣的性质。我们先将这个原始问题转化为等价的拉格朗日无约束问题。
  首先我们写出拉格朗日函数:
L a g r a n g e ( w , b , λ ) = 1 2 w T w + ∑ i = 1 m λ i [ 1 − y i ( w T x i + b ) ] λ i ≥ 0 (1.9) Lagrange(w,b,\lambda)=\frac12w^Tw+ \sum_{i=1}^m \lambda_i [1-y_i(w^Tx_i+b)] \qquad \lambda_i \geq0 \tag{1.9} Lagrange(w,b,λ)=21wTw+i=1mλi[1yi(wTxi+b)]λi0(1.9)
  则(1.8)式的优化就等价于下面的公式的优化
min ⁡ w , b max ⁡ λ L a g r a n g e ( w , b , λ ) s . t λ i ≥ 0 i = 1 , 2 , . . . , m (1.10) \min_{w,b} \max_{\lambda} Lagrange(w,b,\lambda) \\ s.t \qquad \lambda_i \geq0 \qquad i=1,2,...,m \tag{1.10} w,bminλmaxLagrange(w,b,λ)s.tλi0i=1,2,...,m(1.10)
这里简单说明下(1.8)和(1.10)为什么等价,首先固定 ( w , b ) (w,b) (w,b)来看 max ⁡ L a g r a n g e ( w , b , λ ) \max Lagrange(w,b,\lambda) maxLagrange(w,b,λ),这是一个关于 λ \lambda λ的函数。

  1. 对于满足约束条件的 ( x i , y i ) (x_i,y_i) (xi,yi) ,即 y i ( w T x i + b ) ≥ 1 y_i(w^Tx_i+b) \geq 1 yi(wTxi+b)1,那么 1 − y i ( w T x i + b ) ≤ 0 1-y_i(w^Tx_i+b) \leq 0 1yi(wTxi+b)0,又因为 λ i ≥ 0 \lambda_i \geq0 λi0 ,此时只有 λ = 0 \lambda=0 λ=0取最大,则 max ⁡ L a g r a n g e ( w , b , λ ) = 0 \max Lagrange(w,b,\lambda) = 0 maxLagrange(w,b,λ)=0
  2. 对于不满足约束条件的 ( x i , y i ) (x_i,y_i) (xi,yi) ,即 y i ( w T x i + b ) < 1 y_i(w^Tx_i+b) <1 yi(wTxi+b)<1,那么 1 − y i ( w T x i + b ) > 0 1-y_i(w^Tx_i+b) > 0 1yi(wTxi+b)>0,时只需要令 λ = + ∞ \lambda=+\infty λ=+,则 max ⁡ L a g r a n g e ( w , b , λ ) = + ∞ \max Lagrange(w,b,\lambda) = +\infty maxLagrange(w,b,λ)=+
    综上, max ⁡ L a g r a n g e ( w , b , λ ) \max Lagrange(w,b,\lambda) maxLagrange(w,b,λ)的取值:
    max ⁡ L a g r a n g e ( w , b , λ ) = { 1 2 w T w y i ( w T x i + b ) ≥ 1 + ∞ y i ( w T x i + b ) < 1 (1.11) \max Lagrange(w,b,λ) = \begin{cases} \frac12w^Tw \qquad y_i(w^Tx_i+b) \geq 1 \\ +\infty \qquad y_i(w^Tx_i+b) <1 \end{cases} \tag{1.11} maxLagrange(w,b,λ)={21wTwyi(wTxi+b)1+yi(wTxi+b)<1(1.11)
    min ⁡ w , b max ⁡ λ L a g r a n g e ( w , b , λ ) = min ⁡ w , b ( 1 2 w T w , + ∞ ) = min ⁡ w , b 1 2 w T w (1.12) \min_{w,b} \max_{\lambda} Lagrange(w,b,\lambda)=\min_{w,b}(\frac12w^Tw,+\infty)=\min_{w,b}\frac12w^Tw \tag{1.12} w,bminλmaxLagrange(w,b,λ)=w,bmin(21wTw,+)=w,bmin21wTw(1.12)
    现在回到公式(1.10),对(1.10)使用拉格朗日对偶法,则对公式(1.10)的优化问题等价于:
    max ⁡ λ min ⁡ w , b L a g r a n g e ( w , b , λ ) s . t λ i ≥ 0 i = 1 , 2 , . . . , m (1.13) \max_{\lambda} \min_{w,b} Lagrange(w,b,\lambda) \\ s.t \qquad \lambda_i \geq0 \qquad i=1,2,...,m \tag{1.13} λmaxw,bminLagrange(w,b,λ)s.tλi0i=1,2,...,m(1.13)
    对(1.13)的求解,需要先对拉格朗日函数对 w , b w,b w,b求极小,在对 λ \lambda λ求极大(关于什么条件下对偶问题有解,最优解和原始问题最优解相同的问题暂不说明)。
  1. 求解 min ⁡ w , b L ( w , b , λ ) \min_{w,b}L(w,b,\lambda) minw,bL(w,b,λ)
    将拉格朗日函数 L ( w , b , λ ) L( w,b,\lambda) L(w,b,λ)分别对 w , b w,b w,b求偏导数并令其等于0。
    ▽ w L ( w , b , λ ) = w − ∑ i = 1 m λ i y i x i = 0 ⇒ w = ∑ i = 1 m λ i y i x i ▽ b L ( w , b , λ ) = ∑ i = 1 m λ i y i = 0 (1.14) \bigtriangledown_w L(w,b, \lambda) = w -\sum_{i=1}^m \lambda_i y_i x_i = 0 \Rightarrow w=\sum_{i=1}^m \lambda_i y_i x_i \\ \bigtriangledown_b L(w,b, \lambda) = \sum_{i=1}^m \lambda_i y_i = 0 \tag{1.14} wL(w,b,λ)=wi=1mλiyixi=0w=i=1mλiyixibL(w,b,λ)=i=1mλiyi=0(1.14)
    将(1.14) 带入(1.13)得:
    max ⁡ λ − 1 2 ∑ i = 1 m ∑ i = 1 m λ i λ j y i y j x i T x j + ∑ i = 1 m λ i s . t ∑ i = 1 m λ i y i = 0 λ i ≥ 0 i = 1 , 2 , . . . , m (1.15) \max_{\lambda} -\frac12 \sum_{i=1}^m \sum_{i=1}^m \lambda_i \lambda_j y_i y_j x_i^T x_j + \sum_{i=1}^m \lambda_i \\ s.t \qquad \sum_{i=1}^m \lambda_i y_i = 0 \qquad \lambda_i \geq0 \qquad i=1,2,...,m \tag{1.15} λmax21i=1mi=1mλiλjyiyjxiTxj+i=1mλis.ti=1mλiyi=0λi0i=1,2,...,m(1.15)
    将式(1.16)的目标函数由求极大转换成求极小, 就得到下面与之等价的对偶最优化问题。
    min ⁡ λ 1 2 ∑ i = 1 m ∑ i = 1 m λ i λ j y i y j x i T x j − ∑ i = 1 m λ i s . t ∑ i = 1 m λ i y i = 0 λ i ≥ 0 i = 1 , 2 , . . . , m (1.16) \min_{\lambda} \frac12 \sum_{i=1}^m \sum_{i=1}^m \lambda_i \lambda_j y_i y_j x_i^T x_j - \sum_{i=1}^m \lambda_i \\ s.t \qquad \sum_{i=1}^m \lambda_i y_i = 0 \qquad \lambda_i \geq0 \qquad i=1,2,...,m \tag{1.16} λmin21i=1mi=1mλiλjyiyjxiTxji=1mλis.ti=1mλiyi=0λi0i=1,2,...,m(1.16)
    如果 λ ∗ = ( λ 1 ∗ , λ 2 ∗ , . . . , λ m ∗ ) \lambda^ \ast=(\lambda_1^\ast,\lambda_2^\ast,...,\lambda_m^\ast) λ=(λ1,λ2,...,λm) 是最优化问题(1.16)的解,则存在下标j,使得 λ j > 0 \lambda_j>0 λj>0,可按下式求得原始问题的最优解。
    w ∗ = ∑ i = 1 m λ i ∗ y i x i b ∗ = y j − ∑ i = 1 m λ i ∗ y i x i T x j (1.17) w^\ast= \sum_{i=1}^m \lambda_i^\ast y_i x_i \\ b^\ast = y_j - \sum_{i=1}^m \lambda_i^\ast y_i x_i^Tx_j \tag{1.17} w=i=1mλiyixib=yji=1mλiyixiTxj(1.17)

1.4 硬间隔最大化SMO

  目前,我们已经知道通过求解对偶问题的最优解 λ ∗ \lambda^ \ast λ可以获得原始问题的最优解 w ∗ , b ∗ w^\ast, b^\ast w,b,那么接来下的问题就是:怎么求得对偶问题的最优解呢,我们可以通过最小序列优化(Sequential Minimal Optimization)求解。

SMO 算法是一种启发式算法, 其基本思路是: 如果所有变量的解都满足此最优化问题的 KK丁条件( Karush-Kuhn-Tucker conditions), 那么这个最优化问题的解就得到了. 因为 KKT 条件是该最优化问题的充分必要条件。否则, 选择两个变量, 固定其他变量,针对这两个变量构建一个二次规划问题。

注意,子问题的两个变最中只有一个是自由变量,假设选择 λ 1 , λ 2 \lambda_1,\lambda_2 λ1,λ2这两个变量, λ 3 , λ 4 , . . , λ m \lambda_3,\lambda_4,..,\lambda_m λ3,λ4,..,λm固定由等式(1.14)可知
∑ i = 1 m λ i y i = 0 \sum_{i=1}^m \lambda_i y_i = 0 i=1mλiyi=0
如果 λ 1 \lambda_1 λ1确定,那么 λ 2 \lambda_2 λ2也随之确定 ,所以子问题中同时更新两个变量。

  1. 启发式选择第一个变量 λ 1 \lambda_1 λ1
    SMO 称选择第 1 个变量的过程为外层循环,外层循环首先在整个训练集上遍历,计算每个样本是否违反KKT条件,如果违反就可以用来优化。单次扫描整个训练集之后,外层循环遍历所有拉格朗日乘数不为0的样本(非边界样本),且检查非边界样本是否违反KKT条件,违反的将被用来做优化。外层循环扫描那些非边界样本,直到所有的非边界样本在误差ε内满足KKT条件,然后外层循环重新遍历训练集。外层循环交替进行在整个训练集上单次扫描和在非边界子集上多次扫描,直到整个训练集在误差ε内符合KKT条件,此时算法终止。(注:误差ε内很重要,一般设置为0.001)
  2. 启发式选择第二个变量 λ 2 \lambda_2 λ2
    SMO 称选择第 2 个变量的过程为内层循环,在要在内层循环中找第2个变量 λ 2 \lambda_2 λ2。 第2个变量选择的标准是希望
    能使 λ 2 \lambda_2 λ2有足够大的变化,选择使 ∣ E 1 − E 2 ∣ |E_1-E_2| E1E2最大。因为 λ 1 \lambda_1 λ1已定, E 1 E_1 E1也确定了,如果 E 1 E_1 E1是正的,那么选择最小的 E i E_i Ei作为 E 2 E_2 E2;如果 E 1 E_1 E1是负的,那么选择最大的 E i E_i Ei作为 E 2 E_2 E2。在特殊情况下, 如果内层循环通过以上方法选择的 λ 2 \lambda_2 λ2不能使目标函数有足够的下降, 那么采用以下启发式规则继续选择 λ 2 \lambda_2 λ2。遍历在间隔边界上的支持向量点,依次将其对应的变量作为 λ 2 \lambda_2 λ2用,直到目标函数有足够的下降。若找不到合适的 λ 2 \lambda_2 λ2那么遍历训练数据集;若仍找不到合适的 λ 2 \lambda_2 λ2,则放弃第1个 λ 1 \lambda_1 λ1,再通过外层循环寻求另外的 λ 1 \lambda_1 λ1
  3. 更新 λ 1 , λ 2 \lambda_1,\lambda_2 λ1,λ2
    先定义特征到结果的输出函数为 u i u_i ui、残差 E i E_i Ei
    u i = w T x i + b (1.18) u_i=w^Tx_i+b \tag{1.18} ui=wTxi+b(1.18)
    E i = w T x i + b − y i = u i − y i (1.19) E_i=w^Tx_i+b-y_i=u_i-y_i \tag{1.19} Ei=wTxi+byi=uiyi(1.19)
    SMO 的最优化问题的子问题可以写成
    min ⁡ λ 1 , λ 2 W ( λ 1 , λ 2 ) = 1 2 [ ( 2 y 1 ∑ i = 3 m λ i y i x i x 1 T ) λ 1 + x 1 x 1 T λ 1 2 + ( 2 y 2 ∑ i = 3 m λ i y i x i x 2 T ) λ 2 + x 2 x 2 T λ 2 2 + 2 y 1 y 2 x 1 x 2 T λ 1 λ 2 ] − λ 1 − λ 2 + c o n s t s . t λ 1 y 1 + λ 2 y 2 = − ∑ i = 3 m y i λ i = ζ (1.20) \min_{\lambda_1,\lambda_2} W(\lambda_1,\lambda_2) = \frac12 \left[ \left(2y_1 \sum_{i=3}^m \lambda_i y_i x_i x_1^T\right) \lambda_1 + x_1x_1^T \lambda_1^2 + \left(2y_2 \sum_{i=3}^m \lambda_i y_i x_i x_2^T\right) \lambda_2 + x_2x_2^T \lambda_2^2 + 2y_1 y_2 x_1 x_2^T \lambda_1 \lambda_2 \right] - \lambda_1 - \lambda_2 + const \\ s.t \qquad \lambda_1 y_1 + \lambda_2 y_2 = -\sum_{i=3}^m y_i \lambda_i = \zeta \tag{1.20} λ1,λ2minW(λ1,λ2)=21[(2y1i=3mλiyixix1T)λ1+x1x1Tλ12+(2y2i=3mλiyixix2T)λ2+x2x2Tλ22+2y1y2x1x2Tλ1λ2]λ1λ2+consts.tλ1y1+λ2y2=i=3myiλi=ζ(1.20)
    K i j K_{ij} Kij表示內积 x i T x j x_i^Tx_j xiTxj,将 λ 2 = ( ζ − λ 1 y 1 ) y 2 , y i 2 = 1 \lambda_2=( \zeta - \lambda_1 y_1)y_2, \quad y_i^2=1 λ2=(ζλ1y1)y2,yi2=1带入 W ( λ 1 , λ 2 ) W(\lambda_1,\lambda_2) W(λ1,λ2)得到只含有 λ 1 \lambda_1 λ1的目标函数:
    W ( λ 1 ) = W ( λ 1 , ( ζ − λ 1 y 1 ) y 2 ) = λ 1 y 1 ∑ i = 3 m λ i y i K i 1 + 1 2 K 11 λ 1 2 + ( ζ − λ 1 y 1 ) ∑ i = 3 m λ i y i K i 2 + 1 2 K 22 ( ζ − λ 1 y 1 ) 2 + y 1 K 12 λ 1 ( ζ − λ 1 y 1 ) − λ 1 − ( ζ − λ 1 y 1 ) y 2 + c o n s t = 1 2 ( K 11 + K 22 − 2 K 12 ) λ 1 2 + [ y 1 ∑ i = 3 m λ i y i K i 1 − y 1 ∑ i = 3 m λ i y i K i 2 − y 1 ζ K 22 + y 1 ζ K 12 − 1 + y 1 y 2 ] λ 1 + c o n s t (1.21) \begin{aligned} W(\lambda_1) & = W(\lambda_1,( \zeta - \lambda_1 y_1)y_2) \\ &=\lambda_1 y_1 \sum_{i=3}^m \lambda_i y_i K_{i1} + \frac12 K_{11} \lambda_1^2 + ( \zeta - \lambda_1 y_1) \sum_{i=3}^m \lambda_i y_i K_{i2} +\frac12 K_{22} ( \zeta - \lambda_1 y_1)^2 + y_1 K_{12} \lambda_1 ( \zeta - \lambda_1 y_1) - \lambda_1 - ( \zeta - \lambda_1 y_1)y_2 + const \\ &= \frac12(K_{11} + K_{22} - 2K_{12}) \lambda_1^2 + \left[ y_1 \sum_{i=3}^m \lambda_i y_i K_{i1} - y_1 \sum_{i=3}^m \lambda_i y_i K_{i2} - y_1 \zeta K_{22} + y_1 \zeta K_{12} - 1 + y_1y_2 \right] \lambda_1 +const \tag{1.21} \end{aligned} W(λ1)=W(λ1,(ζλ1y1)y2)=λ1y1i=3mλiyiKi1+21K11λ12+(ζλ1y1)i=3mλiyiKi2+21K22(ζλ1y1)2+y1K12λ1(ζλ1y1)λ1(ζλ1y1)y2+const=21(K11+K222K12)λ12+[y1i=3mλiyiKi1y1i=3mλiyiKi2y1ζK22+y1ζK121+y1y2]λ1+const(1.21)
    λ 1 \lambda_1 λ1求偏导,令其等于0,并带入 y 1 λ 1 o l d + y 2 λ 2 o l d = ζ y_1 \lambda_1^{old} + y_2 \lambda_2^{old} = \zeta y1λ1old+y2λ2old=ζ
    ∂ W ( λ 1 ) ∂ λ 1 = ( K 11 + K 22 − 2 K 12 ) λ 1 + [ y 1 ∑ i = 3 m λ i y i K i 1 − y 1 ∑ i = 3 m λ i y i K i 2 − y 1 ζ K 22 + y 1 ζ K 12 − 1 + y 1 y 2 ] = 0 (1.22) \frac{\partial W(\lambda_1) }{\partial \lambda_1} = (K_{11} + K_{22} - 2K_{12}) \lambda_1 + \left[ y_1 \sum_{i=3}^m \lambda_i y_i K_{i1} - y_1 \sum_{i=3}^m \lambda_i y_i K_{i2} - y_1 \zeta K_{22} + y_1 \zeta K_{12} - 1 + y_1y_2 \right] = 0 \tag{1.22} λ1W(λ1)=(K11+K222K12)λ1+[y1i=3mλiyiKi1y1i=3mλiyiKi2y1ζK22+y1ζK121+y1y2]=0(1.22)
    ( 2 K 12 − K 11 − K 22 ) λ 1 = y 1 [ y 2 − y 1 + ζ K 12 − ζ K 22 + ∑ i = 3 m λ i y i K i 1 − ∑ i = 3 m λ i y i K i 2 ] = y 1 [ y 2 − y 1 + ζ K 12 − ζ K 22 + ∑ i = 1 m λ i y i K i 1 − λ 1 y 1 K 11 − λ 2 y 2 K 21 − ∑ i = 0 m λ i y i K i 2 + λ 1 y 1 K 12 + λ 2 y 2 K 22 ] = y 1 [ y 2 − y 1 + ζ K 12 − ζ K 22 + w T x 1 − λ 1 o l d y 1 K 11 − λ 2 o l d y 2 K 21 − w T x 2 + λ 1 o l d y 1 K 12 + λ 2 o l d y 2 K 22 ] = y 1 [ E 1 − E 2 + 2 y 1 K 12 λ 1 o l d − y 1 K 11 λ 1 o l d − y 1 K 22 λ 1 o l d ] = ( 2 K 12 − K 11 − K 22 ) λ 1 o l d + y 1 ( E 1 − E 2 ) (1.23) \begin{aligned} (2K_{12} - K_{11} - K_{22}) \lambda_1 &= y_1 \left[ y_2-y_1 + \zeta K_{12} - \zeta K_{22} + \sum_{i=3}^m \lambda_i y_i K_{i1} - \sum_{i=3}^m \lambda_i y_i K_{i2}\right] \\ &= y_1 \left[ y_2-y_1 + \zeta K_{12} - \zeta K_{22} +\sum_{i=1}^m \lambda_i y_i K_{i1} - \lambda_1 y_1 K_{11} - \lambda_2 y_2 K_{21} - \sum_{i=0}^m \lambda_i y_i K_{i2} + \lambda_1 y_1 K_{12} + \lambda_2 y_2 K_{22}\right] \\ &= y_1 \left[ y_2-y_1 + \zeta K_{12} - \zeta K_{22} + w^T x_1 - \lambda_1^{old} y_1 K_{11} - \lambda_2^{old} y_2 K_{21} - w^Tx_2 + \lambda_1^{old} y_1 K_{12} + \lambda_2^{old} y_2 K_{22} \right] \\ &=y_1 \left[ E_1- E_2 + 2y_1 K_{12} \lambda_1^{old} - y_1 K_{11} \lambda_1^{old} - y_1 K_{22} \lambda_1^{old}\right] \\ &=(2K_{12} - K_{11} - K_{22}) \lambda_1^{old} + y_1(E_1- E_2) \tag{1.23} \end{aligned} (2K12K11K22)λ1=y1[y2y1+ζK12ζK22+i=3mλiyiKi1i=3mλiyiKi2]=y1[y2y1+ζK12ζK22+i=1mλiyiKi1λ1y1K11λ2y2K21i=0mλiyiKi2+λ1y1K12+λ2y2K22]=y1[y2y1+ζK12ζK22+wTx1λ1oldy1K11λ2oldy2K21wTx2+λ1oldy1K12+λ2oldy2K22]=y1[E1E2+2y1K12λ1oldy1K11λ1oldy1K22λ1old]=(2K12K11K22)λ1old+y1(E1E2)(1.23)
    η = 2 K 12 − K 11 − K 22 \eta = 2K_{12} - K_{11} - K_{22} η=2K12K11K22,由(1.23)得到 λ 1 \lambda_1 λ1
    λ 1 n e w = λ 1 o l d + y 1 ( E 1 − E 2 ) η (1.24) \lambda_1^{new} = \lambda_1^{old} +\frac{y_1(E_1- E_2)}{\eta} \tag{1.24} λ1new=λ1old+ηy1(E1E2)(1.24)
    λ 2 n e w = λ 2 o l d + y 1 y 2 ( λ 1 o l d − λ 1 n e w ) (1.25) \lambda_2^{new} = \lambda_2^{old} + y_1 y_2(\lambda_1^{old} - \lambda_1^{new}) \tag{1.25} λ2new=λ2old+y1y2(λ1oldλ1new)(1.25)
    此时得到是未经修剪的 λ 1 \lambda_1 λ1,需满足约束 λ i ≥ 0 \lambda_i \geq 0 λi0,所以需要确定 λ 1 \lambda_1 λ1的上下界。
    y 1 λ 1 o l d + y 2 λ 2 o l d = y 1 λ 1 n e w + y 2 λ 2 n e w = c o n s t (1.26) y_1 \lambda_1^{old} + y_2 \lambda_2^{old} = y_1 \lambda_1^{new} + y_2 \lambda_2^{new} = const \tag{1.26} y1λ1old+y2λ2old=y1λ1new+y2λ2new=const(1.26)
    由式(1.25)得到 λ 1 \lambda_1 λ1上下界的取值范围:
    y 1 = y 2 , L = 0 ; H = λ 1 o l d + λ 2 o l d y 1 ! = y 2 , L = m a x ( 0 , λ 1 o l d − λ 2 o l d ) ; H = + ∞ (1.27) y_1 = y_2, L = 0;H = \lambda_1^{old} + \lambda_2^{old} \\ y_1 != y_2,L = max(0,\lambda_1^{old} - \lambda_2^{old});H = + \infty \tag{1.27} y1=y2,L=0;H=λ1old+λ2oldy1!=y2,L=max(0,λ1oldλ2old);H=+(1.27)
  4. 更新 b b b
    在每次完成两个变量的优化后, 都要重新计算阈值b,根据KKT条件
    K K T 条 件 { λ i ≥ 0 y i ( w T x i + b ) − 1 ≥ 0 λ i [ y i ( w T x i + b ) − 1 ] = 0 (1.28) KKT条件 \begin{cases} \lambda_i\geq 0 \\ y_i(w^Tx_i+b)-1 \geq 0 \\ \lambda_i[y_i(w^Tx_i+b)-1] = 0 \end{cases} \tag{1.28} KKTλi0yi(wTxi+b)10λi[yi(wTxi+b)1]=0(1.28)
    违 反 K K T 条 件 { 1 、 y i ( w T x i + b ) − 1 = y i E i < 0 2 、 y i ( w T x i + b ) − 1 = y i E i > 0 , λ i > 0 , 违反KKT条件 \begin{cases} 1、y_i(w^Tx_i+b)-1 = y_iE_i < 0 \\ 2、 y_i(w^Tx_i+b)-1 = y_iE_i > 0 , \lambda_i > 0 , \end{cases} KKT{1yi(wTxi+b)1=yiEi<02yi(wTxi+b)1=yiEi>0,λi>0,
    λ 1 n e w > 0 \lambda_1^{new}>0 λ1new>0时:
    w T x 1 + b 1 n e w = y 1 ⇒ b 1 n e w = y 1 − ∑ i = 0 m λ i y i x i x 1 T b 1 n e w = y 1 − ∑ j = 3 m λ i y i x i x 1 T − λ 1 n e w y 1 K 11 − λ 2 n e w y 2 K 21 E 1 = ∑ j = 3 m λ i y i x i x 1 T + λ 1 o l d y 1 K 11 + λ 2 o l d y 2 K 21 + b o l d − y 1 b 1 n e w = − E 1 + λ 1 o l d y 1 K 11 + λ 2 o l d y 2 K 21 + b o l d − λ 1 n e w y 1 K 11 − λ 2 n e w y 2 K 21 b 1 n e w = − 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 ) + b o l d (1.29) w^Tx_1+b_1^{new} = y_1 \Rightarrow b_1^{new} = y_1 - \sum_{i=0}^m \lambda_i y_i x_i x_1^T \\ b_1^{new} = y_1 - \sum_{j=3}^m \lambda_i y_i x_i x_1^T - \lambda_1^{new} y_1K_{11} - \lambda_2^{new} y_2K_{21} \\ E_1 = \sum_{j=3}^m \lambda_i y_i x_i x_1^T +\lambda_1^{old} y_1K_{11} + \lambda_2^{old} y_2K_{21} + b^{old} - y_1 \\ b_1^{new} = -E_1 + \lambda_1^{old} y_1K_{11} + \lambda_2^{old} y_2K_{21} + b^{old} - \lambda_1^{new} y_1K_{11} - \lambda_2^{new} y_2K_{21} \\ b_1^{new} = -E_1 - y_1K_{11}(\lambda_1^{new} - \lambda_1^{old}) - y_2K_{21}(\lambda_2^{new} - \lambda_2^{old}) + b^{old} \tag{1.29} wTx1+b1new=y1b1new=y1i=0mλiyixix1Tb1new=y1j=3mλiyixix1Tλ1newy1K11λ2newy2K21E1=j=3mλiyixix1T+λ1oldy1K11+λ2oldy2K21+boldy1b1new=E1+λ1oldy1K11+λ2oldy2K21+boldλ1newy1K11λ2newy2K21b1new=E1y1K11(λ1newλ1old)y2K21(λ2newλ2old)+bold(1.29)
    同理,当 λ 2 n e w > 0 \lambda_2^{new}>0 λ2new>0时:
    b 2 n e w = − E 2 − y 1 K 21 ( λ 1 n e w − λ 1 o l d ) − y 2 K 22 ( λ 2 n e w − λ 2 o l d ) + b o l d (1.30) b_2^{new} = -E_2 - y_1K_{21}(\lambda_1^{new} - \lambda_1^{old}) - y_2K_{22}(\lambda_2^{new} - \lambda_2^{old}) +b^{old} \tag{1.30} b2new=E2y1K21(λ1newλ1old)y2K22(λ2newλ2old)+bold(1.30)
    如果 λ 1 n e w , λ 2 n e w \lambda_1^{new},\lambda_2^{new} λ1new,λ2new,同时满足条件 λ i n e w > 0 \lambda_i^{new}>0 λinew>0,那么 b 1 n e w = b 2 n e w b_1^{new} = b_2^{new} b1new=b2new;如果 λ 1 n e w , λ 2 n e w \lambda_1^{new},\lambda_2^{new} λ1new,λ2new是0,那么 b 1 n e w b_1^{new} b1new b 2 n e w b_2^{new} b2new以及它们之间的数都是符合 KKT 条件的阈值, 这时选择它们的中点作为 b n e w b^{new} bnew
  5. 更新 E i E_i Ei
    E j n e w = ∑ S y i λ i K i j + b n e w − y j (1.31) E_j^{new} =\sum_S y_i \lambda_i K{ij} +b^{new} - y_j \tag{1.31} Ejnew=SyiλiKij+bnewyj(1.31)
    其中S是所有支持向量 x i x_i xi的集合,根据KKT条件,支持向量的点 λ i ≥ 0 \lambda_i \geq 0 λi0,不是支持向量的点 λ i = 0 \lambda_i = 0 λi=0,所以式(1.31)可以写成(1.32),只是计算量增加,其结果不变。
    E j n e w = ∑ i = 1 m y i λ i K i j + b n e w − y j (1.32) E_j^{new} =\sum_{i=1}^m y_i \lambda_i K{ij} +b^{new} - y_j \tag{1.32} Ejnew=i=1myiλiKij+bnewyj(1.32)

1.5 硬间隔SMO只代码实现

#外层循环 选择alpha1, KKT条件的检查在internal_loop进行
    def outer_loop(self):
        numChanged = 0
        examineAll = 1
        while numChanged > 0 or examineAll:
            numChanged = 0
            if examineAll:
            	# 1 首次在整个训练集上遍历单次扫描,2 所有的非边界样本满足KKT,然后重新遍历整个样本集
                for i in range(self.alphas.shape[0]):
                    numChanged += self.internal_loop(i)
            else:
                # 外层循环遍历所有拉格朗日乘数不为0的样本(非边界样本),在非边界子集上多次扫描
                for i in np.where(self.alphas != 0)[0]:
                    numChanged += self.internal_loop(i)
            if examineAll:
                examineAll = 0
            elif numChanged == 0:
                #表示外层循环交替进行在整个训练集上单次扫描    和   在非边界子集上多次扫描
                examineAll = 1
    # 内层循环
    def internal_loop(self, i1):
        yi = self.y[i1]
        ei = self.errors[i1]
        alphai = self.alphas[i1]
        #在误差范围内0.001,检查第一个点alpha1是否违反KKT条件 
        if (yi * ei < -self.tol) or (yi * ei > self.tol and alphai > 0):
           # 在边界上的点选择|E1-E2|最大
            if len(self.alphas[(self.alphas != 0)]) > 1:
                if ei > 0:
                    i2 = np.argmin(self.errors)
                else:
                    i2 = np.argmax(self.errors)
                step_result = self.take_step(i1, i2)
                if step_result:
                    return 1
            # 若上一步不能更新,就从 0<alpha_1 随机选择一个j,能够更新alpha就更新。
            for i2 in np.roll(np.where(self.alphas != 0)[0], np.random.choice(self.m)):
                step_result = self.take_step(i1, i2)
                if step_result:
                    return 1
            # 若上一步还是不能更新,不考虑范围,从整个数据集中选择一个样本j
            for i2 in np.roll(np.arange(self.m), np.random.choice(np.arange(self.m))):
                step_result = self.take_step(i1, i2)
                if step_result:
                    return 1
        return 0
    # 更新参数alpha1,alpha2,对应文中的lambda1、lambda2
    def take_step(self, i1, i2):
        if i1 == i2:
            return 0
        alph1 = self.alphas[i1]
        alph2 = self.alphas[i2]
        y1 = self.y[i1]
        y2 = self.y[i2]
        E1 = self.errors[i1]
        E2 = self.errors[i2]
        s = y1 * y2
        # 计算 alpha1的上下界
        if y1 != y2:
            L = max(0, alph1 - alph2)
        elif y1 == y2:
            H = alph1 + alph2

        k11 = self.X[i1] @ self.X[i1].T
        k12 = self.X[i1] @ self.X[i2].T
        k22 = self.X[i2] @ self.X[i2].T
        eta = 2 * k12 - k11 - k22
        #计算新的alpha1
        if eta < 0:
            a1 = alph1 + y1 * (E1 - E2) / eta
            if y1 != y2:
                a1 = max(L, a1)
            else:
                a1 = min(H, a1)
        else:
            return 0

        if a1 < 1e-5:
            a1 = 0.0

        #更新过小,则放弃更新
        if np.abs(a1 - alph1) < self.eps*0.01:
            return 0
        a1 = np.round(a1, decimals=5)
        a2 = alph2 + s * (alph1 - a1)
        a2 = np.round(a2, decimals=5)
       
        b1 = -E1 - y1 * (a1 - alph1) * k11 - y2 * (a2 - alph2) * k12 + self.b
        b2 = -E2 - y1 * (a1 - alph1) * k12 - y2 * (a2 - alph2) * k22 + self.b
        b_new = (b1 + b2) * 0.5

        self.alphas[i1] = a1
        self.alphas[i2] = a2
        self.b = b_new
        self.errors = self.decision_function(self.X) - self.y
        return 1
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs


class linersvm:
    def __init__(self, X_train, y, alphas, errors, tol=0.001, eps=0.001, b=0.0):
        self.X = X_train
        self.y = y
        self.alphas = alphas
        self.tol = tol
        self.eps = eps
        self.b = b
        self.errors = errors
        self.m = len(self.X)

    def decision_function(self, x_test):
        return (self.alphas * self.y) @ (self.X @ x_test.T) + self.b
    
    def showClassifer(self):
        plt.scatter(self.X[:, 0], self.X[:, 1], c=self.y, s=30, cmap=plt.cm.Paired)
        xrange = np.linspace(self.X[:, 0].min(), self.X[:, 0].max(), 1000)
        yrange = np.linspace(self.X[:, 1].min(), self.X[:, 1].max(), 1000)
        XX, YY = np.meshgrid(xrange, yrange)
        xy = np.vstack([XX.ravel(), YY.ravel()]).T
        Z = self.decision_function(xy).reshape(XX.shape)
        #画决策边界
        plt.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
        #画支持向量的点
        mask = np.round(self.alphas, decimals=3) != 0.0
        plt.scatter(self.X[mask, 0], self.X[mask, 1], s=100, linewidth=1, facecolors='none', edgecolors='k')
        plt.show()
if __name__ == '__main__':
    sample_numbers = 500
    samples, labels = make_blobs(n_samples=sample_numbers, centers=2, n_features=2, random_state=1)
    labels[labels == 0] = -1
    model = linersvm(samples, labels, np.zeros(sample_numbers), np.zeros(sample_numbers))
    model.errors = model.decision_function(samples) - labels
    model.outer_loop()
    model.showClassifer()

实验结果:

二、线性SVM最大软间隔

2.1 最大软间隔算法介绍

  对于数据集线性不可分的时候,不等式约束并不能都成立,怎么才能将它扩展到线性不可分问题呢? 这就需要修改硬间隔最大化, 使其成为软间隔最大化。
  线性不可分意味着某些样本点 ( x i , y i ) (x_i,y_i) (xi,yi)不能满足函数间隔大于等于1的约束条件。为了解决这个问题,可以对每个样本点 ( x i , y i ) (x_i,y_i) (xi,yi)引进一个松弛变量 ξ i ≥ 0 \xi_i \geq 0 ξi0使函数间隔加上松弛变量大于等于1。约束条件变为:

y i ( w T x i + b ) ≥ 1 − ξ i (2.1) y_i(w^Tx_i+b) \geq 1 - \xi_i \tag{2.1} yi(wTxi+b)1ξi(2.1)
同时, 对每个松弛变量 ξ i \xi_i ξi,支付一个代价 ξ i \xi_i ξi函数由原来的 1 2 ∣ ∣ w ∣ ∣ 2 \frac12||w||^2 21w2变成:
1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 m ξ i (2.2) \frac12 ||w||^2 + C \sum_{i=1}^m \xi_i \tag{2.2} 21w2+Ci=1mξi(2.2)
这里,C>0称为惩罚参数,C值大时对误分类的惩罚增大,C值小时对误分类的惩罚减小。最小化目标函数(2.2)包含两层含义:使 1 2 ∣ ∣ w ∣ ∣ 2 \frac12||w||^2 21w2尽量小即间隔尽量大,同时使误分类点的个数尽量小,C是调和二者的系数。软间隔最大化的原始问题:
min ⁡ w , b , ξ 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 m ξ i s . t y i ( w T x i + b ) ≥ 1 − ξ i i = 1 , 2 , . . . , m ξ i ≥ 0 i = 1 , 2 , . . . , m (2.3) \min_{w,b,\xi} \frac12||w||^2 + C \sum_{i=1}^m \xi_i \\ s.t \qquad y_i(w^Tx_i+b) \geq 1 - \xi_i \qquad i=1,2,...,m \\ \xi_i \geq 0 \qquad i=1,2,...,m \tag{2.3} w,b,ξmin21w2+Ci=1mξis.tyi(wTxi+b)1ξii=1,2,...,mξi0i=1,2,...,m(2.3)
原始问题的拉格朗日函数是:
L ( w , b , ξ , λ , μ ) = 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 m ξ i + ∑ i = 1 m λ i [ 1 − ξ i − y i ( w T x i + b ) ] − ∑ i = 1 m μ i ξ i (2.4) L(w,b,\xi,\lambda,\mu)=\frac12||w||^2 + C \sum_{i=1}^m \xi_i + \sum_{i=1}^m \lambda_i[1 - \xi_i -y_i (w^Tx_i + b)] - \sum_{i=1}^m \mu_i \xi_i \tag{2.4} L(w,b,ξ,λ,μ)=21w2+Ci=1mξi+i=1mλi[1ξiyi(wTxi+b)]i=1mμiξi(2.4)
原始问题等价于对拉格朗日函数的极小极大:
min ⁡ w , b , ξ max ⁡ λ , μ L ( w , b , ξ , λ , μ ) s . t λ i ≥ 0 , μ i ≥ 0 i = 1 , 2 , . . . , m (2.5) \min_{w,b,\xi} \max_{\lambda,\mu} L(w,b,\xi,\lambda , \mu) \\ s.t \qquad \lambda_i \geq 0, \mu_i \geq 0 \qquad i=1,2,...,m \tag{2.5} w,b,ξminλ,μmaxL(w,b,ξ,λ,μ)s.tλi0,μi0i=1,2,...,m(2.5)
拉格朗日函数的极小极大的对偶问题是极大极小:
max ⁡ λ , μ min ⁡ w , b , ξ L ( w , b , ξ , λ , μ ) s . t λ i ≥ 0 , μ i ≥ 0 i = 1 , 2 , . . . , m (2.6) \max_{\lambda,\mu} \min_{w,b,\xi} L(w,b,\xi,\lambda , \mu) \\ s.t \qquad \lambda_i \geq 0, \mu_i \geq 0 \qquad i=1,2,...,m \tag{2.6} λ,μmaxw,b,ξminL(w,b,ξ,λ,μ)s.tλi0,μi0i=1,2,...,m(2.6)
L ( w , b , ξ , λ , μ ) L(w,b,\xi,\lambda , \mu) L(w,b,ξ,λ,μ) w , b , ξ w,b,\xi w,b,ξ的极小
∂ L ∂ w = w − ∑ i = 1 m λ i y i x i = 0 ⇒ w = ∑ i = 1 m λ i y i x i ∂ L ∂ b = − ∑ i = 1 m λ i y i = 0 ⇒ ∑ i = 1 m λ i y i = 0 ∂ L ∂ ξ i = C − λ i − μ i = 0 ⇒ C = λ i + μ i (2.7) \frac{\partial L }{\partial w} = w - \sum_{i=1}^m \lambda_i y_i x_i =0 \Rightarrow w = \sum_{i=1}^m \lambda_i y_i x_i \\ \frac{\partial L }{\partial b} = - \sum_{i=1}^m \lambda_i y_i = 0 \Rightarrow \sum_{i=1}^m \lambda_i y_i = 0 \\ \frac{\partial L }{\partial \xi_i} = C - \lambda_i - \mu_i = 0 \Rightarrow C = \lambda_i + \mu_i \tag{2.7} wL=wi=1mλiyixi=0w=i=1mλiyixibL=i=1mλiyi=0i=1mλiyi=0ξiL=Cλiμi=0C=λi+μi(2.7)
将(2.7)带入(2.6)得:
max ⁡ w , b , ξ L ( w , b , ξ , λ , μ ) = − 1 2 ∑ i = 1 m ∑ i = 1 m λ i λ j y i y j ( x i ∙ x j ) + ∑ i = 1 m λ i (2.8) \max_{w,b,\xi} L(w,b,\xi,\lambda , \mu) = -\frac12 \sum_{i=1}^m \sum_{i=1}^m \lambda_i \lambda_j y_i y_j (x_i \bullet x_j) + \sum_{i=1}^m \lambda_i \tag{2.8} w,b,ξmaxL(w,b,ξ,λ,μ)=21i=1mi=1mλiλjyiyj(xixj)+i=1mλi(2.8)
再对 max ⁡ min ⁡ w , b , ξ L ( w , b , ξ , λ , μ ) \max\min_{w,b,\xi} L(w,b,\xi,\lambda , \mu) maxminw,b,ξL(w,b,ξ,λ,μ) λ \lambda λ极大,即得对偶问题:
max ⁡ λ − 1 2 ∑ i = 1 m ∑ i = 1 m λ i λ j y i y j ( x i ∙ x j ) + ∑ i = 1 m λ i s . t ∑ i = 1 m λ i y i = 0 λ i ≥ 0 , μ i ≥ 0 i = 1 , 2 , . . . , m C = λ i + μ i (2.9) \max_{\lambda} -\frac12 \sum_{i=1}^m \sum_{i=1}^m \lambda_i \lambda_j y_i y_j (x_i \bullet x_j) + \sum_{i=1}^m \lambda_i \\ s.t \qquad \sum_{i=1}^m \lambda_i y_i = 0 \qquad \lambda_i \geq 0 ,\mu_i \geq 0 \qquad i=1,2,...,m \\ C = \lambda_i + \mu_i \tag{2.9} λmax21i=1mi=1mλiλjyiyj(xixj)+i=1mλis.ti=1mλiyi=0λi0,μi0i=1,2,...,mC=λi+μi(2.9)
将式(2.7)的目标函数由求极大转换成求极小, 就得到下面与之等价的对偶最优化问题。
min ⁡ λ 1 2 ∑ i = 1 m ∑ i = 1 m λ i λ j y i y j ( x i ∙ x j ) − ∑ i = 1 m λ i s . t ∑ i = 1 m λ i y i = 0 λ i ≥ 0 , μ i ≥ 0 i = 1 , 2 , . . . , m C = λ i + μ i (2.10) \min_{\lambda} \frac12 \sum_{i=1}^m \sum_{i=1}^m \lambda_i \lambda_j y_i y_j (x_i \bullet x_j) - \sum_{i=1}^m \lambda_i \\ s.t \qquad \sum_{i=1}^m \lambda_i y_i = 0 \qquad \lambda_i \geq 0 ,\mu_i \geq 0 \qquad i=1,2,...,m \\ C = \lambda_i + \mu_i \tag{2.10} λmin21i=1mi=1mλiλjyiyj(xixj)i=1mλis.ti=1mλiyi=0λi0,μi0i=1,2,...,mC=λi+μi(2.10)
我们可以看到对于(2.10) 式目标函数的优化函数与最大硬间隔一样,多了一个约束条件。所以对 λ , b , E i \lambda,b,E_i λ,b,Ei的更新与1.4节稍微不同,即 λ \lambda λ的上下界改变了,b的更新条件改变了,KKT条件也稍有不同。
K K T 条 件 { λ i ≥ 0 , μ i ≥ 0 , ξ i ≥ 0 μ i ξ i = 0 C = λ i + μ i y i ( w T x i + b ) − 1 + ξ i ≥ 0 λ i [ y i ( w T x i + b ) − 1 + ξ i ] = 0 (2.11) KKT条件 \begin{cases} \lambda_i\geq 0 ,\mu_i\geq 0,\xi_i\geq 0\\ \mu_i \xi_i = 0 \\ C = \lambda_i + \mu_i \\ y_i(w^Tx_i+b)-1 + \xi_i \geq 0 \\ \lambda_i[y_i(w^Tx_i+b)-1 + \xi_i] = 0 \end{cases} \tag{2.11} KKTλi0,μi0,ξi0μiξi=0C=λi+μiyi(wTxi+b)1+ξi0λi[yi(wTxi+b)1+ξi]=0(2.11)
由(2.10)可以得出下面的结论:
{ 1 、 λ i = 0 ⇒ μ i = C , ξ i = 0 , y i ( w T x i + b ) − 1 ≥ 0 2 、 0 < λ i < C ⇒ μ i > 0 , ξ i = 0 , y i ( w T x i + b ) − 1 = 0 3 、 λ i = C ⇒ μ i = 0 , ξ i ≥ 0 , y i ( w T x i + b ) − 1 ≤ 0 (2.12) \begin{cases} 1、\lambda_i=0 \qquad \Rightarrow \mu_i=C,\xi_i = 0,y_i(w^T x_i + b) -1 \geq 0 \\ 2、0<\lambda_i<C \Rightarrow \mu_i>0,\xi_i = 0,y_i(w^T x_i + b) -1 = 0 \\ 3、 \lambda_i = C \qquad \Rightarrow \mu_i=0,\xi_i \geq 0,y_i(w^T x_i + b) -1 \leq 0 \end{cases} \tag{2.12} 1λi=0μi=C,ξi=0,yi(wTxi+b)1020<λi<Cμi>0,ξi=0,yi(wTxi+b)1=03λi=Cμi=0,ξi0,yi(wTxi+b)10(2.12)
则违反KKT条件:
违 反 K K T 条 件 { 1 、 y i ( w T x i + b ) − 1 = y i E i ≤ 0 , λ i < C 2 、 y i ( w T x i + b ) − 1 = y i E i ≥ 0 , λ i > 0 3 、 y i ( w T x i + b ) − 1 = y i E i = 0 , λ i = 0 或 λ i = C (2.13) 违反KKT条件 \begin{cases} 1、y_i(w^Tx_i+b)-1 = y_iE_i \leq 0 , \lambda_i < C \\ 2、 y_i(w^Tx_i+b)-1 = y_iE_i \geq 0 , \lambda_i > 0 \\ 3、 y_i(w^Tx_i+b)-1 = y_iE_i = 0 , \lambda_i = 0 或 \lambda_i = C \end{cases} \tag{2.13} KKT1yi(wTxi+b)1=yiEi0,λi<C2yi(wTxi+b)1=yiEi0,λi>03yi(wTxi+b)1=yiEi=0,λi=0λi=C(2.13)
确定 λ 1 \lambda_1 λ1的上下界,根据下面的几个等式:
y 1 λ 1 o l d + y 2 λ 2 o l d = y 1 λ 1 n e w + y 2 λ 2 n e w = c o n s t 0 ≤ λ 1 ≤ C , 0 ≤ λ 2 ≤ C (2.14) y_1 \lambda_1^{old} + y_2 \lambda_2^{old} = y_1 \lambda_1^{new} + y_2 \lambda_2^{new} = const \\ 0 \leq \lambda_1 \leq C,0 \leq \lambda_2 \leq C \tag{2.14} y1λ1old+y2λ2old=y1λ1new+y2λ2new=const0λ1C,0λ2C(2.14)
如果 y 1 = y 2 y_1=y_2 y1=y2:
λ 1 o l d + λ 2 o l d = λ 1 n e w + λ 2 n e w = c o n s t λ 2 n e w = λ 1 o l d + λ 2 o l d − λ 1 n e w ⇒ 0 ≤ λ 1 o l d + λ 2 o l d − λ 1 n e w ≤ C ⇒ λ 1 o l d + λ 2 o l d − C ≤ λ 1 n e w ≤ λ 1 o l d + λ 2 o l d L : m a x ( 0 , λ 1 o l d + λ 2 o l d − C ) H : m i n ( C , λ 1 o l d + λ 2 o l d ) \lambda_1^{old} + \lambda_2^{old} =\lambda_1^{new} + \lambda_2^{new} = const \\ \lambda_2^{new} = \lambda_1^{old} + \lambda_2^{old} - \lambda_1^{new} \\ \Rightarrow 0 \leq \lambda_1^{old} + \lambda_2^{old} - \lambda_1^{new} \leq C \\ \Rightarrow \lambda_1^{old} + \lambda_2^{old} -C \leq \lambda_1^{new} \leq \lambda_1^{old} + \lambda_2^{old} \\ L:max(0, \lambda_1^{old} + \lambda_2^{old} -C) \qquad H:min(C,\lambda_1^{old} + \lambda_2^{old}) λ1old+λ2old=λ1new+λ2new=constλ2new=λ1old+λ2oldλ1new0λ1old+λ2oldλ1newCλ1old+λ2oldCλ1newλ1old+λ2oldL:max(0,λ1old+λ2oldC)H:min(C,λ1old+λ2old)
如果 y 1 ! = y 2 y_1!=y_2 y1!=y2:
λ 1 o l d − λ 2 o l d = λ 1 n e w − λ 2 n e w = c o n s t λ 2 n e w = λ 1 n e w − λ 1 o l d + λ 2 o l d ⇒ 0 ≤ λ 1 n e w − λ 1 o l d + λ 2 o l d ≤ C ⇒ λ 1 o l d − λ 2 o l d ≤ λ 1 n e w ≤ C + λ 1 o l d − λ 2 o l d L : m a x ( 0 , λ 1 o l d − λ 2 o l d ) H : m i n ( C , C + λ 1 o l d − λ 2 o l d ) \lambda_1^{old} - \lambda_2^{old} =\lambda_1^{new} - \lambda_2^{new} = const \\ \lambda_2^{new} = \lambda_1^{new} - \lambda_1^{old} + \lambda_2^{old} \\ \Rightarrow 0 \leq \lambda_1^{new} - \lambda_1^{old} + \lambda_2^{old} \leq C \\ \Rightarrow \lambda_1^{old} - \lambda_2^{old} \leq \lambda_1^{new} \leq C + \lambda_1^{old} - \lambda_2^{old} \\ L:max(0, \lambda_1^{old} - \lambda_2^{old} ) \qquad H:min(C,C + \lambda_1^{old} - \lambda_2^{old}) λ1oldλ2old=λ1newλ2new=constλ2new=λ1newλ1old+λ2old0λ1newλ1old+λ2oldCλ1oldλ2oldλ1newC+λ1oldλ2oldL:max(0,λ1oldλ2old)H:min(C,C+λ1oldλ2old)
综上 λ 1 n e w \lambda_1^{new} λ1new的上下界如下:
{ y 1 = y 2 L : m a x ( 0 , λ 1 o l d + λ 2 o l d − C ) H : m i n ( C , λ 1 o l d + λ 2 o l d ) y 1 ! = y 2 L : m a x ( 0 , λ 1 o l d − λ 2 o l d ) H : m i n ( C , C + λ 1 o l d − λ 2 o l d ) (2.15) \begin{cases} y_1=y_2 \qquad L:max(0, \lambda_1^{old} + \lambda_2^{old} -C) \qquad H:min(C,\lambda_1^{old} + \lambda_2^{old}) \\ y_1!=y_2 \qquad L:max(0, \lambda_1^{old} - \lambda_2^{old} ) \qquad H:min(C,C + \lambda_1^{old} - \lambda_2^{old}) \end{cases} \tag{2.15} {y1=y2L:max(0,λ1old+λ2oldC)H:min(C,λ1old+λ2old)y1!=y2L:max(0,λ1oldλ2old)H:min(C,C+λ1oldλ2old)(2.15)
λ n e w \lambda^{new} λnew参数更新:
λ 1 n e w = λ 1 o l d + y 1 ( E 1 − E 2 ) η λ 2 n e w = λ 2 o l d + y 1 y 2 ( λ 1 o l d − λ 1 n e w ) (2.16) \lambda_1^{new} = \lambda_1^{old} +\frac{y_1(E_1- E_2)}{\eta} \\ \lambda_2^{new} = \lambda_2^{old} + y_1 y_2(\lambda_1^{old} - \lambda_1^{new}) \\ \tag{2.16} λ1new=λ1old+ηy1(E1E2)λ2new=λ2old+y1y2(λ1oldλ1new)(2.16)
更新b,当 0 < λ 1 < C 0<\lambda_1<C 0<λ1<C时,由KKT 条件(2.11)可知:
∑ i = 1 m λ i y i K i 1 + b = y 1 \sum_{i=1}^m \lambda_i y_i K_{i1} + b = y_1 i=1mλiyiKi1+b=y1
参考(1.29)解得 b 1 n e w b_1^{new} b1new
b 1 n e w = − 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 ) + b o l d (2.17) b_1^{new} = -E_1 - y_1K_{11}(\lambda_1^{new} - \lambda_1^{old}) - y_2K_{21}(\lambda_2^{new} - \lambda_2^{old}) + b^{old} \tag{2.17} b1new=E1y1K11(λ1newλ1old)y2K21(λ2newλ2old)+bold(2.17)
同理,如果 0 < λ 2 < C 0<\lambda_2<C 0<λ2<C,那么:
b 2 n e w = − E 2 − y 1 K 21 ( λ 1 n e w − λ 1 o l d ) − y 2 K 22 ( λ 2 n e w − λ 2 o l d ) + b o l d (2.18) b_2^{new} = -E_2 - y_1K_{21}(\lambda_1^{new} - \lambda_1^{old}) - y_2K_{22}(\lambda_2^{new} - \lambda_2^{old}) +b^{old} \tag{2.18} b2new=E2y1K21(λ1newλ1old)y2K22(λ2newλ2old)+bold(2.18)
E i E_i Ei的更新与(1.32)一样:
E j n e w = ∑ i = 1 m y i λ i K i j + b n e w − y j (2.19) E_j^{new} =\sum_{i=1}^m y_i \lambda_i K{ij} +b^{new} - y_j \tag{2.19} Ejnew=i=1myiλiKij+bnewyj(2.19)

2.2 最大软间隔代码实现

    # 内层循环和最大硬间隔一样,这个函数是最大软间隔的外层循环
    def internal_loop(self, i1):
        yi = self.y[i1]
        ei = self.errors[i1]
        alphai = self.alphas[i1]
        if (yi * ei < -self.tol and alphai < self.C) or (yi * ei > self.tol and alphai > 0):
            if len(self.alphas[(self.alphas != 0) & (self.alphas != self.C)]) > 1:
                if ei > 0:
                    i2 = np.argmin(self.errors)
                else:
                    i2 = np.argmax(self.errors)
                step_result = self.take_step(i1, i2)
                if step_result:
                    return 1
            # 若上一步不能更新,就从 0<alpha_i<C 随机选择一个j,能够更新alpha就更新。
            for i2 in np.roll(np.where((self.alphas != 0) & (self.alphas != self.C))[0],
                              np.random.choice(self.m)):
                step_result = self.take_step(i1, i2)
                if step_result:
                    return 1
            # 若上一步还是不能更新,不考虑范围,从整个数据集中选择一个样本j
            for i2 in np.roll(np.arange(self.m), np.random.choice(np.arange(self.m))):
                step_result = self.take_step(i1, i2)
                if step_result:
                    return 1
        return 0
   # 更新参数alpha1,alpha2,对应文中的lambda1、lambda2
    def take_step(self, i1, i2):
        if i1 == i2:
            return 0
        alph1 = self.alphas[i1]
        alph2 = self.alphas[i2]
        y1 = self.y[i1]
        y2 = self.y[i2]
        E1 = self.errors[i1]
        E2 = self.errors[i2]
        s = y1 * y2
        
        if (y1 != y2):
            L = max(0, alph1 - alph2)
            H = min(self.C, self.C + alph1 - alph2)
        elif (y1 == y2):
            L = max(0, alph1 + alph2 - self.C)
            H = min(self.C, alph1 + alph2)
        if (L == H):
            return 0

        k11 = self.X[i1] @ self.X[i1].T
        k12 = self.X[i1] @ self.X[i2].T
        k22 = self.X[i2] @ self.X[i2].T
        eta = 2 * k12 - k11 - k22
        
        if eta < 0:
            a1 = alph1 + y1 * (E1 - E2) / eta
            # Clip a2 based on bounds L & H
            if L < a1 < H:
                a1 = a1
            elif a1 <= L:
                a1 = L
            elif a1 >= H:
                a1 = H
        else:
            return 0
            
        if a1 < 1e-4:
            a1 = 0.0
        elif a1 > (self.C - 1e-4):
            a1 = self.C
         
        if (np.abs(a1 - alph1) < self.eps * (a1 + alph1 + self.eps)):
            return 0
        a1 = np.round(a1, decimals=5)
        a2 = alph2 + s * (alph1 - a1)
        a2 = np.round(a2, decimals=5)

        b1 = -E1 - y1 * (a1 - alph1) * k11 - y2 * (a2 - alph2) * k12 + self.b
        b2 = -E2 - y1 * (a1 - alph1) * k12 - y2 * (a2 - alph2) * k22 + self.b

        if 0 < a1 < self.C:
            b_new = b1
        elif 0 < a2 < self.C:
            b_new = b2
        else:
            b_new = (b1 + b2) * 0.5

        self.alphas[i1] = a1
        self.alphas[i2] = a2
        
        self.b = b_new
        self.errors = self.decision_function(self.X) - self.y
        return 1
if __name__ == '__main__':
	mean = [4, 4]
    cov = [[1, 0], [0, 2]]
    smpcount = 15
    samples1 = np.random.multivariate_normal(mean, cov, smpcount, "raise")
    samples1 = np.c_[samples1, np.ones([smpcount, 1])]
    mean = [7, 7]
    cov = [[2, 0], [0, 1]]
    samples2 = np.random.multivariate_normal(mean, cov, smpcount, "raise")
    samples2 = np.c_[samples2, np.ones([smpcount, 1])*(-1)]
    samples = np.vstack([samples1, samples2])
    np.random.shuffle(samples)
    model = linersvm(samples[:, :-1], samples[:, -1], 0.1, np.zeros(smpcount*2), np.zeros(smpcount*2))
    model.errors = model.decision_function(samples[:, :-1]) - samples[:, -1]
    model.outer_loop()
    model.showClassifer()

2.3 实验结果

3 非线性SVM

  前面介绍的线性SVM,是假设样本集是线性可分或大部分数据线性可分,而实际情况往往是线性不可分。即在样本空间不存在一个超平面能够正确划分样本类别。面对这样的情况,我们可以将样本投影到高维特征空间,是的样本在这个高维特征空间是线性可分的。则划分超平面可以表示为:
f ( x ) = w T ϕ ( x ) + b (3.1) f(x) = w^T \phi(x) +b \tag{3.1} f(x)=wTϕ(x)+b(3.1)
关于 w , b w,b w,b的原始问题为:
min ⁡ w , b 1 2 ∣ ∣ w ∣ ∣ 2 s . t y i ( w T ϕ ( x i ) + b ) ≥ 1 i = 1 , 2 , . . . , m (3.2) \min_{w,b} \frac12||w||^2 \\ s.t \qquad y_i(w^T \phi(x_i)+b) \geq 1 \qquad i=1,2,...,m \tag{3.2} w,bmin21w2s.tyi(wTϕ(xi)+b)1i=1,2,...,m(3.2)
对偶问题变为:
min ⁡ λ 1 2 ∑ i = 1 m ∑ i = 1 m λ i λ j y i y j ϕ ( x i ) T ϕ ( x j ) − ∑ i = 1 m λ i s . t ∑ i = 1 m λ i y i = 0 λ i ≥ 0 i = 1 , 2 , . . . , m (3.3) \min_{\lambda} \frac12 \sum_{i=1}^m \sum_{i=1}^m \lambda_i \lambda_j y_i y_j \phi(x_i)^T \phi(x_j) - \sum_{i=1}^m \lambda_i \\ s.t \qquad \sum_{i=1}^m \lambda_i y_i = 0 \qquad \lambda_i \geq0 \qquad i=1,2,...,m \tag{3.3} λmin21i=1mi=1mλiλjyiyjϕ(xi)Tϕ(xj)i=1mλis.ti=1mλiyi=0λi0i=1,2,...,m(3.3)
其中, ϕ ( x i ) T ϕ ( x j ) \phi(x_i)^T \phi(x_j) ϕ(xi)Tϕ(xj)表示映射在特征里的內积,直接计算 ϕ ( x i ) T ϕ ( x j ) \phi(x_i)^T \phi(x_j) ϕ(xi)Tϕ(xj)是比较困难。所以我们引入了核函数:
κ ( x i , x j ) = ϕ ( x i ) T ϕ ( x j ) (3.4) \kappa(x_i,x_j) = \phi(x_i)^T \phi(x_j) \tag{3.4} κ(xi,xj)=ϕ(xi)Tϕ(xj)(3.4)
即, x i , x j x_i,x_j xi,xj在特征空间的內积等于在样本的原空间中通过 κ ( . , . ) \kappa(.,.) κ(.,.)计算得到,称 κ ( x , z ) \kappa(x,z) κ(x,z)为核函数。下面是集中常用的核函数:

名称表达式参数
线性核 κ ( x i , x j ) = x i T x j \kappa(x_i,x_j) =x_i^T x_j κ(xi,xj)=xiTxj
多项式核 κ ( x i , x j ) = ( x i T x j ) T \kappa(x_i,x_j) =(x_i^T x_j)^T κ(xi,xj)=(xiTxj)T d ≥ 1 d \geq 1 d1为多项式的次数
高斯核 κ ( x i , x j ) = e x p ( − ∥ x i − x j ∥ 2 2 σ 2 ) \kappa(x_i,x_j) =exp(- \frac{\|x_i-x_j\|^2} {2\sigma^2}) κ(xi,xj)=exp(2σ2xixj2) σ > 0 \sigma>0 σ>0
拉普拉斯核 κ ( x i , x j ) = e x p ( − ∥ x i − x j ∥ σ ) \kappa(x_i,x_j) =exp(- \frac{\|x_i-x_j\|} {\sigma}) κ(xi,xj)=exp(σxixj) σ > 0 \sigma>0 σ>0
Sigmoid核 κ ( x i , x j ) = t a n h ( β x i T x j + θ ) \kappa(x_i,x_j) = tanh(\beta x_i^T x_j + \theta) κ(xi,xj)=tanh(βxiTxj+θ)tanh为双曲正切函数 β > 0 , θ < 0 \beta>0,\theta<0 β>0,θ<0

核函数的性质:

  • κ 1 \kappa_1 κ1 κ 2 \kappa_2 κ2为核函数,对于任意 λ 1 , λ 2 \lambda_1,\lambda_2 λ1,λ2的线性组合 λ 1 κ 1 + λ 2 κ 2 \lambda_1 \kappa_1+\lambda_2 \kappa_2 λ1κ1+λ2κ2也是核函数。
  • κ 1 \kappa_1 κ1 κ 2 \kappa_2 κ2为核函数,核函数的乘积 κ 1 ( x , z ) κ 2 ( x , z ) \kappa_1(x,z)\kappa_2(x,z) κ1(x,z)κ2(x,z)也是核函数。
  • κ 1 \kappa_1 κ1为核函数,对任意函数 g ( x ) g(x) g(x),有 g ( x ) κ 1 ( x , z ) g ( z ) g(x)\kappa_1(x,z)g(z) g(x)κ1(x,z)g(z)也是核函数。

参考

【1】《统计学习方法》 李航
【2】《机器学习》周志华
【3】Python3:《机器学习实战》之支持向量机(3)完整版SMO

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值