摘要:
本文对支持向量机做了简单介绍,并对线性可分支持向量分类机、线性支持向量分类机以及核函数做了详细介绍。
最近一直在看《机器学习实战》这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习,今天学习支持向量机(Support Vector Machines,SVM),这个无论是在模式识别还是机器学习等领域都赫赫有名的工具。
支持向量机是一项借助于最优化方法来解决机器学习问题的新工具,最初由 V.Vapnik 等人提出,近几年来其在理论研究和算法实现等方面都取得了很大的进展,开始成为克服“维数灾难”和过学习等困难的强有力的手段。
我们知道分类的目的是学会一个分类器,将数据库中的数据映射到给定类 别中的某一个,实现对未知数据类别的预测。
对于二维数据集,将数据集分隔开的直线称为分隔超平面,如果分隔的是三维的,分类的就是面,如果是更高维的就是超平面。将分类的决策边界统称为超平面,分布在超平面一侧的所有数据都属于某个类别,而分布在另一侧的所有数据都属于另一个类别。
那么对于分类而言,合理的构建分类器就尤为重要了,怎样才能构造分类器使得分类结果更为可信。下面举个例子说明:
对于左图坐标中的两类图形,如果让你画一条线,合理的将它们分开,你会如何怎样划分?这分法可就多了,到底哪种分法最好呢?我们可以引入一个实际问题:假设这两类图形分别代替的是两个居民区,现要在两居民区之间修一条路,那么该怎么修?我想大多数人都会选择那条红线吧,这条路权衡了远和近,也可以理解为折中,相对于每个点而言都是最公平的。
该例子就可以看成是在样本中寻找超平面将不同类别分开,那么为了更好的分类,就要使得不同类别之间的间隔最大,(间隔指的是点到分隔面的距离),这样如果分错或者在有限数据上训练分类器的话,也能最大程度的保证分类器的健壮。上述例子是在二维平面中寻找超平面,直接用肉眼就可以抉择,然而如果是三维或者更高维的情况,单凭人类肉眼是无能为力的,但机智的我们是可以通过计算机来寻找啊,通过相应的数学知识,建立对应的数学模型,通过计算机来求解。
这种寻找超平面分类思想就是SVM的思想,下来我们学习支持向量机。
用于分类的SVM本质上是一个二类分类模型。SVM属于监督学习,目的是在给定一个包含正例和反例的样本集合中寻找一个超平面对样本中的正例和反例进行分割,同时保证正例和反例之间的间隔最大。这样使得分类结果更为可信,而且对于未知的新样本才能有更好的分类预测能力。为了达到类别之间间隔最大,我们不需要考虑所有点,只需要让离分隔超平面最近的点距离分隔面的距离尽可能远即可,这里距离分隔超平面最近的那些点就是支持向量
下面来讲述一下SVM的原理:
首先,给定N个训练样本:{(x 1 ,y 1 ),(x 2 ,y 2 )…(x n ,y n )},其中x是d维向量,表明了每个样本具有d个属性;y i 指的是类别,其中,y i 属于 {-1,1}。寻找一个实值函数g(x),从而用分类函数f(x) = sgn(g(x))推断任意一个样本x所对应的y值。
线性可分SVM就是用上述的N个样本去训练学习得到一个线性分类器,也就是得到一个超平面:f(x) = sgn(w•x+b),线性可分表明当w•x+b>0时,对应的f(x) = 1,相应的当w•x+b<0时,对应的f(x) = -1,而w•x+b = 0就是所要寻找的超平面,此时对应的超平面为 硬间隔超平面 。接下来我们就来寻找这个超平面,基于 之前的分析,这里我们需要将样本分成两类,且保证分隔面到这两类中最近的点的距离尽可能的远,下面我们结合数学公式进行分析:
如上图所示,我们要寻找一个超平面最大的分隔这两个类,保证这两个类别之间的距离尽可能大,问题可以转化为最大化这两个类别中距离分隔面最近的点(支持向量)之间的距离。
首先,在上图中找到两个和这个超平面平行且距离相等的超平面:w•x+b = -1和w•x+b = 1,保证在这两个超平面之间没有任何样本点,那么问题就可转化为最大化这两个超平面之间的距离;进而结合相关的数学知识,因为超平面均二维,则它们之间的距离可表示为: d = |1+1|/sqrt(w 1 2 + w 2 2 ) = 2 / ||w||,问题就是最大化2 / ||w||,可以转化为最小化||w||;最后结合两个超平面之间没有任何样本点这个约束,则有:对于任何一个正样本y i =+1,它都要处于w•x+b = 1这个超平面的右边,即要保证:y= w•x+b>=+1,同理对于任何一个负样本y i =-1,它都要处于w•x+b=-1的左边,也就是要保证:y = w•x+b <=-1,于是可以合并为:y i (w•x i +b)>=1。
于是寻找最优超平面的问题就可以转化为二次规划问题:
min ||w|| 2 /2
s.t. y i (w•x i +b)>=1 i = 1,2,...,N
该问题的特点是目标函数是凸函数,并且约束条件为线性,则可以引入lagrange函数:
进而根据wolf对偶的定义,将原问题的各变量偏导置零有:
进而带入拉格朗日函数可将问题转化为原问题的拉格朗日对偶问题:
求解上述问题的最优解,计算w*和b*:
由KKT互补条件可得:
只有当x i 为支持向量的时候,对应的a i *才为正,否则皆为0,选择a*的一个正分量,计算可得:
由此可以构造分类超平面(w*•x)+b* = 0,由此求得决策函数:
进而得到分类函数:
从而对未知类别进行分类。根据KKT的条件,只有当x i 为支持向量的时候,对应的a i *才为正,否则皆为0。所以,我们只需求得新来的样本和支持向量的内积,然后运算即可。
上面所分析的是样本点线性可分的情况,我们在寻找硬间隔超平面时,首先是找到了两个分类边界,并假定所有的样本点都在这两个分类边界以外,但现实不总是那么尽人意,下面这种情况也势必会遇到:
这幅图里正类和负类都有点跑到“另类”的地盘,这时候就找不到一条直线将它们分开了,那要如何才能折中呢?对于这种数据点有一定偏离超平面的情况,我们仍然能继续使用超平面进行划分, 只是这时要对间隔进行“软化” ,构造软间隔超平面。简言之就是在两个分类边界之间允许出现样本点,这类样本点被称为边界支持向量。 这种向量机成为线性支持向量分类机,如下图所示:
对于该问题软化的方法是引入松弛变量:
从而得到软化之后针对于原问题的约束条件为:
松弛变量的设置,允许了某些样本点出现在对方的区域中,当松弛变量充分大时,样本点总是满足上述的约束条件,但也是要设法避免取值太大。为此我们可以重新调整目标函数,引入惩罚因子C,对离群点进行惩罚, 则二次规划问题转化为:
,其中,C>0
对应的拉格朗日函数为:
对应原问题的对偶问题为:
我们发现与线性可分模型中知识多了C>=a这个约束条件,按照之前的方法,同理计算得:
分类函数为:
其中 C为无穷大时,就等价于线性可分的情形。
上面讲述的是线性支持向量分类机,其中允许一定程度上的离群点,那若是样本点真的是线型不可分呢,那就得采用核函数进行处理了。
联系到T.M.Cover的模式可分性定理:一个复杂的模式分析问题映射到高维空间后,会比在低维空间线性可分。核方法就是通过非线性映射将原始数据通过特征映射嵌入到新的特征空间(Hilbert空间),发现数据在特征空间上的线性模式,进而选取相应的核函数利用输入计算内积。根据对偶解法可得算法所需要的信息位于特征空间上数据点之间的内积,维数过大时会影响算法的高效性,所以,将内积作为输入特征的直接函数,更高效的计算内积,减少了算法的时间复杂度。
常用的核函数有:
基于上述分析,对于线型不可分的样本点,问题就转化为在Hilbert空间中寻找超平面: ,相应的转化为二次规划问题:
其中核函数K满足条件:
我们再次选用RBF核函数,得到拉格朗日对偶问题:
相应的计算求得分类函数为:
接下来就可以据此对线性不可分问题进行分类了。因为大多数的a*是0,所以我们只需要计算新样本和少量的训练样本的核函数,求和去符号就可完成新样本的分类了。而采用不同的核函数,相当于采用不同的相似度对样本进行分类。
至此,关于支持向量机的相关知识大致就学习完了,之后的一些细节也将继续学习。