SVM支持向量机详解

SVM支持向量机是一个优秀的分类算法,用简单的原理构造了复杂的算法。

本文将从SVM的基础开始讲:

1.拉格朗日乘子法和KKT条件

a) 拉格朗日乘子法:

只要有拉格朗日乘子法的地方就有组合优化问题。

带约束优化的问题:

这是一个带等式约束优化问题,有目标值,有约束条件。假设没有约束条件我们应该如何求解:将x1,x2,x3分别求偏导,然后偏导为0,那么各个x都为0,f=0求得最小值。当把约束条件加进来之后,它不满足约束条件,那么问题就来了。这里在说一点的是,为什么上面说求导为0就可以呢?理论上多数问题是可以的,但是有的问题不可以。如果求导为0一定可以的话,那么f一定是个凸优化问题,什么是凸的呢?像下面这个左图:

凸的就是开口朝一个方向(向上或向下)。更准确的数学关系就是:

注意的是这个条件是对函数的任意x取值。如果满足第一个就是开口向上的凸,第二个是开口向下的凸。可以看到对于凸问题,你去求导的话,是不是只有一个极点,那么他就是最优点,很合理。类似的看看上图右边这个图,很明显这个条件对任意的x取值不满足,有时满足第一个关系,有时满足第二个关系,对应上面的两处取法就是,所以这种问题就不行,再看看你去对它求导,会得到好几个极点。然而从图上可以看到,只有其中一个极点是最优解,其他的是局部最优解,那么当真实问题的时候你选择那个?说了半天要说啥呢,就是拉格朗日法是一定适合于凸问题的,不一定适合于其他问题,还好我们最终的问题是凸问题。

好了回到我们现在的问题,就是有了约束条件就不可以直接求导来求最优值,那么我们应该怎么办?既然有了约束不能直接求导,那么如果把约束去掉不就可以了吗?怎么去掉呢?这才需要拉格朗日方法。既然是等式约束,那么我们把这个约束乘一个系数加到目标函数中去,这样就相当于既考虑了原目标函数,也考虑了约束条件,比如上面那个函数,加进去就变为:

然后我们再对各个x求偏导,让偏导为0就可以求得他们的极值:

求得x1,x2,x3的值之后将它们带到前面的约束条件里面就可以求得α的值,进而求得x1,x2,x3的数值,求得f的全局极值。

b) 下面讲一下KKT条件:

继续讨论关于带等式以及不等式的约束条件的凸函数优化。任何原始问题约束条件无非最多3种,等式约束,大于号约束,小于号约束,而这三种最终通过将约束方程化简化为两类:约束方程等于0和约束方程小于0。再举个简单的方程为例,假设原始约束条件为下列所示:

那么把约束条件变个样子:

为什么都变成等号与小于号,方便后面的,反正式子的关系没有发生任何变化就行了。

现在将约束拿到目标函数中去就变成:

那么KKT条件的定理是什么呢?就是如果一个优化问题在转变完后变成:

g表示的是不等式约束,h表示的是等式约束。那么KKT条件就是函数的最优值必定满足下面条件:

公式(1)(2)很容易理解,我们主要讲一下第三个公式的意思,一直在不等式约束中我们要对约束条件就行变形都变味g(x)<=0的样式。并且还要求和为0,无非就是告诉你,要么某个不等式,要么其对应的。那么为什么KKT的条件是这样的呢?

假设有一个目标函数,以及它的约束条件,形象的画出来就如下:

假设就这么几个吧,最终约束是把自变量约束在一定范围,而函数是在这个范围内寻找最优解。函数开始也不知道该取哪一个值是吧,那就随便取一个,假设某一次取得自变量集合为x1,发现一看,不满足约束,然后再换呀换,换到了x2,发现可以了,但是这个时候函数值不是最优的,并且x2使得g1(x)与g2(x)等于0了,而g3(x)还是小于0。

这个时候,我们发现在x2的基础上再寻找一组更优解要靠谁呢?当然是要靠约束条件g1(x)与g2(x),因为他们等于0了,很极限呀,一不小心,走错了就不满足它们两了,这个时候我们会选择g1(x)与g2(x)的梯度方向往下走,这样才能最大程度的拜托g1(x)与g2(x)=0的命运,使得他们满足小于0的约束条件对不对。至于这个时候需不需要管g3(x)呢?正常来说管不管都可以,如果管了,也取g3在x2处的梯度的话,因为g3已经满足了小于0的条件,这个时候在取在x2处的梯度,你能保证它是往好的变了还是往差的变了?答案是都有可能。运气好,往好的变了,可以更快得到结果,运气不好,往差的变了,反而适得其反。

那么如果不管呢?因为g1(x)与g2(x)已经在边缘了,所以取它的梯度是一定会让目标函数变好的。综合来看,这个时候我们就不选g3。那么再往下走,假设到了自变量优化到了x3,这个时候发现g2(x)与g3(x)等于0,也就是走到边了,而g1(x)小于0,可变化的空间绰绰有余,那么这个时候举要取g2(x)与g3(x)的梯度方向作为变化的方向,而不用管g1(x)。那么一直这样走呀走,最终找到最优解。可以看到的是,上述如果g1(x)、g2(x)=0的话,我们是需要优化它的,又因为他们本身的条件是小于0的,所以最终的公式推导上表明,是要乘以一个正系数作为他们梯度增长的倍数,而那些不需要管的g(x)为了统一表示,这个时候可以将这个系数设置为0,那么这一项在这一次的优化中就没有了。那么把这两种综合起来就可以表示为:

也即是某次的g(x)在为最优解起作用,那么它的系数值(可以)不为0。如果某次g(x)没有为下一次的最优解x的获得起到作用,那么它的系数就必须为0,这就是这个公式的含义。

比如上面例子的目标值与约束:

将约束提到函数中有:

此时分别对x1、x2求导数:

而我们还有一个条件就是,那么也就是:

这样我们就去讨论下,要么g=0,要么,这里两个g两个,这样我们就需要讨论四种情况,可能你会说,这是约束条件少的情况,那么如果有10个约束条件,这样就有10个g和10个,你去给我讨论?多少种组合,不知道,但是换个思路,我们非得去10个一起去讨论?机智的学者想到一种方法,考虑到这个条件,那么我两个两个讨论不就可以了,比如现在我就讨论7,8,让其他的不变,为什么选或者至少选两个讨论呢,因为这个式子求和为0,改变一个显然是不行的,那就改变两个,你增我就减,这样和可以为0。再问为什么不讨论3个呢?也可以,这不是麻烦嘛,一个俗语怎么说来着,三个和尚没水喝,假设你改变了一个,另外两个你说谁去减或者加使得和为0,还是两个都变化一点呢?不好说吧,自然界都是成双成对的才和谐,没有成三成四的(有的话也少)。

这里顺便提一下后面会介绍到的内容,就是实现SVM算法的SMO方法,在哪里,会有很多,那么人们怎么解决的呢,就是随便选择两个去变化,看看结果好的话,就接受,不好的话就舍弃在选择两个,如此反复,后面介绍。

可以看到像这种简单的讨论完以后就可以得到解了。

2.支持向量机

经过前面的基础现在我们开始将我们的svm。

一个简单的二分类问题如下图:

       我们希望找到一个决策面使得两类分开,这个决策面一般表示就是W'X+b=0,现在的问题是找到对应的W和b使得分割最好,知道logistic分类 机器学习之logistic回归与分类的可能知道,这里的问题和那里的一样,也是找权值。在那里,我们是根据每一个样本的输出值与目标值得误差不断的调整权值W和b来求得最终的解的。当然这种求解最优的方式只是其中的一种方式。那么SVM的求优方式是怎样的呢?

      这里我们把问题反过来看,假设我们知道了结果,就是上面这样的分类线对应的权值W和b。那么我们会看到,在这两个类里面,是不是总能找到离这个线最近的点,向下面这样:

       然后定义一下离这个线最近的点到这个分界面(线)的距离分别为d1,d2。那么SVM找最优权值的策略就是,先找到最边上的点,再找到这两个距离之和D,然后求解D的**最大值**,想想如果按照这个策略是不是可以实现最优分类,是的。好了,还是假设找到了这样一个分界面W'X+b=0,那么做离它最近的两类点且平行于分类面,如上面的虚线所示。

       好了再假设我们有这两个虚线,那么真实的分界面我们认为正好是这两个分界面的中间线,这样d1就等于d2了。因为真实的分界面为W'X+b=0,那么就把两个虚线分别设置为W'X+b=1和W'X+b=-1,可以看到虚线相对于真实面只是上下移动了1个单位距离,可能会说你怎么知道正好是一个距离?确实不知道,就假设上下是k个距离吧,那么假设上虚线现在为W'X+b=k,两边同时除k可以吧,这样上虚线还是可以变成W'X+b=1,同理下虚线也可以这样,然后他们的中线就是W1'X+b1=0吧,可以看到从k到1,权值无非从w变化到w1,b变到b1,我在让w=w1,b=b1,不是又回到了起点吗,也就是说,这个中间无非是一个倍数关系。所以我们只需要先确定使得上下等于1的距离,再去找这一组权值,这一组权值会自动变化到一定倍数使得距离为1的。

好了再看看D=d1+d2怎么求吧,假设分界面W'X+b=0,再假设X是两维的,那么分界面再细写出来就是:W1'X1+W2'X2+b=0。上分界线:W1'X1+W2'X2+b=1,这是什么,两条一次函数(y=kx+b)的曲线是不是,那么初中就学过两直线的距离吧:

这里W=(w1,w2),是个向量,||W||为向量的距离,那么||W||^2=W'W。下界面同理。这样

要使D最大,就要使分母最小,这样优化问题就变为 ,乘一个系数0.5没影响,但是在后面却有用。

注意的是这可不是一个约束条件,而是对所有的每个样本xi都有一个这样的约束条件。转换到这种形式以后是不是很像上节说到的KKT条件下的优化问题了,就是这个。但是有一个问题,我们说上节的KKT是在凸函数下使用的,那么这里的目标函数是不是呢?答案是的,想想W'*W,函数乘出来应该很单一,不能有很多极点,当然也也可以数学证明是的。

好了那样的话就可以引入拉格朗日乘子法了,优化的目标变为:

然后要求这个目标函数最优解,求导吧:

这两个公式非常重要,简直是核心公式。

求导得到这个应该很简单吧,那我问你为什么W'W 对w求导是w呢?如果你知道,那么你很厉害了,反正开始我是一直没转过来。其实说起来也很简单,如果光去看看为什么求导以后,转置就没了,不太好想明白,设想一下假设现在是二维样本点,也就是最终的W=(w1,w2),那么W'W=w1*w1+w2*w2那么对w1求导就是2w1,对w2就是2w2,这样写在一起就是对w求导得到(2w1,2w2)=2w了,然后乘前面一个1/2(这也就是为什么要加一个1/2),就变成w了。

好了得到上面的两个公式,再带回L中把去w和b消掉,你又可能发现,w确实可以消,因为有等式关系,那b怎么办?上述对b求导的结果竟然不含有b,上天在开玩笑吗?其实没有,虽然没有b,但是有那个求和为0呀,带进去你会惊人的发现,b还真的可以消掉,就是因为了那个等式。简单带下:

那么求解最最开始的函数的最小值等价到这一步以后就是求解W的最大值了,因为使用了拉格朗日乘子法后,原问题就变为其对偶问题了,最小变成了最大,至于为什么,等到详细研究过对偶问题再来解释吧。不了解的,只需要知道求W的极值即可。整理一下,经过这么一圈的转化,最终的问题为:

为什么有ai >0$,这是上节说到的KKT条件的必须。至此问题来源部分到这。

细心的你肯可能会发现,上述所有的构造等等都是在数据完全线性可分,且分界面完全将两类分开,那么如果出现了下面这种情况:

正负两类的最远点没有明显的分解面,搞不好正类的最远点反而会跑到负类里面去了,负类最远点跑到正类里面去了,要是这样的话,你的分界面都找不到,因为你不可能找到将它们完全分开的分界面,那么这些点在实际情况是有的,就是一些离群点或者噪声点,因为这一些点导致整个系统用不了。当然如果不做任何处理确实用不了,但是我们处理一下就可以用了。SVM考虑到这种情况,所以在上下分界面上加入松弛变量e,认为如果正类中有点到上界面的距离小于e,那么认为他是正常的点,哪怕它在上界面稍微偏下一点的位置,同理下界面。还是以上面的情况,我们目测下的是理想的分解面应该是下面这种情况:

如果按照这种分会发现4个离群点,他们到自己对应分界面的距离表示如上,理论上讲,我们给每一个点都给一个自己的松弛变量ei,如果一个分界面求出来了,那么比较这个点到自己对应的界面(上、下界面)的距离是不是小于这个值,要是小于这个值,就认为这个界面分的可以,比如上面的e3这个点,虽然看到明显偏离了正轨,但是计算发现它的距离d小于等于我们给的e3,那么我们说这个分界面可以接受。你可能会说那像上面的e10,距离那么远了,他肯定是大于预设给这个点的ei了对吧,确实是这样的,但是我们还发现什么?这个点是分对了的点呀,所以你管他大不大于预设值,反正不用调整分界面。需要调整分界面的情况是只有当类似e3这样的点的距离大于了e3的时候。

你发现目标函数里面多了一点东西,而加上这个是合理的,我们在优化的同时,也使得总的松弛变量之和最小。常数C决定了松弛变量之和的影响程度,如果越大,影响越严重,那么在优化的时候会更多的注重所有点到分界面的距离,优先保证这个和小。好了将问题写在一起吧:

猜你喜欢

转载自blog.csdn.net/donkey_1993/article/details/81626058