登录
首页精彩阅读一小时领会SVM支持向量机
一小时领会SVM支持向量机
2018-08-10
收藏

一小时领会SVM支持向量机

机器学习领域,SVM支持向量机作为杀手级武器,对于分类问题是一招鲜——吃遍天!它强大的通用技能对于很多偷懒的工程师都是一大福音,所谓是兵来将挡,更有甚者,来了问题用SVM上,没有问题也要创造问题让SVM上,开玩笑啦。所以,童鞋们都知道了SVM的重要性,纷纷投向其大本营,于是看到了一大堆公式的推导,懵X……

写这篇文章的目的就是为了帮助找不到简单易理解的学习资料的童鞋,请你一致向这看齐。

等等,想要熟读本文,你们还得需要基础的高数、线性代数、统计学习知识,什么?都没有?学了都忘了?基本没关系,因为到时候遇到关键词的时候,我会具体指出哪些需要你们花三分钟百度一下的,好了,又说了这么多,这一次,我们真的要开始了!

先简单解释一下支持向量机的作用。这是一个二分类分类器,所谓分类分类,就是把你输入的样本扔到该待的阵营里。好,举个例子,最简单是二维的,我们现在假设有n个(X1,X2)样本,对应的阵营有两个类别,分别是1和-1。那么我现在给你一个(X1,X2)样本,你告诉我它是属于1的还是属于-1的。说得有点抽象,来画个图,假如我给你一个方块,你是觉得它是属于1还是-1,由图可见,它是属于1了。


作用我们说完了,接下来我们开始聊原理。上面的图片告诉我们什么了?我们看到,有两个一模一样的坐标图,方块和圆圈的分界很明显,所以你要是给我一个方块我毫不犹豫就把它扔进-1的区域。那么问题来了,我大概知道1区域在哪里,但是具体的边界位置在哪里?我们看到第一个坐标轴和第二个坐标轴划分的区域是不一样的,第一个区域划分得比较匀称,而第二个区域划分得有点勉强,为什么会有这种感觉?第一个划分线距离每一个点都是有些距离的,而第二个划分线距离其中有些点过于近了,这是我们直观的判断感觉。

对于支持向量机,它是怎么判断这个线划分得好不好?接下来这句话非常重要:我们找的这条线,能够让所有点中离它最近的点,具有最大间距。  我们分析一下这句话,我们找的这条线,判断它好不好,不靠所有的点,而是靠离它最近的一个点,仅靠这一个点到直线的距离,来直接判断这条线好不好。

那我们就开始找这条线,根据众多的样本(X1,X2),我们设这个直线为wTx+b=0 ( wTx=w1x1+w2x2+w3x3+……+wnxn,这里只有二元,所以这里的wTx=w1x1+w2x2)。

wTx看不懂?这里就要开始用到线性代数知识了,熟悉的直接掠过这段话,这里可以百度矩阵的知识。简单解释下,假设有一条直线y=kx+b,这是一元的。如果是多元的,比如三元一次函数y=k1x1+k2x2+k3x3+b,这个时候我们就可以用矩阵K=[k1,k2,k3]来代表,那么这个函数就变成了y=KTx,上标T代表矩阵的转置,这里你们需要百度矩阵的乘法。

我们看到了图中的这条直线wTx+b=0,其实对于数学稍微敏感点的童鞋已经知道怎么利用公式判断点属于哪个阵营的了,看图中方块都在wTx+b=1直线以上,说明如果wTx+b>=1的一定是方块,同理,如果wTx+b<=-1的一定是圆圈,重点来了,在这里我介绍一个函数,它就是SVM最基础的决策函数:f(x)=sgn(wTx+b),sgn()是一个函数,遇到小于等于-1的值会返回-1,遇到大于等于1的值返回1,所以最终f(x)的值是1或者-1,所以我们要把wTx+b=0解出来,再次明确一下我们现在的目标,求w和b的值。

wTx+b=0的前后还有两条平行线,仔细观察,这两条线都与各自区域内最外边的点是重合关系,这里说得直白一点,其实wTx+b=0是由它前后两条线推出来的,因为它正处于前后两条线的正中间。要打战了,我们把那两条线都当作是双方的战壕,把每个点都当作要打战的士兵,士兵打完战回战壕休整,这个时候当然我方战壕离敌方战壕越远越好,士兵有安全感嘛,而士兵太累活动不了,他们的位置就是不变的,在这种情况下怎么才能把双方的战壕隔得最远?这里先求两个直线的距离,这里假设第一条直线是w1x1+w2x2=1,第二条直线是w1x1+w2x2=-1,根据高中的数学知识,我们求得它们的距离d=2/ sqrt(W12+w22),用矩阵表示就是2/||w||,问题转化为求2/||w||的最大值。这两条线向后退,退到什么时候距离才是最大的?那就是刚好贴在最前面的士兵,不能再后退了,不然前面的士兵就没东西挡着了,这个时候,我们想起前面一句话,我们找的这条线,能够让所有点中离它最近的点,具有最大间距 ,这个最前面的士兵就是离中线最近的点,所以这个时候这两条直线的距离间接帮助我们解决了找中间这条线的问题。

开始简化问题,目前我们手中有一个目标函数,2/||w||,求它的最小值,把它转化一下,就是求1/2*||w||2的最大值,这个可以理解。直接求肯定是求不出来的,看看有没有其他条件,我们知道方块的属性是y=1,而它的wTx+b>=1,圆圈的属性是y=-1,而它的wTx+b<=1。所以yi(wTx+b)>=1,我们称它为约束条件。

         

这个时候我们引入拉格朗日乘子法,其简单解释如下图,即把目标函数和约束条件以一定形式结合到一个函数中,再求解,具体解释百度拉格朗日乘子法。

由拉格朗日乘子法转换得到

现在把原函数转化成了现在这个L函数,由于转化为对偶问题(这里不懂直接百度拉格朗日对偶问题),原来求的最小值,变成了求L的最大值,不过L也是有约束条件的,不然它就变成无穷大了,这个约束条件还是那个yi(wTx+b)>=1。梳理一下思路,现在有三个变量,分别是w,b,a,那么L函数最大是什么时候,就是减号后面为0(因为它不能为负数,不然不满足导入拉格朗日乘子法这个目的),所以L函数最大的时候还是1/2*||w||2,问题又来了,我们本来不就是要求1/2*||w||2的最小值吗?所以现在的情况变成了这样

把它转化一下

有时候数学就是这么奇妙,我们的脑筋还没转过弯,它就帮我们不知不觉解决了问题,想起一位老师的话:微妙的数学思维蕴含着宇宙的真理,我们不知道为什么这样能解出来,可它就是解出来了,就像宇宙中的种种巧合,突然就蹦了出来,当然这是众多资深的数学家前辈们穷其一生的精华,值得我们去尊仰。又不知道说到哪里去了,现在我们目标就明确了一点,求解L函数关于w和b的最小值,你想到什么?没错,简单的一阶偏微分就够了,这个时候w,b的梯度都为0,它们在这里都达到极值。

将第一个函数代入L函数,得到

现在得到了一个新函数,是不是有些陌生,其实这些都是w和b的化身而已,α现在取代了w和b的位置,这样看起来求解确实是方便了许多。你们有没有发现之前的约束条件已经用掉了,现在需要去寻找新的约束条件去求解,眼皮底下只有一个条件可以用,那就是L函数关于b的偏微分所得到的结果。约束条件找到了,现在把目标函数转化一下,求L函数的最大值,就是求-L的最小值,重新梳理一下,再次明确我们的目标,通过求α的值来求w和b的值。

这里我们先打住,因为有比求解α更为重要的事情。现在既然能用α来表示w和b了,自然也可以用α来表示分类决策函数。

图中的b是由y=wTx+b得到的,就这样我们得到了关于α的分类决策函数,其中x是输入测试的样本。

接下来我们来考虑另一个非常重要的问题,如果样本分布边界并不是很明显怎么办? 打战的时候,有些士兵还没来得及返回自己的战壕,双方就歇下了,那他只能就近找个地方隐蔽自己,可能这个地方还在敌人的腹地中,那修战壕肯定不可能把这个战友考虑进去,不然就修到敌人的地盘去了。所以第一种划分的方法是不理智的,这个时候划分边界就要选择性忽视偏差较大的样本点,可能那个样本是收集数据的噪点,也可以从统计学来说,它距离均值太远,没啥参考意义。问题又来了,怎么忽略?在机器学习中,我们称其软间隔最大化,说得俗点,我们允许这样偏离较大的样本出现,并且在目标函数中增加一个惩罚项降低这些样本的权重(这是土理解,反正差不多这个意思)。

于是我们的目标函数和约束条件变成了这样

有人说了,这个公式看不懂,C和x是什么?这里的C称为惩罚系数,一般由具体的问题所决定,C大的话对目标函数影响越大,惩罚效果就越强,双方的战壕就越近,x是什么?看图

对于点A和点B来说,假如点B代入公式y=wTx+b,则是wTx+b=1。而点A代入公式则是wTx+b+xi=1,即wTx+b=1-xi,所以约束条件变成了yi(wxi+b)>=1-x。其实引入这个惩罚项主要有两个目的,第一使1/2*||w||2尽量小,第二使偏离点(误分类点)的个数尽量小(这个就是拉近双方战壕的距离,让那些偏离点看起来不那么偏离),而C是调和二者的关系的作用。

现在有了新的目标函数,那就从新开始求解。这里省略了与上面类似的求解过程,直接看最后的目标函数和约束条件。

我们发现与上面的约束条件很相似,但是多了一个条件:0<=ai<=C。

最重要的时候来了,要开始求解α,真相的大门马上就要打开了。这里我们用的是序列最小最优化算法,简称SMO。

先看上图中的约束条件,发现每一个aiyi都是互相关联的,它们所有的和等于0。这里作一个假设,假设这里的α是类似于w的系数(事实上α是与w有直接关系的,这个假设还是靠谱的),那好,我们就当它是系数好了。眼前有无数个α等着我们去解出来,怎么解?这么多的α,那就一个一个解,直到满足KKT条件为止(KKT条件后面会说明)。由于这些系数都是互相关联的,不是相对独立的,于是有了这么一个关系。

用其它的α可以表示出α1,如果想冻住其他α而只对α1进行求导取极值是不现实的,这就变成了牵一发而动全身了,而我们并不想动全身,只想一个一个去求解,有没有办法?肯定有,再看一眼上图的公式,再给它变化一下

这时可以直接冻住其他α了,由α1和α2保持平衡,可是这时候有两个变量,求解又不那么乐观了,聪明的你已经有新想法了,用α2和其他α表示α1直接代入目标方程,再求导求解,α2的值就这么的出来了,是不是很简单,再把α2的值代入上面的公式,α1的值也出来,这一对的值就求解完毕了,这就是大名鼎鼎的SMO算法,由伟大的platt于1988年提出。

现在我们来解决一下KKT的问题,KKT是拉格朗日乘子法衍生的条件,简单说一般情况下涉及到对偶问题,或者相关的转化问题,会有一个KKT条件作为支撑约束,具体的推导过程可以参考链接1。KKT条件如下

解释一下上图的条件,当α=0时,可见这个xi对边界时没有意义的,它一直处于远离边界的自己的地盘中。当0<α<C的时候,则ξi=0,这个时候xi作为支持向量(刚好在战壕线上的点)在边界(战壕)上。当α=C时,0<ξ<1,xi在边界(战壕)和分隔平面(分割线)的中间,ξ=1时,xi在分隔平面上,ξ>1时,xi在分隔平面外(过了分割线,已经是对方的地盘了),

解题思路有了,接下来,就要开始动手了。因为α1和α2并行作战,所以它们的取值范围不仅仅是[0,C]这么简单了。这里可以写个目标函数明确下求值目的。

图中的Kij看作是(xi,xj)。现在看约束条件,α1和α2有着很明显的比例关系,当y1不等于y2的时候,α1和α2成正比。当y1等于y2的时候,α1和α2成反比。α1和α2各自的取值范围都是[0,C],加上这个条件后,取值范围就开始变化了。是怎么变化呢?

首先,要明白一件事,α2必然要满足[L,H]的约束条件,L和H的具体值是什么?

看上左图,当y1不等于y2的时候,这条直线的左交纵坐标是α2-α1,右交纵坐标是α2-α1+C,而α的最大值是C,所以这里的α2取值应该是[α2-α1,C],我们找一个规律满足图中直线的取值,它就是这样

同理,当y1等于y2的时候,L和H的取值规律是这样的

取值范围出来了,辅助条件一个一个清晰明了,接下来最重要的一步大棋马上就要开盘。找α1和α2开战,准确地说,是找αi和αj,因为是通过无数对的

αi和αj迭代计算才能最终出来我们想要的结果。

αi怎么找?在这里我们用愚笨一点的方法,因为优化重点在αj上。首先全局遍历αi,在αi的基础上用最长步长法找αj,什么是最长步长法?举个栗子,我们从大城市出发,到达一个小乡村,没有直达的方法,怎么选择交通工具?你可以做大客车转大客车转中巴车转小巴车转牛车,你也可以坐火车转 中巴车转牛车,你也可以做飞机转中巴车转牛车,在不在乎钱的情况下,哪个最快?毫无疑问啊,坐飞机效果太明显,加上转车,可能全部加起来也就几个小时,而国内长途火车和大客车都是起步价十几个小时的,这差了一个数量级,结论是坐飞机最快。找αj也一样,我们要找最明显的那个αj,一旦 修正了αj,就会让结果看上去改变非常大,这个落实到具体问题上,就是错误率和αi差的最远的那个。这里要说明下一个小细节,显然找αj的过程涉及到了对比的过程,我们要建立一个全局变量用于储存这个错误率的差值,这样才能找出最大的来寻找αj。

条件全部都找齐了,接下来就是套用公式求值了。

首先要知道错误率怎么求,简单点就是当前样本的决策分类值与它的标签值的差(这里是试验集,所以是有标签的)

接下来求i与j的相似系数η

括号内是矩阵内积的运算,这里可以百度矩阵内积。求这个相似系数是为接下来的求αj的公式做铺垫。

αj由目标函数对αi求导解出,然后用αj求αi。

我们看KKT条件,当0<α<C,也就是当样本在边界上的时候,yg(x)=1,这个时候可以直接求解b的值,也就是b1和b2。假如样本不再边界上,就取平均值

整体思路就到这里结束了,这是一个超级入门超级入门超级入门的教程,没有任何正统借鉴意义,给看不懂其他参考文献的童鞋一个简单粗暴的解释,如果想要深入地研究学习SVM,还需要投入更多的时间去积累和领悟,网上有很多大神的博客都写得很好这里就不列举了,相信读到这里你差不多花了一个小时,SVM是一个很有意思的算法,如果你仍保持很大的学习兴趣,那就继续耕耘吧,到这里才走了仅仅一小步哦!


数据分析咨询请扫描二维码

客服在线
立即咨询