svm简单推导

支持向量机(support vector machine, svm)在小样本、非线性、高维模式识别问题中有很多优势,并且能够方便地扩展到函数拟合等其他机器学习问题中。

1. svm思想

  1. 将低维空间中线性不可分的数据通过kernel trick映射到高维空间中,使得数据变得线性可分,从而实现分类;
  2. 寻找一个分割平面,使得两类数据距离这个平面最近的点到这个平面的距离相等且最大,这个平面即为所求分离超平面。

2. svm简单推导(适用于面试时手推公式)

svm的详细原理介绍及推导可见参考3(写的真的好,深入浅出),此处仅为面试时手推公式用的简洁版推导。


图片来源于参考3

如上图所示有两类样本,其中圆形样本的标签为(y=+1),正方形样本的标签为(y=-1)。设所求超平面的方程为:

[g(x)=w^T x+b=0 ]

其中(w,x)均为向量,(b)是标量。在上图中所求超平面即为中间的直线(H)。我们定义某个样本点(x_i)到超平面的距离为:

[ ho_i=y_i(w^Tx_i+b) ]

其中(y_i)是样本点(x_i)的标签,是个标量。容易知道(y_i(w^Tx_i+b))总是大于0的(应为若(y_i=+1),表明样本点(x_i)属于此类样本,则(w^Tx_i+b>0),同理,若(y_i=-1),则(w^Tx_i+b<0)),因此它的值就等于(|g(x_i)|)。我们对间隔( ho_i)进行归一化,得到几何间隔(delta_i):

[delta_i=frac{1}{||w||}|g(x_i)| ]

在上图中,(H)是分类面,(H_1)(H_2)平行于(H),且过离(H)最近的两类样本。(H_1)(H)(H_2)(H)的距离即为几何间隔。我们的目标是最大化几何间隔,通常我们是固定间隔(g(x)),将其固定为1,然后寻找最小的(||w||)。于是我们将目标函数定义为:

[min ||w|| ]

为了后续计算方便,我们将目标函数改写为:

[min frac{1}{2}||w||^2 ]

另外我们还要加入约束条件。前面说到我们把间隔(|g(x)|)固定为1,则对于其他样本点,他们都应该在间隔外面。因此有:

[|g(x_i)|=y_i(w^Tx_i+b)geq 1 ]

综上,我们的优化问题变为求解以下函数:

[min frac{1}{2}||w||^2 ]

[subject to y_i(w^Tx_i+b)geq 1(i=1,2,...,n,n是样本数) ]

回顾一下,我们的目标是要求一个最优的超平面方程(g(x)=w^Tx+b=0),要求这个最优的超平面方程,就是要求出参数向量(w)(参数b在求出了参数(w)后只要带入几个支持向量样本即可求得,支持向量就是落在(H_1),(H_2)上的样本点)。其实向量(w)只与支持向量及其标签有关,因此(w)可以表示如下:

[w=alpha_1y_1x_1+alpha_2y_2x_2+...alpha_iy_ix_i+...+alpha_ty_tx_t ]

其中(x_1,...,x_t)(t)个支持向量,(alpha_1,...,alpha_t)是系数,也叫做拉格朗日乘子,(y_1,...,y_t)是支持向量对应的标签。(w)也可以表示如下:

[w=sum_{i=1}^{t} (alpha_iy_ix_i) ]

(g(x))的表达式可以改为:

[g(x)=w^Tx+b=<w,x>+b=sum_{i=1}^{t}alpha_iy_i<x_i,x>+b=sum_{i=1}^{t}alpha_iy_ik(x_i,x)+b ]

其中(<cdot>)表示内积,(k(cdot))表示核函数。要求超平面方程,我们就是要求(g(x)),要求(g(x)),就是要求(alpha_i(i=1,...,t))
因为有离群点(对于正样本,即为(H_1)左边的点,对于负样本,即为(H_2)右边的点)的存在,我们引入松弛变量(gamma),则目标函数改为如下:

[min frac{1}{2}||w||^2+Csum_{i=1}^{t}gamma_i^2 ]

[subject to y_i(w^Tx_i+b)geq 1-gamma_i(i=1,...,t),gamma_igeq 0 ]

其中(C)为惩罚因子,(C)越大,表示对离群点越重视,表示你非常不愿意放弃这些离群点。非离群点对应的松弛变量为0。松弛变量越大,表示离群点偏离得越远。

3. 核方法的思想

核方法的主要思想是基于这样一个假设:低维空间中线性不可分的点集在高维空间就变得线性可分了,如下图所示:


图片来源于网络

那么怎么将低维空间的点映射到高维空间呢?通过核技巧可以巧妙地解决这个问题。
高维空间中向量的乘积只要通过低维空间中点的核函数就可以计算,这种方法成为核技巧(kernel trick)。即只要在低维空间中计算两个点的核函数,我们就相当于得到这两个点在高维空间的内积。公式表达如下:

[k(x_1,x_2)=<phi(x_1),phi(x_2)> ]

其中(k(cdot))是核函数,(x_1,x_2)是低维空间中的两个点,(phi(x_1),phi(x_2))(x_1,x_2)在高维空间中的向量表示,(<phi(x_1),phi(x_2)>)表示的是高维向量(phi(x_1))(phi(x_2)的内积。

4. 常用的核函数

线性核:

多项式核:

径向基核函数(Radial Basis Function):

高斯核函数:

Reference:

  1. https://blog.csdn.net/xianlingmao/article/details/7719122
  2. http://blog.sina.com.cn/s/blog_eb23a2510102x6he.html
  3. http://www.blogjava.net/zhenandaci/archive/2009/02/13/254519.html
  4. https://blog.csdn.net/lisi1129/article/details/70209945?locationNum=8&fps=1
不当之处,敬请批评指正。
原文地址:https://www.cnblogs.com/wumh7/p/9453582.html