支持向量机(support vector machines, SVM)是一种二分类模型,它将实力的特征向量映射为空间中的一些点,SVM的目的就是想要画出一条线,以“最好地”区分这两类点。如果以后有了新的点,这条线也能做出很好的分类。SVM适合中小型数据样本、非线性、高维的分类问题。
将实例的特征向量(以二维为例)映射为空间中的一些点,如下图的实心点和空心点,它们属于不同的两类。SVM目的就是想要画出一条线,以“最好的”区分这两类点。
Q1:画线的标准是什么?
线是有无数条可以画的,区别就在于效果好不好。SVM将会寻找可以区分两个类别并且能使间隔(margin)最大的划分超平面。
超平面:样本的特征很可能是高维的,此时样本空间的划分就不是一条线了
Q2:间隔(margin)是什么?
对于任意一个超平面,其两侧数据点都距离它有一个最小距离。如下图,虚线是由距离中央实线最近的两个点所确定出来的(也就是由支持向量决定),但此时margin比较小,如果用第二种方式,margin明显变大也更接近我们的目标。
Q3:支持向量是什么?
从上图可以看出,虚线上的点到划分超平面的距离都是一样的,实际上只有这几个点共同确定了超平面的位置,因此被称作“支持向量”,“支持向量机”也是由此来的。
对于每个类,有一个当前类和其他类的二类分类器
将多分类问题转化为n个二分类问题,n就是类别个数
核方法主要思想:
在低维空间中不能线性分割的点集,通过转化为高维空间中的点集,很有可能变为线性可分的。
左边是一个原始的数据空间,虽然肉眼可见这个数据有明显的数据边界来进行区分,但是SVM并不能得到这样的边界,但是通过转换,例如转换到右边的空间,就可以称为线性可分的数据,公式如下:
Φ ( x ) → x 1 2 , x 2 2 , 2 x 1 x 2 \Phi(x) \to x_1^2, x_2^2,\sqrt{2}x_1x_2 Φ(x)→x12,x22,2x1x2
其中 Φ \Phi Φ是一个转换函数,其将2-D空间的数据转换到3-D空间, 2 \sqrt{2} 2是为了后续的计算方便,有了这个3-D空间的数据,就可以利用直线或者平面将其分开,假设使用罗切斯特回归的方式,那么公式如下:
β 0 + β 1 x 1 2 + β 2 x 2 2 + β 3 2 x 1 x 2 = 0 \beta_0+\beta_1x_1^2+\beta_2x_2^2+\beta_3\sqrt{2}x_1x_2 = 0 β0+β1x12+β2x22+β32x1x2=0
利用SVM也能得到这样的公式,在SVM的计算过程中,需要利用到点积的操作,即 < Φ ( x i ) , Φ ( x j ) > <\Phi(x_i),\Phi(x_j)> <Φ(xi),Φ(xj)>,先将某向量转换到高维空间,然后计算点积。
< Φ ( x i ) , Φ ( x j ) > = < { x i 1 2 , x i 2 2 , 2 x i 1 x i 2 } , { x j 1 2 , x j 2 2 , 2 x j 1 x j 2 } > = x i 1 2 x j 1 2 + x i 2 2 x j 2 2 + 2 x i 1 x i 2 x j 1 x j 2 \begin{split} \big<\Phi(x_i),\Phi(x_j)\big> &= \big<\{x_{i1}^2,x_{i2}^2,\sqrt{2}x_{i1}x_{i2}\},\{x_{j1}^2,x_{j2}^2,\sqrt{2}x_{j1}x_{j2}\}\big>\\ &=x_{i1}^2x_{j1}^2+x_{i2}^2x_{j2}^2+2x_{i1}x_{i2}x_{j1}x_{j2} \end{split} ⟨Φ(xi),Φ(xj)⟩=⟨{xi12,xi22,2xi1xi2},{xj12,xj22,2xj1xj2}⟩=xi12xj12+xi22xj22+2xi1xi2xj1xj2
使用核函数:(直接在原始空间中进行卷积)
< x i , x j > 2 = < { x i 1 , x i 2 } , { x j 1 , x j 2 } > 2 = ( x i 1 x j 1 + x i 2 x j 2 ) 2 = x i 1 2 x j 1 2 + x i 2 2 x j 2 2 + 2 x i 1 x i 2 x j 1 x j 2 \begin{split} \big
从计算量来看前者比二者多很多,从计算空间看后者也更直接
在线性SVM中转化为最优化问题时求解的公式计算都是以内积形式出现的,其中 Φ ( X ) \Phi(X) Φ(X)是把训练集中的向量点转化为高维的非线性映射函数。
因为内积的算法复杂度非常大,所以我们利用核函数来取代计算非线性映射函数的内积。
以下核函数和非线性映射函数的内积等同,但核函数K的运算量要远少于求内积。
K ( X i , X j ) = Φ ( X i ) ⋅ Φ ( X j ) K(X_i,X_j) = \Phi(X_i)\cdot\Phi(X_j) K(Xi,Xj)=Φ(Xi)⋅Φ(Xj)
h度多项式核函数:
K ( X i , X j ) = ( X i , X j + 1 ) h K(X_i,X_j) = (X_i,X_j+1)^h K(Xi,Xj)=(Xi,Xj+1)h
高斯径向基核函数:
K ( X i , X j ) = e − ∣ ∣ X i − X j ∣ ∣ 2 2 σ 2 K(X_i,X_j) = e^{\frac{-||X_i-X_j||^2}{2\sigma^2}} K(Xi,Xj)=e2σ2−∣∣Xi−Xj∣∣2
S型核函数:
K ( X i , X j ) = tanh ( k X i ⋅ X j − δ ) K(X_i,X_j) = \tanh(kX_i\cdot X_j-\delta) K(Xi,Xj)=tanh(kXi⋅Xj−δ)
如何选择使用哪个kernel?
使用kernel的意义在于:
无法用一条直线将两类样本点区分开
在线性不可分的情况下,数据集在空间中对应的向量无法被一个超平面区分开,如何处理:
如何利用非线性映射将原始数据转化到高维空间中去?
例子:
有一个3维输入量 X = ( x 1 , x 2 , x 3 ) X=(x_1,x_2,x_3) X=(x1,x2,x3),将其转化到6维空间Z中去:
Φ 1 ( X ) = x 1 , Φ 2 ( X ) = x 2 , Φ 3 ( X ) = x 3 , Φ 4 ( X ) = ( x 1 ) 2 , Φ 5 ( X ) = x 1 x 2 , Φ 6 ( X ) = x 1 x 3 \begin{split} &\Phi_1(X) = x_1,\Phi_2(X)=x_2,\Phi_3(X)=x_3,\\ &\Phi_4(X) = (x_1)^2,\Phi_5(X)=x_1x_2,\Phi_6(X) = x_1x_3 \end{split} Φ1(X)=x1,Φ2(X)=x2,Φ3(X)=x3,Φ4(X)=(x1)2,Φ5(X)=x1x2,Φ6(X)=x1x3
新的决策超平面: d ( Z ) = W Z + b d(Z) = WZ+b d(Z)=WZ+b,其中W和Z是向量,这个超平面是线性的
解出W和b之后带入原方程
d ( Z ) = w 1 x 1 + w 2 x 2 + w 3 x 3 + w 4 ( x 1 ) 2 + w 5 x 1 x 2 + w 6 x 1 x 3 + b = w 1 z 1 + w 2 z 2 + w 3 z 3 + w 4 z 4 + w 5 z 5 + w 6 z 6 + b \begin{split} d(Z) &= w_1x_1+w_2x_2+w_3x_3+w_4(x_1)^2+w_5x_1x_2+w_6x_1x_3+b\\ &=w_1z_1+w_2z_2+w_3z_3+w_4z_4+w_5z_5+w_6z_6+b \end{split} d(Z)=w1x1+w2x2+w3x3+w4(x1)2+w5x1x2+w6x1x3+b=w1z1+w2z2+w3z3+w4z4+w5z5+w6z6+b