【机器学习-监督学习】支持向量机

news2024/9/20 3:03:36

在这里插入图片描述

【作者主页】Francek Chen
【专栏介绍】 ⌈ ⌈ Python机器学习 ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,依赖于强大的开源库如Scikit-learn、TensorFlow和PyTorch。本专栏介绍机器学习的相关算法以及基于Python的算法实现。
【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/Python_machine_learning。

文章目录

    • 一、支持向量机的数学描述
    • 二、序列最小优化
    • 三、动手实现SMO求解SVM
    • 四、核函数
    • 五、Sklearn中的SVM工具
    • 六、拓展:SVM对偶问题的推导


  本文我们介绍非参数化模型。与参数化模型不同,非参数化模型对数据分布不做先验的假设,从而能够更灵活地适配到不同的数据分布上。但另一方面,灵活性也使其对数据更为敏感,容易出现过拟合现象。本文主要介绍一个经典的非参数化模型:支持向量机(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 xiRn 是输入向量, 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)的最小值最大的平面。

在这里插入图片描述

图1 用直线分隔带噪声的点集

一、支持向量机的数学描述

  我们首先来考虑如何计算样本点与平面的间隔。如图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 wRn b ∈ R b \in \mathbb R bR 为支持向量机的参数, 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γiww)+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+γiww)+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γiyiww)+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=wyi(wTxi+b)=yi(wwTx+wb)

在这里插入图片描述

图2 二维空间下的分类决策边界和几何间隔

  对上式来说,当 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,bmaxwγ^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,bmaxw1s.t.yi(wTxi+b)1,i=1,,m 然而,优化目标 1 ∥ w ∥ \begin{aligned}\frac{1}{\lVert\boldsymbol w\lVert}\end{aligned} w1是非凸的,其求解较为困难。考虑到函数 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,bmin21w2s.t.yi(wTxi+b)1,i=1,,m 由于 ∥ w ∥ ≥ 0 \lVert\boldsymbol w\lVert \ge 0 w0,其二次函数在定义域内是单调递增的,并且为凸函数。其中,系数选择 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,ξimin21w2+Ci=1mξis.t.yi(wTxi+b)1ξi  ξi0,  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=1mαi21i=1mj=1mαiαjyiyjxiTxj)s.t.0αiC,i=1,,mi=1mα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=1mαiyixib=21(i,yi=1maxwTxi+i,yi=1minwTxi) 并且,这组最优参数 ( 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(1yi(wTxi+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 wTx+b=0 的函数间隔 y i ( w ∗ T x i + b ) = 1 = γ ^ y_i(\boldsymbol w^{*\mathrm T}\boldsymbol x_i+b)=1=\hat\gamma yi(wTxi+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(wTxi+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^* wTx+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^* wTx+b=(i=1mαiyixi)Tx+b=i=1,xiSmαiyixiTx+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=1m=αiyi=0,我们每次选取两个不同的参数 α i \alpha_i αi α j \alpha_j αj,而固定其他的参数,只优化这两个参数从而保证等式约束一直成立。完成后,再选取另两个参数,固定其他个 m − 2 m-2 m2 参数,进行优化。如此反复迭代,直到目标函数的值收敛位置。无论目标是需要被最大化还是最小化,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+α221α1y1x1+α2y2x22(α1y1x1+α2y2x2)T(i=3mαiyixi)+A0)C=i=3mα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+α221(K11α12+K22α22)y1y2K12α1α2y1α1i=3mαiyiK1iy2α2i=3mα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=3mα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)=(1y1y2)α121K11α1221K22(ζy1α1)y1K12(ζy1α1)α1y1α1i=3myiαiK1i+y1α1i=3myiαiK2i+A1=21(K11+K222K12)α12+[y1y2+(K22K12)ζ+i=3myiαi(K2iK1i)]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+K222K12)=21(x1Tx1+x2Tx22x1Tx2)=21x1x220

  如果数据集中没有相同的样本,那么严格有 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<002pqC2pq>C 其对应的大致图像如图3所示。

在这里插入图片描述

图3 SMO最优解示意图

  解出 α 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 0y1y2α1+ζy2C 这一条件对 α 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=1myiα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=1myiαiK1i+b,g(x2)=i=1myiα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=[y1y2+(K22K12)ζ+i=3myiαi(K2iK1i)]y1=[y1y2+(K22K12)(y1α1+y2α2)+(g(x2)y1α1K12y2α2K22b)(g(x1)y1α1K11y2α2K12b)]y1=(K11+K222K12)α1+[g(x2)y2g(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+K222K12[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α1K11+y2α2K12+i=3myiαiK1i+b1=y1(α1α1)K11+y2(α2α2)K12b+b1+g(x1)=bg(x1)+y1y1(α1α1)K11y2(α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=bg(x2)+y2y2(α2α2)K22y1(α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):RnRN。将线性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=1mαi21i=1mj=1myiyjα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^=wTϕ(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=αiyiϕ(xi)。但是,我们可以直接利用核函数计算 w ∗ T ϕ ( x ) \boldsymbol w^{*\mathrm T} \phi(\boldsymbol x) wTϕ(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) wTϕ(x)=i=1,xiSmαiyiϕ(xi)Tϕ(x)=i=1,xiSmαiyiK(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=1maxwTϕ(xi)+i,yi=1maxwTϕ(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)=e2σ2xy2,又称径向基函数(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)=xyxTy,该函数计算的是向量 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=1kαigi(w)+i=1lβihi(w),αi0 其中 α \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)=α,β;αi0maxL(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 αi0,知 α 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α,β;αi0maxL(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) α,β;αi0maxθD(α,β)=α,β;αi0maxwminL(w,α,β) 记其最优值为 d ∗ = max ⁡ α , β ; α i ≥ 0 θ D ( α , β ) d^*=\max\limits_{\boldsymbol\alpha,\boldsymbol\beta;\alpha_i\ge0}\theta_{\mathcal D}(\boldsymbol\alpha,\boldsymbol\beta) d=α,β;αi0maxθ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) α,β;αi0maxθ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 αi0
  • 互补松弛性: α i ∗ g i ( w ∗ ) = 0 \alpha_i^*g_i(w^*)=0 αigi(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 αigi(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,bmin21w2s.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)+10,得到其拉格朗日函数为 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,α)=21w2i=1mα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,α)=wi=1mαiyixi=i=1mαiyixi=bL(w,b,α)=i=1mα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=1mαiyixi 2i=1m(αiyij=1mαjyjxjTxi)(i=1mαiyi)2+i=1mαi=i=1mαi21i=1mj=1mα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.αi0,i=1,,mi=1mα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αiC,i=1,,mi=1mα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(1yi(wTxi+b))=0

思考:试通过参数量与数据集大小的关系、参数更新方式等视角,分析和体会SVM模型的原问题对应参数化模型,而对偶问题对应非参数化模型。

(1)原问题:

  原问题是指SVM的原始优化问题,它直接处理数据点和模型参数。SVM的原问题涉及一个带有约束的优化问题,即在满足所有数据点到分隔超平面距离至少为某个固定值(即间隔)的条件下,最大化这个间隔。
  在数学上,原问题可以表示为关于支持向量和模型参数(例如,权重向量和偏置项)的问题。如果数据集很大,那么相应的参数也会很多,因此,从这个角度看,原问题似乎是一个参数化模型。然而,由于解仅由一小部分称为支持向量的数据点决定,所以实际上并不需要存储整个数据集。

(2)对偶问题:

  通过引入拉格朗日乘子将原问题的约束优化转换为无约束优化问题,我们得到了所谓的对偶问题。在这个过程中,数据点以拉格朗日乘子的形式出现,并且最终决策函数仅依赖于数据点之间的内积,而不是数据点的显式表示。这意味着在对偶形式下,我们不需要直接处理原始数据点,而是关注数据点之间的关系。
  从参数更新方式来看,对偶问题通常只涉及拉格朗日乘子(alpha),而与原始问题中的参数(如权重和偏置)无关。这使得对偶问题看起来更像一个非参数化模型,因为它没有直接使用原始参数空间的大小作为其复杂性的度量。此外,对偶问题通常具有更少的变量(拉格朗日乘子的数量等于数据点的数量),这使得求解过程更加高效,尤其是在处理大规模数据集时。

:以上文中的数据集及相关资源下载地址:
链接:https://pan.quark.cn/s/1ce6354d6788
提取码:gHSD

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:Bash中的命令介绍(简单命令、管道以及命令列表)

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 在Bash中&#xff0c;命令执行的方式可以分为简单命令、管道和命令列表组成。这些结构提供了强大的工具&#xff0c;允许用户组合命令并精确控制其执行方式。以下是对这…

分享一个基于文本挖掘的微博舆情分析系统Python网络舆情监控系统Flask爬虫项目大数据(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

Comsol TPMS_Diamond多孔构型吸声性能仿真

TPMS_Diamond多孔构型是一种新型的吸声材料结构&#xff0c;它采用了三维打印技术制备而成。该构型的设计灵感来自于结晶体的晶格结构&#xff0c;通过将正方形的单元堆积并沿着特定方向旋转&#xff0c;形成了一种类似于钻石的多孔结构。 TPMS_Diamond多孔构型具有以下特点&a…

systemback制作Ubuntu自己的系统镜像

systemback制作Ubuntu自己的系统镜像 目录1.安装、制作2.解决镜像大于4GB的问题3.写入镜像到U盘&#xff14;.安装 目录 systemback制作Ubuntu自己的系统镜像 最近需要备份自己的系统&#xff0c;同时制作安装镜像在另一台笔记本上安装&#xff0c;这里找到了一款很不错的软件…

excel表格输入数据生成函数曲线图

1.新建一个excel表格&#xff0c;横向或者纵向输入x轴点的数据 下图以横向数据为例子&#xff0c;两个y轴数据&#xff0c;生成两个函数曲线 2.右键选中上面输入的数据&#xff0c;点击插入&#xff0c;选择你要构造的函数样式 3.选中带平滑散点图即可生成前面数据生成的函数 …

内存管理篇-06Per-CPU页帧缓存

per-CPU缓存是对伙伴系统的完善&#xff0c;也是伙伴系统中的一部分。再回顾一下zone结构体的内容&#xff0c;这里的__percpu *pageset实际上就是Per-CPU的实现机制&#xff0c;所以这里的内存实际上最少有三部分&#xff0c;&#xff08;1&#xff09;free_area管理了大部分的…

数学建模之Matlab快速入门--全

前言&#xff1a; 本文是之前学Matlab时候做的笔记&#xff0c;很适合快速入门数学建模中matlab和python是最常用的两个软件&#xff0c;现在本人更喜欢python去做数学建模 文章目录 界面介绍与操作快捷操作 数据类型数值型整型浮点型复型逻辑型字符型struct数组cell数组函数句…

区块链国赛第六套样题(关于运维)

任务1-2&#xff1a;区块链系统部署与运维 围绕食品安全溯源区块链平台部署与运维需求&#xff0c;进行项目相关系统、节点以及管理工具的部署工作。通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范&#xff0c;完成系统日志、网络参数、节点服务等系统结构的维…

Jetson安装Archiconda3全过程

1. 下载Archiconda3 下载网址&#xff1a; 发布 Archiconda/build-tools --- Releases Archiconda/build-tools (github.com)​​​​​​ 2. 执行命令 bash ./Archiconda3-0.2.2-Linux-aarch64.sh 3. conda换源 conda config --add channels https://mirrors.tuna.tsing…

计算机网络-PIM-SM组播实验

一、概述 目前为止我们学习了组播转发网络中的PIM协议&#xff0c;PIM模型有两种&#xff1a; PIM-DM主要使用在网络规模较小&#xff0c;用户集中的组播网络中。 PIM-SM主要使用在网络规模较大&#xff0c;用户较为分散的组播网络中。PIM-SM基于组播模型又可以分为PIM-SM&…

5.Lab four —— Trap

首先切换traps分支 git checkout traps make clean RISC-V assembly 代码&#xff1a; #include "kernel/param.h" #include "kernel/types.h" #include "kernel/stat.h" #include "user/user.h"int g(int x) {return x3; }int f(…

AI预测体彩排3采取888=3策略+和值012路或胆码测试8月24日升级新模型预测第61弹

经过近60多期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;已到达90%的命中率&#xff0c;这给喜欢打私菜的朋友提供了极高价值的预测结果~当然了&#xff0c;大…

Linux——驱动——自动设备

自动创建设备节点是Linux设备驱动开发中的一个重要环节&#xff0c;它允许设备驱动程序在内核中注册后&#xff0c;自动在/dev目录下创建对应的设备文件&#xff0c;从而使得用户空间程序可以通过标准的文件操作接口&#xff08;如open、read、write等&#xff09;与硬件设备进…

Level3 — PART 4 机器学习算法 — 朴素贝叶斯

目录 贝叶斯定理 朴素贝叶斯模型&#xff08;Naive Bayes Model&#xff09; 估计 离散估计 极大似然估计 案例 朴素贝叶斯扩展 高斯贝叶斯分类器 原理 应用 源码分析 伯努利贝叶斯分类器 原理 源码分析 多项朴素贝叶斯分类器 半朴素贝叶斯分类器 模拟题 CDA…

Linux系统之jobs命令的基本使用

Linux系统之jobs命令的基本使用 一、jobs命令介绍二、jobs命令的使用帮助2.1 jobs命令的help帮助信息2.2 jobs命令的语法解释 三、jobs命令的基本使用3.1 运行一个后台任务3.2 列出后台所有的作业3.3 列出进程ID3.4 只列出进程ID3.5 终止后台任务3.6 只显示运行任务3.7 只显示停…

tcp 网络通信及抓包工具的使用

tcp网络通信 本地回环&#xff08;Loopback&#xff09;的概念 本地回环地址是一个特殊的IP地址&#xff0c;用于指向计算机本身的网络接口。在IPv4中&#xff0c;最常见的本地回环地址是127.0.0.1&#xff0c;而在IPv6中则是::1。这个地址用于测试网络软件&#xff0c;确保网…

【IoT】路由器/linux系统,如何使用shell查看系统硬件配置,传感器CPU温度,资源占用率等信息(以红米AX6000为例)

【IoT】路由器/linux系统&#xff0c;如何使用shell查看硬件配置&#xff0c;传感器CPU温度&#xff0c;系统资源占用率等信息&#xff08;以红米AX6000为例&#xff09; 文章目录 1、路由器拆机与测评&#xff08;Redmi AX6000&#xff09;2、通过telnet获得SSH3、linux系统信…

SpringBoot集成kafka接收消息

SpringBoot集成kafka接收消息 1、SpringBoot集成kafka接收消息2、Payload注解接收消息体内容3、Header注解接收消息头内容4、接收消息所有内容 1、SpringBoot集成kafka接收消息 生产者 package com.power.producer;import org.springframework.kafka.core.KafkaTemplate; imp…

【自动化】考试答题自动化完成答案,如何实现100%正确呢

一、科目仿真考试不能自动答题 我的答案是可以的&#xff0c;电脑程序可以模拟人的操作完成所有的答题并提交结束考试 二、分析页面内容 完成一个题目&#xff0c;包括判断题&#xff0c;对与错2选1答案&#xff0c;单选题ABCD4选1答案&#xff0c;多选题大家想一想 F12查看按…

基于机器学习的糖尿病数据分析与风险评估系统

B站视频及代码下载&#xff1a;基于机器学习的糖尿病数据分析与风险评估系统_哔哩哔哩_bilibili 1. 项目简介 糖尿病&#xff0c;作为一种在全球范围内广泛流行的慢性疾病&#xff0c;已经影响了数以百万计的人们的生活&#xff0c;给全球公共健康带来了严重的挑战。因此&#…