读书笔记之支持向量机(SVM)基础

来源:互联网 发布:如何找天使投 知乎 编辑:程序博客网 时间:2024/06/14 18:58

https://www.zhihu.com/question/21094489

http://blog.pluskid.org/?p=632

http://www.blogjava.net/zhenandaci/archive/2009/02/13/254519.html

首先感谢上面三位,我文中的内容大部分都是来自三位的文章及答案,加上自己的理解,完成这个系列,方便以后回顾。

 

下面首先看知乎一个关于“支持向量机(SVM)是什么意思?”问题的回答,我觉得是最好的SVM入门例子。答主叫做“简之”,排名第二的答主也有把数学公式一一列出。

 

他说了下面这个故事!

在很久以前的情人节,大侠要去救他的爱人,但魔鬼和他玩了一个游戏。魔鬼在桌子上似乎有规律放了两种颜色的球,说:“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。”

                                                    

于是大侠这样放,干的不错!

                                                       

然后魔鬼,又在桌上放了更多的球,似乎有一个球站错了阵营。

                                                            

SVM是试图把棍放在最佳位置,好让在棍的两边有尽可能大的间隙。

                                                                   

现在即使魔鬼放了更多的球,棍仍然是一个好的分界线。

                                                                  

然后,在SVM工具箱中有另一个更加重要的 trick。 魔鬼看到大侠已经学会了一个trick,于是魔鬼给了大侠一个新的挑战。

                                                     

现在,大侠没有棍可以很好帮他分开两种球了,现在怎么办呢?当然像所有武侠片中一样大侠桌子一拍,球飞到空中。然后,凭借大侠的轻功,大侠抓起一张纸,插到了两种球的中间。

                                                  

现在,从魔鬼的角度看这些球,这些球看起来像是被一条曲线分开了。

                                                  

再之后,无聊的大人们,把这些球叫做「data」,把棍子 叫做「classifier」, 最大间隙trick 叫做「optimization」,拍桌子叫做「kernelling」, 那张纸叫做「hyperplane」。

如果你只想知道SVM是什么意思,看到这里,基本就不用再往下看了。

 

那么从上面的讲解我们知道SVM其实也就是一种分类的算法,准确的说是一系列的分类算法。怎么分类?我们从下面这张图说起。

                                        

我们看到粉色和蓝色的球被一条红色的线分成了两部分,在平面中,我们知道一条直线的可以表示成f(x)=ax+b。

如果想把一条线分成两部分,一个点就足够了;如果要把一个平面分成两部分,就需要一条线了;如果是三维的空间,就需要一个平面了;如果是n维的空间,那么那需要一个超平面了。

我们把数据点(也就是那些蓝色粉色的点)用X表示,这是一个n维的向量,类别用y来表示,类别的取值只能是1或-1,分别代表两个不同的类。支持向量机的很大一部分工作,就是找到这个超平面,这个超平面可以表示为:

                                                                       WTX+b=0

如上面所说,这个超平面在二维空间,就是一条直线。我们希望通过这个超平面把两类数据分开。比如,在超平面的一边的数据点对应的y全是1,而另一边全是-1.具体来说,我们令f(x)=WTX+b,显然,如果f(x)=0,那么x是位于平面上面的点。我们令所有所有满足f(x)<0的点,对应的y都是-1,反之,则为1.当然很多时候数据点不是这样线性可分的,后面我们会对这种情况进行讨论。

那么我们如何找到这个超平面呢?

                                                              

对于点x到x0的距离,这是我们中学的时候就学过的,它的公式如下:

                                                                 

我们要这个距离公式有啥用呢?

                              

看上图,我们的超平面其实是由两个临界超平面确定的,而且这个超平面刚好位于中间位置。那么我们为了使这个超平面尽量的完美,也就是最近的数据点离超平面尽可能的远,我们就需要利用这个距离公式来确定这个超平面了。

我们定义functional margin为γˆ=y(wTx+b)=yf(x),前面乘上类别y之后可以保证这个margin的非负性。(因为当y为-1时,f(x)<0;当y等于1时,f(x)>0。)而点到超平面的定义为geometrical margin:

                                                                

这个就与我们上面的点到面的公式对应起来了。显然,functional margin和geometrical margin相差一个||W||的缩放因子。按照我们前面分析的,当距离越大的时候,这个分类就会越完美。

因为我们把两边的超平面分别定义为y=1和y=-1,所以任一超平面到我们所求超平面的距离可以简化为:

                                    

也就是我们最终就是要求这个最大值。通过求解这个,我们就能得到我们想要的超平面了。这个超平面叫做最大边缘超平面(MaximumMarginal Hyperplane,MMH)。而落在这个MMH两侧超平面上面的数据点,就叫做支持向量(support vector)。

对于上面求目标函数的最大值,可以等价于:

                                

至于为什么要这么等价?后面会说到,其实是方便求导。这样式子它是一个凸优化的问题,具体的说,它是一个二次优化的问题,所谓的二次优化,就是说目标函数是二次的,约束条件是线性的。

但是上面这个的求解该怎么解呢?在我们高数里面,我们通常可以给一个优化问题加上添加拉格朗日算子,构造拉格朗日函数,来使问题得到解决。于是我们得到了下面这个式子:

                                    

其中的αi就是拉格朗日算子,还有这个算子必须非负。

对于上式,我们要做到两个要求。①对参数最小化L(解SVM要求),②对乘子又要最大化(拉格朗日乘子法要求)。

对于第一个要求,由于是凸优化的问题,我们可以分别对w、b求导。

                                                     

然后把得到的式子带回原来的式子,就得到了下面这个式子:


发现w、b不见了,这个时候就变成了α的优化问题。


  

通过上式,我们就可以反过来求解了。另外还有别的推理方法,可以参考pluskid和jasper的博客。

但是我们碰到的分类并不是都是直接一个超平面就分开了的。在《三体》中,我们知道通过降维攻击可以把被攻击对象封住,那么我们想要展开,那就增加维度喽。在SVM中,我们是通过核函数来解决的。然后不管什么的模型,最后可能都有一些线性不可分的点,这么麻烦!那咱就不要了。这些点叫做outlier,通过松弛变量来处理这些膈应人的玩意儿!

好了,SVM最基本的东西就说完了。后面会对核函数与松弛向量用专门的章节来讲解。


原创粉丝点击