现在介绍支持向量机的文档很多,以下只是我个人对于支持向量机算法的认识,有认识不到位的地方请各位大牛多指正。支持向量机属于一种二类分类模型,它的模型是定义在特征空间上的间隔最大的分类器。支持向量机的本质在于在特征空间寻求一个间隔最大的超平面。算法的核心思想在于以下两点:1.在线性可分的情况下,利用间隔最大化的学习策略寻求一个间隔最大的超平面。2在线性不可分的情况下,通过核函数将低维的特征向量空间映射到高维来寻求线性可分。
支持向量机有如下优缺点。优点:1对于线性不可分的情况可以通过核函数,映射到高维特征空间实现线性可分。2.SVM学习问题可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值。而其他分类方法(如基于规则的分类器和人工神经网络)都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。3.小集群分类效果好。
缺点:1 SVM仅仅只限于一个二类分类问题,对于多分类问题解决效果并不好。2.仅局限于小集群样本,对于观测样本太多时,效率较低。3.寻求合适的核函数相对困难。
支持向量机学习基础:
Logistic回归: Logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。假设函数
其中x是n维特征向量,函数g就是logistic函数。而的图像是可以看到,将无穷映射到了(0,1)。而假设函数就是特征属于y=1的概率。从而,当我们要判别一个新来的特征属于哪个类时,只需求即可,若大于0.5就是y=1的类,反之属于y=0类。
此外,只和有关,>0,那么,而g(z)只是用来映射,真实的类别决定权还是在于。再者,当时,=1,反之=0。如果我们只从出发,希望模型达到的目标就是让训练数据中y=1的特征,而是y=0的特征。Logistic回归就是要学习得到,使得正例的特征远大于0,负例的特征远小于0,而且要在全部训练实例上达到这个目标。
接下来,尝试把logistic回归做个变形。首先,将使用的结果标签y = 0和y = 1替换为y = -1,y = 1,然后将()中的替换为b,最后将后面的替换为(即)。如此,则有了。也就是说除了y由y=0变为y=-1外,线性分类函数跟logistic回归的形式化表示没区别。
进一步,可以将假设函数中的g(z)做一个简化,将其简单映射到y=-1和y=1上。映射关系如下:
经验风险最小化、过拟合现象和结构风险最小化:
经验风险最小化:在假设空间、损失函数以及训练数据集确定的情况下模型f(x)关于训练数据集的平均损失,记作:
经验风险是模型关于训练样本集的平均损失。根据大数定理(随机变量相互独立,服从同一分布且有数学期望u,则序列依概率收敛于u).当样本容量N趋于无穷时经验风险趋于期望风险。因此可以用经验风险去估计期望风险,然后现实情形是训练样本数目往往有限,甚至很小。用经验风险估计期望风险往往不太理想,因此要对经验风险进行一定的矫正,如下两个策略:经验风险最小化和结构风险最小化。根据经验风险最小化策略认为,经验风险最小化的模型是最优的模型,根据这一策略,按照经验风险最小化求最优模型就是求最优化解(诸如在损失函数为对数损失函数时,利用极大似然估计求经验风险最小化)。
过拟合现象:在样本容量很小时,容易产生过拟合现象:是指在学习时选择的模型所包含的参数过多,以至于出现这一模型对于已知数据预测很好,而对于未知数据预测很差的现象。也就是训练误差小于测试误差时发生的现象。
结构风险最小化:为了防止过拟合现象,提出了结构风险最小化策略。结构风险是经验风险加上表示模型复杂度的正则化项或罚项。在假设空间、损失函数以及训练数据集确定的情况下,结构风险定义为:
结构风险小的模型往往对训练数据以及未知的测试数据都有很好的预测。贝叶斯估计中的最大后验概率估计就是结构风险最小化的一个例子,当模型复杂度由模型的先验概率表示时,结构风险最小化就等价于最大后验概率估计。
KKT条件:KKT 条件的介绍,一般地,一个最优化数学模型能够表示成下列标准形式:
其中,f(x)是需要最小化的函数,h(x)是等式约束,g(x)是不等式约束,p和q分别为等式约束和不等式约束的数量。同时,我们得明白以下两个定理:
那到底什么是所谓Karush-Kuhn-Tucker条件呢?KKT条件就是指上面最优化数学模型的标准形式中的最小点 x* 必须满足下面的条件:
经过论证,我们这里的问题是满足 KKT 条件的(首先已经满足Slater condition,再者f和gi也都是可微的,即L对w和b都可导),因此现在我们便转化为求解第二个问题。也就是说,现在,咱们的原问题通过满足一定的条件,已经转化成了对偶问题。而求解这个对偶学习问题,分为3个步骤,首先要让L(w,b,a) 关于w w 和 bb 最小化,然后求对α的极大,最后利用SMO算法求解对偶因子。
拉格朗日对偶:来看看存在等式约束的极值问题求法,比如下面的最优化问题:
目标函数是f(w),下面是等式约束。通常解法是引入拉格朗日算子,这里使用来表示算子,得到拉格朗日公式为
L是等式约束的个数。
然后分别对w和求偏导,使得偏导数等于0,然后解出w和。至于为什么引入拉格朗日算子可以求出极值,原因是f(w)的dw变化方向受其他不等式的约束,dw的变化方向与f(w)的梯度垂直时才能获得极值,而且在极值处,f(w)的梯度与其他等式梯度的线性组合平行,因此他们之间存在线性关系。(参考《最优化与KKT条件》)
然后我们探讨有不等式约束的极值问题求法,问题如下
我们定义一般化的拉格朗日公式
这里的和都是拉格朗日算子。如果按这个公式求解,会出现问题,因为我们求解的是最小值,而这里的已经不是0了,我们可以将调整成很大的正值,来使最后的函数结果是负无穷。因此我们需要排除这种情况,我们定义下面的函数:
这里的P代表primal。假设或者,那么我们总是可以调整和来使得有最大值为正无穷。而只有g和h满足约束时,为f(w)。这个函数的精妙之处在于,而且求极大值。
因此我们可以写作
这样我们原来要求的min f(w)可以转换成求了。
我们使用来表示。如果直接求解,首先面对的是两个参数,而也是不等式约束,然后再在w上求最小值。这个过程不容易做,那么怎么办呢?
D的意思是对偶,将问题转化为先求拉格朗日关于w的最小值,将和看作是固定值。之后在求最大值的话:
这个问题是原问题的对偶问题,相对于原问题只是更换了min和max的顺序,而一般更换顺序的结果是Max Min(X) <= MinMax(X)。然而在这里两者相等。用来表示对偶问题如下:
下面解释在什么条件下两者会等价。假设f和g都是凸函数,h是仿射的(affine,)。并且存在w使得对于所有的i,。在这种假设下,一定存在使得是原问题的解,是对偶问题的解。还有另外,满足库恩-塔克条件(Karush-Kuhn-Tucker, KKT condition),该条件如下:
所以如果满足了库恩-塔克条件,那么他们就是原问题和对偶问题的解。让我们再次审视公式(5),这个条件称作是KKT dual complementarity条件。这个条件隐含了如果,那么。也就是说,时,w处于可行域的边界上,这时才是起作用的约束。而其他位于可行域内部(的)点都是不起作用的约束,其。这个KKT双重补足条件会用来解释支持向量和SMO的收敛测试。
KKT的总体思想是将极值会在可行域边界上取得,也就是不等式为0或等式约束里取得,而最优下降方向一般是这些等式的线性组合,其中每个元素要么是不等式为0的约束,要么是等式约束。对于在可行域边界内的点,对最优解不起作用,因此前面的系数为0。
SVM算法:
线性可分的支持向量机:学习的目标是在特征空间中找到一个分离超平面,能将实例分到不同的类。在给定线性可分训练数据集的情形下,通过间隔最大化学习分离超平面,而分离超平面对应于方程w.x+b=0,只要求得法向量w和截据b就可以得到分离超平面,以及相应的分类决策函数
f(x)=sign(w*x+b) (1)
函数间隔:上述提到间隔最大化,何为间隔了。在超平面确定的情况下:由点到平面的距离公式(点(x0,y0,z0)到了平面Ax+By+Cz+D=0的距离为:d=|Ax0+By0+Cz0+D|/√(A^2+B^2+C^2)),因此可得|w*x+b|能够相对的表示向量点到超平面的远近。而距离的远近可以表示分类预测的确信程度。因此可以用y(w*x+b)来表示分类的正确性以及确信度。
几何间隔:我们将w和b改变为2w和2b超平面没有发生改变而间隔却变成了原来的两倍。因此我们需要对分离超平面的法向量进行约束,使得间隔固定成为几何间隔。
假定对于一个点 x ,令其垂直投影到超平面上的对应点为 x0 ,w 是垂直于超平面的一个向量,为样本x到分类间隔的距离,如下图所示:
有,其中||w||表示的是范数。
又由于 x0 是超平面上的点,满足 f(x0)=0 ,代入超平面的方程即可算出:
间隔最大化(Maximum Margin Classifier):间隔最大化的直观解释是:对于训练数据集找到几何间隔最大的超平面意味着以充分大的确信度对训练数据进行分类,也就是说不但可以将正负实例点分开,而且对最难分的实例点也有足够大的确信度将他们分开。可以得到如下约束最优化问题:
上述最优化问题可以等价于:
我们将约束条件改写为:
从KKT条件得知只有函数间隔是1(离超平面最近的点)的线性约束式前面的系数,也就是说这些约束式,对于其他的不在线上的点(),极值不会在他们所在的范围内取得,因此前面的系数.注意每一个约束式实际就是一个训练样本。
看下面的图:
实线是最大间隔超平面,假设×号的是正例,圆圈的是负例。在虚线上的点就是函数间隔是1的点,那么他们前面的系数,其他点都是。这三个点称作支持向量。构造拉格朗日函数如下:
注意到这里只有没有是因为原问题中没有等式约束,只有不等式约束。
下面我们按照对偶问题的求解步骤来一步步进行,
首先求解的最小值,对于固定的,的最小值只与w和b有关。对w和b分别求偏导数。
并得到
将上式带回到拉格朗日函数中得到,此时得到的是该函数的最小值(目标函数是凸函数)
代入后,化简过程如下:
最后得到
由于最后一项是0,因此简化为
此时的拉格朗日函数只包含了变量。然而我们求出了才能得到w和b。
前面提到过对偶问题和原问题满足的几个条件,首先由于目标函数和线性约束都是凸函数,而且这里不存在等式约束h。存在w使得对于所有的i,。因此,一定存在使得是原问题的解,是对偶问题的解。在这里,根据SMO算法(文章最后会有所介绍)求就是求了。
即可求出b。即离超平面最近的正的函数间隔要等于离超平面最近的负的函数间隔。
关于上面的对偶问题如何求解,将留给下一篇中的SMO算法来阐明。
这里考虑另外一个问题,由于前面求解中得到
我们通篇考虑问题的出发点是,根据求解得到的,我们代入前式得到
因此我们利用拉格朗日对偶法求得最大间隔的超平面。
支持向量和间隔边界:主要分为以下三种情形,在线性可分的情形下、在线性不可分的情形下,利用核函数进行空间映射转换的前提下。
线性可分的情形下:训练数据集的样本点中与分离超平面最近的样本点的实例称为支持向量。支持向量在数学方面解释为是使约束条件等号成立的点:
对于正例点y=1,支持向量在超平面 H : w*x+b= 1
对于负例点y =-1,支持向量在超平面 H: w*x+b = -1
例如在蓝色虚线上的蓝色实点和粉色虚线上的红心实点。
在线性不可分的情形下:
如图所示,分离超平面用实线表示正负例的支持向量点分别是“。”和"x"。可以得知在间隔边界(也就是约束条件为等式的)情形下得到的实例点,作为支持向量。非线性的情形下,同理可知。
松弛变量:
在如图所示的情形下:被圈起来的蓝色的点是线性不可分的。因此需要对每个样本点引入松驰变量,因此我们可以得到在线性不可分的情形下变为如下凸二次规划问题:
用之前的方法将限制或约束条件加入到目标函数中,得到新的拉格朗日函数,如下所示:分析方法和前面一样,转换为另一个问题之后,我们先让针对、 和最小化:
将 带回 并化简,得到和原来一样的目标函数:
不过,由于我们得到而又有(作为 Lagrange multiplier 的条件),因此有,所以整个 dual 问题现在写作:
把前后的结果对比一下(错误修正:图中的Dual formulation中的Minimize应为maxmize):
可以看到唯一的区别就是现在 dual variable 多了一个上限 。
核技巧:
用线性分类的方法解决非线性分类的问题分为两步:1首先使用一个变换将原空间的数据映射到新空间。2在新空间里用线性分类的学习方法从训练数据中学习分类模型。
核技巧的想法是,在学习与预测中只定义核函数K(x,z),而不是显式定义映射函数。如果有一种方式可以在特征空间中直接计算内积〈φ(xi · φ(x)〉,就像在原始输入点的函数中一样,就有可能将两个步骤融合到一起建立一个非线性的学习器,这样直接计算法的方法称为核函数方法:
核函数:如何处理非线性数据核函数的作用:1.在现实情况中经常遇到线性不可分的非线性分类问题,需要将将样例映射到高维空间中去,达到线性可分的目的。2.核函数的价值在于虽然实现了将特征从低维空间到高维空间的转换,但核函数事先在低维空间中进行计算,实质分类效果体现在高维空间,直接避免了高维空间中的复杂计算。来看个核函数的例子。如下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时咱们该如何把这两类数据分开呢(下文将会有一个相应的三维空间图)事实上,上图所述的这个数据集,是用两个半径不同的圆圈加上了少量的噪音生成得到的,所以,一个理想的分界应该是一个“圆圈”而不是一条线(超平面)。如果用 X1 和 X2 来表示这个二维平面的两个坐标的话,我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程可以写作这样的形式:
注意上面的形式,如果我们构造另外一个五维的空间,其中五个坐标的值分别为 Z1=X1, Z2=X21, Z3=X2, Z4=X22, Z5=X1X2,那么显然,上面的方程在新的坐标系下可以写作:
关于新的坐标 Z ,这正是一个 hyper plane 的方程!也就是说,如果我们做一个映射 ϕ:R2→R5 ,将 X 按照上面的规则映射为 Z ,那么在新的空间中原来的数据将变成线性可分的,从而使用之前我们推导的线性分类算法就可以进行处理了。这正是 Kernel 方法处理非线性问题的基本思想。
再进一步描述 Kernel 的细节之前,不妨再来看看这个例子映射过后的直观例子。当然,你我可能无法把 5 维空间画出来,不过由于我这里生成数据的时候就是用了特殊的情形,具体来说,我这里的超平面实际的方程是这个样子(圆心在 X2 轴上的一个正圆):
因此我只需要把它映射到 Z1=X21, Z2=X22, Z3=X2 这样一个三维空间中即可,下图即是映射之后的结果,将坐标轴经过适当的旋转,就可以很明显地看出,数据是可以通过一个平面来分开的(pluskid:下面的gif 动画,先用 Matlab 画出一张张图片,再用 Imagemagick 拼贴成):
核函数相当于把原来的分类函数:
映射成:
而其中的可以通过求解如下 dual 问题而得到的:
这样一来问题就解决了吗?似乎是的:拿到非线性数据,就找一个映射 ,然后一股脑把原来的数据映射到新空间中,再做线性 SVM 即可。不过事实上没有这么简单!其实刚才的方法稍想一下就会发现有问题:在最初的例子里,我们对一个二维空间做映射,选择的新空间是原始空间的所有一阶和 二阶的组合,得到了五个维度;如果原始空间是三维,那么我们会得到 19 维的新空间,这个数目是呈爆炸性增长的,这给 的计算带来了非常大的困难,而且如果遇到无穷维的情况,就根本无从计算了。所以就需要 Kernel 出马了。
不妨还是从最开始的简单例子出发,设两个向量和,而即是到前面说的五维空间的映射,因此映射过后的内积为:
(公式说明:上面的这两个推导过程中,所说的前面的五维空间的映射,这里说的前面便是文中2.2.1节的所述的映射方式,回顾下之前的映射规则,再看那第一个推导,其实就是计算x1,x2各自的内积,然后相乘相加即可,第二个推导则是直接平方,去掉括号,也很容易推出来)
另外,我们又注意到:
二者有很多相似的地方,实际上,我们只要把某几个维度线性缩放一下,然后再加上一个常数维度,具体来说,上面这个式子的计算结果实际上和映射
之后的内积的结果是相等的,那么区别在于什么地方呢?
- 一个是映射到高维空间中,然后再根据内积的公式进行计算;
- 而另一个则直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果。
(公式说明:上面之中,最后的两个式子,第一个算式,是带内积的完全平方式,可以拆开,然后,通过凑一个得到,第二个算式,也是根据第一个算式凑出来的)
回忆刚才提到的映射的维度爆炸,在前一种方法已经无法计算的情况下,后一种方法却依旧能从容处理,甚至是无穷维度的情况也没有问题。也就是说在核函数给定的条件下,可以利用解决线性分类问题的方法求解非线性分类的支持向量机。学习是隐式的在特征空间中进行。不需要显式定义特征空间和映射函数这样的技巧称为核技巧
我们把这里的计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数 (Kernel Function) ,例如,在刚才的例子中,我们的核函数为:
核函数能简化映射空间中的内积运算——刚好“碰巧”的是,在我们的 SVM 里需要计算的地方数据向量总是以内积的形式出现的。对比刚才我们上面写出来的式子,现在我们的分类函数为:
其中 由如下 dual 问题计算而得:
这样一来计算的问题就算解决了,避开了直接在高维空间中进行计算,而结果却是等价的!当然,因为我们这里的例子非常简单,所以我可以手工构造出对应于的核函数出来,如果对于任意一个映射,想要构造出对应的核函数就很困难了。
核函数的选择:
SMO算法:
- 第一步选取一对和,选取方法使用启发式方法;
- 第二步,固定除和之外的其他参数,确定W极值条件下的,由表示。
假定在某一次迭代中,需要更新 , 对应的拉格朗日乘子 , ,那么这个小规模的二次规划问题写为:那么在每次迭代中,如何更新乘子呢?引用 这里的两张PPT说明下:知道了如何更新乘子,那么选取哪些乘子进行更新呢?具体选择方法有以下两个步骤:
- 步骤1:先“扫描”所有乘子,把第一个违反KKT条件的作为更新对象,令为a2;
- 步骤2:在所有不违反KKT条件的乘子中,选择使|E1 −E2|最大的a1进行更新,使得能最大限度增大目标函数的值(类似于梯度下降。此外,而,求出来的E代表函数ui对输入xi的预测值与真实输出类标记yi之差)。
最后,每次更新完两个乘子的优化后,都需要再重新计算b,及对应的Ei值。除了在这篇论文《fast training of support vector machines using sequential minimal optimization》中platt给出了SMO算法的逻辑代码之外,这里也有一份SMO的实现代码。综上,SMO算法的基本思想是将Vapnik在1982年提出的Chunking方法推到极致,SMO 算法每次迭代只选出两个分量ai和aj进行调整,其它分量则保持固定不变,在得到解ai和aj之后,再用ai和aj改进其它分量。与通常的分解算法比较, 尽管它可能需要更多的迭代次数,但每次迭代的计算量比较小,所以该算法表现出整理的快速收敛性,且不需要存储核矩阵,也没有矩阵运算。
参考文献:
http://www.cnblogs.com/liqizhou/archive/2012/05/11/2495788.html
http://www.cnblogs.com/haore147/p/3619046.html
http://www.cnblogs.com/zhangchaoyang/articles/4306833.html
http://blog.csdn.net/liukun321/article/details/41574617
《统计机器学习》 李航