机器学习十大算法之四:SVM(支持向量机)

SVM(支持向量机)

支持向量机(Support Vector Machine)是一种十分常见的分类器,曾经火爆十余年,分类能力强于NN,整体实力比肩LR与RF。核心思路是通过构造分割面将数据进行分离,寻找到一个超平面使样本分成两类,并且间隔最大。而我们求得的w就代表着我们需要寻找的超平面的系数 ,如下图:
机器学习十大算法之四:SVM(支持向量机)_第1张图片

一、超平面

1.超平面方程

一条直线方程, 其中m是斜率, c是直线在y轴的截距,它的直线方程可以表示: y=mx+c y = m x + c
二维空间里面, 一条直线的方程可以表示为: Ax+By+C=0 A x + B y + C = 0
三维空间里面, 平面的方程可以表示为: Ax+By+Cz+D=0 A x + B y + C z + D = 0
依次推广, n维空间的超平面方程可以表示为: Ax1+Bx2+Cx3+Dx4+Ex5+Fx6+.+K=0 A x 1 + B x 2 + C x 3 + D x 4 + E x 5 + F x 6 + … . + K = 0
一般的对于n维空间的超平面的一般方程使用矩阵形式表示如下:

wTx=0 w T x = 0

其中 w w x x 是向量, wTx w T x 是两个向量的点积。 向量 w w 通常被称为权重。 w,x w , x 皆为向量, wTx+b=0 w T x + b = 0 就是
a1x1+a2x2+anxn+b=0 a 1 ∗ x 1 + a 2 ∗ x 2 + … a n ∗ x n + b = 0 对b做统一为 x=1 x = 1 处理
因为n维空间对应的是n维坐标系, 仅仅用 xyz x 、 y 、 z 几个字母较难表示, 所以此处用 x1x2x3xn x 1 、 x 2 、 x 3 、 … 、 x n 来表示n维坐标系, 各个维度的系数此处也可以用 w1w2w3wn w 1 、 w 2 、 w 3 、 … 、 w n 来表示;

2.求数据点到超平面方程距离

由超平面方程: wTx+b=0 w T x + b = 0
那么对于这个平面上任意两个点 xixj x i , x j ,可以得到:

wTxi+b=0wTxj+b=0 w T x i + b = 0 w T x j + b = 0

把上面两个点做差,可以得到

wT(xjxj)=0 w T ⋅ ( x j − x j ) = 0

xjxj x j − x j 这两个点的差还是在这个平面上,所以可以得到 wT w T 是这个超平面的一个法向量,垂直于这个超平面。
对于空间中任意一个不属于这个超平面的点 x1 x 1 ,它到这个超平面的距离要怎么得到呢?
参考下面点到平面的距离,只要找到法向量并投影就可以得到;
机器学习十大算法之四:SVM(支持向量机)_第2张图片
所以:我们可以连接点 x1 x 1 和点 xi x i ,得到 x1xi x 1 − x i ,把它与超平面的法向量 w⃗  w → 做向量乘法,然后再除以法向量的长度,可以得到:
d=wT(x1xi)||w||wTxi+b=0d=wTx1+b||w|| d = w T ( x 1 − x i ) | | w | | − − − − − − − − − − − 又 因 为 w T x i + b = 0 − − − − − − − − − 可 以 得 到 如 下 距 离 算 法 − − − − − − − − − − − − − d = w T x 1 + b | | w | |

这里我们没有考虑到式子的正负,因为距离都是正的,所以结合向量机本身的假设把 y1 y 1 乘上去,是的上面式子永远非负,我们就得到超平面关于特征空间中某点 x1 x 1 的几何间隔:
d=y1wTx1+b||w|| d = y 1 w T x 1 + b | | w | |

因此,在支持向量机中,对线性方程 wTx=0 w T x = 0 ,样本点D到超平面的距离就有:

r=|wTx+b|||w|| r = | w T x + b | | | w | |

所以:
(1)定义超平面(w,b)关于样本点 (xi,yi) ( x i , y i ) 的几何间隔为:
γi=yi(w||w||xi+b||w||) γ i = y i ( w | | w | | ⋅ x i + b | | w | | )

(2)定义超平面(w,b)关于训练数据集T的几何间隔为超平面(w,b)关于T中所有样本点 (xi,yi) ( x i , y i ) 的几何间隔之最小值,即:
γ=mini=1,2,...,Nγi γ = min i = 1 , 2 , . . . , N γ i

二、离超平面最近的点距离超平面尽可能的远

支持向量机的最核心思想就是最大化分隔两个类的间隔,但这句话并不是很好理解。
这句话有点绕,分开三步看:
1.找到一个超平面,求出样本点到超平面的距离(上面的距离公式)
2.找到这些距离中最小的,这个最小的就是离超平面最近的点(这个只要把所有的点到平面的距离求出来就可以了)
3.使得超平面尽可能的距离这个最近的点尽量远

这个是主要疑问点,距离确定了怎么能又要求尽可能的远呢?这时候的距离不是一个定值么?其实这个可以看出一个动态的规划问题,我们假设超平面或者说支持平面是一个有n种可能函数,这n种可能都有对应的样本集D中点到n个超平面的距离的集合,我们就是从这n个超平面中选取一个能保证距离最近的点离超平面有最大值;

这样里面有涉及到一个约束问题:
1.取样本点对每一个超平面 (wi,bi) ( w i , b i ) 的距离这个超平面来说最近的样本点距离 γi γ i ,找出对每一个 (wi,bi) ( w i , b i ) 来说最近的 γi,min γ i , m i n
2.保证 γ γ 是所有超平面中最小的最大值;就是找到 γi,min γ i , m i n i=1,2,3...n i = 1 , 2 , 3... n 中的最大值;

从这两点出发就可以找到最符合要求的支持平面了;以上两点可以抽象成一个约束问题:

max(γ^||w||)s.t.yi(wTxi+b||w||)γ^||w||(1)(2) (1) m a x ( γ ^ | | w | | ) (2) s . t . y i ⋅ ( w T x i + b | | w | | ) ≥ γ ^ | | w | |

为了便于优化推导,我们可以令 γ=1 γ = 1
maxw,b(1||w||)s.t.yi(wTxi+b)1(3)(4) (3) m a x w , b ( 1 | | w | | ) (4) s . t . y i ⋅ ( w T x i + b ) ≥ 1

对于式子(3)而言最大化 1||w|| 1 | | w | | 和最小化 12||w||2 1 2 | | w | | 2 是等价的(为了可导便于优化)可以变成如下:
minw,b(12||w||2)s.t.yi(wTxi+b)1(5)(6) (5) m i n w , b ( 1 2 | | w | | 2 ) (6) s . t . y i ⋅ ( w T x i + b ) ≥ 1

这个约束问题可以根据拉个朗日方法求得约束条件下的极值问题(拉个朗日乘子法会单独说明):

三、构建拉格朗日函数

通过拉格朗日乘子法,由5,6两式可以得到:

L(w,b,a)=12||w||2i=1nai(yi.(wT.Φ(xi)+b)1) L ( w , b , a ) = 1 2 | | w | | 2 − ∑ i = 1 n a i ( y i . ( w T . Φ ( x i ) + b ) − 1 )

化简,将1提取出来得到:
L(x,α,β)=12||w||2i=1Nαiyi(wTxi+b)+j=1Nαi(7) (7) L ( x , α , β ) = 1 2 | | w | | 2 − ∑ i = 1 N α i y i ( w T x i + b ) + ∑ j = 1 N α i

对式子7求极值可以通过求导法,在导函数为零时求得极值;
所以对式子求偏导可得:
δLδwδLδb=0 =>  w=i=1naiyixi=0 =>  0=i=1naiyi δ L δ w = 0   =>     w = ∑ i = 1 n a i y i x i δ L δ b = 0   =>     0 = ∑ i = 1 n a i y i

将上面两个值带入到式(7)可以化简得到:
L(w,b,a)min(w,b)=12wTwwTi=1naiyixibi=1naiyi+i=1nai=i=1nai12(i=1naiyixi)Ti=1naiyixi=i=1nai12i=1,j=1naiajyiyjxixj L ( w , b , a ) m i n ( w , b ) = 1 2 w T w − w T ∑ i = 1 n a i y i x i − b ∑ i = 1 n a i y i + ∑ i = 1 n a i = ∑ i = 1 n a i − 1 2 ( ∑ i = 1 n a i y i x i ) T ∑ i = 1 n a i y i x i = ∑ i = 1 n a i − 1 2 ∑ i = 1 , j = 1 n a i a j y i y j x i x j

上面式子就是一个只关于 α α 的函数方程;这个时候就是要求点到超平面要足够远的问题了(求确定w,b情况下最大间隔) ;
所以上面式子的求极值也可以转换成拉格朗日乘子法问题:就是求 minw,bL(w,b,α) m i n w , b L ( w , b , α ) 中(w,b)确定情况下对 α α 变量求极大值;根据这个可以得到如下约束与函数关系:
maxai=1nai12i=1,j=1naiajyiyjxixjs.t.i=1naiyi=0ai0,i=1,2,...,N m a x a ∑ i = 1 n a i − 1 2 ∑ i = 1 , j = 1 n a i a j y i y j x i x j s . t . ∑ i = 1 n a i y i = 0 a i ≥ 0 , i = 1 , 2 , . . . , N

上面的式子求极大值可以转换为下面的式子求极小值:
mina12i=1,j=1naiajyiyjxixji=1nais.t.i=1naiyi=0ai0,i=1,2,...,N m i n a 1 2 ∑ i = 1 , j = 1 n a i a j y i y j x i x j − ∑ i = 1 n a i s . t . ∑ i = 1 n a i y i = 0 a i ≥ 0 , i = 1 , 2 , . . . , N

上面的对偶的式子所获得的解,能不能代表是原来式子的所需极值问题的解呢?这个可以根据广义拉格朗日的对偶问题证明:此时约束条件下求得的极值就是原来约束条件的极值。

最后:对于给定的样本点就可以通过上面的约束条件求得 α α ,而通过 α α 就可以根据(7)式子中求偏导得到的w,b和 α α 关系求得对应的超平面。由这个可以得到,超平面是唯一的。

w=i=1naiyixib=yii=1naiyi(xiyi) w ∗ = ∑ i = 1 n a i ∗ y i x i b ∗ = y i − ∑ i = 1 n a i ∗ y i ( x i y i )

上面推导成立的两个隐藏条件是拉格朗日的对偶问题和KKT条件,那么这两个又是什么呢?
这个可以参考: 真正理解拉格朗日乘子法和 KKT 条件

四、对线性不可分数据优化

对线性不可分数据需要修改上述的硬间隔最大化,使其软间隔最大化;
线性不可分意味着某些样本点 (xi,yi) ( x i , y i ) 不能满足函数间隔大于等于1的约束条件,我们可以对每个样本点 (xi,yi) ( x i , y i ) 引入一个松弛变量 ξi0 ξ i ≥ 0 ,使得函数间隔加上松弛变量大于等于1,这样约束条件变成:

yi(wTxi+b)1ξi y i ⋅ ( w T x i + b ) ≥ 1 − ξ i

同时,为每个松弛变量 ξi ξ i ,补充一个代价 ξi ξ i ,目标函数由原来的 12||w||2 1 2 | | w | | 2 变成 12||w||2+CNi=1ξi 1 2 | | w | | 2 + C ∑ i = 1 N ξ i
所以原来的求解问题可以变换为如下:
minw,b(12||w||2+Ci=1Nξi)s.t.yi(wTxi+b)1ξiξi0,i=1,2,...,N(91)(92)(93) (91) m i n w , b ( 1 2 | | w | | 2 + C ∑ i = 1 N ξ i ) (92) s . t . y i ⋅ ( w T x i + b ) ≥ 1 − ξ i (93) ξ i ≥ 0 , i = 1 , 2 , . . . , N

为了解决个别正例和负例样本点很接近时,引入松弛因子
当C趋近于无穷大时,容忍度越低,分类越严格
当C趋近于很小时,意味着容忍度很高
对于引入松弛变量后的求解可以参见SVM的一般求解方法。

五、核函数的引入

在SVM中,其中最重要的也是最核心的就是核函数的选取和参数选择,当然这个需要大量的经验来支撑。SVM相对感知机而言,它可以解决线性不可分的问题,那么它是怎么解决的呢?它的解决思想很简单,就是对原始数据的维度变换,一般是扩维变换,使得原样本空间中的样本点线性不可分,但是在变维之后的空间中样本点是线性可分的,然后再变换后的高维空间中进行分类。
这个时候的对偶凸优化就表示为了:

maxai=1nai12i=1,j=1naiajyiyjΦ(xi)Φ(xj)s.t.i=1naiyi=0ai0,i=1,2,...,N m a x a ∑ i = 1 n a i − 1 2 ∑ i = 1 , j = 1 n a i a j y i y j Φ ( x i ) Φ ( x j ) s . t . ∑ i = 1 n a i y i = 0 a i ≥ 0 , i = 1 , 2 , . . . , N

其中 Φ(xi) Φ ( x i ) 表示原来的样本扩维后的坐标。
在求解对偶问题的过程中都会用到各样本点的内积的结果,那么这时候问题来了,在很多情况下,扩维可能会把原数据扩到很高维(甚至无穷维),这时候直接求内积是非常困难的,我们为了避免做这样的事就提出了核函数的概念。
核函数:任意两个样本点在扩维后的空间的内积,如果等于这两个样本点在原来空间经过一个函数后的输出,那么这个函数就叫核函数。

举个例子,假设所有样本点都是二维点,其值分别为(x,y), k(xi,xj)=<xi,xj>2 k ( x i , x j ) =< x i , x j > 2 他对应的映射方式 Φ((x,y))=(x2,2xy,y2) Φ ( ( x , y ) ) = ( x 2 , 2 x y , y 2 ) 以验证任意两个扩维后的样本点在3维空间的内积等于原样本点在2维空间的函数输出:

<Φ(x1),Φ(x2)>=<(x21,2x1y1,y21),(x22,2x2y2,y22)>=x21x22+2x1x2y1y2+y21y22=(x1x2+y1y2)2=<v1,v2>2=K(v1,v2) < Φ ( x 1 ) , Φ ( x 2 ) > = < ( x 1 2 , 2 x 1 y 1 , y 1 2 ) , ( x 2 2 , 2 x 2 y 2 , y 2 2 ) > = x 1 2 x 2 2 + 2 x 1 x 2 y 1 y 2 + y 1 2 y 2 2 = ( x 1 x 2 + y 1 y 2 ) 2 = < v 1 , v 2 > 2 = K ( v 1 , v 2 )

有了这个核函数,以后的高维内积都可以转化为低维的函数运算了,这里也就是只需要计算低维的内积,然后再平方。明显问题得到解决且复杂度降低极大。总而言之, 核函数它本质上隐含了从低维到高维的映射,从而避免直接计算高维的内积。

你可能感兴趣的:(人工智能学习,机器学习,算法基础)