zoukankan      html  css  js  c++  java
  • 【机器学习】 SVM 全程讲解

    支持向量机(SVM),一个神秘而众知的名字,在其出来就受到了莫大的追捧,号称最优秀的分类算法之一,以其简单的理论构造了复杂的算法,又以其简单的用法实现了复杂的问题,不得不说确实完美。SVM讲解链接

     

    本系列旨在以基础化的过程,实例化的形式一探SVM的究竟。曾经也只用过集成化的SVM软件包,效果确实好。因为众人皆说原理复杂就对其原理却没怎么研究,最近经过一段时间的研究感觉其原理还是可以理解,这里希望以一个从懵懂到略微熟知的角度记录一下学习的过程。其实网络上讲SVM算法的多不胜数,博客中也有许多大师级博主的文章,写的也很简单明了,可是在看过之和总是感觉像差点什么,当然对于那些基础好的可能一看就懂了,然而对于像我们这些薄基础的一遍下来也能马马虎虎懂,过一两天后又忘了公式怎么来的了。

     

    比如说在研究SVM之前,你是否听说过拉格朗日乘子法?你是否知道什么是对偶问题?你是否了解它们是怎么解决问题的?Ok这些不知道的话,更别说什么是KKT条件了,哈哈,有没有说到你的心声,不用怕,学学就会了。话说像拉格朗日乘子法,在大学里面学数学的话,不应该没学过,然你学会了吗?你知道是干什么的吗?如果那个时候就会了,那你潜质相当高了。作为一个过来的人,将以简单实例化形式记录自己的学习过程,力图帮助新手级学习者少走弯路。

     

    1一、关于拉格朗日乘子法和KKT条件

    1)关于拉格朗日乘子法

     

    首先来了解拉格朗日乘子法,那么为什么需要拉格朗日乘子法?记住,有拉格朗日乘子法的地方,必然是一个组合优化问题。那么带约束的优化问题很好说,就比如说下面这个:

    这是一个带等式约束的优化问题,有目标值,有约束条件。那么想想假设没有约束条件这个问题是怎么求解的呢?

    是不是直接f对各个x求导等于0,,解x就可以了,可以看到没有约束的话,求导为0,那么各个x均为0吧,这样f=0了,最小。但是x都为0不满足约束条件呀,那么问题就来了。

    这里在说一点的是,为什么上面说求导为0就可以呢?理论上多数问题是可以的,但是有的问题不可以。如果求导为0一定可以的话,那么f一定是个凸优化问题,什么是凸的呢?像下面这个左图:

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

    注意的是这个条件是对函数的任意x取值。如果满足第一个就是开口向上的凸,第二个是开口向下的凸。

    可以看到对于凸问题,你去求导的话,是不是只有一个极点,那么他就是最优点,很合理。类似的看看上图右边这个图,很明显这个条件对任意的x取值不满足,有时满足第一个关系,有时满足第二个关系,对应上面的两处取法就是,所以这种问题就不行,再看看你去对它求导,会得到好几个极点。

    然而从图上可以看到,只有其中一个极点是最优解,其他的是局部最优解,那么当真实问题的时候你选择那个?说了半天要说啥呢,就是拉格朗日法是一定适合于凸问题的,不一定适合于其他问题,还好我们最终的问题是凸问题。

     

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

     

    这里可以看到与相乘的部分都为0,所以的取值为全体实数。现在这个优化目标函数就没有约束条件了吧,既然如此,求法就简单了,分别对x求导等于0,如下:

    把它在带到约束条件中去,可以看到,2个变量两个等式,可以求解,最终可以得到,这样再带回去求x就可以了。那么一个带等式约束的优化问题就通过拉格朗日乘子法完美的解决了。那么更高一层的,带有不等式的约束问题怎么办?那么就需要用更一般化的拉格朗日乘子法即KKT条件来解决这种问题了。

     

    关于为什么原函数加上约束条件就可得极值,做如下解释。

     

    拉格朗日乘数法(Lagrange multiplier)有很直观的几何意义。
    举个2维的例子来说明:
    假设有自变量x和y,给定约束条件g(x,y)=c,要求f(x,y)在约束g下的极值。

    我们可以画出f的等高线图,如下图。此时,约束g=c由于只有一个自由度,因此也是图中的一条曲线(红色曲线所示)。显然地,当约束曲线g=c与某一条等高线f=d1相切时,函数f取得极值。
    两曲线相切等价于两曲线在切点处拥有共线的法向量。因此可得函数f(x,y)与g(x,y)在切点处的梯度(gradient)成正比。
    于是我们便可以列出方程组求解切点的坐标(x,y),进而得到函数f的极值。

      

    梯度场与切空间垂直,也就是梯度场不能够有任何流形切空间上的分量,否则在切空间方向有分量,在流形上沿分量方向走,函数值会增加,沿反方向走,函数值会减少,不可能为局部极小或者极大值点。 一个形象的比喻是人爬山(此处人是原函数,山是约束条件)相切点一定在山谷或者山顶。参考此blog=>拉格朗日乘子法讲解

     

    2)关于KKT条件

     

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

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

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

     

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

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

           其中g是不等式约束,h是等式约束(像上面那个只有不等式约束,也可能有等式约束)。那么KKT条件就是函数的最优值必定满足下面条件:

           这三个式子前两个好理解,重点是第三个式子不好理解,因为我们知道在约束条件变完后,所有的g(x)<=0,然后求和还要为0,无非就是告诉你,要么某个不等式,要么其对应的。那么为什么KKT的条件是这样的呢?

     

     

    关于KKT条件的详细理论推导讲解===> KKT条件

    至此KKT条件解这类约束性问题就是这样,它对后续的SVM求解最优解至关重要

     

     

    2二、SVM的理论基础

    上节我们探讨了关于拉格朗日乘子和KKT条件,这为后面SVM求解奠定基础,本节希望通俗的细说一下原理部分。

     

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

            我们希望找到一个决策面使得两类分开,这个决策面一般表示就是W'X+b=0,现在的问题是找到对应的Wb使得分割最好,知道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还真的可以消掉,就是因为了那个等式。简单带下:

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

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

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

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

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

    说明上面s.t.  1-松弛变量,不是+

     

    你发现目标函数里面多了一点东西,而加上这个是合理的,我们在优化的同时,也使得总的松弛变量之和最小。常数C决定了松弛变量之和的影响程度,如果越大,影响越严重,那么在优化的时候会更多的注重所有点到分界面的距离,努力使得间隔面对所有样例可正确分类C作用 (1是确保所有样例点的间隔不小于1,2是尽量使间隔尽可能大),优先保证这个和最小。好了将问题写在一起吧:

     

     

    3三、SMO算法原理与实战求解

    上节我们讨论到解SVM问题最终演化为求下列带约束条件的问题:

    问题的解就是找到一组使得W最小

    现在我们来看看最初的约束条件是什么样子的: 

    这是最初的一堆约束条件吧,现在有多少个约束条件就会有多少个αi。那么KKT条件的形成就是让:

    我们知道αi≥0,而后面那个小于等于0,所以他们中间至少有一个为0(至于为什么要这么做,第一节讨论过)。再简单说说原因,假设现在的分类问题如下: 

    某一次迭代后,分类面为粗蓝线所示,上下距离为1的分界面如细蓝线所示,而理想的分界面如紫虚线所示。那么我们想想,要想把粗蓝线变化到紫虚线,在这一次是哪些个点在起作用?很显然是界于细蓝线边上以及它们之间的所有样本点在起作用吧,而对于那些在细蓝线之外的点,比如正类的四个圈和反类的三个叉,它们在这一次的分类中就已经分对了,那还考虑它们干什么?所以这一次就不用考虑这些分对了的点。

          那么我们用数学公式可以看到,对于在这一次就分对了的点,它们满足什么关系,显然yi(Wxi+b)>1,然后还得满足,那么显然它们的αi=0。对于那些在边界内的点,显然yi(Wxi+b)≤1,而这些点我们说是要为下一次达到更好的解做贡献的,那么我们就取这些约束条件的极限情况,也就是yi(Wxi+b)=1,在这些极限约束条件下,我们就会得到一组新的权值W与b,也就是改善后的解。那么既然这些点的yi(Wxi+b)=1那它对应的αi就可以不为0了,至于是多少,那就看这些点具体属于分界面内的什么位置了,偏离的越狠的点,我想它对应的αi就越大,这样才能把这个偏得非常狠的点给拉回来,或者说使其在下一次的解中更靠近正确的分类面。

     

    那么满足KKT条件的,我们说如果一个点满足KKT条件,那么它就不需要调整

    对于第1种情况,表明αi是正常分类,在边界内部;
    对于第2种情况,表明αi是支持向量,在边界上;

    对于第3种情况,表明αi是在两条边界之间。

    一旦不满足,就需要调整。由上可知,不满足KKT条件的也有三种情况:

    至此我们可以说,简单的,线性的,带有松弛条件(可以容错的)的整个SMO算法就完了,剩下的就是循环,选择两个α,看是否需要更新(如果不满足KKT条件),不需要再选,需要就更新。一直到程序循环很多次了都没有选择到两个不满足KKT条件的点,也就是所有的点都满足KKT了,那么就大功告成了。 


    当然了,这里面还有些问题就是如何去优化这些步骤,最明显的就是怎么去选择这两个α,程序越到后期,你会发现只有那么几个点不满足KKT条件,这个时候如果你再去随机选择两个点的α,那么它是满足的,就不更新,循环,这样一直盲目的找呀找,程序的效率明显就下来了。当然这在后面是有解决办法的。 


    先不管那么多,就先让他盲目盲目的找吧,设置一个代数,盲目到一定代数停止就ok了,下面就来一个盲目找α的matlab程序,看看我们的SMO算法如何。

    SVM 思路很简单,依靠拉格朗日乘子法跟延伸的KKT算法 还有SMO算法 可以极大的简化处理过程。而且中间过程都是有严格是数据公式推导,看了几个blog 手气匪浅。

    blog 如下:

    Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM

    支持向量机理论推导理论推导SVMPDFSVM通俗讲解拉格朗日乘子法与KKT条件深入理解拉格朗日乘子法跟KKTSVM重要参数

    关注公众号 海量干货等你
  • 相关阅读:
    python基础练习题(题目 画菱形)
    python基础练习题(题目 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单)
    python基础练习题(题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少)
    python基础练习题(题目 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数)
    python基础练习题(题目 求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制)
    酒库重构测试—半自动化验证
    python基础练习题(题目 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数)
    python基础练习题(题目 将一个整数分解质因数。例如:输入90,打印出90=2*3*3*5)
    python基础练习题(题目 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身)
    python基础练习题(题目 判断101-200之间有多少个素数,并输出所有素数。)
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734356.html
Copyright © 2011-2022 走看看