首页 > 代码库 > 支持向量机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回归
1.3 形式化标示
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) 关于w和b最小化,然后求对α的极大,最后利用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