机器学习十大算法之四:SVM(支持向量机)
SVM(支持向量机)
支持向量机(Support Vector Machine)是一种十分常见的分类器,曾经火爆十余年,分类能力强于NN,整体实力比肩LR与RF。核心思路是通过构造分割面将数据进行分离,寻找到一个超平面使样本分成两类,并且间隔最大。而我们求得的w就代表着我们需要寻找的超平面的系数 ,如下图:
一、超平面
1.超平面方程
一条直线方程, 其中m是斜率, c是直线在y轴的截距,它的直线方程可以表示:
二维空间里面, 一条直线的方程可以表示为:
三维空间里面, 平面的方程可以表示为:
依次推广, n维空间的超平面方程可以表示为:
一般的对于n维空间的超平面的一般方程使用矩阵形式表示如下:
其中和是向量, 是两个向量的点积。 向量通常被称为权重。皆为向量,就是
对b做统一为处理
因为n维空间对应的是n维坐标系, 仅仅用几个字母较难表示, 所以此处用来表示n维坐标系, 各个维度的系数此处也可以用来表示;
2.求数据点到超平面方程距离
由超平面方程:
那么对于这个平面上任意两个点 ,可以得到:
把上面两个点做差,可以得到
而这两个点的差还是在这个平面上,所以可以得到是这个超平面的一个法向量,垂直于这个超平面。
对于空间中任意一个不属于这个超平面的点,它到这个超平面的距离要怎么得到呢?
参考下面点到平面的距离,只要找到法向量并投影就可以得到;
所以:我们可以连接点 和点 ,得到 ,把它与超平面的法向量 做向量乘法,然后再除以法向量的长度,可以得到:
这里我们没有考虑到式子的正负,因为距离都是正的,所以结合向量机本身的假设把乘上去,是的上面式子永远非负,我们就得到超平面关于特征空间中某点 的几何间隔:
因此,在支持向量机中,对线性方程,样本点D到超平面的距离就有:
所以:
(1)定义超平面(w,b)关于样本点的几何间隔为:
(2)定义超平面(w,b)关于训练数据集T的几何间隔为超平面(w,b)关于T中所有样本点的几何间隔之最小值,即:
二、离超平面最近的点距离超平面尽可能的远
支持向量机的最核心思想就是最大化分隔两个类的间隔,但这句话并不是很好理解。
这句话有点绕,分开三步看:
1.找到一个超平面,求出样本点到超平面的距离(上面的距离公式)
2.找到这些距离中最小的,这个最小的就是离超平面最近的点(这个只要把所有的点到平面的距离求出来就可以了)
3.使得超平面尽可能的距离这个最近的点尽量远
这个是主要疑问点,距离确定了怎么能又要求尽可能的远呢?这时候的距离不是一个定值么?其实这个可以看出一个动态的规划问题,我们假设超平面或者说支持平面是一个有n种可能函数,这n种可能都有对应的样本集D中点到n个超平面的距离的集合,我们就是从这n个超平面中选取一个能保证距离最近的点离超平面有最大值;
这样里面有涉及到一个约束问题:
1.取样本点对每一个超平面的距离这个超平面来说最近的样本点距离,找出对每一个来说最近的;
2.保证是所有超平面中最小的最大值;就是找到中中的最大值;
从这两点出发就可以找到最符合要求的支持平面了;以上两点可以抽象成一个约束问题:
为了便于优化推导,我们可以令
对于式子(3)而言最大化和最小化是等价的(为了可导便于优化)可以变成如下:
这个约束问题可以根据拉个朗日方法求得约束条件下的极值问题(拉个朗日乘子法会单独说明):
三、构建拉格朗日函数
通过拉格朗日乘子法,由5,6两式可以得到:
化简,将1提取出来得到:
对式子7求极值可以通过求导法,在导函数为零时求得极值;
所以对式子求偏导可得:
将上面两个值带入到式(7)可以化简得到:
上面式子就是一个只关于的函数方程;这个时候就是要求点到超平面要足够远的问题了(求确定w,b情况下最大间隔) ;
所以上面式子的求极值也可以转换成拉格朗日乘子法问题:就是求中(w,b)确定情况下对变量求极大值;根据这个可以得到如下约束与函数关系:
上面的式子求极大值可以转换为下面的式子求极小值:
上面的对偶的式子所获得的解,能不能代表是原来式子的所需极值问题的解呢?这个可以根据广义拉格朗日的对偶问题证明:此时约束条件下求得的极值就是原来约束条件的极值。
最后:对于给定的样本点就可以通过上面的约束条件求得,而通过就可以根据(7)式子中求偏导得到的w,b和关系求得对应的超平面。由这个可以得到,超平面是唯一的。
上面推导成立的两个隐藏条件是拉格朗日的对偶问题和KKT条件,那么这两个又是什么呢?
这个可以参考:真正理解拉格朗日乘子法和 KKT 条件
四、对线性不可分数据优化
对线性不可分数据需要修改上述的硬间隔最大化,使其软间隔最大化;
线性不可分意味着某些样本点不能满足函数间隔大于等于1的约束条件,我们可以对每个样本点引入一个松弛变量,使得函数间隔加上松弛变量大于等于1,这样约束条件变成:
同时,为每个松弛变量,补充一个代价,目标函数由原来的变成
所以原来的求解问题可以变换为如下:
为了解决个别正例和负例样本点很接近时,引入松弛因子
当C趋近于无穷大时,容忍度越低,分类越严格
当C趋近于很小时,意味着容忍度很高
对于引入松弛变量后的求解可以参见SVM的一般求解方法。
五、核函数的引入
在SVM中,其中最重要的也是最核心的就是核函数的选取和参数选择,当然这个需要大量的经验来支撑。SVM相对感知机而言,它可以解决线性不可分的问题,那么它是怎么解决的呢?它的解决思想很简单,就是对原始数据的维度变换,一般是扩维变换,使得原样本空间中的样本点线性不可分,但是在变维之后的空间中样本点是线性可分的,然后再变换后的高维空间中进行分类。
这个时候的对偶凸优化就表示为了:
其中表示原来的样本扩维后的坐标。
在求解对偶问题的过程中都会用到各样本点的内积的结果,那么这时候问题来了,在很多情况下,扩维可能会把原数据扩到很高维(甚至无穷维),这时候直接求内积是非常困难的,我们为了避免做这样的事就提出了核函数的概念。
核函数:任意两个样本点在扩维后的空间的内积,如果等于这两个样本点在原来空间经过一个函数后的输出,那么这个函数就叫核函数。
举个例子,假设所有样本点都是二维点,其值分别为(x,y), 他对应的映射方式以验证任意两个扩维后的样本点在3维空间的内积等于原样本点在2维空间的函数输出:
有了这个核函数,以后的高维内积都可以转化为低维的函数运算了,这里也就是只需要计算低维的内积,然后再平方。明显问题得到解决且复杂度降低极大。总而言之,核函数它本质上隐含了从低维到高维的映射,从而避免直接计算高维的内积。