在如下图所示的二分类问题里,我们在训练分类器时就是希望找到一个最优的超平面。直观来讲,我们希望找到如图所示的一个通道(Margin)能够区分正负样本,最大化其宽度,取其中间线为超平面。直观来说,这样得到的超平面更具有泛化能力。

我们准备讨论的SVM就是采用的这个思想:寻找一个分类器,使其有最大化的Margin。

SVM的优化问题

令训练集中的数据为 { x i , t i } 1 N , x i ∈ R d , t i ∈ { 1 , − 1 } \{x_i,t_i\}_1^N,x_i\in \mathbb{R}^d,t_i\in\{1,-1\} {xi​,ti​}1N​,xi​∈Rd,ti​∈{1,−1},即有N个数据,每个数据的输入x的维度为d,且所要分类的目标值用1和-1表示。

那么超平面可以表示为 w T x + b = 0 w^Tx+b = 0 wTx+b=0,w为权重,b为bias或叫位移项。

那么,如上图所示,不难得到这个Margin的宽度为 2 ∣ ∣ w ∣ ∣ \frac{2}{||w||} ∣∣w∣∣2​。为了使其尽量宽,就需要是的权重的norm足够小。这样我们就得到了SVM里的优化问题:

a r g m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 \underset{w,b}{\mathbf{argmin}}\frac12||w||^2 w,bargmin​21​∣∣w∣∣2,且其约束条件为

t n ( w T x n + b ) ≥ 1 ∀ n = 1 , 2 , . . . N t_n(w^Tx_n+b)\ge1 \quad \forall n = 1,2,...N tn​(wTxn​+b)≥1∀n=1,2,...N

那么如何通过这一系列的约束来得到最优的结果呢?SVM里引入拉格朗日乘子法来找到最优解。

拉格朗日乘子法与对偶问题

如下图所示,假设有函数 f ( x , y ) f(x,y) f(x,y),要求其极值(最大值/最小值),且满足约束条件 g ( x , y ) = 0 g(x,y) = 0 g(x,y)=0,这里令c为0。对不同 d n d_n dn​的值,不难想像出 f ( x , y ) = d n f(x,y) = d_n f(x,y)=dn​的等高线。

不难看出当 f ( x , y ) = d n f(x,y) = d_n f(x,y)=dn​的等高线与 g ( x , y ) = 0 g(x,y) = 0 g(x,y)=0曲线相切的时候, f ( x , y ) f(x,y) f(x,y)取到极值点,且在这个极值点处, f ( x , y ) f(x,y) f(x,y)和 g ( x , y ) = 0 g(x,y) = 0 g(x,y)=0的梯度是相切的。

拉格朗日乘子法

对于一般情况,对于要求极值的函数 f ( x ) , x ∈ R d f(x),x\in \mathbb{R}^d f(x),x∈Rd(函数有d维变量x),满足 g ( x ) = 0 g(x)=0 g(x)=0的约束。由前面二维的例子看出,该问题的目标是在由 g ( x ) = 0 g(x)=0 g(x)=0确定的 d − 1 d-1 d−1维约束曲面上寻找 f ( x ) f(x) f(x)的极值点。那么不难得到:

  • 对于约束曲面上的任一点x,该点的梯度 ▽ g ( x ) \triangledown g(x) ▽g(x)正交于约束平面
  • 对于极值点 x ∗ x^* x∗,目标函数 f ( x ∗ ) f(x^*) f(x∗)在该点的梯度 ▽ f ( x ∗ ) \triangledown f(x^*) ▽f(x∗)正交于约束平面

由此,在极值点 x ∗ x^* x∗处,梯度 ▽ g ( x ∗ ) , ▽ f ( x ∗ ) \triangledown g(x^*),\triangledown f(x^*) ▽g(x∗),▽f(x∗)的方向必相同或相反,即存在 λ ≠ 0 \lambda\ne 0 λ​=0使得:
▽ f ( x ∗ ) + λ ▽ g ( x ∗ ) = 0 \triangledown f(x^*)+\lambda\triangledown g(x^*) = 0 ▽f(x∗)+λ▽g(x∗)=0
λ \lambda λ称为拉格朗日乘子,其定义拉格朗日函数:
L ( x , λ ) = f ( x ) + λ g ( x ) L(x,\lambda)=f(x)+\lambda g(x) L(x,λ)=f(x)+λg(x)
这样 L ( x , λ ) L(x,\lambda) L(x,λ)的极值也就是 f ( x ) f(x) f(x)在 g ( x ) g(x) g(x)约束下的极值,然后我们就把原约束问题转换为拉格朗日函数 L ( x , λ ) L(x,\lambda) L(x,λ)无约束问题

KKT条件

但是在SVM里,我们的优化问题的约束条件是不等式 y n ( w T x n + b ) − 1 ≥ 0 y_n(w^Tx_n+b)-1\ge 0 yn​(wTxn​+b)−1≥0,那么我们需要分两种情况讨论

  1. 如果极值点落在了边界上,即 g ( x ∗ ) = 0 g(x^*) = 0 g(x∗)=0,那么就是上面的情况,这时就存在 λ > 0 \lambda>0 λ>0使得:

    ▽ f ( x ∗ ) + λ ▽ g ( x ∗ ) = 0 \triangledown f(x^*)+\lambda\triangledown g(x^*) = 0 ▽f(x∗)+λ▽g(x∗)=0

  2. 如果极值点落在边界内,即 g ( x ∗ ) > 0 g(x^*) > 0 g(x∗)>0,那么最值点就是极值点,直接令 λ = 0 \lambda = 0 λ=0,对 f ( x ) f(x) f(x)求梯度即可得到极值

综合上面2种情况我们可以得到Karush-Kuhn-Tucker (KKT)条件:
{ λ ≥ 0 g ( x ) ≥ 0 λ g ( x ) = 0 \begin{aligned} \begin{cases} \lambda \ge 0\\ g(x)\ge0\\ \lambda g(x)=0 \end{cases} \end{aligned} ⎩⎪⎨⎪⎧​λ≥0g(x)≥0λg(x)=0​​
通俗意义理解KKT条件的话就是目标函数在约束条件下取得极值的充要条件,也就是目标函数在约束条件下取得极值时对应的x,λ必须满足KKT条件,反之亦然。

多问题约束推广

将上述做法推广到m个等式约束和n个不等式约束,且可行域非空的优化问题。
m i n x f ( x ) , x ∈ R d h i ( x ) = 0 ( i = 1 , . . . , m ) g j ( x ) ≥ 0 ( j = 1 , . . . , n ) \begin{aligned} &min_xf(x), x\in \mathbb{R}^d\\ h_i&(x)= 0(i=1,...,m)\\ g_j&(x)\ge 0(j = 1,...,n) \end{aligned} hi​gj​​minx​f(x),x∈Rd(x)=0(i=1,...,m)(x)≥0(j=1,...,n)​
引入拉格朗日乘子 λ = ( λ 1 , λ 2 , . . . , λ m ) . T , μ = ( μ 1 , μ 2 , . . . , μ n ) . T \lambda=(\lambda_1,\lambda_2,...,\lambda_m).T , \mu=(\mu_1,\mu_2,...,\mu_n).T λ=(λ1​,λ2​,...,λm​).T,μ=(μ1​,μ2​,...,μn​).T, 相应的拉格朗日函数为:
L ( x , λ , μ ) = f ( x ) + ∑ i = 1 m λ i h i ( x ) + ∑ j = 1 n μ j g j ( x ) L(x,\lambda,\mu) = f(x)+\sum_{i=1}^m\lambda_i h_i(x)+\sum_{j=1}^n\mu_j g_j(x) L(x,λ,μ)=f(x)+i=1∑m​λi​hi​(x)+j=1∑n​μj​gj​(x)
由不等式约束引入KKT条件(j=1,2,3,…,n):
{ μ j ≥ 0 g j ( x ) ≥ 0 μ j g j ( x ) = 0 \begin{cases} \mu_j \ge 0\\ g_j(x)\ge0\\ \mu_j g_j(x)=0 \end{cases} ⎩⎪⎨⎪⎧​μj​≥0gj​(x)≥0μj​gj​(x)=0​

支持向量机的拉格朗日函数

根据其优化问题:
m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 s . t t n ( w T x n + b ) ≥ 1 ∀ n = 1 , 2 , . . . N \begin{aligned} \underset{w,b}{\mathbf{min}}\frac12||w||^2\\ s.t \quad t_n(w^Tx_n+b)\ge1 &\quad \forall n = 1,2,...N \end{aligned} w,bmin​21​∣∣w∣∣2s.ttn​(wTxn​+b)≥1​∀n=1,2,...N​
对每条约束添加拉格朗日乘子 α 1 ≥ 0 \alpha_1 \ge 0 α1​≥0,则该问题的拉格朗日函数可写为:
L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ n = 1 N α i ( t n ( w T x n + b ) − 1 ) L(w,b,\alpha) = \frac12||w||^2 - \sum_{n=1}^N\alpha_i(t_n(w^Tx_n+b)-1) L(w,b,α)=21​∣∣w∣∣2−n=1∑N​αi​(tn​(wTxn​+b)−1)

KKT条件为:
{ α n ≥ 0 t n ( w T x n + b ) − 1 ≥ 0 α n ( t n ( w T x n + b ) − 1 ) = 0 \begin{aligned} \begin{cases} \alpha_n \ge 0\\ t_n(w^Tx_n+b)-1\ge0\\ \alpha_n(t_n(w^Tx_n+b)-1)=0 \end{cases} \end{aligned} ⎩⎪⎨⎪⎧​αn​≥0tn​(wTxn​+b)−1≥0αn​(tn​(wTxn​+b)−1)=0​​

对偶形式求最优解

上面的拉格朗日函数分别对w和b求偏导可以得到
w = ∑ n = 1 N α n t n x n 0 = ∑ n = 1 N α n t n \begin{aligned} w &= \sum_{n = 1}^N\alpha_nt_nx_n\\ 0 &= \sum_{n=1}^N\alpha_nt_n \end{aligned} w0​=n=1∑N​αn​tn​xn​=n=1∑N​αn​tn​​
将上式带入到拉格朗日函数中消去w,b:
L p = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ n = 1 N α i t n w T x n − b ∑ n = 1 N α n t n + ∑ n = 1 N α n = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ n = 1 N α i t n w T x n + ∑ n = 1 N α n ( s i n c e : ∑ n = 1 N α n t n = 0 ) = 1 2 w T w − w T w + ∑ n = 1 N α n ( s i n c e : w = ∑ n = 1 N α n t n x n ) = ∑ n = 1 N α n − 1 2 w T w = ∑ n = 1 N α n − 1 2 ( ∑ n = 1 N α n t n x n ) T ( ∑ m = 1 N α m t m x m ) = ∑ n = 1 N α n − 1 2 ∑ n = 1 N ∑ m = 1 N α n α m t n t m ( x n T x m ) \begin{aligned} L_p &= \frac12||w||^2 - \sum_{n=1}^N\alpha_it_nw^Tx_n-\boxed {b\sum_{n=1}^N\alpha_nt_n}+\sum_{n=1}^N\alpha_n\\ &=\frac12||w||^2 - \boxed{\sum_{n=1}^N\alpha_it_nw^Tx_n}+\sum_{n=1}^N\alpha_n\quad &(since: \quad\sum_{n=1}^N\alpha_nt_n = 0)\\ &=\frac12w^Tw - w^Tw+\sum_{n=1}^N\alpha_n \quad &(since: w = \sum_{n = 1}^N\alpha_nt_nx_n)\\ & = \sum_{n=1}^N\alpha_n -\boxed{\frac12w^Tw}\\ & = \sum_{n=1}^N\alpha_n -\boxed{\frac12(\sum_{n=1}^N\alpha_nt_nx_n)^T(\sum_{m=1}^N\alpha_mt_mx_m)}\\ & = \sum_{n=1}^N\alpha_n -\frac12\sum_{n=1}^N\sum_{m=1}^N\alpha_n\alpha_mt_nt_m(\mathbf{x_n^Tx_m}) \end{aligned} Lp​​=21​∣∣w∣∣2−n=1∑N​αi​tn​wTxn​−bn=1∑N​αn​tn​​+n=1∑N​αn​=21​∣∣w∣∣2−n=1∑N​αi​tn​wTxn​​+n=1∑N​αn​=21​wTw−wTw+n=1∑N​αn​=n=1∑N​αn​−21​wTw​=n=1∑N​αn​−21​(n=1∑N​αn​tn​xn​)T(m=1∑N​αm​tm​xm​)​=n=1∑N​αn​−21​n=1∑N​m=1∑N​αn​αm​tn​tm​(xnT​xm​)​(since:n=1∑N​αn​tn​=0)(since:w=n=1∑N​αn​tn​xn​)​
从而得到对偶问题:
m a x ∑ n = 1 N α n − 1 2 ∑ n = 1 N ∑ m = 1 N α n α m t n t m ( x n T x m ) s . t . ∑ n = 1 N α n t n = 0 α n ≥ 0 , ∀ n = 1 , 2 , . . . , N \begin{aligned} &\mathbb{max} \sum_{n=1}^N\alpha_n -\frac12\sum_{n=1}^N\sum_{m=1}^N\alpha_n\alpha_mt_nt_m(\mathbf{x_n^Tx_m})\\ s.t. \quad&\sum_{n=1}^N\alpha_nt_n = 0\\ &\alpha_n \ge 0, \forall n = 1,2,...,N \end{aligned} s.t.​maxn=1∑N​αn​−21​n=1∑N​m=1∑N​αn​αm​tn​tm​(xnT​xm​)n=1∑N​αn​tn​=0αn​≥0,∀n=1,2,...,N​
通过对这个凸优化问题求解可以得到最优解 α ∗ \alpha^* α∗, 理论上来说,使用 w = ∑ n = 1 N α n t n x n w = \sum_{n = 1}^N\alpha_nt_nx_n w=∑n=1N​αn​tn​xn​即可求得最优的权重,但是在实际计算过程中,由于精度的问题,在得到的support vectors的 α ∗ \alpha^* α∗值往往并不是0,而是接近于0的一个很小的值,这就可能会带来误差。

但我们知道SVM的超平面是只由support vectors,因此我们可以根据最优的 α ∗ \alpha^* α∗中并不是趋近于0且大于0 的值,其index所对应的数据就是support vectors。然后通过相应的support vectors即可求得相应的最优权重w。
w = ∑ n = 1 N s v α n ∗ t n x n w = \sum_{n = 1}^{N_{sv}}\alpha_n^*t_nx_n w=n=1∑Nsv​​αn∗​tn​xn​
而且由上面图二我们知道support vectors是恰好落在Margin边缘的,那么满足 t n ( w T x n + b ) = 1 t_n(w^Tx_n+b) = 1 tn​(wTxn​+b)=1,根据此我们可以求得相应的b的值。也就是说只需要一个support vector我们就可以求得b的值。但是对于多个support vectors,我们这里采用取平均的方式来求得b,更具有鲁棒性。
b = 1 N s v ∑ n ∈ s v ( t n − w T x n ) b = \frac1{N_{sv}}\sum_{n\in sv}(t_n-w^Tx_n) b=Nsv​1​n∈sv∑​(tn​−wTxn​)
到此SVM对于线性可分的数据集的分类就结束了。但是现实生活当中,绝大部分的数据集并不是线性可分的,对此SVM引入松弛变量来解决这个问题。

松弛变量

如下图所示,当前数据是线性不可分的,也就是没办法找到一个超平面,使得恰好两个类别数据分开。

我们为每一个训练数据 x n x_n xn​设置了一个松弛变量 ξ n ≥ 0 \xi_n\ge0 ξn​≥0,其取值分为以下两种情况:

  1. 对于数据点落在了Margin正确的一侧,令 ξ n = 0 \xi_n = 0 ξn​=0
  2. 对于其他的数据点,我们令 ξ = ∣ t n − ( w T x n + b ) ∣ \xi = |t_n-(w^Tx_n+b)| ξ=∣tn​−(wTxn​+b)∣

也就是说对于落在超平面(决策边界)上的点有 ξ n = 1 \xi_n = 1 ξn​=1;对于错误分类的点有 ξ n > 1 \xi_n > 1 ξn​>1;对于正确分类且落在Margin里的点有 0 < ξ n < 1 0<\xi_n < 1 0<ξn​<1;对于正确分类且落在Margin外的点有 ξ n = 0 \xi_n = 0 ξn​=0。

这样SVM的优化问题就发生了些许改变:
对 于 线 性 可 分 的 数 据 : m i n 1 2 ∣ ∣ w ∣ ∣ 2 对 于 线 性 不 可 分 数 据 : m i n 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ n = 1 N ξ n \begin{aligned} &对于线性可分的数据:\mathbb{min}\frac12 ||w||^2\\ &对于线性\textbf不可分数据:\mathbb{min}\frac12 ||w||^2+C\sum_{n=1}^N\xi_n \end{aligned} ​对于线性可分的数据:min21​∣∣w∣∣2对于线性不可分数据:min21​∣∣w∣∣2+Cn=1∑N​ξn​​
其中C为超参数,是人为设定的惩罚因子。然后完整的优化问题为:
m i n 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ n = 1 N ξ n s . t t n ( w T x n + b ) ≥ 1 − ξ n ∀ n = 1 , 2 , . . . N ξ n ≥ 0 ∀ n = 1 , 2 , . . . N \begin{aligned} &\mathbb{min}\frac12 ||w||^2+C\sum_{n=1}^N\xi_n\\ s.t \quad &t_n(w^Tx_n+b)\ge 1 - \xi_n\quad &\forall n = 1,2,...N\\ &\xi_n \ge 0\quad &\forall n = 1,2,...N \end{aligned} s.t​min21​∣∣w∣∣2+Cn=1∑N​ξn​tn​(wTxn​+b)≥1−ξn​ξn​≥0​∀n=1,2,...N∀n=1,2,...N​
那么根据前面拉格朗日乘子法多约束推广可以得到新的拉格朗日优化函数:
L p = 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ n = 1 N ξ n − ∑ n = 1 N α i ( t n ( w T x n + b ) − 1 + ξ n ) − ∑ n = 1 N μ n ξ n L_p = \frac12 ||w||^2+C\sum_{n=1}^N\xi_n -\sum_{n=1}^N\alpha_i(t_n(w^Tx_n+b)-1+\xi_n) - \sum_{n=1}^N\mu_n\xi_n Lp​=21​∣∣w∣∣2+Cn=1∑N​ξn​−n=1∑N​αi​(tn​(wTxn​+b)−1+ξn​)−n=1∑N​μn​ξn​
新的KKT条件也就是:
{ α n ≥ 0 t n ( w T x n + b ) − 1 + ξ n ≥ 0 α n ( t n ( w T x n + b ) − 1 + ξ n ) = 0 μ n ≥ 0 ξ n ≥ 0 μ n ξ n = 0 \begin{aligned} \begin{cases} \alpha_n \ge 0\\ t_n(w^Tx_n+b)-1+\xi_n\ge0\\ \alpha_n(t_n(w^Tx_n+b)-1+\xi_n)=0\\ \mu_n\ge0\\ \xi_n\ge 0 \\ \mu_n\xi_n=0 \end{cases} \end{aligned} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​αn​≥0tn​(wTxn​+b)−1+ξn​≥0αn​(tn​(wTxn​+b)−1+ξn​)=0μn​≥0ξn​≥0μn​ξn​=0​​
那么对w,b和 ξ n \xi_n ξn​求偏导可得:
w = ∑ n = 1 N α n t n x n 0 = ∑ n = 1 N α n t n C = α n + μ n , n = 1 , 2... , N \begin{aligned} w &= \sum_{n = 1}^N\alpha_nt_nx_n\\ 0 &= \sum_{n=1}^N\alpha_nt_n\\ C &= \alpha_n+\mu_n,\quad n = 1,2...,N \end{aligned} w0C​=n=1∑N​αn​tn​xn​=n=1∑N​αn​tn​=αn​+μn​,n=1,2...,N​
可以发现对w和b求偏导的结果和前面是一样的,那么类似的我们可以将上面拉格朗日函数用 α , μ \alpha,\mu α,μ进行改写:
L p = 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ n = 1 N ξ n − ∑ n = 1 N α i ( t n ( w T x n + b ) − 1 + ξ n ) − ∑ n = 1 N μ n ξ n = ∑ n = 1 N α n − 1 2 ∑ n = 1 N ∑ m = 1 N α n α m t n t m ( x n T x m ) + C ∑ n = 1 N ξ n − ∑ n = 1 N α n ξ n − ∑ n = 1 N μ n ξ n s i n c e : C = α n + μ n , n = 1 , 2... , N ⇒ C ∑ n = 1 N ξ n − ∑ n = 1 N α n ξ n − ∑ n = 1 N μ n ξ n = 0 L p = ∑ n = 1 N α n − 1 2 ∑ n = 1 N ∑ m = 1 N α n α m t n t m ( x n T x m ) \begin{aligned} L_p &= \frac12 ||w||^2+C\sum_{n=1}^N\xi_n -\sum_{n=1}^N\alpha_i(t_n(w^Tx_n+b)-1+\xi_n) - \sum_{n=1}^N\mu_n\xi_n\\ & = \sum_{n=1}^N\alpha_n -\frac12\sum_{n=1}^N\sum_{m=1}^N\alpha_n\alpha_mt_nt_m(\mathbf{x_n^Tx_m})+\boxed{C\sum_{n=1}^N\xi_n-\sum_{n=1}^N\alpha_n\xi_n-\sum_{n=1}^N\mu_n\xi_n}\\ since: C &= \alpha_n+\mu_n,\ n = 1,2...,N \quad \Rightarrow \quad C\sum_{n=1}^N\xi_n-\sum_{n=1}^N\alpha_n\xi_n-\sum_{n=1}^N\mu_n\xi_n = 0\\ L_p &= \sum_{n=1}^N\alpha_n -\frac12\sum_{n=1}^N\sum_{m=1}^N\alpha_n\alpha_mt_nt_m(\mathbf{x_n^Tx_m}) \end{aligned} Lp​since:CLp​​=21​∣∣w∣∣2+Cn=1∑N​ξn​−n=1∑N​αi​(tn​(wTxn​+b)−1+ξn​)−n=1∑N​μn​ξn​=n=1∑N​αn​−21​n=1∑N​m=1∑N​αn​αm​tn​tm​(xnT​xm​)+Cn=1∑N​ξn​−n=1∑N​αn​ξn​−n=1∑N​μn​ξn​​=αn​+μn​, n=1,2...,N⇒Cn=1∑N​ξn​−n=1∑N​αn​ξn​−n=1∑N​μn​ξn​=0=n=1∑N​αn​−21​n=1∑N​m=1∑N​αn​αm​tn​tm​(xnT​xm​)​
我们发现结果是和上面一样的,那么对偶问题中优化的目标也是一样的,只是约束变了:
m a x ∑ n = 1 N α n − 1 2 ∑ n = 1 N ∑ m = 1 N α n α m t n t m ( x n T x m ) s . t . ∑ n = 1 N α n t n = 0 0 ≤ α n ≤ C , ∀ n = 1 , 2 , . . . , N \begin{aligned} &\mathbb{max} \sum_{n=1}^N\alpha_n -\frac12\sum_{n=1}^N\sum_{m=1}^N\alpha_n\alpha_mt_nt_m(\mathbf{x_n^Tx_m})\\ s.t. \quad&\sum_{n=1}^N\alpha_nt_n = 0\\ &\boxed{0\le\alpha_n \le C, \forall n = 1,2,...,N} \end{aligned} s.t.​maxn=1∑N​αn​−21​n=1∑N​m=1∑N​αn​αm​tn​tm​(xnT​xm​)n=1∑N​αn​tn​=00≤αn​≤C,∀n=1,2,...,N​​

超参数惩罚因子C

其实从上面最后的约束我们可以明显发现,如果C取很大以至于无穷的话那么就跟前面线性可分的情况一样了,也就越不允许出现在Margin的数据点,换句话说就是对于不符合规矩的数据点的惩罚很大。相反C取得小,根据最优时满足 C = α n + μ n , n = 1 , 2... , N C = \alpha_n+\mu_n,\quad n = 1,2...,N C=αn​+μn​,n=1,2...,N,就允许很多 μ \mu μ的值为0,对应的松弛变量值就不为0,那么就允许部分数据点落在Margin内部甚至于错误分类且在Margin外。

我们可以看一下以下几个例子来更好地理解C值的选取对分类的影响

  • 训练数据明显是线性可分的情况:

  • 训练数据还是线性可分的,但比较勉强:

  • 训练数据线性不可分:

从上面三个例子我们可以看出,C值的选取取决于训练集线性可分的程度,如果训练集线性可分,那么C值要取得大,如果训练集线性不可分且复杂,那么C值就要取小一点。因此在实际生活中,选取合适的C值直接影响了分类器的泛化能力,就需要通过可视化等多种方法来分析数据从而选择更合适的C值。当然一般来说比较难分析,还是通过不断地测试C的值来确定最优。

好了,SVM的基本原理到此就结束了,我们可以尝试去用代码实现一个简单的SVM分类器了。

Python实现

对于SVM中的对偶问题,我这里使用了cvxopt包来找到最优的 α ∗ \alpha* α∗. cvxopt是一个免费的软件包,用于基于Python编程语言的凸优化。

以下为简单的线性SVM分类器的python代码:

def svmlin(X, t, C):"""INPUT:X        : the dataset                   (num_samples x dim)t        : labeling                      (num_samples x 1)C        : 惩罚因子                       (scalar)OUTPUT:alpha    : 拉格朗日乘子                    (num_samples x 1)sv       : supports vectors的布尔向量      (1 x num_samples)w        : 分类器的权重                    (1 x dim)b        : 线性SVM的偏移值                 (scalar)result   : 分类结果                       (1 x num_samples)slack    : 位于Margin中的数据点,布尔向量。  (1 x num_samples)"""N = X.shape[0]# 计算拉格朗日对偶形式的中的t_nt_m(x_n^Tx_m)# H(i,j) = t_i * t_j * dot_product(x_i, x_j)# 这里先求tn*x_n的矩阵,之后点乘自己就是我们所需要的y = t.reshape(-1, 1)X_dash = y * XH = np.dot(X_dash, X_dash.T)# cvxopt.solvers 寻找的是最优的alpha使得等式值最小化, 因此我们要对f取负# 以使得cvxopt.solvers找的是最大化等式的alpha:#       max 1'*x - 0.5*x'*H*x    subject to:  A*x <= b#        x#   <=>#       min -1'*x + 0.5*x'*H*x    subject to:  A*x <= b#        xf = (-1) * np.ones(N)# G,h是对alpha值的约束,每一个拉格朗日乘子的上下限: 0 <= alpha_n <= C# 这里分为两部分:0 <= alpha_n,alpha_n <= C# 实际操作时,是 -I x <= 0;I x <=C, I为对角线矩阵# 因此G的结构是上面为负Identity,下面为正IdentityG = np.vstack([-np.eye(N), np.eye(N)])LB = np.zeros(N)UB = C * np.ones(N)h = np.hstack([-LB, UB])# 构造约束条件: sum(t_n * alpha_n) = 0 => Ax = bA = t.reshape((1, N)).astype(np.double)b = np.double(0)sol = cvxopt.solvers.qp(P=cvxopt.matrix(H), q=cvxopt.matrix(f), G=cvxopt.matrix(G), h=cvxopt.matrix(h),A=cvxopt.matrix(A), b=cvxopt.matrix(b))#获取最优的alpha值alpha = np.array(sol['x']).reshape((-1,))# 查找support vectors, 前面原理提到过,虽然理论上非support vectors的对应的alpha# 应该值为0,但是由于浮点数的精度问题,alpha并不会为0,只是趋近于0# 所以这里设了一个阈值1e-6,默认小于这个数的都是应该值为0的sv = np.where(alpha > 1e-6, True, False)if ~sv.any():# 如果没有发现任何support vectorsraise ValueError('No support vectors found.')else:# 由KKT条件,在松弛变量不为0时候,u_n = 0. 且最优时候: alpha_n = C - u_n# 所以寻找相应的index,对应的alpha值趋近于C即可(理论上alpha == C)slack = np.where(alpha > C - 1e-6, True, False)# 计算权重w = (alpha[sv] * t[sv]).dot(X[sv])# 计算bias,也就是b的值b = np.mean(t[sv] - w.dot(X[sv].T))# 获取最后结果result = X.dot(w) + bresult[result >= 0] = 1result[result < 0] = -1return alpha, sv, w, b, result, slack

总结

本文主要是对线性SVM分类器的原理进行分析,着重于对优化问题以及寻找超平面的原理进行解析,在基本的SVM的思想方面没有多做解释,如果对那一部分有疑问可以直接参考下面参考资料第二条。希望大家读完本文后能对SVM有更深的理解。

另外对于非线性SVM分类器以及核方法,本人之后会补上,写不动了,要躺一会。

请大家多多点赞收藏转发支持,写这玩意很费劲的,公式纯手打的-_-

参考文献

  • 维基百科
  • SVM支持向量机-拉格朗日乘子与对偶问题(1)
  • cvxopt文档
  • Christopher M. Bishop,Pattern Recognition and Machine Learning,Springer, 2006

看不懂掐死我系列之支持向量机(SVM)从原理到python代码实现相关推荐

  1. 支持向量机SVM算法原理及应用(R)

    支持向量机SVM算法原理及应用(R) 2016年08月17日 16:37:25 阅读数:22292更多 个人分类: 数据挖掘实战应用 版权声明:本文为博主原创文章,转载请注明来源. https://b ...

  2. python机器学习案例系列教程——支持向量机SVM、核函数

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 线性函数.线性回归.线性分类 参考:http://blog.csdn.net/luanpeng825485697/article/de ...

  3. 支持向量机SVM详细原理,Libsvm工具箱详解,svm参数说明,svm应用实例,神经网络1000案例之15

    目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的股票价格预测 支持向量机SVM的详细原理 SVM的定义 ...

  4. 支持向量机——SVM算法及例子(代码)

    终于拖到最后一天交机器学习作业,选择了SVM算法,之前一直听说过,现在终于有了初步的了解,顺便post到这里分享一下,不足地方请大家指出 本文内容有来自<统计学习算法>(李航 著)第7章- ...

  5. OpenCV支持向量机SVM的实例(附完整代码)

    OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 #include <opencv2/core.hpp> #include < ...

  6. 【SVM分类】基于人工蜂群算法优化支持向量机SVM实现数据分类附Matlab代码

    1 简介 为确定合理的底板防水煤岩柱尺寸,减少底板突水安全事故的发生,利用支持向量机(SVM)与人工蜂群算法(ABCA)综合研究底板破坏深度问题.由于SVM训练参数惩罚因子C和核函数宽度g的选择对预测 ...

  7. 支持向量机SVM算法原理笔记2

    上篇博客介绍了当样本集是线性可分情况下的SVM算法原理.接下来介绍不存在一个划分超平面可以正确分类的问题,比如说"异或问题". 对于此类问题,可以将样本空间映射到更高维度空间,这样 ...

  8. 树状数组(详细分析+应用),看不懂打死我!

    树状数组介绍 在学习一个算法之前一定要清楚它能干嘛,能解决什么样的问题,对你解题是否有帮助,然后才去学习它! 那么接下来看如下几个问题 什么是树状数组 顾名思义就是一个结构为树形结构的数组,于二叉树的 ...

  9. Keras【Deep Learning With Python】Autoencoder 自编码(看不懂你打我系列!)

    文章目录 1 前言 2 Autoencoder 2.1 编码器 Encoder (-PCA主成分分析一个道理) 2.2 解码器 Decoder 3 代码实现 4 讲解 6 输出结果 1 前言 本文分为 ...

最新文章

  1. python删除字典中性别为男_python初学者,用python3实现基本的学生管理系统代码实例...
  2. UIButton文字居左显示
  3. Xcode命令行生成Bitcode静态库
  4. php mysql 链表_浅谈PHP链表数据结构(单链表)
  5. 性能测试--jmeter中的HTTP信息头管理器的使用【8】
  6. java 文件流 追加_JAVA向文件中追加内容(转)
  7. 前端开发必须知道的JS(二) 闭包及应用
  8. android flash插件安装失败,安卓手机怎么安装Adobe Flash Player插件
  9. 图灵奖得主都写过哪些书?
  10. 数字孪生--thingjs
  11. 西瓜书学习之绪论部分
  12. 超越YOLOv4-tiny!YOLObile:移动设备上的实时目标检测 [左侧有码]
  13. UE 某图局部 展UV 图标 / CSS 精灵图(sprite) 好像
  14. 必不可少的Firefox插件(一)
  15. 【C++】常用math函数
  16. JAVA里面继承和接口
  17. 树的三叉链的创建和遍历
  18. 动网 php v1.0 漏洞,动网论坛dispuser.php页面SQL注入漏洞
  19. 最逼近Mac OS的Linux系统 -- Elementary OS
  20. 【评测】iPS细胞株-Alzheimer‘s disease (AD),LDLR和APOE4基因突变

热门文章

  1. Pixhawk在MP上的故障保护
  2. 统计量的标准误的估计(bootstrap方法)
  3. 西电挑战杯文案编写要求
  4. 愿有人陪你颠沛流离(读书摘要)
  5. 联想计算机突然开机不了,开机无反应
  6. 弹出窗口lhgDialog API文档
  7. Python 字典(键值对)
  8. layui表格编辑修改session数据
  9. 相观天下:你是如何理解相由心生?
  10. 上门家政小程序|上门保洁APP|家政服务预约上门软件开发