支持向量机 Support Vector Machine
2017-12-17 13:08:50
SVM所做的工作简言之就是找到一个超平面将两组数据分开,并且这个超平面的Margin要最大。
一、线性SVM
所谓线性SVM是指一组数据是线性可分的,也就是说存在一个超平面可以将数据进行二分。
任何超平面都可以写作满足下面方程的点集 :
关于该超平面,有两点结论:
- w为该超平面的法向量
- 可以很方便的计算点到该平面的距离
如果这些训练数据是线性可分的,可以选择分离两类数据的两个平行超平面,使得它们之间的距离尽可能大。在这两个超平面范围内的区域称为“间隔”,最大间隔超平面是位于它们正中间的超平面。这些超平面可以由方程族:
或
来表示。为了计算的便捷性,我们引入了yi变量:
这样我们就可以将上面的两个式子转为一个:
我们可以很容易的计算得到Margin Width=2/||w||,为了得到最大的Width,等价于计算1/2||w||2的最小值。这里是一个有条件的求极值问题,可以使用拉格朗日乘数法进行计算。
通过对变量求偏导可以得到两个等式,将等式回代到Lp中可以得到对偶问题Ld,Ld中仅仅包含变量Alpha,通过对Ld的分析求解可以得到各个Alpha的值。
显然的是有了Alpha后w的值也就确定了,计算b的值也非常简单,一是可以将任意一个支持向量(Alpha!=0)的值带入平行超平面计算得到b,二是可以将所有支持向量的值带入平行超平面计算得到一个平均值。
此时的超平面方程为,其核心其实是计算两个向量的内积:
举个例子:
二、Soft Margin
有些问题并不是因为数据本身是非线性结构,而是因为数据中存在离群点(异常值)。对于这种偏离正常位置很远的数据点,我们称为outliers。在我们之前的SVM分类模型里,outliers的存在有可能造成很大的影响,因为超平面本身就是由几个少数的支持向量决定的,如果这些支持向量里又存在outliers的话,那么影响就会很大。
为了处理这种情况,SVM允许数据点在一定程度上可以偏离超平面。
此时的拉格朗日乘数法函数变为:
同样的,对各个变量求偏导,并进行反代得到对偶式:
我们可以很惊喜的发现这里的Ld和硬间隔的Ld在函数表达上是一样的,只是Alpha的范围有了限定。这大大方便了计算。
三、非线性SVM
上面提到的SVM只是针对线性可分的情况,对于线性不可分的情况需要使用空间变换的方法。
正如上图所示,对于在二维平面不可分的数据集,将其通过某个函数映射到三维空间之后就可分了。SVM也正是采用了这用方法。
比如这个问题就可以定义变换为[x1,x2]->[x1,x2,x12+x22] ,不过这种自定义的方式是非常麻烦的,难道对每个问题都要自己去思考这样的变换函数么?
SVM的另一个精妙的地方就是Kernel Trick。
先来看一个映射的例子:
计算特征空间的内积:
我们再一次惊喜的发现虽然映射到了很高的维度,但是实际的内积计算竟然使用原空间的内积计算得到!
这就是非常有名的Kernel Trick,也就是虽然进行了高维度映射,但是最终的计算只需要计算原空间的内积即可。
常用的Kernel函数有:
在进行了空间变换后的各个量的计算:
四、多分类问题
SVM的提出最初是用来解决二分类的监督学习问题的,要想使用SVM来解决多分类的问题有如下的三种解决方案:
- 直接在目标函数上进行修改,将空间划分成多个区域,但是这种方法的计算量非常的庞大,并不是很实用。
- one vs one
假设有A,B,C,D四类,在训练的时候以{A,B},{A,C},{A,D},{B,C},{B,D},{C,D}分别作为训练集,然后会得到6个SVM,在测试的时候,在每个训练到的SVM上进行预测,然后投票即可。
这种方法针对k个类别,需要设计k(k-1)/2个SVM。
- one vs rest
假设有A,B,C,D四类,在训练的时候以{A,REST},{B,REST},{C,REST},{D,REST}作为训练集,得到4个SVM,分类时将未知样本分类为具有最大分类函数值的那类。
这种方法针对k个类别,需要设计k个SVM。
稍稍退一步,我们就会想到所谓“一类对其余”的方法,就是每次仍然解一个两类分类的问题。比如我们有5个类别,第一次就把类别1的样本定为正样本,其余2,3,4,5的样本合起来定为负样本,这样得到一个两类分类器,它能够指出一篇文章是还是不是第1类的;第二次我们把类别2 的样本定为正样本,把1,3,4,5的样本合起来定为负样本,得到一个分类器,如此下去,我们可以得到5个这样的两类分类器(总是和类别的数目一致)。到了有文章需要分类的时候,我们就拿着这篇文章挨个分类器的问:是属于你的么?是属于你的么?哪个分类器点头说是了,文章的类别就确定了。这种方法的好处是每个优化问题的规模比较小,而且分类的时候速度很快(只需要调用5个分类器就知道了结果)。但有时也会出现两种很尴尬的情况,例如拿一篇文章问了一圈,每一个分类器都说它是属于它那一类的,或者每一个分类器都说它不是它那一类的,前者叫分类重叠现象,后者叫不可分类现象。分类重叠倒还好办,随便选一个结果都不至于太离谱,或者看看这篇文章到各个超平面的距离,哪个远就判给哪个。不可分类现象就着实难办了,只能把它分给第6个类别了……更要命的是,本来各个类别的样本数目是差不多的,但“其余”的那一类样本数总是要数倍于正类(因为它是除正类以外其他类别的样本之和嘛),这就人为的造成了上一节所说的“数据集偏斜”问题。
五、一些疑问的解答
- 为什么设置平行超平面的量为1?
线性分割面是f(x) = wx + b,该线性分割面是要把样本点分为两类:
对于正样本,都满足:wx + b > 0;
对于负样本,都满足:wx + b < 0;
从式子中可以观察到,如果同时放大或缩小w和b,最后的结果是不受影响的,还是同一个线性分割面。因此,我们可以做一个要求:
对于所有正样本,都满足:wx + b >= 1;
对于所有负样本,都满足:wx + b <= -1;
其中,间隔边界外的点对应的是">"或"<"号,而间隔边界上的点,对应的是"="号。
即得到:
对于间隔边界上的正样本,都满足:wx + b = 1;
对于间隔边界上的负样本,都满足:wx + b = -1;
这里设置为1只是一种假设,为了便于计算而设置的。并且总可以找到一组w,b使之成立。理由如下,对于特定的超平面,其法向量是唯一确定的也就是w的方向,其与原点的距离也是唯一确定的,也就是|b|/||w||。因此,b,w的具体大小其实是可变的,只要他们的比值不变即可,因此必然可以找到一组w,b使值成立。
如果将1设置成2或者3,也可以通过不等式两边同乘一个系数将其变为1,因此说,这里的公式表示的是一个超平面集,也就是说选取不同的支持向量,就可以得到不同的平行超平面。
- 如何计算各个Alpha?
序列最小优化算法(英语:Sequential minimal optimization, SMO)是一种用于解决支持向量机训练过程中所产生优化问题的算法。SMO由微软研究院的约翰·普莱特于1998年发明,目前被广泛使用于SVM的训练过程中,并在通行的SVM库LIBSVM中得到实现。1998年,SMO算法发表在SVM研究领域内引起了轰动,因为先前可用的SVM训练方法必须使用复杂的方法,并需要昂贵的第三方二次规划工具。而SMO算法较好地避免了这一问题。
问题定义:
SMO是一种解决此类支持向量机优化问题的迭代算法。由于目标函数为凸函数,一般的优化算法都通过梯度方法一次优化一个变量求解二次规划问题的最大值,但是,对于以上问题,由于限制条件
无法一次优化一个变量。为了克服以上的困难,SMO采用一次更新两个变量的方法。
数学推导:
假设算法在某次更新时更新的变量为alpha1,alpha2,则其余变量都可以视为常量。为了描述方便,规定
因而,二次规划目标值可以写成
算法框架:
优化向量选择的方法:
终止条件: