【机器学习-监督学习】支持向量机
本文介绍了支持向量机的原理及其求解算法SMO。由于SVM属于非参数化模型,其模型中的参数与数据集的规模相同,求解较为复杂,但SMO算法大大降低了求解的难度。对于非线性分布的数据,通过引入非线性的核函数使SVM完成分类任务,达到和神经网络中激活函数类似的效果。
【作者主页】Francek Chen
【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,依赖于强大的开源库如Scikit-learn、TensorFlow和PyTorch。本专栏介绍机器学习的相关算法以及基于Python的算法实现。
【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/Python_machine_learning。
本文我们介绍非参数化模型。与参数化模型不同,非参数化模型对数据分布不做先验的假设,从而能够更灵活地适配到不同的数据分布上。但另一方面,灵活性也使其对数据更为敏感,容易出现过拟合现象。本文主要介绍一个经典的非参数化模型:支持向量机(support vector machine,SVM),以及其求解算法——序列最小优化(sequential minimal optimization,SMO)算法,并利用其完成平面点集的二分类任务。
由于非参数化模型与数据集大小有关,我们假设数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } \mathcal D=\{( \boldsymbol x_1,y_1),(\boldsymbol x_2,y_2),\cdots,(\boldsymbol x_m,y_m)\} D={(x1,y1),(x2,y2),⋯,(xm,ym)},其中 x i ∈ R n \boldsymbol x_i\in \mathbb R^n xi∈Rn 是输入向量, y i ∈ { − 1 , 1 } y_i\in \{-1,1\} yi∈{−1,1} 是输入数据的分类。为了下面理论推导方便,这里我们用-1代替0作为类别标签。线性的SVM假设数据集中的点是线性可分的。需要注意,该假设与SVM是非参数化模型并不矛盾,因为SVM仍然需要与数据集大小相匹配的参数量来求解分隔平面,具体的求解流程我们会在下文详细说明。与之相反,逻辑斯谛回归作为参数化模型,其参数 θ \boldsymbol\theta θ的维度只和输入向量的维度 n n n有关。
通常来说,即使数据集 D \mathcal D D是线性可分的,可以将其分开的超平面也有无数种选择。如图1所示,任意一条绿色或红色的直线都可以将平面上的橙色点和蓝色点分开。然而,如果我们考虑到现实场景中可能的噪声和扰动,这些分隔线就会产生区别。假如下图中的数据点实际所处的位置可能在它们旁边标出的虚线圆圈内的任意一处,那么图中的两条红色虚线就有可能给出错误的分类结果。因此,为了使分隔直线对数据点的扰动或噪声的鲁棒性更强,我们希望从这无数个可以分隔两个点集的超平面中,挑选出与任意一点间隔(margin)的最小值最大的平面。
一、支持向量机的数学描述
我们首先来考虑如何计算样本点与平面的间隔。如图2所示,设决策边界给出的超平面方程为 w T x + b = 0 \boldsymbol w^{\mathrm T}\boldsymbol x+b=0 wTx+b=0,其中 w ∈ R n \boldsymbol w \in \mathbb R^n w∈Rn 和 b ∈ R b \in \mathbb R b∈R 为支持向量机的参数, w \boldsymbol w w方向就是该平面的法线方向。设样本 x i \boldsymbol x_i xi到平面的距离是 γ i \gamma_i γi,那么从 x i \boldsymbol x_i xi出发,沿着法线方向经过长度 γ i \gamma_i γi,应当正好到达平面上。因此, γ i \gamma_i γi满足 w T ( x i − γ i w ∥ w ∥ ) + b = 0 \boldsymbol w^{\mathrm T}\left(\boldsymbol x_i-\gamma_i\frac{\boldsymbol w}{\lVert\boldsymbol w\lVert}\right)+b=0 wT(xi−γi∥w∥w)+b=0或 w T ( x i + γ i w ∥ w ∥ ) + b = 0 \boldsymbol w^{\mathrm T}\left(\boldsymbol x_i+\gamma_i\frac{\boldsymbol w}{\lVert\boldsymbol w\lVert}\right)+b=0 wT(xi+γi∥w∥w)+b=0 出现两个不同的方程是因为我们还没有确定是在法线的方向还是法线的反方向。如果 x i \boldsymbol x_i xi在法线方向,那么有 w T x i + b > 0 \boldsymbol w^{\mathrm T}\boldsymbol x_i+b>0 wTxi+b>0,反之则是 w T x i + b < 0 \boldsymbol w^{\mathrm T}\boldsymbol x_i+b<0 wTxi+b<0。因此,不妨规定使 w T x i + b > 0 \boldsymbol w^{\mathrm T}\boldsymbol x_i+b>0 wTxi+b>0 的样本点的类别标签 y i = 1 y_i=1 yi=1,使 w T x i + b < 0 \boldsymbol w^{\mathrm T}\boldsymbol x_i+b<0 wTxi+b<0 的样本点的类别标签 y i = − 1 y_i=-1 yi=−1。对于分类问题,标签的具体值我们可以任意替换,只要最终能对应回原始类别即可。另外,我们设使 w T x i + b = 0 \boldsymbol w^{\mathrm T}\boldsymbol x_i+b=0 wTxi+b=0 的点的类别标签 y i = 0 y_i=0 yi=0,因为这些点正好处于该超平面上,从而 y i = 0 y_i=0 yi=0 表示超平面无法对其进行分类。这样,我们就可以把上面两个方程统一起来,写成 w T ( x i − γ i y i w ∥ w ∥ ) + b = 0 \boldsymbol w^{\mathrm T}\left(\boldsymbol x_i-\gamma_iy_i\frac{\boldsymbol w}{\lVert\boldsymbol w\lVert}\right)+b=0 wT(xi−γiyi∥w∥w)+b=0或者等价变形为 γ i = y i ( w T x i + b ) ∥ w ∥ = y i ( w T ∥ w ∥ x + b ∥ w ∥ ) \gamma_i=\frac{y_i(\boldsymbol w^{\mathrm T}\boldsymbol x_i+b)}{\lVert\boldsymbol w\lVert}=y_i\left(\frac{\boldsymbol w^{\mathrm T}}{\lVert\boldsymbol w\lVert}\boldsymbol x + \frac{b}{\lVert\boldsymbol w\lVert}\right) γi=∥w∥yi(wTxi+b)=yi(∥w∥wTx+∥w∥b)
对上式来说,当 w \boldsymbol w w和 b b b的大小同时变为 λ \lambda λ倍时,式中的分母 ∥ w ∥ \lVert\boldsymbol w\lVert ∥w∥也变为 λ \lambda λ倍,这时划分超平面完全不变。因此,我们不妨设 γ ^ i = y i ( w T x i + b ) \hat{\gamma}_i = y_i(\boldsymbol w^{\mathrm T}\boldsymbol x_i+b) γ^i=yi(wTxi+b),称为函数间隔(functional margin),而将几何间隔(geometric margin) γ i = γ ^ i / ∥ w ∥ \gamma_i = \hat{\gamma}_i/\lVert\boldsymbol w\lVert γi=γ^i/∥w∥ 看作函数间隔对 w \boldsymbol w w的长度归一化的结果。
我们希望所有样本到平面的几何间隔
γ
i
\gamma_i
γi的最小值最大。设
γ
=
min
i
γ
i
\gamma=\min_i\gamma_i
γ=miniγi,
γ
^
=
min
i
γ
^
i
\hat\gamma=\min_i\hat\gamma_i
γ^=miniγ^i,那么
γ
=
γ
^
/
∥
w
∥
\gamma = \hat{\gamma}/\lVert\boldsymbol w\lVert
γ=γ^/∥w∥。于是,支持向量机的优化目标可以写为
max
γ
^
,
w
,
b
γ
^
∥
w
∥
s.t.
y
i
(
w
T
x
i
+
b
)
≥
γ
^
,
i
=
1
,
⋯
,
m
\begin{aligned} & \max_{\hat\gamma,\boldsymbol w,b}\frac{\hat\gamma}{\lVert\boldsymbol w\lVert} \\[2ex] & \text{s.t.}\quad y_i(\boldsymbol w^{\mathrm T}\boldsymbol x_i+b) \ge \hat\gamma,\quad i=1,\cdots,m \end{aligned}
γ^,w,bmax∥w∥γ^s.t.yi(wTxi+b)≥γ^,i=1,⋯,m 上面已经提到,函数间隔
γ
^
\hat\gamma
γ^关于
w
\boldsymbol w
w和
b
b
b的大小并不影响实际的几何间隔
γ
\gamma
γ,因为其变化总会被
∥
w
∥
\lVert\boldsymbol w\lVert
∥w∥所抵消。因此,不妨令
γ
^
=
1
\hat\gamma=1
γ^=1。这样上面的优化目标就变为
max
w
,
b
1
∥
w
∥
s.t.
y
i
(
w
T
x
i
+
b
)
≥
1
,
i
=
1
,
⋯
,
m
\begin{aligned} & \max_{\boldsymbol w,b}\frac{1}{\lVert\boldsymbol w\lVert} \\[2ex] & \text{s.t.}\quad y_i(\boldsymbol w^{\mathrm T}\boldsymbol x_i+b) \ge 1,\quad i=1,\cdots,m \end{aligned}
w,bmax∥w∥1s.t.yi(wTxi+b)≥1,i=1,⋯,m 然而,优化目标
1
∥
w
∥
\begin{aligned}\frac{1}{\lVert\boldsymbol w\lVert}\end{aligned}
∥w∥1是非凸的,其求解较为困难。考虑到函数
1
t
\begin{aligned}\frac{1}{t}\end{aligned}
t1关于
t
t
t单调递减,最大化
1
t
\begin{aligned}\frac{1}{t}\end{aligned}
t1与最小化
t
t
t的任意一个单调递增函数都等价。为了求解方便,我们选择凸的单调递增函数,进一步将优化目标等价地写为
min
w
,
b
1
2
∥
w
∥
2
s.t.
y
i
(
w
T
x
i
+
b
)
≥
1
,
i
=
1
,
⋯
,
m
\begin{aligned} & \min_{\boldsymbol w,b}\frac{1}{2}\lVert\boldsymbol w\lVert^2 \\[2ex] & \text{s.t.}\quad y_i(\boldsymbol w^{\mathrm T}\boldsymbol x_i+b) \ge 1,\quad i=1,\cdots,m \end{aligned}
w,bmin21∥w∥2s.t.yi(wTxi+b)≥1,i=1,⋯,m 由于
∥
w
∥
≥
0
\lVert\boldsymbol w\lVert \ge 0
∥w∥≥0,其二次函数在定义域内是单调递增的,并且为凸函数。其中,系数选择
1
2
\begin{aligned}\frac{1}{2}\end{aligned}
21是为了后续求导简洁,与MSE中的作用类似。
至此,我们讨论了数据线性可分的情况。如果数据线性不可分,我们可以适当放低上面的约束要求,引入松弛变量
ξ
i
\xi_i
ξi,将约束问题改写为
min
w
,
b
,
ξ
i
1
2
∥
w
∥
2
+
C
∑
i
=
1
m
ξ
i
s.t.
y
i
(
w
T
x
i
+
b
)
≥
1
−
ξ
i
ξ
i
≥
0
,
i
=
1
,
⋯
,
m
\begin{aligned} & \min_{\boldsymbol w,b,\xi_i}\frac{1}{2} \lVert\boldsymbol w\lVert^2 + C\sum_{i=1}^m\xi_i \\[3ex] & \text{s.t.} \quad y_i(\boldsymbol w^{\mathrm T}\boldsymbol x_i+b) \ge 1-\xi_i \\[1ex] & \quad\quad\ \ \xi_i\ge 0,\ \ i=1,\cdots,m \end{aligned}
w,b,ξimin21∥w∥2+Ci=1∑mξis.t.yi(wTxi+b)≥1−ξi ξi≥0, i=1,⋯,m
可以看出,松弛变量允许某个样本点的类别与超平面给出的分类不同。但是,对这些分类错误的样本点,我们也需要进行惩罚。因此,我们在优化的目标函数上加入 ξ i \xi_i ξi值本身作为惩罚项,其中 C C C是惩罚系数。
对于带约束的凸优化问题,数学上有一套成熟的解决方式,将其转化为更容易的对偶问题求解。我们将较为繁琐的数学推导放在本文的拓展阅读中,感兴趣的可以自行学习,这里我们直接给出结论。求解上面的优化问题等价于求解下面的二次规划:
max
α
W
(
α
)
=
max
α
(
∑
i
=
1
m
α
i
−
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
x
i
T
x
j
)
s.t.
0
≤
α
i
≤
C
,
i
=
1
,
⋯
,
m
∑
i
=
1
m
α
i
y
i
=
0
\begin{aligned} & \max_{\boldsymbol\alpha}W(\boldsymbol\alpha) = \max_{\boldsymbol\alpha}\left(\sum_{i=1}^m\alpha_i-\frac{1}{2}\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j \boldsymbol{x}_i^{\mathrm T}\boldsymbol{x}_j\right) \\ & \text{s.t.} \quad 0 \le \alpha_i \le C, \quad i=1,\cdots,m \\ & \quad \quad\sum_{i=1}^m \alpha_iy_i = 0 \end{aligned}
αmaxW(α)=αmax(i=1∑mαi−21i=1∑mj=1∑mαiαjyiyjxiTxj)s.t.0≤αi≤C,i=1,⋯,mi=1∑mαiyi=0 其中,
α
\boldsymbol\alpha
α是待求解的参数。这时可以看出,SVM问题的参数量是与数据集的规模
m
m
m相当的。当数据集规模增大时,其参数量也相应变多,表现出非参数化模型的特性。
当解出最优的
α
∗
\boldsymbol\alpha^*
α∗后,SVM的参数
w
∗
\boldsymbol{w}^*
w∗和
b
∗
b^*
b∗可以由下式计算得到
w
∗
=
∑
i
=
1
m
α
i
∗
y
i
x
i
b
∗
=
−
1
2
(
max
i
,
y
i
=
−
1
w
∗
T
x
i
+
min
i
,
y
i
=
1
w
∗
T
x
i
)
\boldsymbol{w}^*=\sum_{i=1}^m\alpha_i^*y_i\boldsymbol{x}_i \\[1ex] b^*=-\frac{1}{2}(\max_{i,y_i=-1}\boldsymbol{w}^{*\mathrm T}\boldsymbol{x}_i + \min_{i,y_i=1}\boldsymbol{w}^{*\mathrm T}\boldsymbol{x}_i)
w∗=i=1∑mαi∗yixib∗=−21(i,yi=−1maxw∗Txi+i,yi=1minw∗Txi) 并且,这组最优参数
(
w
∗
,
b
∗
,
α
∗
)
(\boldsymbol{w}^*,b^*,\boldsymbol\alpha^*)
(w∗,b∗,α∗)满足
α
i
∗
(
1
−
y
i
(
w
∗
T
x
i
+
b
∗
)
)
=
0
\alpha_i^*(1-y_i(\boldsymbol w^{*\mathrm T}\boldsymbol x_i+b^*))=0
αi∗(1−yi(w∗Txi+b∗))=0。因此对于数据集中的任意一个样本
x
i
\boldsymbol x_i
xi来说,要么其对应的参数
α
i
∗
=
0
\alpha_i^*=0
αi∗=0,要么其与支持向量机对应的超平面
w
∗
T
x
+
b
∗
=
0
\boldsymbol w^{*\mathrm T}\boldsymbol x+b^*=0
w∗Tx+b∗=0 的函数间隔
y
i
(
w
∗
T
x
i
+
b
)
=
1
=
γ
^
y_i(\boldsymbol w^{*\mathrm T}\boldsymbol x_i+b)=1=\hat\gamma
yi(w∗Txi+b)=1=γ^,从而
x
i
\boldsymbol x_i
xi是所有样本中与该超平面间隔最小的。我们称这些与超平面间隔最小的向量
x
i
\boldsymbol x_i
xi称为支持向量(supporting vector)。引入松弛变量后,对于那些类别与SVM的超平面相反的向量,由于其
α
i
∗
≠
0
\alpha_i^*\ne0
αi∗=0,会影响SVM的参数,因此这些向量也属于支持向量。
设支持向量的集合为 S = { x i ∣ ( x i , y i ) ∈ D , y i ( w ∗ T x i + b ∗ ) = 1 } \mathcal S=\{\boldsymbol x_i|(\boldsymbol x_i,y_i)\in \mathcal D,y_i(\boldsymbol w^{*\mathrm T}\boldsymbol x_i+b^*)=1\} S={xi∣(xi,yi)∈D,yi(w∗Txi+b∗)=1},那么上面所有关于 α i ∗ \alpha_i^* αi∗的求和只需要在集合 S \mathcal S S中进行,因为其余非支持向量对应的 α i ∗ \alpha_i^* αi∗都为零,对求和没有贡献。进一步,当我们需要用支持向量机预测某个新样本 x \boldsymbol x x的类别时,需要计算 w ∗ T x + b ∗ \boldsymbol w^{*\mathrm T}\boldsymbol x+b^* w∗Tx+b∗ 的正负性,即计算 w ∗ T x + b ∗ = ( ∑ i = 1 m α i ∗ y i x i ) T x + b ∗ = ∑ i = 1 , x i ∈ S m α i ∗ y i x i T x + b ∗ \boldsymbol w^{*\mathrm T}\boldsymbol x+b^*=\left(\sum_{i=1}^m\alpha_i^*y_i\boldsymbol x_i\right)^{\mathrm T}\boldsymbol x+b^*=\sum_{i=1,\boldsymbol{x}_i\in \mathcal S}^m\alpha_i^*y_i\boldsymbol{x}_i^{\mathrm T}\boldsymbol{x}+b^* w∗Tx+b∗=(i=1∑mαi∗yixi)Tx+b∗=i=1,xi∈S∑mαi∗yixiTx+b∗
这样,用SVM进行预测的时间复杂度从 O ( m ) O(m) O(m)变为了 O ( ∣ S ∣ ) O(|\mathcal S|) O(∣S∣)。通常情况下支持向量只占数据集的很小一部分,因此,利用支持向量的特性,SVM模型建立完成后,再进行预测的时间复杂度就大大减小了。这一优势在线性SVM中并不明显,因为我们可以直接计算出 w ∗ \boldsymbol w^* w∗的值,但是对于后面会介绍的带有非线性核函数的SVM来说,其优化是相当可观的。
现在,我们只需要从上面的二次规划问题中解出 α ∗ \boldsymbol\alpha^* α∗。然而,传统的求解二次规划问题的算法时间开销都非常大。因此,我们通常使用专门针对SVM的问题形式所设计的序列最小优化(SMO)算法来求解SVM的优化问题。
二、序列最小优化
序列最小优化的核心思想是,同时优化所有的参数 α i \alpha_i αi较为困难,因此每次可以选择部分参数来优化。由于优化问题中有等式约束 ∑ i = 1 m = α i y i = 0 \sum\limits_{i=1}^m=\alpha_iy_i=0 i=1∑m=αiyi=0,我们每次选取两个不同的参数 α i \alpha_i αi和 α j \alpha_j αj,而固定其他的参数,只优化这两个参数从而保证等式约束一直成立。完成后,再选取另两个参数,固定其他个 m − 2 m-2 m−2 参数,进行优化。如此反复迭代,直到目标函数的值收敛位置。无论目标是需要被最大化还是最小化,SMO算法都可以工作。下面,我们以固定 α 1 \alpha_1 α1和 α 2 \alpha_2 α2为例,演示SMO算法的流程。
固定
α
1
\alpha_1
α1与
α
2
\alpha_2
α2后,优化问题的目标为
max
α
1
,
α
2
W
1
,
2
(
α
1
,
α
2
)
=
max
α
1
,
α
2
(
α
1
+
α
2
−
1
2
∥
α
1
y
1
x
1
+
α
2
y
2
x
2
∥
2
−
(
α
1
y
1
x
1
+
α
2
y
2
x
2
)
T
(
∑
i
=
3
m
α
i
y
i
x
i
)
+
A
0
)
s.t.
0
≤
α
1
,
α
2
≤
C
α
1
y
1
+
α
2
y
2
=
−
∑
i
=
3
m
α
1
y
i
\begin{aligned} \max_{\alpha_1,\alpha_2}W_{1,2}(\alpha_1,\alpha_2) = &\max_{\alpha_1,\alpha_2}\Bigg(\alpha_1 + \alpha_2 -\frac{1}{2}\lVert\alpha_1y_1\boldsymbol{x}_1+\alpha_2y_2\boldsymbol{x}_2\lVert^2 \\ &-(\alpha_1y_1\boldsymbol{x}_1+\alpha_2y_2\boldsymbol{x}_2)^{\mathrm T}\left(\sum_{i=3}^m\alpha_iy_i\boldsymbol{x}_i\right)+A_0\Bigg) \\ \text{s.t.} \quad 0 \le \alpha_1,\alpha_2 \le &C \\ \alpha_1y_1+\alpha_2y_2 &= -\sum_{i=3}^m\alpha_1y_i \end{aligned}
α1,α2maxW1,2(α1,α2)=s.t.0≤α1,α2≤α1y1+α2y2α1,α2max(α1+α2−21∥α1y1x1+α2y2x2∥2−(α1y1x1+α2y2x2)T(i=3∑mαiyixi)+A0)C=−i=3∑mα1yi 其中,
A
0
A_0
A0是与
α
1
\alpha_1
α1和
α
2
\alpha_2
α2无关的常数。注意到上式中样本向量不会单独出现,而都以两个样本做内积的形式出现。回忆线性回归中的核技巧,我们将样本向量之间的内积记为矩阵
K
=
X
X
T
\boldsymbol K=\boldsymbol X\boldsymbol X^{\mathrm T}
K=XXT,其中
X
\boldsymbol X
X的行向量
x
i
\boldsymbol x_i
xi是数据集中的样本,根据矩阵乘法的规则和向量内积的对称性可知
K
i
j
=
K
j
i
=
x
i
T
x
j
K_{ij}=K_{ji}=\boldsymbol x_i^{\mathrm T}\boldsymbol x_j
Kij=Kji=xiTxj。注意,
y
i
∈
{
−
1
,
1
}
⇒
y
i
2
=
1
y_i\in \{-1,1\}\Rightarrow y_i^2=1
yi∈{−1,1}⇒yi2=1,目标函数
W
1
,
2
(
α
1
,
α
2
)
W_{1,2}(\alpha_1,\alpha_2)
W1,2(α1,α2)可以用
K
\boldsymbol K
K改写为
W
1
,
2
(
α
1
,
α
2
)
=
α
1
+
α
2
−
1
2
(
K
11
α
1
2
+
K
22
α
2
2
)
−
y
1
y
2
K
12
α
1
α
2
−
y
1
α
1
∑
i
=
3
m
α
i
y
i
K
1
i
−
y
2
α
2
∑
i
=
3
m
α
i
y
i
K
2
i
+
A
0
\begin{aligned} W_{1,2}(\alpha_1,\alpha_2) = &\alpha_1 + \alpha_2 -\frac{1}{2}(K_{11}\alpha_1^2+K_{22}\alpha_2^2)-y_1y_2K_{12}\alpha_1\alpha_2 \\ &-y_1\alpha_1\sum_{i=3}^m\alpha_iy_iK_{1i}-y_2\alpha_2\sum_{i=3}^m\alpha_iy_iK_{2i}+A_0 \end{aligned}
W1,2(α1,α2)=α1+α2−21(K11α12+K22α22)−y1y2K12α1α2−y1α1i=3∑mαiyiK1i−y2α2i=3∑mαiyiK2i+A0
上述第二个约束条件表明,
α
1
\alpha_1
α1与
α
2
\alpha_2
α2不是独立的,我们可以将
α
2
\alpha_2
α2用
α
1
\alpha_1
α1表示。记
ζ
=
−
∑
i
=
3
m
α
i
y
i
\zeta=-\sum\limits_{i=3}^m\alpha_iy_i
ζ=−i=3∑mαiyi,则有
α
1
y
1
+
α
2
y
2
=
ζ
⇒
α
2
=
−
α
1
y
1
y
2
+
ζ
y
2
⇒
α
2
=
(
−
y
1
α
1
+
ζ
)
y
2
\begin{aligned} && &\alpha_1y_1+\alpha_2y_2 = \zeta \\[1ex] \Rightarrow && &\alpha_2 = -\alpha_1\frac{y_1}{y_2} + \frac{\zeta}{y_2} \\[2ex] \Rightarrow && &\alpha_2=(-y_1\alpha_1 + \zeta)y_2 \end{aligned}
⇒⇒α1y1+α2y2=ζα2=−α1y2y1+y2ζα2=(−y1α1+ζ)y2
将上式代入优化目标,消去
α
2
\alpha_2
α2,可得
W
1
,
2
(
α
1
,
α
2
)
=
W
1
(
α
1
)
=
(
1
−
y
1
y
2
)
α
1
−
1
2
K
11
α
1
2
−
1
2
K
22
(
ζ
−
y
1
α
1
)
−
y
1
K
12
(
ζ
−
y
1
α
1
)
α
1
−
y
1
α
1
∑
i
=
3
m
y
i
α
i
K
1
i
+
y
1
α
1
∑
i
=
3
m
y
i
α
i
K
2
i
+
A
1
=
−
1
2
(
K
11
+
K
22
−
2
K
12
)
α
1
2
+
[
y
1
−
y
2
+
(
K
22
−
K
12
)
ζ
+
∑
i
=
3
m
y
i
α
i
(
K
2
i
−
K
1
i
)
]
y
1
α
1
+
A
1
=
p
α
1
2
+
q
α
1
+
A
1
\begin{aligned} W_{1,2}(\alpha_1,\alpha_2) &= W_1(\alpha_1) \\ &=(1-y_1y_2)\alpha_1 - \frac{1}{2}K_{11}\alpha_1^2 - \frac{1}{2}K_{22}(\zeta-y_1\alpha_1) - y_1K_{12}(\zeta-y_1\alpha_1)\alpha_1 \\ & \quad -y_1\alpha_1\sum_{i=3}^my_i\alpha_iK_{1i}+y_1\alpha_1\sum_{i=3}^my_i\alpha_iK_{2i} + A_1 \\ &=-\frac{1}{2}(K_{11}+K_{22}-2K_{12})\alpha_1^2 + \left[y_1-y_2+(K_{22}-K_{12})\zeta+\sum_{i=3}^my_i\alpha_i(K_{2i}-K_{1i})\right]y_1\alpha_1 + A_1 \\ &=p\alpha_1^2+q\alpha_1+A_1 \end{aligned}
W1,2(α1,α2)=W1(α1)=(1−y1y2)α1−21K11α12−21K22(ζ−y1α1)−y1K12(ζ−y1α1)α1−y1α1i=3∑myiαiK1i+y1α1i=3∑myiαiK2i+A1=−21(K11+K22−2K12)α12+[y1−y2+(K22−K12)ζ+i=3∑myiαi(K2i−K1i)]y1α1+A1=pα12+qα1+A1 其中,
p
p
p、
q
q
q和
A
1
A_1
A1是与
α
1
\alpha_1
α1无关的常数,且
p
=
−
1
2
(
K
11
+
K
22
−
2
K
12
)
=
−
1
2
(
x
1
T
x
1
+
x
2
T
x
2
−
2
x
1
T
x
2
)
=
−
1
2
∥
x
1
−
x
2
∥
2
≤
0
p=-\frac{1}{2}(K_{11}+K_{22}-2K_{12}) = -\frac{1}{2}(\boldsymbol{x}_1^{\mathrm T}\boldsymbol{x}_1+\boldsymbol{x}_2^{\mathrm T}\boldsymbol{x}_2-2\boldsymbol{x}_1^{\mathrm T}\boldsymbol{x}_2) = -\frac{1}{2}\lVert\boldsymbol{x}_1-\boldsymbol{x}_2\lVert^2 \le 0
p=−21(K11+K22−2K12)=−21(x1Tx1+x2Tx2−2x1Tx2)=−21∥x1−x2∥2≤0
如果数据集中没有相同的样本,那么严格有
p
<
0
p<0
p<0。因此,该优化问题本质上是寻找参数
α
1
\alpha_1
α1的二次函数的最大值点,非常容易计算。注意参数
α
1
\alpha_1
α1的取值范围是
[
0
,
C
]
[0,C]
[0,C],使其二次函数取最大值
α
1
\alpha_1
α1的有3种情况:
arg
max
α
1
W
(
α
1
)
=
{
0
,
−
q
2
p
<
0
−
q
2
p
,
0
≤
−
q
2
p
≤
C
C
,
−
q
2
p
>
C
\arg\max_{\alpha_1}W(\alpha_1) = \left\{ \begin{aligned} & \quad 0, &&-\frac{q}{2p}<0 \\[2ex] & -\frac{q}{2p}, &&0 \le -\frac{q}{2p} \le C \\[2ex] & \quad C, &&-\frac{q}{2p}>C \end{aligned} \right.
argα1maxW(α1)=⎩
⎨
⎧0,−2pq,C,−2pq<00≤−2pq≤C−2pq>C 其对应的大致图像如图3所示。
解出 α 1 \alpha_1 α1的最优值 α 1 ′ \alpha_1' α1′后,就得到 α 2 \alpha_2 α2的最优值 α 2 ′ = − y 1 y 2 α 1 ′ + ζ y 2 \alpha_2'=-y_1y_2\alpha_1'+\zeta y_2 α2′=−y1y2α1′+ζy2。我们还需要保证 α 2 ′ \alpha_2' α2′也在 [ 0 , C ] [0,C] [0,C]范围内,因此在计算 α 2 ′ \alpha_2' α2′之前,再用 0 ≤ − y 1 y 2 α 1 ′ + ζ y 2 ≤ C 0 \le -y_1y_2\alpha_1'+\zeta y_2 \le C 0≤−y1y2α1′+ζy2≤C 这一条件对 α 1 ′ \alpha_1' α1′进行裁剪。
为了代码实现方便,我们进一步化简 − q 2 p \begin{aligned}-\frac{q}{2p}\end{aligned} −2pq。设 g ( x ) = ∑ i = 1 m y i α i x i T x + b g(\boldsymbol{x})=\sum\limits_{i=1}^my_i\alpha_i\boldsymbol{x}_i^{\mathrm T}\boldsymbol{x}+b g(x)=i=1∑myiαixiTx+b,则 g ( x 1 ) = ∑ i = 1 m y i α i K 1 i + b , g ( x 2 ) = ∑ i = 1 m y i α i K 2 i + b g(\boldsymbol{x}_1)=\sum\limits_{i=1}^my_i\alpha_iK_{1i}+b, \quad g(\boldsymbol{x}_2)=\sum\limits_{i=1}^my_i\alpha_iK_{2i}+b g(x1)=i=1∑myiαiK1i+b,g(x2)=i=1∑myiαiK2i+b
将
g
(
x
1
)
g(\boldsymbol{x}_1)
g(x1)、
g
(
x
2
)
g(\boldsymbol{x}_2)
g(x2)与
ζ
=
y
1
α
1
+
y
2
α
2
\zeta=y_1\alpha_1+y_2\alpha_2
ζ=y1α1+y2α2 代入
q
q
q的表达式,得到
q
=
[
y
1
−
y
2
+
(
K
22
−
K
12
)
ζ
+
∑
i
=
3
m
y
i
α
i
(
K
2
i
−
K
1
i
)
]
y
1
=
[
y
1
−
y
2
+
(
K
22
−
K
12
)
(
y
1
α
1
+
y
2
α
2
)
+
(
g
(
x
2
)
−
y
1
α
1
K
12
−
y
2
α
2
K
22
−
b
)
−
(
g
(
x
1
)
−
y
1
α
1
K
11
−
y
2
α
2
K
12
−
b
)
]
y
1
=
(
K
11
+
K
22
−
2
K
12
)
α
1
+
[
g
(
x
2
)
−
y
2
−
g
(
x
1
)
+
y
1
]
y
1
\begin{aligned} q &= \left[y_1-y_2+(K_{22}-K_{12})\zeta+\sum_{i=3}^my_i\alpha_i(K_{2i}-K_{1i})\right]y_1 \\[2ex] &= [y_1-y_2+(K_{22}-K_{12})(y_1\alpha_1+y_2\alpha_2) \\ & \quad +(g(\boldsymbol{x}_2)-y_1\alpha_1K_{12}-y_2\alpha_2K_{22}-b)-(g(\boldsymbol{x}_1)-y_1\alpha_1K_{11}-y_2\alpha_2K_{12}-b)]y_1 \\[1ex] &= (K_{11}+K_{22}-2K_{12})\alpha_1+[g(\boldsymbol{x}_2)-y_2-g(\boldsymbol{x}_1)+y_1]y_1 \end{aligned}
q=[y1−y2+(K22−K12)ζ+i=3∑myiαi(K2i−K1i)]y1=[y1−y2+(K22−K12)(y1α1+y2α2)+(g(x2)−y1α1K12−y2α2K22−b)−(g(x1)−y1α1K11−y2α2K12−b)]y1=(K11+K22−2K12)α1+[g(x2)−y2−g(x1)+y1]y1 于是可得
arg
max
α
1
W
1
(
α
1
)
=
−
q
2
p
=
α
1
+
[
g
(
x
2
)
−
y
2
]
−
[
g
(
x
1
)
−
y
1
]
K
11
+
K
22
−
2
K
12
y
1
\arg\max_{\alpha_1}W_1(\alpha_1)=-\frac{q}{2p}=\alpha_1+\frac{[g(\boldsymbol{x}_2)-y_2]-[g(\boldsymbol{x}_1)-y_1]}{K_{11}+K_{22}-2K_{12}}y_1
argα1maxW1(α1)=−2pq=α1+K11+K22−2K12[g(x2)−y2]−[g(x1)−y1]y1 这一形式更加简洁和对称。
在计算出
α
1
′
\alpha_1'
α1′和
α
2
′
\alpha_2'
α2′之后,阈值
b
b
b同样需要更新,以保证通过对偶问题推导出的SVM优化问题成立。下面我们粗略解释其原因,感兴趣的话也可以参考本文的拓展阅读,详细了解为何要进行这样的保证。简单来说,样本对应的系数
α
\alpha
α反映了样本的分类性质。
α
=
0
\alpha=0
α=0 说明样本被正确分类,
α
=
C
\alpha=C
α=C 说明样本被错误分类,这两种情况下
α
\alpha
α都取边界值,样本不是支持向量。反之,
α
∈
(
0
,
C
)
\alpha \in (0,C)
α∈(0,C) 时,其对应的样本必定是支持向量。这也反映出,SVM的分类边界完全是由支持向量所决定的。回到SMO中,当
0
<
α
1
′
<
C
0<\alpha_1'<C
0<α1′<C 时,其对应的样本
x
1
\boldsymbol{x}_1
x1必定是支持向量,因此我们需要保证更新过参数的SVM一定会将
x
1
\boldsymbol{x}_1
x1分类为
y
1
y_1
y1。设新的阈值为
b
1
b_1
b1,将
(
x
1
,
y
1
)
(\boldsymbol{x}_1,y_1)
(x1,y1)代入SVM的分类表达式可得:
y
1
=
y
1
α
1
′
K
11
+
y
2
α
2
′
K
12
+
∑
i
=
3
m
y
i
α
i
K
1
i
+
b
1
=
y
1
(
α
1
′
−
α
1
)
K
11
+
y
2
(
α
2
′
−
α
2
)
K
12
−
b
+
b
1
+
g
(
x
1
)
⇒
b
1
=
b
−
g
(
x
1
)
+
y
1
−
y
1
(
α
1
′
−
α
1
)
K
11
−
y
2
(
α
2
′
−
α
2
)
K
12
\begin{aligned} && y_1&=y_1\alpha_1'K_{11}+y_2\alpha_2'K_{12}+\sum_{i=3}^my_i\alpha_iK_{1i}+b_1 \\[1ex] && &= y_1(\alpha_1'-\alpha_1)K_{11}+y_2(\alpha_2'-\alpha_2)K_{12}-b+b_1+g(\boldsymbol{x}_1) \\[1ex] \Rightarrow && b_1&=b-g(\boldsymbol{x}_1)+y_1-y_1(\alpha_1'-\alpha_1)K_{11}-y_2(\alpha_2'-\alpha_2)K_{12} \end{aligned}
⇒y1b1=y1α1′K11+y2α2′K12+i=3∑myiαiK1i+b1=y1(α1′−α1)K11+y2(α2′−α2)K12−b+b1+g(x1)=b−g(x1)+y1−y1(α1′−α1)K11−y2(α2′−α2)K12 同理,当
0
<
α
2
′
<
C
0<\alpha_2'<C
0<α2′<C 时,下面的阈值
b
2
b_2
b2可以保证SVM将
x
2
\boldsymbol{x}_2
x2分类为
y
2
y_2
y2:
b
2
=
b
−
g
(
x
2
)
+
y
2
−
y
2
(
α
2
′
−
α
2
)
K
22
−
y
1
(
α
1
′
−
α
1
)
K
12
b_2=b-g(\boldsymbol{x}_2)+y_2-y_2(\alpha_2'-\alpha_2)K_{22}-y_1(\alpha_1'-\alpha_1)K_{12}
b2=b−g(x2)+y2−y2(α2′−α2)K22−y1(α1′−α1)K12
而如果 α 1 ′ \alpha_1' α1′和 α 2 ′ \alpha_2' α2′都在 ( 0 , C ) (0,C) (0,C)范围内,说明两个样本都是支持向量,此时上面两种方法算出的 b 1 b_1 b1和 b 2 b_2 b2是相等的。与此相对,如果 α 1 ′ \alpha_1' α1′和 α 2 ′ \alpha_2' α2′都取边界值 0 0 0或者 C C C,说明两个样本都不是支持向量,对 b b b的条件也就可以放宽, b 1 b_1 b1与 b 2 b_2 b2之间的任何值都满足对偶问题成立的条件。此时我们通常取 b = ( b 1 + b 2 ) / 2 b=(b_1+b_2)/2 b=(b1+b2)/2 为两种极端情况的平均值。
最后,我们将更新后的 α 1 ′ \alpha_1' α1′和 α 2 ′ \alpha_2' α2′代回原目标函数,得到 W ( α ) = W ( α 1 ′ , α 2 ′ , α 3 , ⋯ , α m ) W(\boldsymbol\alpha)=W(\alpha_1',\alpha_2',\alpha_3,\cdots,\alpha_m) W(α)=W(α1′,α2′,α3,⋯,αm)。接下来,我们再随机选取一对参数,例如 α 3 \alpha_3 α3和 α 4 \alpha_4 α4,固定其他参数,用相同的方式求解新的目标函数 W 3 , 4 ( α 3 , α 4 ) W_{3,4}(\alpha_3,\alpha_4) W3,4(α3,α4)。注意此时参数 α 1 \alpha_1 α1和 α 2 \alpha_2 α2的值已经更新为刚刚解出的最优值 α 1 ′ \alpha_1' α1′和 α 2 ′ \alpha_2' α2′。这样反复迭代下去,直到更新参数时, W ( α ) W(\boldsymbol\alpha) W(α)的变化量小于某个预设的精度常数 δ \delta δ,或迭代次数达到预设的最大轮数为止。由于计算 W ( α ) W(\boldsymbol\alpha) W(α)的时间复杂度较高,实践中通常采用后者。
三、动手实现SMO求解SVM
下面,我们按照上节讲述的步骤来动手实现SMO算法求解SVM。我们先考虑最简单的线性可分的情况,本节的数据集linear.csv
包含了一些平面上的点及其分类。数据文件的每一行有3个数,依次是点的横坐标
x
1
x_1
x1、纵坐标
x
2
x_2
x2和类别
y
∈
{
−
1
,
1
}
y\in\{-1,1\}
y∈{−1,1}。由于数据集非常简单,明显线性可分,SVM应当能达到100%的正确率,因此我们不再划分训练集和测试集,只以此为例讲解代码实现。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from tqdm import tqdm, trange
data = np.loadtxt('linear.csv', delimiter=',')
print('数据集大小:', len(data))
x = data[:, :2]
y = data[:, 2]
# 数据集可视化
plt.figure()
plt.scatter(x[y == -1, 0], x[y == -1, 1], color='red', label='y=-1')
plt.scatter(x[y == 1, 0], x[y == 1, 1], color='blue', marker='x', label='y=1')
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')
plt.legend()
plt.show()
下面我们来实现SVM的主要部分SMO算法,具体的讲解放在代码注释中。
def SMO(x, y, ker, C, max_iter):
'''
SMO算法
x,y:样本的值和类别
ker:核函数,与线性回归中核函数的含义相同
C:惩罚系数
max_iter:最大迭代次数
'''
# 初始化参数
m = x.shape[0]
alpha = np.zeros(m)
# 预先计算所有向量的两两内积,减少重复计算
K = np.zeros((m, m))
for i in range(m):
for j in range(m):
K[i, j] = ker(x[i], x[j])
for l in trange(max_iter):
# 开始迭代
for i in range(m):
# 有m个参数,每一轮迭代中依次更新
# 固定参数alpha_i与另一个随机参数alpha_j,并且保证i与j不相等
j = np.random.choice([l for l in range(m) if l != i])
# 用-b/2a更新alpha_i的值
eta = K[j, j] + K[i, i] - 2 * K[i, j] # 分母
e_i = np.sum(y * alpha * K[:, i]) - y[i] # 分子
e_j = np.sum(y * alpha * K[:, j]) - y[j]
alpha_i = alpha[i] + y[i] * (e_j - e_i) / (eta + 1e-5) # 防止除以0
zeta = alpha[i] * y[i] + alpha[j] * y[j]
# 将alpha_i和对应的alpha_j保持在[0,C]区间
# 0 <= (zeta - y_j * alpha_j) / y_i <= C
if y[i] == y[j]:
lower = max(0, zeta / y[i] - C)
upper = min(C, zeta / y[i])
else:
lower = max(0, zeta / y[i])
upper = min(C, zeta / y[i] + C)
alpha_i = np.clip(alpha_i, lower, upper)
alpha_j = (zeta - y[i] * alpha_i) / y[j]
# 更新参数
alpha[i], alpha[j] = alpha_i, alpha_j
return alpha
利用SMO算法解出 α \boldsymbol\alpha α后,我们可以得到SVM的参数 w \boldsymbol w w和 b b b。我们把该算法应用在导入的线性数据集上,绘制出SVM给出的分隔直线,并标记出支持向量。
# 设置超参数
C = 1e8 # 由于数据集完全线性可分,我们不引入松弛变量
max_iter = 1000
np.random.seed(0)
alpha = SMO(x, y, ker=np.inner, C=C, max_iter=max_iter)
# 用alpha计算w,b和支持向量
sup_idx = alpha > 1e-5 # 支持向量的系数不为零
print('支持向量个数:', np.sum(sup_idx))
w = np.sum((alpha[sup_idx] * y[sup_idx]).reshape(-1, 1) * x[sup_idx], axis=0)
wx = x @ w.reshape(-1, 1)
b = -0.5 * (np.max(wx[y == -1]) + np.min(wx[y == 1]))
print('参数:', w, b)
# 绘图
X = np.linspace(np.min(x[:, 0]), np.max(x[:, 0]), 100)
Y = -(w[0] * X + b) / (w[1] + 1e-5)
plt.figure()
plt.scatter(x[y == -1, 0], x[y == -1, 1], color='red', label='y=-1')
plt.scatter(x[y == 1, 0], x[y == 1, 1], marker='x', color='blue', label='y=1')
plt.plot(X, Y, color='black')
# 用圆圈标记出支持向量
plt.scatter(x[sup_idx, 0], x[sup_idx, 1], marker='o', color='none', edgecolor='purple', s=150, label='support vectors')
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')
plt.legend()
plt.show()
思考:对于同一个数据集,逻辑斯谛回归和支持向量机给出的分隔平面一样吗?用本节的linear.csv
数据集验证你的想法。
from sklearn.linear_model import LogisticRegression
# 创建并拟合模型
log_reg = LogisticRegression(max_iter=10000)
log_reg.fit(x, y)
# 提取模型参数
w_log_reg = log_reg.coef_[0]
b_log_reg = log_reg.intercept_
# 计算决策边界
Y_log_reg = -(w_log_reg[0] * X + b_log_reg) / (w_log_reg[1] + 1e-5)
# 可视化
plt.figure()
plt.scatter(x[y == -1, 0], x[y == -1, 1], color='red', label='y=-1')
plt.scatter(x[y == 1, 0], x[y == 1, 1], marker='x', color='blue', label='y=1')
plt.plot(X, Y_log_reg, color='green', label='Logistic Regression')
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')
plt.legend()
plt.show()
四、核函数
对于略微有些线性不可分的数据,我们采用松弛变量的方法,仍然可以导出SVM的分隔超平面。然而,当数据的分布更加偏离线性时,可能完全无法用线性的超平面进行有效分类,松弛变量也就失效了。为了更清晰地展示非线性的情况,我们读入双螺旋数据集spiral.csv
并绘制数据分布。该数据集包含了在平面上呈螺旋分布的两组点,同类的点处在同一条旋臂上。
data = np.loadtxt('spiral.csv', delimiter=',')
print('数据集大小:', len(data))
x = data[:, :2]
y = data[:, 2]
# 数据集可视化
plt.figure()
plt.scatter(x[y == -1, 0], x[y == -1, 1], color='red', label='y=-1')
plt.scatter(x[y == 1, 0], x[y == 1, 1], marker='x', color='blue', label='y=1')
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')
plt.legend()
plt.axis('square')
plt.show()
显然,平面上任意一条直线都无法为上图的双螺旋数据集给出分类。因此,我们需要引入非线性的特征映射。将在神经网络与多层感知机一文中提到,非线性函数可以使数据升维,将在低维中线性不可分的数据映射到高维空间,使其变得线性可分。设映射函数为 ϕ ( x ) : R n → R N \phi(\boldsymbol x):\mathbb R^n \rightarrow \mathbb R^N ϕ(x):Rn→RN。将线性SVM中的 x i \boldsymbol x_i xi全部替换为 ϕ ( x i ) \phi(\boldsymbol x_i) ϕ(xi),并进行相同的数学推导,可以得到对偶问题的优化目标函数为 W ( α ) = ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m y i y j α i α j ϕ ( x i ) T ϕ ( x j ) W(\boldsymbol\alpha)=\sum_{i=1}^m \alpha_i-\frac{1}{2}\sum_{i=1}^m\sum_{j=1}^my_iy_j\alpha_i\alpha_j\phi(\boldsymbol x_i)^{\mathrm T}\phi(\boldsymbol x_j) W(α)=i=1∑mαi−21i=1∑mj=1∑myiyjαiαjϕ(xi)Tϕ(xj)
为了简化上式,我们利用核技巧,定义核函数 K ( x , y ) = ϕ ( x ) T ϕ ( y ) K(\boldsymbol x,\boldsymbol y)=\phi(\boldsymbol x)^{\mathrm T}\phi(\boldsymbol y) K(x,y)=ϕ(x)Tϕ(y)。【机器学习的基本思想】模型优化与评估 中我们曾介绍过,引入核函数后,计算特征映射的时间复杂度被大大降低了。与不带有特征映射时类似,现在SVM对新样本 x \boldsymbol x x的预测为 y ^ = w ∗ T ϕ ( x ) + b ∗ \hat y = \boldsymbol w^{*\mathrm T} \phi(\boldsymbol x)+b^* y^=w∗Tϕ(x)+b∗
虽然我们不知道 ϕ ( x ) \phi(\boldsymbol x) ϕ(x),无法按照原来的方法由 α ∗ \boldsymbol\alpha^* α∗计算 w ∗ = ∑ α i ∗ y i ϕ ( x i ) \boldsymbol w^*=\sum\alpha_i^*y_i\phi(\boldsymbol x_i) w∗=∑αi∗yiϕ(xi)。但是,我们可以直接利用核函数计算 w ∗ T ϕ ( x ) \boldsymbol w^{*\mathrm T} \phi(\boldsymbol x) w∗Tϕ(x): w ∗ T ϕ ( x ) = ∑ i = 1 , x i ∈ S m α i ∗ y i ϕ ( x i ) T ϕ ( x ) = ∑ i = 1 , x i ∈ S m α i ∗ y i K ( x i , x ) \boldsymbol w^{*\mathrm T} \phi(\boldsymbol x)=\sum_{i=1,\boldsymbol x_i\in \mathcal S}^m\alpha_i^*y_i\phi(\boldsymbol x_i)^{\mathrm T}\phi(\boldsymbol x)=\sum_{i=1,\boldsymbol x_i\in \mathcal S}^m\alpha_i^*y_iK(\boldsymbol x_i,\boldsymbol x) w∗Tϕ(x)=i=1,xi∈S∑mαi∗yiϕ(xi)Tϕ(x)=i=1,xi∈S∑mαi∗yiK(xi,x) 从而 b ∗ b^* b∗也可以按原方法计算得出: b ∗ = − 1 2 ( max i , y i = − 1 w ∗ T ϕ ( x i ) + max i , y i = 1 w ∗ T ϕ ( x i ) ) b^*=-\frac{1}{2}(\max_{i,y_i=-1}\boldsymbol w^{*\mathrm T} \phi(\boldsymbol x_i)+\max_{i,y_i=1}\boldsymbol w^{*\mathrm T} \phi(\boldsymbol x_i)) b∗=−21(i,yi=−1maxw∗Tϕ(xi)+i,yi=1maxw∗Tϕ(xi))
实践中, b ∗ b^* b∗仍然由SMO算法求解时同步迭代计算。这时,SVM在计算时只需要用到支持向量的优点就很明显了。在数据集上建立好SVM模型后,我们可以只保留支持向量,而将剩余的数据都舍弃,减小存储模型的空间占用。
现在,我们的任务就变成寻找合适的核函数,来让原本线性不可分的数据线性可分。通常来说,核函数应当衡量向量之间的相似度。常用的核函数有:
-
内积核: K ( x , y ) = x T y K(\boldsymbol x,\boldsymbol y)=\boldsymbol x^{\mathrm T}\boldsymbol y K(x,y)=xTy,该函数即为线性SVM所用的核函数。
-
简单多项式核: K ( x , y ) = ( x T y ) d K(\boldsymbol x,\boldsymbol y)=(\boldsymbol x^{\mathrm T}\boldsymbol y)^d K(x,y)=(xTy)d。
-
高斯核: K ( x , y ) = e − ∥ x − y ∥ 2 2 σ 2 K(\boldsymbol x,\boldsymbol y)=\text{e}^{-\frac{\lVert \boldsymbol x-\boldsymbol y\lVert^2}{2\sigma^2}} K(x,y)=e−2σ2∥x−y∥2,又称径向基函数(radial basis function,RBF)核。
-
余弦相似度核: K ( x , y ) = x T y ∥ x ∥ ⋅ ∥ y ∥ K(\boldsymbol x,\boldsymbol y)=\frac{\boldsymbol x^{\mathrm T}\boldsymbol y}{\lVert \boldsymbol x\lVert\cdot\lVert\boldsymbol y\lVert} K(x,y)=∥x∥⋅∥y∥xTy,该函数计算的是向量 x \boldsymbol x x与 y \boldsymbol y y之间夹角的余弦值。
-
Sigmoid核: K ( x , y ) = tanh ( β x T y + c ) K(\boldsymbol x,\boldsymbol y)=\tanh(\beta\boldsymbol x^{\mathrm T}\boldsymbol y+c) K(x,y)=tanh(βxTy+c),可以证明,带有sigmoid核的SVM等价于两层的多层感知机。
下面,我们尝试用不同的非线性核函数对螺旋数据集进行分类,并观察分类效果。首先,我们实现上文介绍的几个核函数。
# 简单多项式核
def simple_poly_kernel(d):
def k(x, y):
return np.inner(x, y) ** d
return k
# RBF核
def rbf_kernel(sigma):
def k(x, y):
return np.exp(-np.inner(x - y, x - y) / (2.0 * sigma ** 2))
return k
# 余弦相似度核
def cos_kernel(x, y):
return np.inner(x, y) / np.linalg.norm(x, 2) / np.linalg.norm(y, 2)
# sigmoid核
def sigmoid_kernel(beta, c):
def k(x, y):
return np.tanh(beta * np.inner(x, y) + c)
return k
然后,我们依次用这4种核函数计算SVM在双螺旋数据集上的分类结果。其中,简单多项式核取 d = 3 d=3 d=3;RBF核取标准差 σ = 0.1 \sigma=0.1 σ=0.1;sigmoid核取 β = 1 \beta=1 β=1、 c = − 1 c=-1 c=−1。为了更清晰地展示结果,我们在 [ − 1.5 , 1.5 ] × [ − 1.5 , 1.5 ] [-1.5,1.5]\times[-1.5,1.5] [−1.5,1.5]×[−1.5,1.5] 的平面上网格状均匀选点,用构建好的SVM判断这些点的类别,并将其所在小网格涂成对应的颜色。
kernels = [
simple_poly_kernel(3),
rbf_kernel(0.1),
cos_kernel,
sigmoid_kernel(1, -1)
]
ker_names = ['Poly(3)', 'RBF(0.1)', 'Cos', 'Sigmoid(1,-1)']
C = 1e8
max_iter = 500
# 绘图准备,构造网格
plt.figure()
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
axs = axs.flatten()
cmap = ListedColormap(['coral', 'royalblue'])
# 开始求解 SVM
for i in range(len(kernels)):
print('核函数:', ker_names[i])
alpha = SMO(x, y, kernels[i], C=C, max_iter=max_iter)
sup_idx = alpha > 1e-5 # 支持向量的系数不为零
sup_x = x[sup_idx] # 支持向量
sup_y = y[sup_idx]
sup_alpha = alpha[sup_idx]
# 用支持向量计算 w^T*x
def wx(x_new):
s = 0
for xi, yi, ai in zip(sup_x, sup_y, sup_alpha):
s += yi * ai * kernels[i](xi, x_new)
return s
# 计算b*
neg = [wx(xi) for xi in sup_x[sup_y == -1]]
pos = [wx(xi) for xi in sup_x[sup_y == 1]]
b = -0.5 * (np.max(neg) + np.min(pos))
# 构造网格并用 SVM 预测分类
G = np.linspace(-1.5, 1.5, 100)
G = np.meshgrid(G, G)
X = np.array([G[0].flatten(), G[1].flatten()]).T # 转换为每行一个向量的形式
Y = np.array([wx(xi) + b for xi in X])
Y[Y < 0] = -1
Y[Y >= 0] = 1
Y = Y.reshape(G[0].shape)
axs[i].contourf(G[0], G[1], Y, cmap=cmap, alpha=0.5)
# 绘制原数据集的点
axs[i].scatter(x[y == -1, 0], x[y == -1, 1], color='red', label='y=-1')
axs[i].scatter(x[y == 1, 0], x[y == 1, 1], marker='x', color='blue', label='y=1')
axs[i].set_title(ker_names[i])
axs[i].set_xlabel(r'$x_1$')
axs[i].set_ylabel(r'$x_2$')
axs[i].legend()
plt.show()
从实验结果图我们可以看出,不同的核函数对SVM模型的分类效果是截然不同的。对于双螺旋数据的二分类任务,高斯核函数(RBF)带给SVM的性能要明显好于其他核函数。根据高斯核函数的公式,我们可以看到高斯核本质是在衡量样本和样本之间基于欧几里得距离的相似度,这样使得欧几里得距离近的样本更好的聚在一起,在高维空间中达到线性可分。此外,松弛变量带来的对错分类样本的容忍度 C C C也会极大影响分类结果,可以调整 C C C的值,观察不同核函数决策边界的变化。
五、Sklearn中的SVM工具
机器学习工具库sklearn提供了封装好的SVM工具,且支持多种内置核函数。我们以RBF核函数为例,复现上面在双螺旋数据集上的分类结果。在sklearn.SVM
中,SVC
表示用SVM完成分类任务,SVR
表示用SVM完成回归任务,这里我们选用SVC
。此外,它的参数和我们上面的公式在表达上有细微的区别。对于RBF核函数,其参数为
γ
=
1
/
(
2
σ
2
)
\gamma=1/(2\sigma^2)
γ=1/(2σ2)。上一节我们设置
σ
=
0.1
\sigma=0.1
σ=0.1,因此这里对应的参数为
γ
=
50
\gamma=50
γ=50。我们同样在平面上采样,绘制出该SVM给出的分类边界。可以看出,其结果与我们自己实现的SVM基本一致。
使用scikit-learn库中svm模块
的SVC
类可以建立支持向量机模型,其语法格式和参数说明如下。
sklearn.svm.SVC(C=1.0, kernel=’rbf’, degree=3, gamma=’auto’, coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=’ovr’, random_state=None)
参数名称 | 说明 |
---|---|
C | 接收int或float,默认为1.0。惩罚参数C,用于控制分类器的复杂度。较大的C值会使分类器更复杂并且可能导致过拟合,而较小的C值会使分类器更简单但可能导致欠拟合。 |
kernel | 接收str。表示核函数,可选参数为linear、poly、rbf、sigmoid、precomputed。默认为rbf。 |
degree | 接收int。表示多项式核函数poly的维度。默认为3。 |
gamma | 接收str。表示rbf、poly、sigmoid核函数的参数,若是auto,则自动设置参数。默认为auto。 |
coef0 | 接收int或float。表示核函数的常数项,对poly和sigmoid有效,默认为0.0。 |
shrinking | 接收bool。是否启用收缩启发式。收缩启发式可以加速训练过程,尤其是在数据量较大的情况下。默认=True。 |
probability | 接收bool。是否启用概率估计。启用后,会增加训练时间,但可以使用predict_proba方法来获取预测概率。默认=False。 |
tol | 接收float。表示停止训练的误差大小。默认为0.001。 |
cache_size | 接收float。指定缓存大小(以MB为单位),用于加速计算。默认=200。 |
class_weight | 接收dict or {‘balanced’}。类别权重。可以为不同的类别设置不同的权重,‘balanced’ 会根据类的频率自动调整权重。默认=None。 |
verbose | 接收bool。是否输出详细的训练过程信息。默认=False。 |
max_iter | 接受int。表示最大迭代次数,-1表示无限制。默认为-1。 |
decision_function_shape | 接收{‘ovo’, ‘ovr’}。决策函数的形状:‘ovo’:一对一策略;‘ovr’:一对多策略。默认=‘ovr’。 |
break_ties | 接收bool。是否在决策函数值相等的情况下打破平局。在decision_function_shape='ovr’且probability=True时有效。默认=False。 |
random_state | 接收int, RandomState instance or None。控制随机数生成的种子,确保结果的可复现性。默认=None。 |
# 从sklearn.svm中导入SVM分类器
from sklearn.svm import SVC
# 定义SVM模型,包括定义使用的核函数与参数信息
model = SVC(kernel='rbf', gamma=50, tol=1e-6)
model.fit(x, y)
# 绘制结果
fig = plt.figure(figsize=(6,6))
G = np.linspace(-1.5, 1.5, 100)
G = np.meshgrid(G, G)
X = np.array([G[0].flatten(), G[1].flatten()]).T # 转换为每行一个向量的形式
Y = model.predict(X)
Y = Y.reshape(G[0].shape)
plt.contourf(G[0], G[1], Y, cmap=cmap, alpha=0.5)
# 绘制原数据集的点
plt.scatter(x[y == -1, 0], x[y == -1, 1], color='red', label='y=-1')
plt.scatter(x[y == 1, 0], x[y == 1, 1], marker='x', color='blue', label='y=1')
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')
plt.legend()
plt.show()
思考:试基于本节代码,标记出双螺旋数据集spiral.csv
上使用RBF核函数的SVM模型的支持向量,并讨论这些数据点成为支持向量的原因。
# 访问支持向量的索引
support_vector_indices = model.support_
# 获取支持向量
support_vectors = x[support_vector_indices]
# 绘制结果
fig = plt.figure(figsize=(6,6))
G = np.linspace(-1.5, 1.5, 100)
G = np.meshgrid(G, G)
X = np.array([G[0].flatten(), G[1].flatten()]).T # 转换为每行一个向量的形式
Y = model.predict(X)
Y = Y.reshape(G[0].shape)
plt.contourf(G[0], G[1], Y, cmap=cmap, alpha=0.5)
# 绘制支持向量
plt.scatter(support_vectors[:,0], support_vectors[:,1], marker='o', color='none', edgecolor='purple', s=150, label='Support Vectors')
# 绘制原数据集的点
plt.scatter(x[y == -1, 0], x[y == -1, 1], color='red', label='y=-1')
plt.scatter(x[y == 1, 0], x[y == 1, 1], marker='x', color='blue', label='y=1')
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')
plt.legend()
plt.show()
双螺旋数据是一个常用的非线性数据集,通常需要使用RBF(径向基函数)核函数来处理。在这样的数据集中,数据点在空间中具有复杂的分布,支持向量通常分布在各个类别的交界处,帮助模型准确地捕捉非线性的决策边界。成为支持向量的原因如下:
- 离决策边界较近:支持向量通常距离决策边界较近。这些点直接影响决策边界的定位,因为它们位于距离边界的“支持”区域。
- 非线性特征:在RBF核函数的帮助下,SVM能够在高维特征空间中处理非线性问题。支持向量在高维空间中体现为离决策边界非常近的点,这些点在原始空间中可能处于复杂的非线性区域。
- 边界的确定:支持向量是确定分类决策边界的关键点。如果移除这些点,决策边界可能会发生变化,因此它们在模型训练中起着关键作用。
六、拓展:SVM对偶问题的推导
对一般形式的带约束的凸优化问题
min
w
f
(
w
)
s.t.
g
i
(
w
)
≤
0
,
i
=
1
,
⋯
,
k
h
j
(
w
)
=
0
,
j
=
1
,
⋯
,
l
\begin{aligned} \min_{w}&f(w) \\ \text{s.t.} \quad &g_i(w) \le 0, \quad i=1,\cdots,k \\ &h_j(w) = 0, \quad j=1,\cdots,l \end{aligned}
wmins.t.f(w)gi(w)≤0,i=1,⋯,khj(w)=0,j=1,⋯,l 定义其拉格朗日函数(Lagrangian function)为
L
(
w
,
α
,
β
)
=
f
(
w
)
+
∑
i
=
1
k
α
i
g
i
(
w
)
+
∑
i
=
1
l
β
i
h
i
(
w
)
,
α
i
≥
0
\mathcal L(w,\boldsymbol\alpha,\boldsymbol\beta) = f(w)+\sum_{i=1}^k\alpha_ig_i(w)+\sum_{i=1}^l\beta_ih_i(w), \quad \alpha_i\ge0
L(w,α,β)=f(w)+i=1∑kαigi(w)+i=1∑lβihi(w),αi≥0 其中
α
\boldsymbol\alpha
α与
β
\boldsymbol\beta
β称为拉格朗日乘子。拉格朗日函数
L
\mathcal L
L的值不仅与原问题的参数
w
w
w有关,还与乘子
α
\boldsymbol\alpha
α和
β
\boldsymbol\beta
β有关,因此,可以利用乘子的值来表达原问题的约束条件。记原问题为
θ
P
(
w
)
=
max
α
,
β
;
α
i
≥
0
L
(
w
,
α
,
β
)
\theta_{\mathcal P}(w)=\max_{\boldsymbol\alpha,\boldsymbol\beta;\alpha_i\ge0}\mathcal L(w,\boldsymbol\alpha,\boldsymbol\beta)
θP(w)=α,β;αi≥0maxL(w,α,β) 并且定义参数
w
w
w使得原问题的约束条件被违反,即
g
i
(
w
)
>
0
g_i(w)>0
gi(w)>0 或
h
i
(
w
)
≠
0
h_i(w)\ne0
hi(w)=0 时,原问题
θ
P
=
+
∞
\theta_{\mathcal P}=+\infty
θP=+∞。反过来说,如果原问题的约束条件都被满足,那么
h
i
(
w
)
=
0
h_i(w)=0
hi(w)=0,从而拉格朗日函数的第3项全部为零。并且由
g
i
(
w
)
≤
0
g_i(w)\le0
gi(w)≤0 且
α
i
≥
0
\alpha_i\ge0
αi≥0,知
α
i
g
i
(
w
)
≤
0
\alpha_ig_i(w)\le0
αigi(w)≤0。如果要让
L
\mathcal L
L最大,那么所有拉格朗日乘子
α
i
\alpha_i
αi都应当使
α
i
g
i
(
w
)
=
0
\alpha_ig_i(w)=0
αigi(w)=0,否则
L
\mathcal L
L的值会减小。因此,当约束条件满足时,拉格朗日函数的最大值恰好就等于原问题的目标函数
f
(
w
)
f(w)
f(w),从而原问题可以写为
θ
P
=
{
f
(
w
)
,
w
满足约束条件
+
∞
,
其他情况
\theta_{\mathcal P} = \left\{ \begin{aligned} & f(w), && w满足约束条件 \\ & +\infty, && 其他情况 \\ \end{aligned} \right.
θP={f(w),+∞,w满足约束条件其他情况 于是,最开始带约束的优化问题等价于对原问题的无约束优化:
min
w
θ
P
(
w
)
=
min
w
max
α
,
β
;
α
i
≥
0
L
(
w
,
α
,
β
)
\min_w\theta_{\mathcal P}(w) = \min_w \max_{\boldsymbol\alpha,\boldsymbol\beta;\alpha_i\ge0}\mathcal L(w,\boldsymbol\alpha,\boldsymbol\beta)
wminθP(w)=wminα,β;αi≥0maxL(w,α,β) 记该问题的最优值为
p
∗
=
min
w
θ
P
(
w
)
p^*=\min\limits_w\theta_{\mathcal P}(w)
p∗=wminθP(w)。
至此,我们只是通过拉格朗日函数对原问题进行了等价变形,并没有降低问题求解的难度。为了真正解决该优化问题,我们考虑另一个稍微有些区别的函数 θ D \theta_{\mathcal D} θD,定义为 θ D ( α , β ) = min w L ( w , α , β ) \theta_{\mathcal D}(\boldsymbol\alpha,\boldsymbol\beta)=\min_w \mathcal L(w,\boldsymbol\alpha,\boldsymbol\beta) θD(α,β)=wminL(w,α,β)
将上面优化问题中计算 min \min min和 max \max max的顺序交换,定义其对偶问题为 max α , β ; α i ≥ 0 θ D ( α , β ) = max α , β ; α i ≥ 0 min w L ( w , α , β ) \max_{\boldsymbol\alpha,\boldsymbol\beta;\alpha_i\ge0}\theta_{\mathcal D}(\boldsymbol\alpha,\boldsymbol\beta)=\max_{\boldsymbol\alpha,\boldsymbol\beta;\alpha_i\ge0}\min_w \mathcal L(w,\boldsymbol\alpha,\boldsymbol\beta) α,β;αi≥0maxθD(α,β)=α,β;αi≥0maxwminL(w,α,β) 记其最优值为 d ∗ = max α , β ; α i ≥ 0 θ D ( α , β ) d^*=\max\limits_{\boldsymbol\alpha,\boldsymbol\beta;\alpha_i\ge0}\theta_{\mathcal D}(\boldsymbol\alpha,\boldsymbol\beta) d∗=α,β;αi≥0maxθD(α,β)。可以证明,先取 min \min min后取 max \max max的对偶问题最优值 d ∗ d^* d∗要小于等于先取 max \max max后取 min \min min的原问题最优值 p ∗ p^* p∗。然而,在满足某些特殊条件的情况下,两者的最优值是相等的,即 d ∗ = p ∗ d^*=p^* d∗=p∗。对于一个凸优化问题,如果其约束条件可以被严格满足,即存在 w w w使得 g i ( w ) < 0 g_i(w)<0 gi(w)<0 且 h i ( w ) = 0 h_i(w)=0 hi(w)=0,那么必然存在 w ∗ w^* w∗、 α ∗ \boldsymbol\alpha^* α∗和 β ∗ \boldsymbol\beta^* β∗,满足:
- w ∗ w^* w∗是原问题 min w θ P ( w ) \min\limits_w\theta_{\mathcal P}(w) wminθP(w)的解;
- α ∗ \boldsymbol\alpha^* α∗和 β ∗ \boldsymbol\beta^* β∗是对偶问题 max α , β ; α i ≥ 0 θ D ( α , β ) \max\limits_{\boldsymbol\alpha,\boldsymbol\beta;\alpha_i\ge0}\theta_{\mathcal D}(\boldsymbol\alpha,\boldsymbol\beta) α,β;αi≥0maxθD(α,β) 的解;
- 最优值 d ∗ = p ∗ = L ( w ∗ , α ∗ , β ∗ ) d^*=p^*=\mathcal L(w^*,\boldsymbol\alpha^*,\boldsymbol\beta^*) d∗=p∗=L(w∗,α∗,β∗),
以及卡鲁什-库恩-塔克条件(Karush-Kuhn-Tucker conditions),简称KKT条件:
- 稳定性: ∇ w L ( w ∗ , α ∗ , β ∗ ) = 0 \nabla_w\mathcal L(w^*,\boldsymbol\alpha^*,\boldsymbol\beta^*)=0 ∇wL(w∗,α∗,β∗)=0;
- 原问题满足性: g i ( w ∗ ) ≤ 0 g_i(w^*) \le 0 gi(w∗)≤0, h i ( w ∗ ) = 0 h_i(w^*)=0 hi(w∗)=0;
- 对偶问题满足性: α i ∗ ≥ 0 \alpha_i^* \ge 0 αi∗≥0;
- 互补松弛性: α i ∗ g i ( w ∗ ) = 0 \alpha_i^*g_i(w^*)=0 αi∗gi(w∗)=0。
反过来,如果某一组 ( w , α , β ) (w,\boldsymbol\alpha,\boldsymbol\beta) (w,α,β)满足KKT条件,那么它们也是原问题和对偶问题的解。KKT条件中的前3个条件较好理解,都是优化问题本身的约束;最后一个互补松弛性我们在推导 θ P = f ( w ) \theta_{\mathcal P}=f(w) θP=f(w) 时也提到过,否则 α i ∗ g i ( w ∗ ) < 0 \alpha_i^*g_i(w^*)<0 αi∗gi(w∗)<0 会使目标拉格朗日函数的值减小,与 α i ∗ \alpha_i^* αi∗和 w ∗ w^* w∗是最优解矛盾。
根据上面的讨论,如果一个凸优化问题满足KKT条件,且其对偶问题比原问题更容易解决,那么我们可以通过求对偶问题的解来得到原问题的解。对线性版本的支持向量机的优化问题
min
w
,
b
1
2
∥
w
∥
2
s.t.
y
i
(
w
T
x
i
+
b
)
≥
1
,
i
=
1
,
⋯
,
m
\begin{aligned} & \min_{\boldsymbol w,b}\frac{1}{2}\lVert\boldsymbol w\lVert^2 \\[2ex] & \text{s.t.}\quad y_i(\boldsymbol w^{\mathrm T}\boldsymbol x_i+b) \ge 1,\quad i=1,\cdots,m \end{aligned}
w,bmin21∥w∥2s.t.yi(wTxi+b)≥1,i=1,⋯,m 来说,
w
\boldsymbol w
w和
b
b
b都是问题的参数。我们将约束条件重写为
g
i
(
w
,
b
)
=
−
y
i
(
w
T
x
i
+
b
)
+
1
≤
0
g_i(\boldsymbol w,b)=-y_i(\boldsymbol w^{\mathrm T}\boldsymbol x_i+b)+1 \le 0
gi(w,b)=−yi(wTxi+b)+1≤0,得到其拉格朗日函数为
L
(
w
,
b
,
α
)
=
1
2
∥
w
∥
2
−
∑
i
=
1
m
α
i
(
y
i
(
w
T
x
i
+
b
)
−
1
)
\mathcal L(\boldsymbol w,b,\boldsymbol\alpha) = \frac{1}{2}\lVert\boldsymbol w\lVert^2-\sum_{i=1}^m\alpha_i(y_i(\boldsymbol w^{\mathrm T}\boldsymbol x_i+b)-1)
L(w,b,α)=21∥w∥2−i=1∑mαi(yi(wTxi+b)−1)
为了求其最小值
min
w
,
b
L
\min\limits_{\boldsymbol w,b}\mathcal L
w,bminL,令其对
w
\boldsymbol w
w和
b
b
b的梯度等于0,得
0
=
∇
w
L
(
w
,
b
,
α
)
=
w
−
∑
i
=
1
m
α
i
y
i
x
i
⇒
w
=
∑
i
=
1
m
α
i
y
i
x
i
0
=
∇
b
L
(
w
,
b
,
α
)
=
∑
i
=
1
m
α
i
y
i
\begin{aligned} && \boldsymbol0 &= \nabla_{\boldsymbol w}\mathcal L(\boldsymbol w,b,\boldsymbol\alpha)=\boldsymbol w-\sum_{i=1}^m\alpha_iy_i\boldsymbol x_i \\ \Rightarrow && \boldsymbol w &= \sum_{i=1}^m\alpha_iy_i\boldsymbol x_i \\ && 0 &= \nabla_b\mathcal L(\boldsymbol w,b,\boldsymbol\alpha)=\sum_{i=1}^m\alpha_iy_i \end{aligned}
⇒0w0=∇wL(w,b,α)=w−i=1∑mαiyixi=i=1∑mαiyixi=∇bL(w,b,α)=i=1∑mαiyi
我们把
w
\boldsymbol w
w与
b
b
b代入拉格朗日函数的表达式,得到对偶函数
θ
D
(
α
)
\theta_{\mathcal D}(\boldsymbol\alpha)
θD(α)的表达式为
θ
D
(
α
)
=
min
w
,
b
L
(
w
,
b
,
α
)
=
1
2
∥
∑
i
=
1
m
α
i
y
i
x
i
∥
2
−
∑
i
=
1
m
(
α
i
y
i
∑
j
=
1
m
α
j
y
j
x
j
T
x
i
)
−
(
∑
i
=
1
m
α
i
y
i
)
2
+
∑
i
=
1
m
α
i
=
∑
i
=
1
m
α
i
−
1
2
∑
i
=
1
m
∑
j
=
1
m
α
i
α
j
y
i
y
j
x
i
T
x
j
\begin{aligned} \theta_{\mathcal D}(\boldsymbol\alpha) &= \min_{\boldsymbol w,b}\mathcal L(\boldsymbol w,b,\boldsymbol\alpha) \\ &= \frac{1}{2}\left\lVert\sum_{i=1}^m\alpha_iy_i\boldsymbol x_i\right\lVert^2-\sum_{i=1}^m\left(\alpha_iy_i\sum_{j=1}^m\alpha_jy_j \boldsymbol{x}_j^{\mathrm T}\boldsymbol{x}_i\right) - \left(\sum_{i=1}^m\alpha_iy_i\right)^2 + \sum_{i=1}^m\alpha_i \\ &= \sum_{i=1}^m\alpha_i - \frac{1}{2}\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j \boldsymbol{x}_i^{\mathrm T}\boldsymbol{x}_j \end{aligned}
θD(α)=w,bminL(w,b,α)=21
i=1∑mαiyixi
2−i=1∑m(αiyij=1∑mαjyjxjTxi)−(i=1∑mαiyi)2+i=1∑mαi=i=1∑mαi−21i=1∑mj=1∑mαiαjyiyjxiTxj 于是,对偶优化问题的形式为
max
α
θ
D
(
α
)
s.t.
α
i
≥
0
,
i
=
1
,
⋯
,
m
∑
i
=
1
m
α
i
y
i
=
0
\begin{aligned} & \max_{\boldsymbol\alpha}\theta_{\mathcal D}(\boldsymbol\alpha) \\ & \text{s.t.} \quad \alpha_i \ge 0, \quad i=1,\cdots,m \\ & \quad \quad \sum_{i=1}^m \alpha_iy_i = 0 \end{aligned}
αmaxθD(α)s.t.αi≥0,i=1,⋯,mi=1∑mαiyi=0
而引入松弛变量
ξ
i
\xi_i
ξi后,我们用类似的方式也可以求出其对偶问题。具体的推导过程与上面基本一致,我们在此略去,感兴趣的可以自行尝试推导。最后的结果为
max
α
θ
D
(
α
)
s.t.
0
≤
α
i
≤
C
,
i
=
1
,
⋯
,
m
∑
i
=
1
m
α
i
y
i
=
0
\begin{aligned} & \max_{\boldsymbol\alpha}\theta_{\mathcal D}(\boldsymbol\alpha) \\ & \text{s.t.} \quad 0 \le \alpha_i \le C, \quad i=1,\cdots,m \\ & \quad \quad \sum_{i=1}^m \alpha_iy_i = 0 \end{aligned}
αmaxθD(α)s.t.0≤αi≤C,i=1,⋯,mi=1∑mαiyi=0 其中,
θ
D
(
α
)
\theta_{\mathcal D}(\boldsymbol\alpha)
θD(α)的形式与不带松弛变量的版本相同。该对偶问题是关于
α
\boldsymbol\alpha
α的二次规划问题,相比于原问题来说求解难度大大降低了。可以验证,这一问题的形式满足KKT条件,从而我们可以通过求解对偶问题得到原问题的解。并且根据KKT条件中的互补松弛性,最优的
(
w
,
b
,
α
∗
)
(\boldsymbol w,b,\boldsymbol\alpha^*)
(w,b,α∗)满足
α
i
∗
(
1
−
y
i
(
w
T
x
i
+
b
∗
)
)
=
0
\alpha_i^*(1-y_i(\boldsymbol w^{\mathrm T}\boldsymbol x_i+b^*))=0
αi∗(1−yi(wTxi+b∗))=0。
思考:试通过参数量与数据集大小的关系、参数更新方式等视角,分析和体会SVM模型的原问题对应参数化模型,而对偶问题对应非参数化模型。
(1)原问题:
原问题是指SVM的原始优化问题,它直接处理数据点和模型参数。SVM的原问题涉及一个带有约束的优化问题,即在满足所有数据点到分隔超平面距离至少为某个固定值(即间隔)的条件下,最大化这个间隔。
在数学上,原问题可以表示为关于支持向量和模型参数(例如,权重向量和偏置项)的问题。如果数据集很大,那么相应的参数也会很多,因此,从这个角度看,原问题似乎是一个参数化模型。然而,由于解仅由一小部分称为支持向量的数据点决定,所以实际上并不需要存储整个数据集。
(2)对偶问题:
通过引入拉格朗日乘子将原问题的约束优化转换为无约束优化问题,我们得到了所谓的对偶问题。在这个过程中,数据点以拉格朗日乘子的形式出现,并且最终决策函数仅依赖于数据点之间的内积,而不是数据点的显式表示。这意味着在对偶形式下,我们不需要直接处理原始数据点,而是关注数据点之间的关系。
从参数更新方式来看,对偶问题通常只涉及拉格朗日乘子(alpha),而与原始问题中的参数(如权重和偏置)无关。这使得对偶问题看起来更像一个非参数化模型,因为它没有直接使用原始参数空间的大小作为其复杂性的度量。此外,对偶问题通常具有更少的变量(拉格朗日乘子的数量等于数据点的数量),这使得求解过程更加高效,尤其是在处理大规模数据集时。
附:以上文中的数据集及相关资源下载地址:
链接:https://pan.quark.cn/s/1ce6354d6788
提取码:gHSD
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)