首页 > 代码库 > 支持向量机SVM

支持向量机SVM

1.1 SVM 概念

支持向量机SVM是一种原创性(非组合)的具有明显直观几何意义的分类算法,具有较高的准确率。源于Vapnik和Chervonenkis关于统计学习的早期工作(1971年),第一篇有关论文由Boser、Guyon、Vapnik发表在1992年。思想直观,但细节异常复杂,内容涉及凸分析算法,核函数,神经网络等高深的领域。通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

其思路是简单情况,线性可分,把问题转化为一个凸优化问题,可以用拉格朗日乘子法简化,然后用既有的算法解决。复杂情况,线性丌可分,用映射函数将样本投射到高维空间,使其变成线性可分的情形。利用核函数来减少高维度计算量。

问题的提出:最优分离平面(决策边界)

技术分享技术分享

最大边缘超平面(MMH)

技术分享技术分享

    这里我们考虑的是一个两类的分类问题,数据点用 x 来表示,这是一个 n 维向量,w^T中的T代表转置,而类别用 y 来表示,可以取 1 或者 -1 ,分别代表两个不同的类。一个线性分类器的学习目标就是要在 n 维的数据空间中找到一个分类超平面,其方程可以表示为: 技术分享

 1.2 1或-1分类标准的起源:logistic回归

    Logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。
    形式化表示就是 假设函数技术分享技术分享其中x是n维特征向量,函数g就是 logistic函数。, 技术分享技术分享的图像如下所示,将无穷映射到了(0,1)。
技术分享
 而假设logistic函数就是特征属于y=1的概率则有技术分享
当我们要判别一个新来的特征技术分享属于哪个类时,只需求,若技术分享大于0.5就是y=1的类,反之属于y=0类。
    技术分享只和技术分享有关,若技术分享>0,则技术分享技术分享,此时该特征属于y=1类。g(z)只不过是用来映射,真实的类别决定权还在技术分享技术分享。还有当技术分享技术分享技术分享技术分享=1,反之技术分享技术分享=0。
如果我们只从技术分享技术分享出发,希望模型达到的目标无非就是让训练数据中y=1的特征技术分享技术分享, 而y=0的特征技术分享技术分享。 Logistic回归就是要学习得到技术分享技术分享,使得正例的特征远大于0,负例的特征远小于0,强调在全部训练实例上达到这个目标。

1.3 形式化标示

    这次使用的标签是y=-1,y=1,替换在logistic回归中使用的y=0和y=1。同时将技术分享技术分享替换成w和b。以前的技术分享技术分享,其中认为技术分享技术分享。现在我们替换技术分享为b,后面替换技术分享技术分享技术分享技术分享(即技术分享技术分享)。这样,我们让技术分享技术分享,进一步技术分享技术分享。也就是说除了y由y=0变为y=-1,只是标记不同外,与logistic回归的形式化表示没区别。
    再明确下假设函数   技术分享
    技术分享上面提到过我们只需考虑技术分享技术分享的正负问题,而不用关心g(z),因此我们这里将g(z)做一个简化,将其简单映射到y=-1和y=1上。映射关系如下:技术分享
技术分享
    于此,想必已经解释明白了为何线性分类的标准一般用1 或者-1 来标示。
    注:上小节来自jerrylead所作的斯坦福机器学习课程的笔记。
2.1 SVM的线性分类

SVM的线性分类实际就是找gap最大,即决策边界距离最远

技术分享技术分享

 

 技术分享

设x1,x2分别为上支撑边界和下支撑边界的两点,则满足技术分享两式相减后根据内积定义,则可得到技术分享技术分享,由上图可得技术分享综合有技术分享,此时问题就就变成了凸优化问题。凸优化可以由拉格朗日乘子法解决。

 

2.2 拉格朗日乘子法

技术分享

技术分享

背景:拉格朗日乘子法的几何解释

技术分享

其中f(x,y)目标函数的投影,g(x,y)=c为约束条件。当相切点的目标函数梯度与约束条件函梯度互为相反数时,此时目标函数在此约束下达到最优。但是拉格朗日乘子法适用于约束条件等式成立。故解决此凸优化问题需要KTT条件。

2.3 KTT条件

KTT条件适用于以下优化问题

技术分享

 其中,f(x)是需要最小化的函数,h(x)是等式约束,g(x)是不等式约束,p和q分别为等式约束和不等式约束的数量。同时,我们得明白以下两个定理

  • KKT条件的意义:它是一个非线性规划(Nonlinear Programming)问题能有最优化解法的必要和充分条件。

 

  那到底什么是所谓Karush-Kuhn-Tucker条件呢?KKT条件就是指上面最优化数学模型的标准形式中的最小点 x* 必须满足下面的条件:

技术分享

经过论证,该问题是满足 KKT 条件的(首先已经满足Slater condition,再者f和gi也都是可微的,即L对w和b都可导),因此现在我们便转化为求解第二个问题。即原问题通过满足一定的条件,已经转化成了对偶问题。求解这个对偶学习问题,分为3个步骤,首先要让L(w,b,a) 关于wb最小化,然后求对α的极大,最后利用SMO算法求解对偶因子。

2.4 简化为对偶问题

技术分享

技术分享

 将以上的梯度计算结果重新代入到拉格朗日函数

技术分享

技术分享


此时拉格朗日函数化简为对偶问题,

技术分享

显然比之前的凸优化问题简洁,可以用各种凸优化算法加以解决,只有支持向量参与计算,所以计算规模远低于我们的想象。拉格朗日函数只包含了一个变量技术分享,求对技术分享的极大,即可以求得关于对偶问题的最优化问题。根据技术分享技术分享便能求出w和b。那么分类函数技术分享也就可以轻而易举的求出来了。

对偶公式中的未知数仅涉及拉格朗日乘子,而原问题中未知数还包含决策边界几何特征参数,未知数太多。待定乘子中实质有徆多为0,仅在“支持向量”处不为0,所以最后的出的函数表达式进比想象中简单(但问题是预先无法知道哪些样本点是“支持向量”)、

 2.5 SMO算法

    对 拉格朗日乘子技术分享的值可能依然心存疑惑。实际上,关于技术分享的求解可以用一种快速学习算法即SMO算法,这里先简要介绍下。SMO算法由Microsoft Research的John C. Platt在1998年提出,并成为最快的二 次规划优化算法,特别针对线性SVM和数据稀疏时性能更优。基本思路是每次只更新两个乘子,迭代获得最终解。计算流程可表示如下

技术分享 

具体的迭代过程和方法详述可参照 JerryLead http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html

 

 

3.1 线性不可分的情形

接下来谈谈线性不可分的情况,因为线性可分这种假设实在是太有局限性了:下图就是一个典型的线性不可分的分类图,我们没有办法用一条直线去将其分成两个区域,每个区域只包含一种颜色的点。 要想在这种情况下的分类器,有两种方式,一种是用曲线去将其完全分开,曲线就是一种非线性的情况,跟之后将谈到的核函数有一定的关系。 

3.1.1增加松弛变量和惩罚函数

另外一种还是用直线,不过不用去保证可分性,就是包容那些分错的情况,不过我们得加入惩罚函数,使得点分错的情况越合理越好。其实在很多时候,不是在训练的时候分类函数越完美越好,因为训练函数中有些数据本来就是噪声,可能就是在人工加上分类标签的时候加错了,如果我们在训练(学习)的时候把这些错误的点学习到了,那么模型在下次碰到这些错误情况的时候就难免出错了(假如老师给你讲课的时候,某个知识点讲错了,你还信以为真了,那么在考试的时候就难免出错)。这种学习的时候学到了“噪声”的过程就是一个过拟合(over-fitting),这在机器学习中是一个大忌,我们宁愿少学一些内容,也坚决杜绝多学一些错误的知识。还是回到主题,用直线怎么去分割线性不可分的点:

 

技术分享技术分享技术分享

 

 我们可以为分错的点加上一点惩罚,对一个分错的点的惩罚函数就是这个点到其正确位置的距离 。在上图中,蓝色、红色的直线分别为支持向量所在的边界,绿色的线为决策函数,那些紫色的线表示分错的点到其相应的决策面的距离,这样我们可以在原函数上面加上一个惩罚函数,并且带上其限制条件为

技术分享

公式中蓝色的部分为在线性可分问题的基础上加上的惩罚函数部分,当xi在错误一边的时候,若C的值很大那么想要获取最小值,只需要使得技术分享越小越好那么技术分享就会越趋近1,也就是分错点到决策面的距离越小。 当xi在正确一边的时候,ε=0,R为全部的点的数目,C是一个由用户去指定的系数,表示对分错的点加入多少的惩罚,当C很大的时候,分错的点就会更少,但是过拟合的情况可能会比较严重,当C很小的时候,分错的点可能会很多,不过可能由此得到的模型也会不太正确,所以如何选择C是有很多学问的,不过在大部分情况下就是通过经验尝试得到的。

接下来就是同样的,求解一个拉格朗日对偶问题,得到一个原问题的对偶问题的表达式:

技术分享

 蓝色的部分是与线性可分的对偶问题表达式的不同之处。在线性不可分情况下得到的对偶问题,不同的地方就是α的范围从[0, +∞),变为了[0, C],增加的惩罚ε没有为对偶问题增加什么复杂度。

 3.1.2 核函数

  刚刚在谈不可分的情况下,提了一句,如果使用某些非线性的方法,可以得到将两个分类完美划分的曲线,比如接下来将要说的核函数。

    我们可以让空间从原本的线性空间变成一个更高维的空间在这个高维的线性空间下,再用一个超平面进行划分。这儿举个例子,来理解一下如何利用空间的维度变得更高来帮助我们分类的(例子以及图片来自pluskid的kernel函数部分):

    下图是一个典型的线性不可分的情况

技术分享

 但是当我们把这两个类似于椭圆形的点映射到一个高维空间后,映射函数为:技术分享    用这个函数可以将上图的平面中的点映射到一个三维空间(z1,z2,z3),并且对映射后的坐标加以旋转之后就可以得到一个线性可分的点集了。

技术分享

  用另外一个哲学例子来说:世界上本来没有两个完全一样的物体,对于所有的两个物体,我们可以通过增加维度来让他们最终有所区别,比如说两本书,从(颜色,内容)两个维度来说,可能是一样的,我们可以加上 作者 这个维度,是在不行我们还可以加入 页码,可以加入 拥有者,可以加入 购买地点,可以加入 笔记内容等等。当维度增加到无限维的时候,一定可以让任意的两个物体可分了

  回忆刚刚得到的对偶问题表达式:

技术分享

公式中红字的地斱要使用映射后的样本向量代替做内积,最初的特征是n维的,我们将其映射到n^2维,然后再计算,这样需要的时间从原先的O(n)变成O(n^2),这样就造成了灾难维度

技术分享

造成灾难维度后就需要核函数出马了。其中令映射到高维函数为左图,核函数k(x,z)如右图,这时发现只计算原始样本x和z内积的平方(时间复杂度是O(n)),就等价于计算映射后高维样本的内积。计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数 (Kernel Function) 。

例子1:

技术分享                技术分享

例子2:

技术分享                             技术分享

核函数能简化映射空间的内积运算,而恰好SVM中的数量计算是由内积形式表出的。则根据在低维空间的分类函数,可得

技术分享

则关于a的对偶最优化问题就可表示为

技术分享

这样对偶优化问题的计算问题就解决了,避开了在高维空间中的计算,但是计算结果是相同的。当然,因为我们这里的例子非常简单,所以我可以构造出对应于技术分享的核函数出来,如果对于任意一个映射,想要构造出对应的核函数就很困难了。所以需要验证高维映射构造出的核函数的有效性。

4.1 核函数有效判定

问题:给定一个函数K,我们能否使用K来替代计算技术分享,也就说,是否能够找出一个技术分享,使得对于所有的x和z,都有技术分享

比如给出了技术分享,是否能够认为K是一个有效的核函数。

下面来解决这个问题,给定m个训练样本技术分享,每一个技术分享对应一个特征向量。那么,我们可以将任意两个技术分享技术分享带入K中,计算得到技术分享。I可以从1到m,j可以从1到m,这样可以计算出m*m的核函数矩阵(Kernel Matrix)。为了方便,我们将核函数矩阵和技术分享都使用K来表示。

如果假设K是有效地核函数,那么根据核函数定义

技术分享

可见,矩阵K应该是个对称阵。让我们得出一个更强的结论,首先使用符号技术分享来表示映射函数技术分享的第k维属性值。那么对于任意向量z,得

技术分享

最后一步和前面计算技术分享时类似。从这个公式我们可以看出,如果K是个有效的核函数(即技术分享技术分享等价),那么,在训练集上得到的核函数矩阵K应该是半正定的(技术分享

这样我们得到一个核函数的必要条件:

K是有效的核函数 ==> 核函数矩阵K是对称半正定的。

可幸的是,这个条件也是充分的,由Mercer定理来表达。

Mercer定理:

如果函数K是技术分享上的映射(也就是从两个n维向量映射到实数域)。那么如果K是一个有效核函数(也称为Mercer核函数),那么当且仅当对于训练样例技术分享,其相应的核函数矩阵是对称半正定的。

Mercer定理表明为了证明K是有效的核函数,那么我们不用去寻找技术分享,而只需要在训练集上求出各个技术分享,然后判断矩阵K是否是半正定(使用左上角主子式大于等于零等方法)即可。

以上仅能作为支持向量的学习笔记

参考 博客园JerryLead,C博客Mac Track 以及炼数成金机器学习支持向量机内容

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

支持向量机SVM