SVM(支持向量机)
支持向量机(Support Vector Machine)是一种十分常见的分类器,曾经火爆十余年,分类能力强于NN,整体实力比肩LR与RF。核心思路是通过构造分割面将数据进行分离,寻找到一个超平面使样本分成两类,并且间隔最大。而我们求得的w就代表着我们需要寻找的超平面的系数 ,如下图:
一、超平面
1.超平面方程
一条直线方程, 其中m是斜率, c是直线在y轴的截距,它的直线方程可以表示:
y=mx+c
二维空间里面, 一条直线的方程可以表示为:
Ax+By+C=0
三维空间里面, 平面的方程可以表示为:
Ax+By+Cz+D=0
依次推广, n维空间的超平面方程可以表示为:
Ax1+Bx2+Cx3+Dx4+Ex5+Fx6+….+K=0
一般的对于n维空间的超平面的一般方程使用矩阵形式表示如下:
wTx=0
其中
w
和
x
是向量,
wTx
是两个向量的点积。 向量
w
通常被称为权重。
w,x
皆为向量,
wTx+b=0
就是
a1∗x1+a2∗x2+…an∗xn+b=0
对b做统一为
x=1
处理
因为n维空间对应的是n维坐标系, 仅仅用
x、y、z
几个字母较难表示, 所以此处用
x1、x2、x3、…、xn
来表示n维坐标系, 各个维度的系数此处也可以用
w1、w2、w3、…、wn
来表示;
2.求数据点到超平面方程距离
由超平面方程:
wTx+b=0
那么对于这个平面上任意两个点
xi,xj
,可以得到:
wTxi+b=0wTxj+b=0
把上面两个点做差,可以得到
wT⋅(xj−xj)=0
而
xj−xj
这两个点的差还是在这个平面上,所以可以得到
wT
是这个超平面的一个法向量,垂直于这个超平面。
对于空间中任意一个不属于这个超平面的点
x1
,它到这个超平面的距离要怎么得到呢?
参考下面点到平面的距离,只要找到法向量并投影就可以得到;
所以:我们可以连接点
x1
和点
xi
,得到
x1−xi
,把它与超平面的法向量
w⃗
做向量乘法,然后再除以法向量的长度,可以得到:
d=wT(x1−xi)||w||−−−−−−−−−−−又因为wTxi+b=0−−−−−−−−−可以得到如下距离算法−−−−−−−−−−−−−d=wTx1+b||w||
这里我们没有考虑到式子的正负,因为距离都是正的,所以结合向量机本身的假设把
y1
乘上去,是的上面式子永远非负,我们就得到超平面关于特征空间中某点
x1
的几何间隔:
d=y1wTx1+b||w||
因此,在支持向量机中,对线性方程
wTx=0
,样本点D到超平面的距离就有:
r=|wTx+b|||w||
所以:
(1)定义超平面(w,b)关于样本点
(xi,yi)
的几何间隔为:
γi=yi(w||w||⋅xi+b||w||)
(2)定义超平面(w,b)关于训练数据集T的几何间隔为超平面(w,b)关于T中所有样本点
(xi,yi)
的几何间隔之最小值,即:
γ=mini=1,2,...,Nγi
二、离超平面最近的点距离超平面尽可能的远
支持向量机的最核心思想就是最大化分隔两个类的间隔,但这句话并不是很好理解。
这句话有点绕,分开三步看:
1.找到一个超平面,求出样本点到超平面的距离(上面的距离公式)
2.找到这些距离中最小的,这个最小的就是离超平面最近的点(这个只要把所有的点到平面的距离求出来就可以了)
3.使得超平面尽可能的距离这个最近的点尽量远
这个是主要疑问点,距离确定了怎么能又要求尽可能的远呢?这时候的距离不是一个定值么?其实这个可以看出一个动态的规划问题,我们假设超平面或者说支持平面是一个有n种可能函数,这n种可能都有对应的样本集D中点到n个超平面的距离的集合,我们就是从这n个超平面中选取一个能保证距离最近的点离超平面有最大值;
这样里面有涉及到一个约束问题:
1.取样本点对每一个超平面
(wi,bi)
的距离这个超平面来说最近的样本点距离
γi
,找出对每一个
(wi,bi)
来说最近的
γi,min
;
2.保证
γ
是所有超平面中最小的最大值;就是找到
γi,min
中
i=1,2,3...n
中的最大值;
从这两点出发就可以找到最符合要求的支持平面了;以上两点可以抽象成一个约束问题:
max(γ^||w||)s.t.yi⋅(wTxi+b||w||)≥γ^||w||(1)(2)
为了便于优化推导,我们可以令
γ=1
maxw,b(1||w||)s.t.yi⋅(wTxi+b)≥1(3)(4)
对于式子(3)而言最大化
1||w||
和最小化
12||w||2
是等价的(为了可导便于优化)可以变成如下:
minw,b(12||w||2)s.t.yi⋅(wTxi+b)≥1(5)(6)
这个约束问题可以根据拉个朗日方法求得约束条件下的极值问题(拉个朗日乘子法会单独说明):
三、构建拉格朗日函数
通过拉格朗日乘子法,由5,6两式可以得到:
L(w,b,a)=12||w||2−∑i=1nai(yi.(wT.Φ(xi)+b)−1)
化简,将1提取出来得到:
L(x,α,β)=12||w||2−∑i=1Nαiyi(wTxi+b)+∑j=1Nαi(7)
对式子7求极值可以通过求导法,在导函数为零时求得极值;
所以对式子求偏导可得:
δLδwδLδb=0 => w=∑i=1naiyixi=0 => 0=∑i=1naiyi
将上面两个值带入到式(7)可以化简得到:
L(w,b,a)min(w,b)=12wTw−wT∑i=1naiyixi−b∑i=1naiyi+∑i=1nai=∑i=1nai−12(∑i=1naiyixi)T∑i=1naiyixi=∑i=1nai−12∑i=1,j=1naiajyiyjxixj
上面式子就是一个只关于
α
的函数方程;这个时候就是要求点到超平面要足够远的问题了(求确定w,b情况下最大间隔) ;
所以上面式子的求极值也可以转换成拉格朗日乘子法问题:就是求
minw,bL(w,b,α)
中(w,b)确定情况下对
α
变量求极大值;根据这个可以得到如下约束与函数关系:
maxa∑i=1nai−12∑i=1,j=1naiajyiyjxixjs.t.∑i=1naiyi=0ai≥0,i=1,2,...,N
上面的式子求极大值可以转换为下面的式子求极小值:
mina12∑i=1,j=1naiajyiyjxixj−∑i=1nais.t.∑i=1naiyi=0ai≥0,i=1,2,...,N
上面的对偶的式子所获得的解,能不能代表是原来式子的所需极值问题的解呢?这个可以根据广义拉格朗日的对偶问题证明:此时约束条件下求得的极值就是原来约束条件的极值。
最后:对于给定的样本点就可以通过上面的约束条件求得
α
,而通过
α
就可以根据(7)式子中求偏导得到的w,b和
α
关系求得对应的超平面。由这个可以得到,超平面是唯一的。
w∗=∑i=1na∗iyixib∗=yi−∑i=1na∗iyi(xiyi)
上面推导成立的两个隐藏条件是拉格朗日的对偶问题和KKT条件,那么这两个又是什么呢?
这个可以参考:
真正理解拉格朗日乘子法和 KKT 条件
四、对线性不可分数据优化
对线性不可分数据需要修改上述的硬间隔最大化,使其软间隔最大化;
线性不可分意味着某些样本点
(xi,yi)
不能满足函数间隔大于等于1的约束条件,我们可以对每个样本点
(xi,yi)
引入一个松弛变量
ξi≥0
,使得函数间隔加上松弛变量大于等于1,这样约束条件变成:
yi⋅(wTxi+b)≥1−ξi
同时,为每个松弛变量
ξi
,补充一个代价
ξi
,目标函数由原来的
12||w||2
变成
12||w||2+C∑Ni=1ξi
所以原来的求解问题可以变换为如下:
minw,b(12||w||2+C∑i=1Nξi)s.t.yi⋅(wTxi+b)≥1−ξiξi≥0,i=1,2,...,N(91)(92)(93)
为了解决个别正例和负例样本点很接近时,引入松弛因子
当C趋近于无穷大时,容忍度越低,分类越严格
当C趋近于很小时,意味着容忍度很高
对于引入松弛变量后的求解可以参见SVM的一般求解方法。
五、核函数的引入
在SVM中,其中最重要的也是最核心的就是核函数的选取和参数选择,当然这个需要大量的经验来支撑。SVM相对感知机而言,它可以解决线性不可分的问题,那么它是怎么解决的呢?它的解决思想很简单,就是对原始数据的维度变换,一般是扩维变换,使得原样本空间中的样本点线性不可分,但是在变维之后的空间中样本点是线性可分的,然后再变换后的高维空间中进行分类。
这个时候的对偶凸优化就表示为了:
maxa∑i=1nai−12∑i=1,j=1naiajyiyjΦ(xi)Φ(xj)s.t.∑i=1naiyi=0ai≥0,i=1,2,...,N
其中
Φ(xi)
表示原来的样本扩维后的坐标。
在求解对偶问题的过程中都会用到各样本点的内积的结果,那么这时候问题来了,在很多情况下,扩维可能会把原数据扩到很高维(甚至无穷维),这时候直接求内积是非常困难的,我们为了避免做这样的事就提出了核函数的概念。
核函数:任意两个样本点在扩维后的空间的内积,如果等于这两个样本点在原来空间经过一个函数后的输出,那么这个函数就叫核函数。
举个例子,假设所有样本点都是二维点,其值分别为(x,y),
k(xi,xj)=<xi,xj>2
他对应的映射方式
Φ((x,y))=(x2,2–√xy,y2)
以验证任意两个扩维后的样本点在3维空间的内积等于原样本点在2维空间的函数输出:
<Φ(x1),Φ(x2)>=<(x21,2–√x1y1,y21),(x22,2–√x2y2,y22)>=x21x22+2x1x2y1y2+y21y22=(x1x2+y1y2)2=<v1,v2>2=K(v1,v2)
有了这个核函数,以后的高维内积都可以转化为低维的函数运算了,这里也就是只需要计算低维的内积,然后再平方。明显问题得到解决且复杂度降低极大。总而言之,
核函数它本质上隐含了从低维到高维的映射,从而避免直接计算高维的内积。