机器学习之-支持向量机SVM原理

支持向量机原理(超详细) 支持向量机(SVM)是机器学习算法之一,是二分类算法。给定一组训练样本集,如图,样本数据集是二维的,分散在平面上,需要找到一条直线将数据集分割开。可以分开的直线有很多,我们要找到其中泛化能力最好,鲁棒性最强的直线。这是在平面上的点,如果是在三维空间中,则需要找到一个平面;如果是超过三维以上的维数,则需要找到一个超平面。 超平面的表达式为: 原理举例:wT取(w1,w2),x取(x1,x2)T, 则原式得 w1x1+w2x2+b=0 与传统直线 Ax+By+c=0 方程式 相同,由二维三维空间推到 阅读详情
支持向量机

支持向量机(support vector machine,简称SVM)是一种二分类模型,它的基本模型是在特征空间上的间隔最大化的线性分类器,其学习模型的策略是间隔最大化,可转化为一个求解凸二次规划的最优化问题。训练后的线性分类器模型不仅保证了每个实例的预测类别准确性,而且还提高了每个实例的预测类别的置信度,从而增强了分类器模型的泛化能力。

支持向量机支持的由简至繁的模型:

  1. 线性可分支持向量机:当训练数据线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机。
  2. 线性支持向量机:当大部分训练数据线性可分,只有极少数数据不可分时,可通过软间隔最大化,学习一个线性分类器,即线性支持向量机。
  3. 非线性支持向量机:当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习一个非线性支持向量机。
一、线性可分支持向量机

给定一个特征空间上的训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\left\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\right\} T={(x1​,y1​),(x2​,y2​),...,(xN​,yN​)}其中, x i ∈ X = R n , y i ∈ Y = { + 1 , − 1 } , i = 1 , 2 , . . . , N , x i x_i\in \mathcal {X}=R^n,y_i \in \mathcal {Y}=\left\{+1,-1\right\},i=1,2,...,N,x_i xi​∈X=Rn,yi​∈Y={+1,−1},i=1,2,...,N,xi​为第 i i i个实例, y i y_i yi​为 x i x_i xi​的类标记,当 y i = + 1 y_i=+1 yi​=+1时, x i x_i xi​为正例;当 y i = − 1 y_i=-1 yi​=−1时, x i x_i xi​为负例。假设训练数据集是线性可分的。学习的目标是在特征空间中找到一个分离超平面,能将所有实例划分到正确的类别中。分离的超平面模型是 w x + b = 0 wx+b=0 wx+b=0,模型参数是法向量 w w w和截距 b b b。分离超平面将特征空间划分为两类,一个是正类,另一个是负类。

然而,当训练数据集线性可分时,存在无穷个分类超平面可将两类数据正确分开。虽然这些分类器保证了实例的正确分类,但是每个模型的泛化能力是有所差异的。为了保证实例以最大可能性的置信度进行预测分类,线性可分支持向量机利用间隔最大化来求解最优分离超平面。这个最优超平面是唯一的。

那么,问题来了,怎么确定这个最优超平面呢?

一般来说,一个点距离分离超平面越远,则表明这个分类预测准确度越大。在超平面 w x + b = 0 wx+b=0 wx+b=0确定的情况下, ∣ w x + b ∣ |wx+b| ∣wx+b∣表示这个点 x x x距离超平面的远近,而 w x + b wx+b wx+b的符号与类标记 y y y的符号是否一致能表示分类是否正确。所以可用 y ( w x + b ) y(wx+b) y(wx+b)来表示分类的正确性及确定度,这就是函数间隔。实例 x i x_i xi​距离超平面的函数间隔可用 y i ( w x i + b ) y_i(wx_i+b) yi​(wxi​+b)来表示。但是当成比例的改变 w , b w,b w,b,超平面没有发生改变,但函数间隔也成比例的改变。因此,需要做规范化处理,即除以法向量 w w w的模: y i ( w x i + b ) ∣ ∣ w ∣ ∣ \frac{y_i(wx_i+b)}{||w||} ∣∣w∣∣yi​(wxi​+b)​,这就是几何间隔。通过几何间隔度量实例到超平面的距离以及分类正确性。

1.1 间隔最大化

支持向量机学习的基本思想是求解能够正确划分数据集并且几何间隔最大的分离超平面。此时,发现有两个临界面 w T x + b = 1 w^Tx+b=1 wTx+b=1和 w T x + b = − 1 w^Tx+b=-1 wTx+b=−1。 w T x + b = 1 w^Tx+b=1 wTx+b=1是类标记为1的临界面。当类别为1的实例,其满足 w T x i + b ≥ 1 w^Tx_i+b\ge 1 wTxi​+b≥1,而类别为-1的实例,其满足 w T x i + b ≤ − 1 w^Tx_i+b\leq -1 wTxi​+b≤−1,因此,实例是否正确分类可依据 y i ( w T x i + b ) ≥ 1 y_i(w^Tx_i+b)\ge 1 yi​(wTxi​+b)≥1这个条件来判定。为了使得分类置信度最大,需要保证两个临界面之间的距离尽可能的远,事实上相当于类别临界点到分离超平面的二倍几何间隔关系,即满足 2 ∣ ∣ w ∣ ∣ \frac{2}{||w||} ∣∣w∣∣2​最大化。其等价于 m i n 1 2 ∣ ∣ w ∣ ∣ 2 min \frac{1}{2}||w||^2 min21​∣∣w∣∣2,将其转化为一个凸二次规划的最优化问题: min ⁡ w , b 1 2 ∣ ∣ w ∣ ∣ 2 \min_{w,b} \frac{1}{2}||w||^2 w,bmin​21​∣∣w∣∣2 s . t . y i ( w x i + b ) ≥ 1 , i = 1 , 2 , . . . , N s.t. \quad y_i(wx_i+b)\ge 1,\quad i=1,2,...,N s.t.yi​(wxi​+b)≥1,i=1,2,...,N

1.2 支持向量

在线性可分情况下,训练数据集的样本点中距离分离超平面最近的样本点实例称为支持向量,其满足 y i ( w x i + b ) = 1 y_i(wx_i+b)=1 yi​(wxi​+b)=1和对应的拉格朗日乘子 α i > 0 \alpha_i>0 αi​>0,即临界面上的实例点。

在训练分离超平面模型时,只有支持向量起作用,相对的,其他实例点并不起作用。当改变支持向量时,相应的分离超平面也将发生改变;如果改变除了支持向量的其他实例点,分离超平面不会发生改变。因此,支持向量决定了分离超平面,这种模型被称为支持向量机。支持向量个数一般很少,所以,支持向量机由很少的“重要的”训练样本确定。

1.3 对偶算法

为了求解线性可分支持向量机的最优化问题,将它作为原始最优化问题,应用拉格朗日对偶性,通过求解对偶问题得到原始问题的最优解,这就是线性可分支持向量机的对偶算法。优点是对偶问题通常更容易求解,而且还可以引入核函数,进而推广到非线性分类问题。(具体算法可参阅统计学习方法附录C)
通过拉格朗日函数将一个约束的凸优化问题转化为非约束的优化问题,为此,为每一个实例的不等式约束引入拉格朗日乘子 α i ≥ 0 , i = 1 , 2 , . . . , N \alpha_i\ge 0,i=1,2,...,N αi​≥0,i=1,2,...,N,拉格朗日函数如下: L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 N α i y i ( w x i + b ) + ∑ i = 1 N α i L(w,b,\alpha)=\frac{1}{2}||w||^2-\sum_{i=1}^N\alpha_iy_i(wx_i+b)+\sum_{i=1}^N\alpha_i L(w,b,α)=21​∣∣w∣∣2−i=1∑N​αi​yi​(wxi​+b)+i=1∑N​αi​其中, α = ( α 1 , α 2 , . . . , α N ) T \alpha=(\alpha_1,\alpha_2,...,\alpha_N)^T α=(α1​,α2​,...,αN​)T为拉格朗日向量。那么,将原始问题的最优解 w , b w,b w,b转化为拉格朗日函数的极小极大问题,即

min ⁡ w , b max ⁡ α L ( w , b , α ) \min_{w,b}\max_{\alpha}L(w,b,\alpha) w,bmin​αmax​L(w,b,α)根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题: max ⁡ α min ⁡ w , b L ( w , b , α ) \max_{\alpha}\min_{w,b}L(w,b,\alpha) αmax​w,bmin​L(w,b,α)为了得到对偶问题的解,需要先求 L ( w , b , α ) L(w,b,\alpha) L(w,b,α)对 w , b w,b w,b的极小,再求对 α \alpha α的极大。

  • min ⁡ w , b L ( w , b , α ) \min_{w,b}L(w,b,\alpha) minw,b​L(w,b,α)
    将拉格朗日函数 L ( w , b , α ) L(w,b,\alpha) L(w,b,α)分别对 w , b w,b w,b求偏导数并令其为0。 ∂ L ( w , b , α ) w = w − ∑ i = 1 N α i y i x i = 0 ⟹ w = ∑ i = 1 N α i y i x i \frac{\partial L(w,b,\alpha)}{w}=w-\sum_{i=1}^N\alpha_iy_ix_i=0 \Longrightarrow w=\sum_{i=1}^N\alpha_iy_ix_i w∂L(w,b,α)​=w−i=1∑N​αi​yi​xi​=0⟹w=i=1∑N​αi​yi​xi​ ∂ L ( w , b , α ) b = − ∑ i = 1 N α i y i = 0 ⟹ ∑ i = 1 N α i y i = 0 \frac{\partial L(w,b,\alpha)}{b}=-\sum_{i=1}^N\alpha_iy_i=0 \Longrightarrow \sum_{i=1}^N\alpha_iy_i=0 b∂L(w,b,α)​=−i=1∑N​αi​yi​=0⟹i=1∑N​αi​yi​=0
    再将其代入拉格朗日函数中,得到以下函数: L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 N α i y i ( w . x i + b ) + ∑ i = 1 N α i = 1 2 ∣ ∣ w ∣ ∣ 2 − w ∑ i = 1 N α i y i x i − b ∑ i = 1 N α i y i + ∑ i = 1 N α i = − 1 2 ∣ ∣ w ∣ ∣ 2 + ∑ i = 1 N α i = − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ⟨ x i , x j ⟩ + ∑ i = 1 N α i \begin{aligned}L(w,b,\alpha) &=\frac{1}{2}||w||^2-\sum_{i=1}^N\alpha_iy_i(w.x_i+b)+\sum_{i=1}^N\alpha_i \\ &= \frac{1}{2}||w||^2-w\sum_{i=1}^N\alpha_iy_ix_i-b\sum_{i=1}^N\alpha_iy_i+\sum_{i=1}^N\alpha_i \\ &=-\frac{1}{2}||w||^2+\sum_{i=1}^N\alpha_i=-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j\left \langle x_i,x_j \right \rangle+\sum_{i=1}^N\alpha_i \end{aligned} L(w,b,α)​=21​∣∣w∣∣2−i=1∑N​αi​yi​(w.xi​+b)+i=1∑N​αi​=21​∣∣w∣∣2−wi=1∑N​αi​yi​xi​−bi=1∑N​αi​yi​+i=1∑N​αi​=−21​∣∣w∣∣2+i=1∑N​αi​=−21​i=1∑N​j=1∑N​αi​αj​yi​yj​⟨xi​,xj​⟩+i=1∑N​αi​​即 min ⁡ w , b L ( w , b , α ) = − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ⟨ x i , x j ⟩ + ∑ i = 1 N α i \min_{w,b}L(w,b,\alpha)=-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j\left \langle x_i,x_j \right \rangle+\sum_{i=1}^N\alpha_i w,bmin​L(w,b,α)=−21​i=1∑N​j=1∑N​αi​αj​yi​yj​⟨xi​,xj​⟩+i=1∑N​αi​
  • 求 min ⁡ w , b L ( w , b , α ) \min_{w,b}L(w,b,\alpha) minw,b​L(w,b,α)对 α \alpha α的极大,即对偶问题: max ⁡ α − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ⟨ x i , x j ⟩ + ∑ i = 1 N α i \max_{\alpha}-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j\left \langle x_i,x_j \right \rangle+\sum_{i=1}^N\alpha_i αmax​−21​i=1∑N​j=1∑N​αi​αj​yi​yj​⟨xi​,xj​⟩+i=1∑N​αi​ s . t . ∑ i = 1 N α i y i = 0 α i ≥ 0 , i = 1 , 2 , . . . , N s.t. \quad \sum_{i=1}^N\alpha_iy_i=0\\ \alpha_i \ge 0,i=1,2,...,N s.t.i=1∑N​αi​yi​=0αi​≥0,i=1,2,...,N等价于以下最优化问题: min ⁡ α 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ⟨ x i , x j ⟩ − ∑ i = 1 N α i \min_{\alpha}\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j\left \langle x_i,x_j \right \rangle-\sum_{i=1}^N\alpha_i αmin​21​i=1∑N​j=1∑N​αi​αj​yi​yj​⟨xi​,xj​⟩−i=1∑N​αi​ s . t . ∑ i = 1 N α i y i = 0 α i ≥ 0 , i = 1 , 2 , . . . , N s.t. \quad \sum_{i=1}^N\alpha_iy_i=0\\ \alpha_i \ge 0,i=1,2,...,N s.t.i=1∑N​αi​yi​=0αi​≥0,i=1,2,...,N
    对于线性可分训练数据集,对偶优化问题可利用SMO算法(可参考SMO博客)求解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*)^T α∗=(α1∗​,α2∗​,...,αN∗​)T,进而求解 w ∗ = ∑ i = 1 N α i ∗ y i x i w^*=\sum_{i=1}^N\alpha_i^*y_ix_i w∗=∑i=1N​αi∗​yi​xi​, b ∗ b^* b∗可通过选择一个非零的 α i > 0 \alpha_i>0 αi​>0,将其对应的 ( x i , y i ) (x_i,y_i) (xi​,yi​)代入到 y i ( w x i + b ) = 1 y_i(wx_i+b)=1 yi​(wxi​+b)=1求解 b ∗ = y i − ∑ j = 1 N α j ∗ y j ⟨ x i , x j ⟩ b^*=y_i-\sum_{j=1}^N\alpha_j^*y_j\left \langle x_i,x_j \right \rangle b∗=yi​−∑j=1N​αj∗​yj​⟨xi​,xj​⟩,最终得到分离超平面及分类决策函数。
    分离超平面: ∑ i = 1 N α i ∗ y i ⟨ x , x i ⟩ + b ∗ = 0 \sum_{i=1}^N\alpha_i^*y_i\left \langle x,x_i \right \rangle+b^*=0 i=1∑N​αi∗​yi​⟨x,xi​⟩+b∗=0
    分类决策函数: f ( x ) = s i g n ( ∑ i = 1 N α i ∗ y i ⟨ x , x i ⟩ + b ∗ ) f(x)=sign(\sum_{i=1}^N\alpha_i^*y_i\left \langle x,x_i \right \rangle+b^*) f(x)=sign(i=1∑N​αi∗​yi​⟨x,xi​⟩+b∗)
1.4 线性可分支持向量机学习算法

输入:线性可分训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\left\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\right\} T={(x1​,y1​),(x2​,y2​),...,(xN​,yN​)},其中, x i ∈ X = R n , y i ∈ Y = { + 1 , − 1 } , i = 1 , 2 , . . . , N x_i\in \mathcal {X}=R^n,y_i \in \mathcal {Y}=\left\{+1,-1\right\},i=1,2,...,N xi​∈X=Rn,yi​∈Y={+1,−1},i=1,2,...,N
输出:分离超平面和分类决策函数

  • 构造并求解约束最优化问题 min ⁡ α 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ⟨ x i , x j ⟩ − ∑ i = 1 N α i \min_{\alpha}\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j\left \langle x_i,x_j \right \rangle-\sum_{i=1}^N\alpha_i αmin​21​i=1∑N​j=1∑N​αi​αj​yi​yj​⟨xi​,xj​⟩−i=1∑N​αi​ s . t . ∑ i = 1 N α i y i = 0 s.t. \quad \sum_{i=1}^N\alpha_iy_i=0 s.t.i=1∑N​αi​yi​=0 α i ≥ 0 , i = 1 , 2 , . . . , N \alpha_i \ge 0,i=1,2,...,N αi​≥0,i=1,2,...,N求最优解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*)^T α∗=(α1∗​,α2∗​,...,αN∗​)T
  • 计算 w ∗ = ∑ i = 1 N α i ∗ y i x i w^*=\sum_{i=1}^N\alpha_i^*y_ix_i w∗=i=1∑N​αi∗​yi​xi​选择 α ∗ \alpha^* α∗的一个正分量 α j ∗ > 0 \alpha_j^*>0 αj∗​>0,计算 b ∗ = y j − ∑ i = 1 N α i ∗ y i ⟨ x i , x j ⟩ b^*=y_j-\sum_{i=1}^N\alpha_i^*y_i\left \langle x_i,x_j \right \rangle b∗=yj​−i=1∑N​αi∗​yi​⟨xi​,xj​⟩
  • 求分离超平面 ∑ i = 1 N α i ∗ y i ⟨ x , x i ⟩ + b ∗ = 0 \sum_{i=1}^N\alpha_i^*y_i\left \langle x,x_i \right \rangle+b^*=0 i=1∑N​αi∗​yi​⟨x,xi​⟩+b∗=0分类决策函数 f ( x ) = s i g n ( ∑ i = 1 N α i ∗ y i ⟨ x , x i ⟩ + b ∗ ) f(x)=sign(\sum_{i=1}^N\alpha_i^*y_i\left \langle x,x_i \right \rangle+b^*) f(x)=sign(i=1∑N​αi∗​yi​⟨x,xi​⟩+b∗)
    在线性可分支持向量机中, w ∗ w^* w∗和 b ∗ b^* b∗只依赖于训练数据对应的 α i ∗ > 0 \alpha_i^*>0 αi∗​>0的样本点 ( x i , y i ) (x_i,y_i) (xi​,yi​),而其他样本点对 w ∗ w^* w∗和 b ∗ b^* b∗没有影响。这些对应的 α i ∗ > 0 \alpha_i^*>0 αi∗​>0的样本点 ( x i , y i ) (x_i,y_i) (xi​,yi​)称为支持向量。

给定线性可分训练数据集,通过硬间隔最大化求解相应的凸二次规划问题学习得到的分离超平面为线性可分支持向量机。

二、线性支持向量机

对于理想情况下,训练数据集是线性可分的,但是在现实问题中的训练数据集存在少量的噪声点或者特异点,这些特殊点导致线性不可分。为了学习分类器模型,将硬间隔最大化的学习策略更改为软间隔最大化,使得分类器模型允许一些噪声点的干扰。为了解决不满足 y i ( w x i + b ) ≥ 1 y_i(wx_i+b)\ge 1 yi​(wxi​+b)≥1这个约束条件的样本点 ( x i , y i ) (x_i,y_i) (xi​,yi​),可以对每个样本点 ( x i , y i ) (x_i,y_i) (xi​,yi​)引入一个松弛变量 ξ i ≥ 0 \xi_i \ge 0 ξi​≥0,使函数间隔加上松弛变量大于等于1,即 y i ( w x i + b ) + ξ i ≥ 1 y_i(wx_i+b)+\xi_i\ge 1 yi​(wxi​+b)+ξi​≥1为了防止松弛变量过大,对松弛变量引入了惩罚参数C,目标函数变为: 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 N ξ i \frac{1}{2}||w||^2+C\sum_{i=1}^N\xi_i 21​∣∣w∣∣2+Ci=1∑N​ξi​ C > 0 C>0 C>0为惩罚参数,C值越大,表明对误分类的 ξ i \xi_i ξi​惩罚力度越大;C值越小,则对误分类的 ξ i \xi_i ξi​惩罚力度越小。最小化目标函数的含义是使 1 2 ∣ ∣ w ∣ ∣ 2 \frac{1}{2}||w||^2 21​∣∣w∣∣2最小化的同时还要保证误分类的个数和对应的松弛变量尽量小,C是调和这两者之间的系数。
软间隔最大化的凸优化问题: min ⁡ w , b , ξ 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 N ξ i \min_{w,b,\xi} \quad \frac{1}{2}||w||^2+C\sum_{i=1}^N\xi_i w,b,ξmin​21​∣∣w∣∣2+Ci=1∑N​ξi​ s . t . y i ( w x i + b ) + ξ i ≥ 1 , i = 1 , 2 , . . . , N s.t.\quad y_i(wx_i+b)+\xi_i\ge 1, i=1,2,...,N s.t.yi​(wxi​+b)+ξi​≥1,i=1,2,...,N ξ i ≥ 0 , i = 1 , 2 , . . . , N \xi_i \ge 0, \quad i=1,2,...,N ξi​≥0,i=1,2,...,N
原始问题的拉格朗日函数,即
L ( w , b , ξ , α , μ ) = 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 N ξ i − ∑ i = 1 N α i ( y i ( w x i + b ) − 1 + ξ i ) − ∑ i = 1 N μ i ξ i , α i ≥ 0 , μ i ≥ 0 L(w,b,\xi ,\alpha,\mu)=\frac{1}{2}||w||^2+C\sum_{i=1}^N\xi_i-\sum_{i=1}^N\alpha_i(y_i(wx_i+b)-1+\xi_i)-\sum_{i=1}^N\mu_i\xi_i,\quad \alpha_i\ge 0,\mu_i\ge 0 L(w,b,ξ,α,μ)=21​∣∣w∣∣2+Ci=1∑N​ξi​−i=1∑N​αi​(yi​(wxi​+b)−1+ξi​)−i=1∑N​μi​ξi​,αi​≥0,μi​≥0与线性可分支持向量机求解步骤相同,求 L ( w , b , ξ , α , μ ) L(w,b,\xi ,\alpha,\mu) L(w,b,ξ,α,μ)对 w , b , ξ w,b,\xi w,b,ξ的极小 ∂ L ( w , b , ξ , α , μ ) w = w − ∑ i = 1 N α i y i x i = 0 ⟹ w = ∑ i = 1 N α i y i x i ∂ L ( w , b , ξ , α , μ ) b = − ∑ i = 1 N α i y i = 0 ⟹ ∑ i = 1 N α i y i = 0 ∂ L ( w , b , ξ , α , μ ) ξ i = C − α i − μ i = 0 \begin{aligned} & \frac{\partial L(w,b,\xi,\alpha,\mu)}{w}=w-\sum_{i=1}^N\alpha_iy_ix_i=0 \Longrightarrow w=\sum_{i=1}^N\alpha_iy_ix_i \\ & \frac{\partial L(w,b,\xi,\alpha,\mu)}{b}=-\sum_{i=1}^N\alpha_iy_i=0 \Longrightarrow \sum_{i=1}^N\alpha_iy_i=0 \\ &\frac{\partial L(w,b,\xi,\alpha,\mu)}{\xi_i}=C-\alpha_i-\mu_i=0\end{aligned} ​w∂L(w,b,ξ,α,μ)​=w−i=1∑N​αi​yi​xi​=0⟹w=i=1∑N​αi​yi​xi​b∂L(w,b,ξ,α,μ)​=−i=1∑N​αi​yi​=0⟹i=1∑N​αi​yi​=0ξi​∂L(w,b,ξ,α,μ)​=C−αi​−μi​=0​将其代入到拉格朗日函数得到如下函数: min ⁡ w , b , ξ L ( w , b , ξ , α , μ ) = − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ⟨ x i , x j ⟩ + ∑ i = 1 N α i \min_{w,b,\xi}L(w,b,\xi,\alpha,\mu)=-\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j\left \langle x_i,x_j \right \rangle+\sum_{i=1}^N\alpha_i w,b,ξmin​L(w,b,ξ,α,μ)=−21​i=1∑N​j=1∑N​αi​αj​yi​yj​⟨xi​,xj​⟩+i=1∑N​αi​再对 min ⁡ w , b , ξ L ( w , b , ξ , α , μ ) \min_{w,b,\xi}L(w,b,\xi,\alpha,\mu) minw,b,ξ​L(w,b,ξ,α,μ)求 α \alpha α的极大,得到对偶问题: max ⁡ α − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ⟨ x i , x j ⟩ + ∑ i = 1 N α i \max_{\alpha} \quad -\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j\left \langle x_i,x_j \right \rangle+\sum_{i=1}^N\alpha_i αmax​−21​i=1∑N​j=1∑N​αi​αj​yi​yj​⟨xi​,xj​⟩+i=1∑N​αi​ s . t . ∑ i = 1 N α i y i = 0 s.t. \qquad \sum_{i=1}^N\alpha_iy_i=0 s.t.i=1∑N​αi​yi​=0 C − α i − μ i = 0 C-\alpha_i-\mu_i=0 C−αi​−μi​=0 α i ≥ 0 , i = 1 , 2 , . . . , N \alpha_i \ge 0,i=1,2,...,N αi​≥0,i=1,2,...,N μ i ≥ 0 , i = 1 , 2 , . . . , N \mu_i \ge 0,i=1,2,...,N μi​≥0,i=1,2,...,N

等价于 min ⁡ α 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ⟨ x i , x j ⟩ − ∑ i = 1 N α i \min_{\alpha} \quad \frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j\left \langle x_i,x_j \right \rangle-\sum_{i=1}^N\alpha_i αmin​21​i=1∑N​j=1∑N​αi​αj​yi​yj​⟨xi​,xj​⟩−i=1∑N​αi​ s . t . ∑ i = 1 N α i y i = 0 s.t. \qquad \sum_{i=1}^N\alpha_iy_i=0 s.t.i=1∑N​αi​yi​=0 0 ≤ α i ≤ C , i = 1 , 2 , . . . , N 0 \leq \alpha_i \leq C,i=1,2,...,N 0≤αi​≤C,i=1,2,...,N同理,对于满足KKT条件的对偶问题,通过SMO算法求解对偶问题的解,从而得到原始问题的解,最终确定分离超平面及分类决策函数。

2.1 线性支持向量机学习算法

输入:线性可分训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\left\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\right\} T={(x1​,y1​),(x2​,y2​),...,(xN​,yN​)},其中, x i ∈ X = R n , y i ∈ Y = { + 1 , − 1 } , i = 1 , 2 , . . . , N x_i\in \mathcal {X}=R^n,y_i \in \mathcal {Y}=\left\{+1,-1\right\},i=1,2,...,N xi​∈X=Rn,yi​∈Y={+1,−1},i=1,2,...,N
输出:分离超平面和分类决策函数

  • 选择惩罚参数C>0,构造并求解凸二次规划问题 min ⁡ α 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ⟨ x i , x j ⟩ − ∑ i = 1 N α i \min_{\alpha} \quad \frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_j\left \langle x_i,x_j \right \rangle-\sum_{i=1}^N\alpha_i αmin​21​i=1∑N​j=1∑N​αi​αj​yi​yj​⟨xi​,xj​⟩−i=1∑N​αi​ s . t . ∑ i = 1 N α i y i = 0 s.t. \qquad \sum_{i=1}^N\alpha_iy_i=0 s.t.i=1∑N​αi​yi​=0 0 ≤ α i ≤ C , i = 1 , 2 , . . . , N 0 \leq \alpha_i \leq C,i=1,2,...,N 0≤αi​≤C,i=1,2,...,N求最优解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*)^T α∗=(α1∗​,α2∗​,...,αN∗​)T
  • 计算 w ∗ = ∑ i = 1 N α i ∗ y i x i w^*=\sum_{i=1}^N\alpha_i^*y_ix_i w∗=i=1∑N​αi∗​yi​xi​选择 α ∗ \alpha^* α∗的一个正分量 0 &lt; α j ∗ &lt; C 0 &lt; \alpha_j^* &lt; C 0<αj∗​<C,计算 b ∗ = y j − ∑ i = 1 N α i ∗ y i ⟨ x i , x j ⟩ b^*=y_j-\sum_{i=1}^N\alpha_i^*y_i\left \langle x_i,x_j \right \rangle b∗=yj​−i=1∑N​αi∗​yi​⟨xi​,xj​⟩
  • 求分离超平面 ∑ i = 1 N α i ∗ y i ⟨ x , x i ⟩ + b ∗ = 0 \sum_{i=1}^N\alpha_i^*y_i\left \langle x,x_i \right \rangle+b^*=0 i=1∑N​αi∗​yi​⟨x,xi​⟩+b∗=0分类决策函数 f ( x ) = s i g n ( ∑ i = 1 N α i ∗ y i ⟨ x , x i ⟩ + b ∗ ) f(x)=sign(\sum_{i=1}^N\alpha_i^*y_i\left \langle x,x_i \right \rangle+b^*) f(x)=sign(i=1∑N​αi∗​yi​⟨x,xi​⟩+b∗)
2.2 支持向量

分离超平面由实线表示,间隔边界由虚线表示,正例点由“o”表示,负例点由“x”表示。实例 x i x_i xi​到间隔边界的距离为 ξ i ∣ ∣ w ∣ ∣ \frac{\xi_i}{||w||} ∣∣w∣∣ξi​​

软间隔的支持向量 x i x_i xi​可能在间隔边界上,或者在间隔边界与分离超平面之间,或者在分离超平面误分的一侧。若 α i &lt; C \alpha_i&lt;C αi​<C,则 ξ i = 0 \xi_i=0 ξi​=0,支持向量 x i x_i xi​在间隔边界上;若 α i = C , 0 &lt; ξ i &lt; 1 \alpha_i=C,0&lt;\xi_i&lt;1 αi​=C,0<ξi​<1,则分类正确, x i x_i xi​在间隔边界与分离超平面之间;若 α i = C , ξ i = 1 \alpha_i=C,\xi_i=1 αi​=C,ξi​=1,则 x i x_i xi​在分离超平面上;若 α i = C , ξ i &gt; 1 \alpha_i=C,\xi_i&gt;1 αi​=C,ξi​>1,则 x i x_i xi​在分离超平面误分的另一侧;

对于给定的线性不可分的训练数据集,通过软间隔最大化求解的凸二次规划问题,得到的分离超平面是线性支持向量机。

三、非线性支持向量机
3.1 核技巧

非线性分类问题一般无法直接用线性分类器来进行有效分类,只能利用非线性模型才能很好地进行分类。例如,如下图是样本的分布,在该空间内不存在一个线性分类器进行分类,但是存在一个超曲面可将正负例分类。

为了使用线性分类问题的解决方法,将该特征空间的实例映射到另一特征空间内,使得实例点线性可分,其采取的方法是进行一个非线性变化,把非线性问题变换为线性问题,再通过解决变换后的线性问题的方法求解原始的非线性问题。

用线性分类方法求解非线性分类问题分为两步:首先使用一个非线性变换将原始空间的数据映射到新的空间,然后,在新空间里用线性分类学习方法从训练数据中学习分类模型。

那么,问题来了,如何找到这种特征空间呢?如何确定原始空间到新特征空间的映射函数呢?

核技巧应用到支持向量机,其基本思想是通过一个非线性变换将输入空间映射到一个特征空间,使得在输入空间中的超曲面模型对应特征空间的超平面模型,这样,分类问题可通过在特征空间求解线性支持向量机。

事实上,根本不需要大费周章的求解新特征空间及相应的映射函数。由于原始空间的超平面模型与新空间的超平面模型是一一对应的关系,原始空间里超曲面模型中的 ⟨ x , z ⟩ \left \langle x,z \right \rangle ⟨x,z⟩对应着新空间里超平面的 ⟨ ϕ ( x ) , ϕ ( z ) ⟩ \left \langle \phi(x),\phi(z)\right \rangle ⟨ϕ(x),ϕ(z)⟩,只需要计算 ⟨ ϕ ( x ) , ϕ ( z ) ⟩ \left \langle \phi(x),\phi(z)\right \rangle ⟨ϕ(x),ϕ(z)⟩即可得到实例的预测类别。但是,计算 ⟨ ϕ ( x ) , ϕ ( z ) ⟩ \left \langle \phi(x),\phi(z)\right \rangle ⟨ϕ(x),ϕ(z)⟩相对比较复杂。因此,引入了核函数 K ( x , z ) K(x,z) K(x,z),其等价于 ⟨ ϕ ( x ) , ϕ ( z ) ⟩ \left \langle \phi(x),\phi(z)\right \rangle ⟨ϕ(x),ϕ(z)⟩,节省了求解新特征空间及对应的映射函数所带来的开销,简化了模型的求解过程。

核函数:设 X \mathcal X X是输入空间, H \mathcal H H是特征空间,如果存在一个从 X \mathcal X X到 H \mathcal H H的映射 ϕ ( x ) : X → H \phi(x):\mathcal X \to \mathcal H ϕ(x):X→H使得所有 x , z ∈ X x,z\in \mathcal X x,z∈X,满足 K ( x , z ) K(x,z) K(x,z)满足条件 K ( x , z ) = ϕ ( x ) . ϕ ( z ) K(x,z)=\phi(x).\phi(z) K(x,z)=ϕ(x).ϕ(z) K ( x , z ) K(x,z) K(x,z)为核函数, ϕ ( x ) \phi(x) ϕ(x)为映射函数, ϕ ( x ) . ϕ ( z ) \phi(x).\phi(z) ϕ(x).ϕ(z)为 ϕ ( x ) \phi(x) ϕ(x)与 ϕ ( z ) \phi(z) ϕ(z)的乘积。

使用核技巧的对偶问题的目标函数变为: 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j K ( x i , x j ) − ∑ i = 1 N α i \frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_jK(x_i,x_j)-\sum_{i=1}^N\alpha_i 21​i=1∑N​j=1∑N​αi​αj​yi​yj​K(xi​,xj​)−i=1∑N​αi​相应的分类决策函数: f ( x ) = s i g n ( ∑ i = 1 N α i ∗ y i ⟨ ϕ ( x i ) , ϕ ( x j ) ⟩ + b ∗ ) = s i g n ( ∑ i = 1 N α i ∗ y i K ( x i , x j ) + b ∗ ) f(x)=sign(\sum_{i=1}^N\alpha_i^*y_i\left \langle \phi(x_i),\phi(x_j) \right \rangle+b^*)=sign(\sum_{i=1}^N\alpha_i^*y_iK(x_i,x_j)+b^*) f(x)=sign(i=1∑N​αi∗​yi​⟨ϕ(xi​),ϕ(xj​)⟩+b∗)=sign(i=1∑N​αi∗​yi​K(xi​,xj​)+b∗)
在核函数 K ( x , z ) K(x,z) K(x,z)给定的条件下,利用解线性分类问题的方法求解非线性分类问题的支持向量机。学习是隐式地在特征空间进行,不需要显示低定义特征空间与映射函数,这样的技巧为核技巧,巧妙地利用线性分类学习方法与核函数解决非线性分类问题。

3.2 常用的核函数
  • 线性核函数(linear) K ( x , z ) = ⟨ x , z ⟩ K(x,z)=\left \langle x,z \right \rangle K(x,z)=⟨x,z⟩
  • 多项式核函数(poly) K ( x , z ) = ( γ ⟨ x , z ⟩ + r ) d K(x,z)=(\gamma\left \langle x,z \right \rangle+r)^d K(x,z)=(γ⟨x,z⟩+r)d
  • 高斯核函数(rbf) K ( x , z ) = e x p ( − γ ∣ ∣ x − z ∣ ∣ 2 ) K(x,z)=exp(-\gamma||x-z||^2) K(x,z)=exp(−γ∣∣x−z∣∣2)
  • sigmoid核函数 t a n h ( γ ⟨ x , z ⟩ + r ) tanh(\gamma\left \langle x,z \right \rangle+r) tanh(γ⟨x,z⟩+r)
3.3 非线性支持向量机学习算法

输入:训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\left\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\right\} T={(x1​,y1​),(x2​,y2​),...,(xN​,yN​)},其中, x i ∈ X = R n , y i ∈ Y = { + 1 , − 1 } , i = 1 , 2 , . . . , N x_i\in \mathcal {X}=R^n,y_i \in \mathcal {Y}=\left\{+1,-1\right\},i=1,2,...,N xi​∈X=Rn,yi​∈Y={+1,−1},i=1,2,...,N
输出:分类决策函数

  • 选择适当的核函数 K ( x , z ) K(x,z) K(x,z)和适当的惩罚参数C>0,构造并求解最优化问题 min ⁡ α 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j K ( x i , x j ) − ∑ i = 1 N α i \min_{\alpha} \quad \frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_jK(x_i,x_j)-\sum_{i=1}^N\alpha_i αmin​21​i=1∑N​j=1∑N​αi​αj​yi​yj​K(xi​,xj​)−i=1∑N​αi​ s . t . ∑ i = 1 N α i y i = 0 s.t. \qquad \sum_{i=1}^N\alpha_iy_i=0 s.t.i=1∑N​αi​yi​=0 0 ≤ α i ≤ C , i = 1 , 2 , . . . , N 0 \leq \alpha_i \leq C,i=1,2,...,N 0≤αi​≤C,i=1,2,...,N求最优解 α ∗ = ( α 1 ∗ , α 2 ∗ , . . . , α N ∗ ) T \alpha^*=(\alpha_1^*,\alpha_2^*,...,\alpha_N^*)^T α∗=(α1∗​,α2∗​,...,αN∗​)T
  • 计算 w ∗ = ∑ i = 1 N α i ∗ y i x i w^*=\sum_{i=1}^N\alpha_i^*y_ix_i w∗=i=1∑N​αi∗​yi​xi​选择 α ∗ \alpha^* α∗的一个正分量 0 &lt; α j ∗ &lt; C 0 &lt; \alpha_j^* &lt; C 0<αj∗​<C,计算 b ∗ = y j − ∑ i = 1 N α i ∗ y i K ( x i , x j ) b^*=y_j-\sum_{i=1}^N\alpha_i^*y_iK(x_i,x_j) b∗=yj​−i=1∑N​αi∗​yi​K(xi​,xj​)
  • 分类决策函数 f ( x ) = s i g n ( ∑ i = 1 N α i ∗ y i K ( x , x i ) + b ∗ ) f(x)=sign(\sum_{i=1}^N\alpha_i^*y_iK(x,x_i)+b^*) f(x)=sign(i=1∑N​αi∗​yi​K(x,xi​)+b∗)

从非线性分类训练集,通过核函数和软间隔最大化,学习得到的分类决策函数为非线性支持向量。

四、SVM参数
参数含义
Cfloat类型,默认值为1.0,错误实例的惩罚参数
kernel默认核函数为rbf,可选项为“linear”,“poly”,“rbf”’,“sigmoid”, “precomputed“等等
degree默认为3.0,只有poly核函数有这个参数,其他核函数没有
gamma‘rbf’, ‘poly’ and 'sigmoid’核函数的核系数。默认为auto,如果默认值,则表示为1/n_features
coef0只有’poly’ and 'sigmoid’核函数有这个参数,用 r r r表示,默认为0.0
probabilityboolean类型,表示是否启用概率评估
shrinkingBoolean类型,默认为True,表示是否使用缩减启发式
tol默认为1e-3,表示标准终止的容忍值
cache_size指定核缓存的大小
class_weight类别的权重,字典形式传递。设置第几类的参数C为weight*C
verbose默认为False,是否支持冗余输出
max_iter默认为-1,表示最大迭代次数。-1为无限制
decision_function_shape‘ovo’:one vs one, ‘ovr’:one vs rest, default=‘ovr’
random_state数据洗牌时的种子值,int值
五、SVM实战
import numpy as np
import pandas as pd
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
def load_data():
    iris = load_iris()
    df_iris = pd.DataFrame(iris.data, columns=iris.feature_names)
    df_iris['label'] = iris.target
    df_iris.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
    df_data = np.array(df_iris.iloc[:100, :])
    for i in range(len(df_data)):
        if df_data[i, -1] == 0:
            df_data[i, -1] = -1
    del df_iris
    return df_data[:, :-1], df_data[:, -1]


X, y = load_data()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2019)


class SVM(object):
    def __init__(self, max_iter=100, kernel='linear', C=1.0):
        self.max_iter = max_iter
        self.kernel = kernel
        self.C = C   # 松弛变量
        self.b = 0.0  # 偏置b

    # 初始化参数
    def _init_args(self, data, label):
        self.instances, self.features = data.shape  # (样本实例数量,特征数量)
        self.X = data
        self.y = label
        self.alpha = np.zeros(self.instances)  # 实例对应的拉格朗日乘子
        self.E = [self._E(i) for i in range(self.instances)]  # 实例对应的误差

    # 计算误差
    def _E(self, i):
        return self.gxi(i) - self.y[i]

    # 核函数
    def _kernel(self, xi, xj):
        if self.kernel == 'linear':
            return sum([xi[k] * xj[k] for k in range(self.features)])
        if self.kernel == 'poly':
            return (sum([xi[k] * xj[k] for k in range(self.features)]) + 1) ** 2
        return 0

    # 样本的预测值
    def gxi(self, i):
        r = self.b
        for j in range(self.instances):
            r += self.alpha[j] * self.y[j] * self._kernel(self.X[i], self.X[j])
        return r

    # KKT条件
    def KKT(self, i):
        y_g = self.y[i] * self.gxi(i)
        if self.alpha[i] == 0:
            return y_g >= 1
        elif 0 < self.alpha[i] < self.C:
            return y_g == 1
        else:
            return y_g <= 1

    # 选择合适的i,j
    def init_alphas(self):
        support_vectors_indexs = [i for i in range(self.instances) if 0 < self.alpha[i] < self.C]
        non_safity_list = [i for i in range(self.instances) if i not in support_vectors_indexs]
        support_vectors_indexs.extend(non_safity_list)

        for i in support_vectors_indexs:
            if self.KKT(i):
                continue
            Ei = self.E[i]
            if Ei >= 0:
                j = min(range(self.instances), key=lambda x: self.E[x])
            else:
                j = max(range(self.instances), key=lambda x: self.E[x])
        return i, j

    # 范围约束的拉格朗日乘子
    def _compare(self, L, H, _alpha):
        if _alpha >= H:
            return H
        elif _alpha <= L:
            return L
        else:
            return _alpha

    # 训练模型
    def fit(self, data, label):
        self._init_args(data, label)

        for iter in range(self.max_iter):
            i, j = self.init_alphas()
            Ei, Ej = self.E[i], self.E[j]

            if self.y[i] == self.y[j]:
                L = max(0, self.alpha[j] + self.alpha[i] - self.C)
                H = min(self.C, self.alpha[j] + self.alpha[i])
            else:
                L = max(0, self.alpha[j] - self.alpha[i])
                H = min(self.C, self.C + self.alpha[j] - self.alpha[i])

            eta = self._kernel(self.X[i], self.X[i]) + self._kernel(self.X[j], self.X[j]) \
                  - 2 * self._kernel(self.X[i], self.X[j])
            if eta <= 0:
                continue

            alphaj_new_unc = self.alpha[j] + self.y[j] * (Ei - Ej) / eta

            alphaj_new = self._compare(L, H, alphaj_new_unc)
            alphai_new = self.alpha[i] + self.y[i] * self.y[j] * (self.alpha[j] - alphaj_new)

            # 更新偏置b
            b1_new = -self.E[i] - self.y[i] * self._kernel(self.X[i], self.X[i]) * (alphai_new - self.alpha[i]) - \
                     self.y[j] * self._kernel(self.X[j], self.X[i]) * (alphaj_new - self.alpha[j]) + self.b
            b2_new = -self.E[j] - self.y[i] * self._kernel(self.X[i], self.X[j]) * (alphai_new - self.alpha[i]) - \
                     self.y[j] * self._kernel(self.X[j], self.X[j]) * (alphaj_new - self.alpha[j]) + self.b

            if alphai_new > 0 and alphai_new < self.C:
                b_new = b1_new
            elif alphaj_new > 0 and alphaj_new < self.C:
                b_new = b2_new
            else:
                b_new = (b1_new + b2_new) / 2

            self.alpha[i] = alphai_new
            self.alpha[j] = alphaj_new
            self.b = b_new

            self.E[i] = self._E(i)
            self.E[j] = self._E(j)
        print('train done...')

    def predict(self, data):
        r = self.b
        for i in range(self.instances):
            r += self.alpha[i] * self.y[i] * self._kernel(self.X[i], data)
        return 1 if r > 0 else -1

    def score(self, X_test, y_test):
        pred_cnt = sum(1 for i in range(len(X_test)) if self.predict(X_test[i]) == y_test[i])
        return pred_cnt / len(X_test)


svm = SVM()
svm.fit(X_train, y_train)
print("The score of custom svm model's prediction is :",svm.score(X_test, y_test))

clf = SVC(gamma='auto')
clf.fit(X_train,y_train)
print("The score of built-in SVC model's prediction is:",clf.score(X_test,y_test))
The score of custom svm model's prediction is: 0.95
The score of built-in SVC model's prediction is: 1.0
参考文献
  • 李航 《统计学习方法》
  • 周志华 《机器学习》
  • scikit-learn官方文档
支持向量机算法(带你了解原理 实践) 支持向量机作为一种强大的分类算法,在各个领域都取得了显著的成果。其基于统计学习理论的原理使得它能够在高维空间中找到最优分类超平面,并通过核函数处理非线性问题。 阅读详情

相关推荐

SVM(支持向量机)原理与应用

1. 支持向量机  支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。SVM使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk)

Air_wanghao的博客 4461

机器学习——支持向量机

支持向量机(SVM)是一种二分类模型,它的基本思想是在特征空间中找到一个最优超平面,使得两个类别的样本点之间的间隔最大化。它是一个随机的二分类数据集,其中的数据点不是线性可分的。我们可以使用高斯核函数将这些数据映射到一个更高维的空间,使得数据在新的特征空间中呈现线性可分的特性。这就是即将要介绍的KKT条件,KKT条件是指在优化问题中,满足一定条件的最优解必须满足的一组充分必要条件。核函数是一种常用的技巧,用于将输入数据从原始空间映射到一个高维特征空间,使得原始数据在新的特征空间中呈现线性可分的特性。

qq_64337860的博客 3177

机器学习笔记13——支持向量机(SVM)模型原理以及python实现案例

支持向量机(SVM)1、概述2、基本概念2.1 线性可分2.2 函数间隔和几何间隔2.3 间隔最大化(硬间隔最大化)2.4 支持向量和间隔边界2.5 对偶问题 1、概述 支持向量机(support vector machines,SVM)是一种二分类模型,它的目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,可以形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题,支持向量机的学习算法是求解凸二次规划的最优化算法。。由简至繁的模型包括: 当训练样本线性可分时,通过硬间隔最

weixin_45666566的博客 4732

支持向量机SVM原理解析

支持向量机(SVM) 可以找到这样一个超平面,使得所有相同类别的样本位于超平面一侧。如图示,可能存在无穷多个超平面。虽然他们的训练误差都等于0,但不能保证这些超平面在测...

轩逸云的博客 8527

【机器学习】支持向量机 SVM 原理详解 详细数学推导

前排提示 多公式预警,如果想真正掌握、想对SVM的推导和原理理解透彻,就请耐心的看完推导过程,博主发现很多书籍文献资料上推导过程大多有所省略,这对数学基础不牢靠的同学来说不太友好(比如博主自己 - -#),所以在此给出最细致的推导过程。 由于公式符号繁多,博主也经过了多次修正检查,如有疏漏或不对的地方还请指正(公式编辑真的打的累死惹)~~ 支持向量机 SVM(support vector ma...

Tinkle2015 4329

机器学习:支持向量机SVM原理及python实现

SVM(support vector machine) 支持向量机是一种监督学习算法,可用于分类、回归、离群点检测。 引入软间隔因为:(1)不是任何任务都能找到好的核函数使其线性可分;(2)就算实现(1),但也无法判断模型线性可分是不是过拟合造成。 支持向量(support vector):到超平面最近的样本点 间隔(margin):各异类支持向量到超平面的距离之和。 硬间隔:要求所有...

wangqianqianya的博客 1534

【机器学习】12.十大算法之一支持向量机(SVM - Support Vector Machine)算法原理讲解

支持向量机(SVM)是一种高效的监督学习算法,广泛应用于分类和回归问题。它通过在特征空间中寻找一个最优的超平面来区分不同类别的数据点,目标是最大化两类数据点之间的间隔,从而提高模型的泛化能力。SVM的关键概念包括超平面、间隔、支持向量以及核函数,其中核函数允许SVM处理非线性问题,通过将数据映射到更高维的空间来寻找线性可分的超平面。此外,软间隔和正则化技术用于处理数据的非完全线性可分性,同时控制模型复杂度,防止过拟合。

weixin_50804299的博客 3544

【机器学习】支持向量机SVM原理总结

【机器学习】支持向量机SVM总结(1) @(Machine Learning) 支持向量机涉及的知识点多,应用广泛,现在特别总结一下支持向量机SVM。 References: 《机器学习》 西瓜书_周志华 《统计学习方法》 李航 问题引入 这部分西瓜书上面说的比较简单,《统计学习方法》上面更加详细。 给定线性可分数据集,分离超平面为: 这里,w是平面的法向量,b是截距。 ...

Life in Technicolor 730

【机器学习原理】SVM支持向量机分类算法

文章目录一、支持向量机:线性分类器的“王者”1. 距离2. 支持向量3. 从更高维度看“线性不可分”二、支持向量机分类的算法原理1. 基本思路(1) 最大间隔(2) 高维映射(3) 核函数(4) 支持向量机的真正运行机制(5) 核技巧2. 数学解析(1) 点到超平面的距离(2) 间隔最大化(3) 核函数3. 具体步骤三、在Python中使用支持向量机分类算法四、支持向量机分类算法的使用场景 一、支持向量机:线性分类器的“王者” 最大间隔 高维映射 核方法 1. 距离 我们已经从用线性回归套S型马甲(lo

ZhShy 1万+

Python机器学习实战:支持向量机(SVM)的原理与使用

《Python机器学习实战:支持向量机(SVM)的原理与使用》 关键词 Python 机器学习 支持向量机 SVM 原理 实践

AI天才研究院 1018

机器学习强基计划3-2:详细推导支持向量机SVM原理+Python实现

支持向量机SVM是基于训练集在样本空间或其映射空间中寻找一个最鲁棒的划分超平面将不同类别样本划分开的分类方法。本文介绍SVM的基本原理与Python实现

FRIGIDWINTER的博客 2222

【机器学习】支持向量机SVM原理及推导

SVM的原理和推导

Chester-py的专栏 4万+

超详细版risc-v五级流水线cpu硬件设计实现解析

深入剖析risc-v五级流水线cpu的硬件架构与设计细节,涵盖指令流程、模块划分与关键时序控制,帮助理解risc-v五级流水线cpu的工作机制与优化策略。

weixin_42437253的博客 1630

【机器学习】深入探索SVM:支持向量机的原理与应用

看一个故事,故事是这样子的:在很久以前的情人节,一位大侠要去救他的爱人,但魔鬼需要大侠先攻克他设置的防线,于是和他玩了一个游戏game。魔鬼在桌子上似乎有规律放了两种颜色的球,说:“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。于是大侠这样放,干的不错?然后魔鬼,又在桌上放了更多的球,似乎有一个球站错了阵营。大侠苦思冥想似乎记得学过SVM技术,于是就采用SVM试试。这里的SVM就试图把棍放在最佳位置,好让在棍的两边有尽可能大的间隙。现在即使魔鬼放了更多的球,棍仍然是一个好的分界线。

2301_76820214的博客 3295

我用 AI 做了个开源地图工具:从 OpenStreetMap 一键获取全国 AOI/POI 数据

本文介绍了一款免费开源的OSM数据查询与可视化工具,旨在解决Overpass QL语法晦涩、数据获取门槛高的问题。工具支持面数据(AOI)、点数据(POI)及路网三种查询模式,内置30+常用模板实现一键检索。具备高德与OSM双底图切换、坐标自动转换功能,支持GeoJSON、SHP、CSV多格式导出,同时保留自定义查询能力。作为纯HTML单文件应用,可零成本部署至GitHub Pages在线使用。该工具有效降低了地理数据获取难度,是替代商业地图API、高效提取全球开源地理信息的实用利器。

weixin_45812624的博客 585

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

一朵花开的时间 6150

[学习笔记] [机器学习] 10. 支持向量机 SVM(SVM 算法原理、SVM API介绍、SVM 损失函数、SVM 回归、手写数字识别)

SVM 算法原理、SVM API介绍、SVM 损失函数、SVM 回归、手写数字识别

Le0v1n 的博客 8961

elementui中el-select和el-tree实现下拉树形多选功能

elementui中el-select和el-tree实现下拉树形多选功能

weixin_49203377的博客 6556

机器学习:支持向量机SVM原理与理解

引言 ——“举牌子:Support Vector Machines ” 一直在犹豫要不要写SVM,因为网上已经有很多详细的SVM原理的解释甚至详细推导,而这东西又庞大复杂,想了解的话直接可以参考。说实话,SVM确实到现在也不是说很懂,感觉最恐怖的是对偶问题后的KKT推导、Mercer定理以及最后的参数求解。随便拿出来一个都是及其晦涩的数学问题。无奈水平不行,只能囫囵吞枣。 之所以决定要敲一下...

SanFancsgo的博客 7983

雪亮工程视频联网技术详解:视综平台主流接入方式与协议分析

随着雪亮工程建设的深入,视频资源的汇聚与共享成为核心需求。本文简要剖析了雪亮视综平台下的视频联网接入技术,重点讲解了主流接入方式的区别与选型,并深入探讨了平台内部及跨平台的视频资源共享机制(含级联与推送模式),旨在为安防开发人员和系统集成商提供清晰的架构思路与技术参考。

lsz152590的博客 716

Dify+MCP Server打造禅道AI智能助手

Dify AI与MCP Server结合打造的禅道AI智能助手,实现了项目管理智能化升级。该方案通过大语言模型和自动化工作流,提供四大核心功能:1)自动化报表生成,支持多维度数据统计与可视化;2)禅道系统管理操作,简化产品/项目/任务管理流程;3)基于知识库的智能问答系统;4)数据库灵活查询与可视化输出。系统采用分层架构,通过MCP协议实现AI与数据源解耦,解决了传统禅道在数据孤岛、工具碎片化等问题。实际应用验证了其在用户管理、任务创建、Bug处理等场景的高效性,显著提升了项目管理效率。

oNew_Lifeo的博客 1708

机器学习数学原理(7)——SVM支持向量机

机器学习数学原理(7)——SVM支持向量机这篇博文笔者将默认读者已经了解了最优间隔分类器以及泛化拉格朗日乘子法,如果部分读者还不是很了解,我这里给出前面一篇博文的链接《机器学习数学原理(6)——最优间隔分类器》。总之,这篇博文将不会再赘述相关的知识,而是直接给出其结论。由于笔者水平有限,如果读者发现任何不妥或者错误之处,欢迎批评指出。1 简介我们来看看前面最优间隔分类器的前提:线性可分的样本空间。但

Άγνωστο.Z 3291

基于YOLOv8的端面小目标计数解决方案: 多头检测器+小缺陷到大缺陷一网打尽的GiraffeDet+Wasserstein Distance Loss | 助力工业小目标缺陷检测

端面小目标计数部署解决方案 | 亲测在工业小目标缺陷涨点明显,原始mAP@0.5 0.936提升至0.955

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1955

机器学习支持向量机SVM的原理、算法、应用解释及完整代码

建立在统计学习理论VC维理论和结构风险最小化原理基础上的机器学习方法。用于解决数据挖掘或模式 识别领域中数据分类问题它在解决小样本、非线性和高维模式识别问题中表现出许多特有的优势,并在很大程度上克服了“维数灾难”和“过学习”等问题。此外,它具有坚实的理论基础,简单明了的数学模型,因此,在模式识别、回归分析、函数估计、时间序列预测等领域都得到了长足的发展,并被广泛应用于文本识别、手写字体识别、人脸图像识别、基因分类及时间序列预测

qq_55433305的博客 3154

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

机器学习算法四之SVM支持向量机原理详解

支持向量机SVM(Support Vector Machine) 1.解决问题思路展开 *要解决的问题:什么样的决策边界才是最好的? *特征数据本身如果就很难分,该怎么办? *计算负责度怎么样?能否实际应用? ==>目标:基于上述问题对SVM进行推导 1.1决策边界 右图中的决策边界更具容忍度,更加可靠 1.2 通过距离获得决策边界(求取点到面的距离) 通过平面上两点可以得到平面的法向量,进而获得与法相量平行的单位方向向量,通过平面外一点X到平面上一点x’的距离D在单位方向向量的投影可以求出距离d

yohnyang的博客 3988

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 随机森林和GBDT的区别
下一篇: 支持向量机SVM之-SMO算法
code__online
博客等级 码龄9年 142粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值