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

在这里插入图片描述

【作者主页】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, trangedata = 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) # 防止除以0zeta = alpha[i] * y[i] + alpha[j] * y[j]# 将alpha_i和对应的alpha_j保持在[0,C]区间# 0 <= (zeta - y_j * alpha_j) / y_i <= Cif 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_jreturn 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) ** dreturn 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*xdef wx(x_new):s = 0for 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] = -1Y[Y >= 0] = 1Y = 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.rhkb.cn/news/408320.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缓存学习

缓存基本概念 概念 对于缓存&#xff0c;最普遍的理解是能让打开某些页面速度更快的工具。从技术角度来看&#xff0c;其本质上是因为缓存是基于内存建立的&#xff0c;而内存的读写速度相比之于硬盘快了xx倍&#xff0c;因此用内存来代替硬盘作为读写的介质当然能大大提高访…

WIFI驱动开发

Linux 4.9 内核驱动移植 Linux 4.9 BSP 内核驱动 下载驱动后获得驱动的 tar.gz 压缩包 解压后找到如下驱动与文件夹 进入内核&#xff0c;找到 linux-4.9/drivers/net/wireless 文件夹中&#xff0c;新建文件夹aic8800 并且把上面的驱动与文件夹放入刚刚创建好的 aic8800 中。…

【笔记篇】Davinci Configurator SomeIpXf模块

目录 1 简介1.1 架构概览2 功能描述2.1 特性2.2 初始化2.3 状态机2.4 主函数2.5 故障处理3 集成4 API描述5 配置1 简介 本文主要描述了AUTOSAR SomeIpXf模块的功能。 SomeIpXf主要用途是对数据进行SOME/IP格式的序列化和反序列化。 1.1 架构概览 SomeIpXf在AUTOSAR软件架构…

【python】OpenCV—Single Human Pose Estimation

文章目录 1、Human Pose Estimation2、模型介绍3、基于图片的单人人体关键点检测4、基于视频的单人人体关键点检测5、左右校正6、关键点平滑7、涉及到的库函数scipy.signal.savgol_filter 8、参考 1、Human Pose Estimation Human Pose Estimation&#xff0c;即人体姿态估计&…

sqli-labsSQL手工注入第26-30关

第26关 一.查询数据库 http://127.0.0.1/Less-26/?id11%27%26extractvalue(1,concat(%27~%27,database(),%27~%27))%261%27 二.查表 http://127.0.0.1/Less-26/?id1%27||(updatexml(1,concat(1,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(…

2月公开赛Web-ssrfme

考点&#xff1a; redis未授权访问 源码&#xff1a; <?php highlight_file(__file__); function curl($url){ $ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);echo curl_exec($ch);curl_close($ch); }if(isset($_GET[url…

qt的model view 使用示范

首先在ui界面拖一个tableView ui->tableView->setModel(mission_model); 然后设置model的qss&#xff0c;并用view绑定model void SettingWidget::init_missionmodel(QString plane_type, QString mission_name) {if(mission_model)delete mission_model;mission_model…

论文导读 | 大语言模型中应用到的强化学习算法

摘要 在最近取得广泛关注的大规模语言模型&#xff08;LLM&#xff09;应用强化学习&#xff08;RL&#xff09;进行与人类行为的对齐&#xff0c;进而可以充分理解和回答人的指令&#xff0c;这一结果展现了强化学习在大规模NLP的丰富应用前景。本文介绍了LLM中应用到的RL技术…

【GH】【EXCEL】P6: Shapes

文章目录 componentslinepicture components line picture Picture A Picture object Input parameters: Worksheet (Generic Data) A Worksheet, Workbook, Range Object, Excel Application, or Text Worksheet NameName (Text) An optional object nameLocation (Point) A p…

Eclipse SVN 插件在线下载地址

Eclipse SVN 插件 Subversive 在线安装 1、选择help下的install new software 2、点击 add 3、Name随便写&#xff0c;Location输入&#xff1a; https://download.eclipse.org/technology/subversive/4.8/release/latest/ 点击Add 4、然后一直下一步&#xff0c;Finish&am…

Vue的计算属性:methods方法、computed计算属性、watch监听属性

1、methods 方法 在创建的 Vue 应用程序实例中&#xff0c;可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法&#xff0c;因此可以像访问 data 数据那样来调用方法。 【实例】在 Vue 应用程序中&#xff0c;使用 methods 选项定义获取用户信…

鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙中巧夺天工

gn是什么? gn 存在的意义是为了生成 ninja,如果熟悉前端开发,二者关系很像 Sass和CSS的关系. 为什么会有gn,说是有个叫even的谷歌负责构建系统的工程师在使用传统的makefile构建chrome时觉得太麻烦,不高效,所以设计了一套更简单,更高效新的构建工具gnninja,然后就被广泛的使用…

《机器学习》—— 通过下采样方法实现逻辑回归分类问题

文章目录 一、什么是下采样方法&#xff1f;二、通过下采样方法实现逻辑回归分类问题三、下采样的优缺点 一、什么是下采样方法&#xff1f; 机器学习中的下采样&#xff08;Undersampling&#xff09;方法是一种处理不平衡数据集的有效手段&#xff0c;特别是在数据集中某些类…

【每日一题】【区间合并】【贪心 模拟】多米诺骨牌 牛客小白月赛99 E题 C++

牛客小白月赛99 E题 多米诺骨牌 题目背景 牛客小白月赛99 题目描述 样例 #1 样例输入 #1 3 6 1 1 1 1 3 2 1 4 3 2 7 9 11 6 2 1 1 1 3 2 1 4 3 2 7 9 11 5 4 1 4 1 1 2 1 2 3 6 8样例输出 #1 3 6 5做题思路 按照玩多米诺骨牌的方式。 先将多米诺骨牌按照骨牌位置从小…

Python二级知识点

在阅读之前&#xff0c;感谢大家的关注和点赞。祝你们都能心想事成、健健康康。 一.数据流程图 一般这道题是经常考的&#xff0c;有向箭头--->表示数据流。圆圈○表示加工处理。 二.字典如何比较大小 字典类型是如何比较大小的呢&#xff0c;是使用字典的键来比较大小&…

redis | Django小项目之Mysql数据库和Redis缓存的应用

Django小项目 需求整体架构图技术细节环境配置各文件配置settings.pyurls.pyviews.pyuser_update.html 结果相关代码补充r.hgetall(cacahe_key)new_data {k.decode():v.decode() for k,v in data.items()} 需求 整体架构图 技术细节 环境配置 django-admin startprojrct rmysi…

zdppy+vue3+onlyoffice文档管理系统实战 20240823上课笔记 zdppy_cache框架的低代码实现

遗留问题 1、封装API2、有账号密码3、查询所有有效的具体数据&#xff0c;也就是缓存的所有字段 封装查询所有有效具体数据的方法 基本封装 def get_all(self, is_activeTrue, limit100000):"""遍历数据库中所有的key&#xff0c;默认查询所有没过期的:para…

深度学习一(Datawhale X 李宏毅苹果书 AI夏令营)

一&#xff0c;机器学习基础 机器学习&#xff08;Machine Learning, ML&#xff09;是让机器具备学习能力的过程&#xff0c;其核心在于使机器能够自动寻找并应用复杂的函数&#xff0c;以解决各种任务如语音识别、图像识别和策略决策&#xff08;如AlphaGo&#xff09;。这些…

顺序表的顺序表示—动态分配

顺序表的顺序表示—动态分配 代码实现 #include <stdio.h> #include <stdlib.h> #define InitSize 15 // 初始化扩容长度typedef struct{int *data; // 动态分配数组的指针int MaxSize;int length; // 当前长度 }SeqList;void InitList(SeqList &L){// 申请一…

得峰(Deffad)A17G本本 - 安装debian12

文章目录 得峰(Deffad)A17G本本 - 安装debian12概述笔记电源插头设置硬件参数修复win10预装的软件列表做debain12的安装U盘从U盘启动引导用U盘装debian12通过U盘安装debian12到本本原有硬盘上成功配置debian12备注备注END 得峰(Deffad)A17G本本 - 安装debian12 概述 和同学讨…