关于支持向量机,我自身实力不济,琢磨了许久,如文章有不妥之处,还望指出。
我发现支持向量机能够成为传统机器学习里的大哥大,很大一部分原因是因为它有一个较为完整的数学理论的支持,所以在学习它的过程中里面的数学理论比较多,但没有关系,后面我会尽量为大家简化学习数学理论的过程(如果想去了解涉及到的数学理论,大家可以上网搜索),但你必须掌握拉格朗日求极值的数学理论。好的,话不多说,我们开始学习。
目录
支持向量机要解决的问题
在了解支持向量机之前,我们先来想想以下的问题。
一、什么样的决策边界才是最好的?
如图:
如果说我现在要对如图上面的红蓝点进行分类,那么我肯定有很多条直线(也就是决策边界)可以将他们进行分类(这里只拿了A,B两条举例子),对于这类可以通过一条直线将两组数据点分开的数据叫做线性可分,那是不是选这A、B两条都可以呢?当然不是,我们肯定是要选择最好的那一条,也就是图中A那条直线。而我们支持向量机的任务就是为了找到那条最理想的决策边界。
二、特征数据本身很难分,那怎么办?
如图:
我们可以看到,蓝色和黄色的特征点,对于这类的非线性可分的数据集,不管画什么样的直线都不能将它们分开,那有没有一些巧妙的方法,也可以说是一些特殊的决策边界,将这些特征点分开呢。当然有,我们可不可以将这些在二维平面当中的特征点,映射到更高维的空间里面呢,在更高维的空间里面,说不定就好分类了。那怎么将它映射到更高维呢?,将低维映射到高维的理论依据又是什么呢?。这个就是等会儿我要给大家介绍支持向量机的强大之处。
上述这两个问题,就是支持向量机的核心了。
如何找到最好的决策边界?
我们先来解决第一个问题,如图:
我们现在想象一下,我们将绿色和蓝色的点看作是”地雷“,那我现在要通过它们,在什么情况下是最安全的?肯定是距离雷越远的时候越安全,对吧。那对比上面两幅图来看,肯定是右边的更安全一些,因为它的”道路“更宽一些,它中间的实线距离边缘的”地雷“更远一些。好的,到这里我们的目的就很清晰了。我们要想找出一条最安全的”路“,是不是就是要找出决策边界(也就是图中的实线)到它边缘”地雷“的距离最远,所以我们要找到最好的决策边界,就是要求出该决策边界到边缘点距离函数的最大值。
上述将数据集分隔开来的决策边界称为分隔超平面,由于上面给出的数据点都在二维平面上,所以此时分隔超平面就只是一条直线。但是,如果所给的数据集是三维的,那么此时用来分隔数据的就是一个平面。超平面本质是自由度比空间维度小1。自由度的概念可以简单的理解为至少要给定多少个分量的值才能确定一个点。例如, 三维空间里的(超)平面只要给定了(x,y,z)中任意两个分量, 剩下的一个的值就确定了。先确定值的两个分量是自由的, 因为它们想取什么值就能取什么值;剩下的那个是"不自由的", 因为它的值已经由另外两确定了, 二维空间里的超平面为一条直线,一维空间里超平面为数轴上的一个点。
而离分割超平面最近的那些点(也就是上述说的边缘点),我们称它们为支持向量。没想到吧,支持向量,居然是一些点。
好的,根据上述,我们已经知道了我们的目的是什么,就是计算分隔超平面到支持向量的距离函数,然后对这个函数不断的优化,找到它的最大值。那怎么得到这个距离函数?
距离函数
对于上述的分隔超平面的形式可以写成(不管是多少维,都可以用它来表示):
这里需要注意的是,和X是向量,而不是简简单单的一个值,举个例子,如果这个超平面是二维的,那么
这个向量里面就有两个值,X里面也有两个值,将公式中
X拆开就得到W1*X1+W2*X2+b=0这样的直线,三维、四维等高维度以此类推。
对于距离函数,为了让大家更加的直观感受,我拿一个三维分隔超平面给大家举例。
如图,阴影部分是我的一个分隔超平面,x点是支持向量(也就是离分割超平面最近的点),这就是一个很简单的求点到平面的距离,我们平常怎么求的,在这里也就怎么求。所以我们得到:
||W||是法向量的长度, 是分隔超平面的法向量,
是支持向量到分隔超平面上任意一点的距离。而又因为
满足分隔平面
,所以
,那么d距离公式又可以化简成。
这个也就是我们的距离函数了,其它维也可以如此表示。(一定一定注意,X是个点,不是值,W是向量!!!!)
得到了支持向量到分隔平面的距离公式,那么接下来就是要去得到它的最大值了,怎么得到它的最大值呢?现在我们知道公式里的X是已知的点,那么我们要得到最大值,是不是就得不断的调整向量W和b的值,从而得到最大值。所以这里,我们又将支持向量机的任务进行简化——求得W向量和b的值,使得d最大。但是,对于这个d方程来说,里面还有绝对值符号,求得向量W和b仍然难度较大,那我们是否可以将方程简化一下呢?
化简距离函数,得到我们最终的目标函数
从这里开始,为了方便大家理解,我将用二维的分隔超平面给大家举例。
首先我们定义了许多数据点:(x1,y1) (x2,y2).......(xn,yn),并且给它们打上了标签,当点X在分割超平面上方的时候Y=+1,在下方的时候Y=-1(当然咯,这里的分隔超平面是一条直线),那我标签可不可以用别的数字呢?在这里不建议,因为标签是一个为了标记分类的数字,确实可以用别的,但我在这里为了化简,用+1和-1是最好的,至于为什么,请接着往下看。
我令分隔超平面方程为y(x) = + b(还是要注意W是向量,X是点),那么当我的数据点
代入方程y(x)大于0的时候,那这个数据点的标签就是+1,小于0,反之。如下图所示:
根据这个,我们就可以得到如下的公式:
因为我的标签y是正负1,所以标签值乘上y(x)是不是还是等于y(x),这就是我们为什么要将标签值设为正负1。有了这个条件之后,那我们在距离公式中是不是就可以去掉绝对值了啊。
( 将 + b = y(x)代入距离公式d)。所以现在我们的距离公式变成了这个:
而对于将数据点Xi放入分隔超平面得到的值我们是不是可以看作这个点离分隔超平面的远近,当它越大的时候离超平面越远,这我们叫他函数间隔。好,记住这段话,稍后我们会有大作用。
好的,我们再来理一理。我们要求的是离分割超平面最近的点到分割超平面的距离最大,为了更好的理解,我们将距离公式d变成如下数学公式:
min后面中括号里面的内容表示的是(由于这个公式我不会编辑,所以找了个相似的,
你就看作
就可以了),加个min也就是表示离超平面最近的点,而max大括号里面的内容就表示最近的点到超平面的距离最大,下面的w,b就是我们要求的。
这么一看,是不是感觉公式又变的更加麻烦了,别急,我们再将它化简一下。
对于min中括号里的内容,我们有没有办法给它去掉?我们先前说过可以看作离分隔超平面的远近,原本
,那我现在给它做一个放缩变换,我将它变成:
也就是说,我让数据点离你超平面最近的函数间隔才为1,变得更加严格,我给你赋这么一个条件。那我min中括号里的内容不就是只等于1了吗。所以,我的公式就变成了如下,它也是我们最终的目标函数:
但一定一定要注意,这个函数的前提是我给了它这么一个条件,所以,我只要用到这个函数,就必须带着它的前提条件跑。
我们一般求解极大值问题会将它转换为求极小值问题,这基本上已经是一个机器学习当中的套路了,所以我们转换一下。我们求1/||W||的最大值是不是就是求||W||的最小值,我们给它平方去掉绝对值,就得到了我们要的了(注意,它还是要有前提条件)。
这里还是千万注意啊,W不是一个数,它是一个向量。而我前面加过一个1/2的常数,是不会对结果有影响的,因为我要得到的是W和b,而不是它的最小值是什么。
总结得出最终目标函数如下:
约束条件:![y_{i}\cdot y(x_{i})=y_{i}(W^{T}X_{i}+b)>=1](https://latex.csdn.net/eq?y_%7Bi%7D%5Ccdot%20y%28x_%7Bi%7D%29%3Dy_%7Bi%7D%28W%5E%7BT%7DX_%7Bi%7D+b%29%3E%3D1)
目标函数:![min_{w,b}\frac{1}{2}w^{2}](https://latex.csdn.net/eq?min_%7Bw%2Cb%7D%5Cfrac%7B1%7D%7B2%7Dw%5E%7B2%7D)
应用拉格朗日乘子法求解
拉格朗日乘子法公式的推理,我在这里就不详细说了,我想大家大多数应该都有一定的高数基础,对它不了解也没关系,咱们只需要知道,拉格朗日乘子法是用来计算有约束条件的目标函数的极值。所以根据上述的约束条件和目标函数,我们已经知道约束条件是:,目标函数是:
,所以我们可以得到如下的公式:
注意注意,W和x都是向量,是标签,而且这里的
必须大于0,这也是一个条件。而相比起拉格朗日的“+”号,我们这里用到的是负号的原因是,拉格朗日必须满足的一个条件是对于一个不等式的约束条件,
后面乘的一约束条件必须是负数,也就是我们将
变为了
,而这两个条件是我们KKT条件的一部分,当优化问题是凸优化时,KKT条件就是极小值点,同时也是全局最小值点存在的充要条件。如果大家对于这个式子很陌生,很想知道它是怎么来的,大家,可以去网上学习一下拉格朗日,看完它的原理,大家就明白这个公式了。
然后我们是不是就直接可以对它求极值呢?还不行,因为我们的约束条件是一个不等式,这样计算会很麻烦,我们得将约束条件化为等式约束。
在满足约束条件下我们有:
这个公式具体怎么来的我就不多解释了,我们只需要知道后面需要它用于我们的计算依据。(如果大家想弄明白,可以去网上查找)
在这里我们经过对偶,得到了我们求极值的式子,这里的详细讲解我也不说了,只要明白我们这么做是为了将不等式约束条件,化为等式约束条件。那等式约束条件哪里来呢?别急,在后面。
好的,有了之后,我们接着来求它里面的min的极值,我们对 L(w,b,
)里的w和b求偏导,于是有:
接着我们将它们带入到原式L(w,b,),于是得到:
注意这里的(),它指的是两个向量的内积,得出的结果是一个值,后面我们的核函数会详细的讲它。而对于这个式子新的等式约束就是:
以及我们一开始有的条件
我们接着对max内容求极值,而由于我上面有说,我们机器学习求最大值,习惯于将它转化为求最小值,所以我们在式子前面加个负号求最小值就可以了,也就是对如下公式求极值:
为了便于大家理解,下面我将用一个二维的例子来求解。
SVM求解实例
(该例子不是出自本人,来自bi站博主:人工智能-泰罗)而且,这里大家就或许有一个疑问,我们不是求离分隔超平面最近的点的最大距离吗?我怎么判断它是离超平面最近的呢?别急,后面我会和大家唠唠。
正例就是标签值为+1,负例标签就是-1,而根据我们的条件,得到a1+a2-a3=0
注意啊,和
是标签值,
和
是点。
(就看出点
就可以了)所以得到分隔超平面:
。
我们回到前面的问题,我们怎么判断哪个点离分隔超平面最近?
我们从上面的例子中已经知道了,
,
,又根据
知道当
的时候,那么w就跟
和
没有关系了,所以我压根在这里我压根就不用考虑x2这个点。所以当
不等于0的点,就是我们正真有作用的点,就是我们离分隔超平面最近的点,也就是我们的支持向量!!!
软间隔
我们先来看到这个图
根据我们支持向量机的需求,我们要让离分隔超平面最近的点距离最大,那分隔超平面就是我们实线上,然而从图可以看出,实线的效果比不上虚线的效果,而其实在实际问题中,我们也不可能非常严格的按照要求,将所有点完全分开。那遇到这种情况我们应该怎么办?
这时候我们就引入了松弛因子。故名思意,就是要我们的条件
别那么的“严格”,我们“放松放松”。所以我们的条件就可以变为:
(
)。对比一下我们原先的条件,原先的条件是要严格的要求我的函数间隔比1要大(点必须在我们的最大间隔区外),而我们引入松弛因子后的条件,要求函数间隔可以比1小,于是当某些点的函数间隔小于1的时候(即这些点可以在我们的最大间隔区内),我们就可以将这些点给抛弃,忽略。
引入松弛因子后,我们的约束条件发生了变化,所以后面我们的目标函数和拉格朗日也都需要变化。
新的目标函数:
原来的目标函数,我们只有左半部分,左半部分就不多说了,我们来说说右半部分。右半部分说明我们加上了松弛因子,而它前面的C,我们叫它惩罚因子,它的作用是控制松弛因子的大小,而且它由我们自己指定 。因为我们的目标函数是希望取最小值,也就是整个式子越小越好,那当我左半部分不能再变化的时候,我右半部分C很大的时候,那我的是不是应该小或者几乎没有,意味着分类就要严格,当C很小的时候,那我
稍微大一点也没多大关系吧,意味着可以有更大的错误容忍。
新的拉格朗日公式:
相比于原式子,我们只是在后面加了一项。
核变换
这就是我们要解决一开始我提出的第二个问题了。我们先来看到如下的图
对于,左边这幅图,我们要将它进行分类的话,非常的困难,哪怕最后我们成功的将它分类出来了,也很大可能会出现过拟合的现象,所以我们就通过一种方法将数据点映射到更高维的空间,就变成了右图这样的,在这样的空间里,我们只需要用一个简单的分割超平面就可以完成分类了。
那我们就会有疑问,将二维的点,映射到三维上,那数据点还是原来的数据点吗?数据点还是以前的意义吗?我们一定是要将二维的点变成三维的点,再进行分隔吗?那要变成更高维的你又该怎么抽象画出来理解嘞?
其实不然,我们不用将低维的点抽象画出到高维上。我们来看到上面我们得到的公式:
我在上述有提到,()是内积!那么它得到的就是一个值,而不是一个向量,对吧。所以我们只需要将低维的(
)得到的内积转化成高维的内积,所以我们不用得出高维的向量,我们可以直接跳过求高维向量的过程得到我们要的内积值!!!!能帮我们做到这一点的就是核函数。
令原数据n维,计为,映射数据m维,计为
。我们需要找到一个函数,使得k(
)=
,函数K就是我们要的核函数,而常用的核函数的类型有:
对于这些核函数怎么来的,我的能力还不够,在这里就不多加叙述,我们只需要知道,它可以帮我们把低维的数据映射到高维上。如果大家相对核函数更深入的了解,大家可以搜索博主:小小小小U。
而对于该方法的代码我这里有我们上课编译的SMO算法来实现支持向量机,有兴趣的朋友可以给我发私信。