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\}
yi∈Y={+1,−1},
x
i
x_i
xi表示第i个特征向量。
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=∣∣w∣∣yi(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.tyi∣∣w∣∣wTxi+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,bmax∣∣w∣∣γ^s.tyi(wTxi+b)≥γ^i=1,2,...,m(1.7)
显然,函数间隔
γ
^
\hat \gamma
γ^的取值并不影响最优化问题的解,令
γ
^
=
1
\hat \gamma=1
γ^=1,注意到最大化
1
∣
∣
w
∣
∣
\frac1{||w||}
∣∣w∣∣1和最小化
1
2
∣
∣
w
∣
∣
2
\frac12||w||^2
21∣∣w∣∣2是等价的,所以(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,bmin21∣∣w∣∣2s.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=1∑mλi[1−yi(wTxi+b)]λi≥0(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λi≥0i=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
λ的函数。
- 对于满足约束条件的 ( 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 1−yi(wTxi+b)≤0,又因为 λ i ≥ 0 \lambda_i \geq0 λi≥0 ,此时只有 λ = 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;
- 对于不满足约束条件的
(
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
1−yi(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λi≥0i=1,2,...,m(1.13)
对(1.13)的求解,需要先对拉格朗日函数对 w , b w,b w,b求极小,在对 λ \lambda λ求极大(关于什么条件下对偶问题有解,最优解和原始问题最优解相同的问题暂不说明)。
- 求解
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,λ)=w−i=1∑mλiyixi=0⇒w=i=1∑mλiyixi▽bL(w,b,λ)=i=1∑mλ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} λmax−21i=1∑mi=1∑mλiλjyiyjxiTxj+i=1∑mλis.ti=1∑mλiyi=0λi≥0i=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=1∑mi=1∑mλiλjyiyjxiTxj−i=1∑mλis.ti=1∑mλiyi=0λi≥0i=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=1∑mλi∗yixib∗=yj−i=1∑mλi∗yixiTxj(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=1∑mλiyi=0
如果
λ
1
\lambda_1
λ1确定,那么
λ
2
\lambda_2
λ2也随之确定 ,所以子问题中同时更新两个变量。
- 启发式选择第一个变量
λ
1
\lambda_1
λ1
SMO 称选择第 1 个变量的过程为外层循环,外层循环首先在整个训练集上遍历,计算每个样本是否违反KKT条件,如果违反就可以用来优化。单次扫描整个训练集之后,外层循环遍历所有拉格朗日乘数不为0的样本(非边界样本),且检查非边界样本是否违反KKT条件,违反的将被用来做优化。外层循环扫描那些非边界样本,直到所有的非边界样本在误差ε内满足KKT条件,然后外层循环重新遍历训练集。外层循环交替进行在整个训练集上单次扫描和在非边界子集上多次扫描,直到整个训练集在误差ε内符合KKT条件,此时算法终止。(注:误差ε内很重要,一般设置为0.001) - 启发式选择第二个变量
λ
2
\lambda_2
λ2
SMO 称选择第 2 个变量的过程为内层循环,在要在内层循环中找第2个变量 λ 2 \lambda_2 λ2。 第2个变量选择的标准是希望
能使 λ 2 \lambda_2 λ2有足够大的变化,选择使 ∣ E 1 − E 2 ∣ |E_1-E_2| ∣E1−E2∣最大。因为 λ 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。 - 更新
λ
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+b−yi=ui−yi(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=3∑mλiyixix1T)λ1+x1x1Tλ12+(2y2i=3∑mλiyixix2T)λ2+x2x2Tλ22+2y1y2x1x2Tλ1λ2]−λ1−λ2+consts.tλ1y1+λ2y2=−i=3∑myiλ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=3∑mλiyiKi1+21K11λ12+(ζ−λ1y1)i=3∑mλiyiKi2+21K22(ζ−λ1y1)2+y1K12λ1(ζ−λ1y1)−λ1−(ζ−λ1y1)y2+const=21(K11+K22−2K12)λ12+[y1i=3∑mλiyiKi1−y1i=3∑mλiyiKi2−y1ζK22+y1ζK12−1+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} ∂λ1∂W(λ1)=(K11+K22−2K12)λ1+[y1i=3∑mλiyiKi1−y1i=3∑mλiyiKi2−y1ζK22+y1ζK12−1+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} (2K12−K11−K22)λ1=y1[y2−y1+ζK12−ζK22+i=3∑mλiyiKi1−i=3∑mλiyiKi2]=y1[y2−y1+ζK12−ζK22+i=1∑mλiyiKi1−λ1y1K11−λ2y2K21−i=0∑mλiyiKi2+λ1y1K12+λ2y2K22]=y1[y2−y1+ζK12−ζK22+wTx1−λ1oldy1K11−λ2oldy2K21−wTx2+λ1oldy1K12+λ2oldy2K22]=y1[E1−E2+2y1K12λ1old−y1K11λ1old−y1K22λ1old]=(2K12−K11−K22)λ1old+y1(E1−E2)(1.23)
令 η = 2 K 12 − K 11 − K 22 \eta = 2K_{12} - K_{11} - K_{22} η=2K12−K11−K22,由(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(E1−E2)(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 λi≥0,所以需要确定 λ 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) - 更新
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条件⎩⎪⎨⎪⎧λi≥0yi(wTxi+b)−1≥0λ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条件{1、yi(wTxi+b)−1=yiEi<02、yi(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=y1⇒b1new=y1−i=0∑mλiyixix1Tb1new=y1−j=3∑mλiyixix1T−λ1newy1K11−λ2newy2K21E1=j=3∑mλiyixix1T+λ1oldy1K11+λ2oldy2K21+bold−y1b1new=−E1+λ1oldy1K11+λ2oldy2K21+bold−λ1newy1K11−λ2newy2K21b1new=−E1−y1K11(λ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=−E2−y1K21(λ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。 - 更新
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=S∑yiλiKij+bnew−yj(1.31)
其中S是所有支持向量 x i x_i xi的集合,根据KKT条件,支持向量的点 λ i ≥ 0 \lambda_i \geq 0 λi≥0,不是支持向量的点 λ 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=1∑myiλiKij+bnew−yj(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 ξi≥0使函数间隔加上松弛变量大于等于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
21∣∣w∣∣2变成:
1
2
∣
∣
w
∣
∣
2
+
C
∑
i
=
1
m
ξ
i
(2.2)
\frac12 ||w||^2 + C \sum_{i=1}^m \xi_i \tag{2.2}
21∣∣w∣∣2+Ci=1∑mξi(2.2)
这里,C>0称为惩罚参数,C值大时对误分类的惩罚增大,C值小时对误分类的惩罚减小。最小化目标函数(2.2)包含两层含义:使
1
2
∣
∣
w
∣
∣
2
\frac12||w||^2
21∣∣w∣∣2尽量小即间隔尽量大,同时使误分类点的个数尽量小,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,ξmin21∣∣w∣∣2+Ci=1∑mξis.tyi(wTxi+b)≥1−ξii=1,2,...,mξi≥0i=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,ξ,λ,μ)=21∣∣w∣∣2+Ci=1∑mξi+i=1∑mλi[1−ξi−yi(wTxi+b)]−i=1∑mμ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λi≥0,μi≥0i=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λi≥0,μi≥0i=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}
∂w∂L=w−i=1∑mλiyixi=0⇒w=i=1∑mλiyixi∂b∂L=−i=1∑mλiyi=0⇒i=1∑mλiyi=0∂ξi∂L=C−λi−μi=0⇒C=λ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=1∑mi=1∑mλiλjyiyj(xi∙xj)+i=1∑mλ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}
λmax−21i=1∑mi=1∑mλiλjyiyj(xi∙xj)+i=1∑mλis.ti=1∑mλiyi=0λi≥0,μi≥0i=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=1∑mi=1∑mλiλjyiyj(xi∙xj)−i=1∑mλis.ti=1∑mλiyi=0λi≥0,μi≥0i=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条件⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧λi≥0,μi≥0,ξi≥0μiξi=0C=λi+μiyi(wTxi+b)−1+ξi≥0λ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)−1≥02、0<λi<C⇒μi>0,ξi=0,yi(wTxi+b)−1=03、λi=C⇒μi=0,ξi≥0,yi(wTxi+b)−1≤0(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}
违反KKT条件⎩⎪⎨⎪⎧1、yi(wTxi+b)−1=yiEi≤0,λi<C2、yi(wTxi+b)−1=yiEi≥0,λi>03、yi(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≤λ1≤C,0≤λ2≤C(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−λ1new⇒0≤λ1old+λ2old−λ1new≤C⇒λ1old+λ2old−C≤λ1new≤λ1old+λ2oldL:max(0,λ1old+λ2old−C)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+λ2old⇒0≤λ1new−λ1old+λ2old≤C⇒λ1old−λ2old≤λ1new≤C+λ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+λ2old−C)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(E1−E2)λ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=1∑mλ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=−E1−y1K11(λ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=−E2−y1K21(λ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=1∑myiλiKij+bnew−yj(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,bmin21∣∣w∣∣2s.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=1∑mi=1∑mλiλjyiyjϕ(xi)Tϕ(xj)−i=1∑mλis.ti=1∑mλiyi=0λi≥0i=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 d≥1为多项式的次数 |
高斯核 | κ ( 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σ2∥xi−xj∥2) | σ > 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(−σ∥xi−xj∥) | σ > 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