SVM总结

目录

1、what

2、SVM 基本概念

3、最优化目标

4、SVM优化的对偶问题

5、松弛向量与软间隔最大化

6、核函数

7、多类分类之SVM

“一对多”的方法

“一对一”的方法


1、what

SVM是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化。或者简单的可以理解为就是在高维空间中寻找一个合理的超平面将数据点分隔开来,其中涉及到非线性数据到高维的映射以达到数据线性可分的目的。

2、SVM 基本概念

将实例的特征向量(以二维为例)映射为空间中的一些点,就是如下图的实心点和空心点,它们属于不同的两类。那么 SVM 的目的就是想要画出一条线,以“最好地”区分这两类点,以至如果以后有了新的点,这条线也能做出很好的分类。

在这里插入图片描述

  • 能够画出多少条线对样本点进行区分?:线是有无数条可以画的,区别就在于效果好不好。比如绿线就不好,蓝线还凑合,红线看起来就比较好。我们所希望找到的这条效果最好的线叫作划分超平面
  • 为什么要叫作“超平面”呢?:因为样本的特征很可能是高维的,此时样本空间的划分就需要“超平面”
  • 画线的标准是什么?/ 什么才叫这条线的效果好?:SVM 将会寻找可以区分两个类别并且能使边际(margin)最大的超平面(hyper plane),即划分超平面。
  • 边际(margin)是什么?:边际就是某一条线距离它两侧最近的点的距离之和。比如下图中两条虚线构成的带状区域就是 margin,虚线是由距离中央实线最近的两个点所确定出来的。但此时 margin 比较小,如果用第二种方式画,margin 明显变大也更接近我们的目标。

  • 为什么要让 margin 尽量大?:因为大 margin 犯错的几率比较小
  • 如何选取使边际最大的超平面 (Max Margin Hyperplane,简称 MMH)?:超平面到一侧最近点的距离等于到另一侧最近点的距离,两侧的两个超平面平行
  • SVM 算法特性:训练好的模型的算法复杂度是由支持向量的个数决定的,而不是由数据的维度决定的。所以 SVM 不太容易产生 overfitting。SVM 训练出来的模型完全依赖于支持向量,即使训练集里面所有非支持向量的点都被去除,重复训练过程,结果仍然会得到完全一样的模型。一个 SVM 如果训练得出的支持向量个数比较少,那么SVM 训练出的模型比较容易被泛化。

3、最优化目标

SVM

从上图中我们可以看到,SVM会最大化间距,也就是那个m。但是,你可能会疑惑,上面的直线都怎么得出来的,m等于什么?我现在给你一个关于原点到直线距离的公式:

                                                            

现在,我们已经得到了间距,我们的SVM是想要最大化这个间距,也就是最小化。你可能会想这so easy啊,使w=0w=0不就ok了吗!但是,大家别忘了,我们求这个最小值是有约束的,也就是要分开我们的训练样本。约束如下:

                                                              

上面公式中的ii表示第ii个训练样本。我们可以把上面的分段函数写的更加紧凑一些,如下:

                                                                          

现在,我们可以总结一下SVM最优化目标了:

                                                                   

4、SVM优化的对偶问题

       对于SVM,前面提到,其primal problem是以下形式:

                                                                  

       同样的方法引入拉格朗日乘子,我们就可以得到以下拉格朗日函数:

                                                     

        然后对L(w, b, α)分别求w和b的极值。也就是L(w, b,α)对w和b的梯度为0:∂L/∂w=0和∂L/∂b=0,还需要满足α>=0。求解这里导数为0的式子可以得到:

                                                                               

       然后再代入拉格朗日函数后,就变成:

                                       

        这个就是dual problem(如果我们知道α,我们就知道了w。反过来,如果我们知道w,也可以知道α)。这时候我们就变成了求对α的极大,即是关于对偶变量α的优化问题(没有了变量w,b,只有α)。当求解得到最优的α*后,就可以同样代入到上面的公式,导出w*和b*了,最终得出分离超平面和分类决策函数。也就是训练好了SVM。那来一个新的样本x后,就可以这样分类了:

                                                                

       在这里,其实很多的αi都是0,也就是说w只是一些少量样本的线性加权值。这种“稀疏”的表示实际上看成是KNN的数据压缩的版本。也就是说,以后新来的要分类的样本首先根据w和b做一次线性运算,然后看求的结果是大于0还是小于0来判断正例还是负例。现在有了αi,我们不需要求出w,只需将新来的样本和训练数据中的所有样本做内积和即可。那有人会说,与前面所有的样本都做运算是不是太耗时了?其实不然,我们从KKT条件中得到,只有支持向量的αi不为0,其他情况αi都是0。因此,我们只需求新来的样本和支持向量的内积,然后运算即可。这种写法为下面要提到的核函数(kernel)做了很好的铺垫。如下图所示:

                                                             

5、松弛向量与软间隔最大化

       我们之前讨论的情况都是建立在样本的分布比较优雅和线性可分的假设上,在这种情况下可以找到近乎完美的超平面对两类样本进行分离。但如果遇到下面这两种情况呢?左图,负类的一个样本点A不太合群,跑到正类这边了,这时候如果按上面的确定分类面的方法,那么就会得到左图中红色这条分类边界,嗯,看起来不太爽,好像全世界都在将就A一样。还有就是遇到右图的这种情况。正类的一个点和负类的一个点都跑到了别人家门口,这时候就找不到一条直线来将他们分开了,那这时候怎么办呢?我们真的要对这些零丁的不太听话的离群点屈服和将就吗?就因为他们的不完美改变我们原来完美的分界面会不会得不偿失呢?但又不得不考虑他们,那怎样才能折中呢?

                                      

       对于上面说的这种偏离正常位置很远的数据点,我们称之为 outlier,它有可能是采集训练样本的时候的噪声,也有可能是某个标数据的大叔打瞌睡标错了,把正样本标成负样本了。那一般来说,如果我们直接忽略它,原来的分隔超平面还是挺好的,但是由于这个 outlier 的出现,导致分隔超平面不得不被挤歪了,同时 margin 也相应变小了。当然,更严重的情况是,如果出现右图的这种outlier,我们将无法构造出能将数据线性分开的超平面来。

      为了处理这种情况,我们允许数据点在一定程度上偏离超平面。也就是允许一些点跑到H1和H2之间,也就是他们到分类面的间隔会小于1。如下图:

                                                       

       具体来说,原来的约束条件就变为:

                                                              

        这时候,我们在目标函数里面增加一个惩罚项,新的模型就变成(也称软间隔):

                                                      

       引入非负参数ξi后(称为松弛变量),就允许某些样本点的函数间隔小于1,即在最大间隔区间里面,或者函数间隔是负数,即样本点在对方的区域中。而放松限制条件后,我们需要重新调整目标函数,以对离群点进行处罚,目标函数后面加上的第二项就表示离群点越多,目标函数值越大,而我们要求的是尽可能小的目标函数值。这里的C是离群点的权重,C越大表明离群点对目标函数影响越大,也就是越不希望看到离群点。这时候,间隔也会很小。我们看到,目标函数控制了离群点的数目和程度,使大部分样本点仍然遵守限制条件。

        这时候,经过同样的推导过程,我们的对偶优化问题变成:

                                                             

       此时,我们发现没有了参数ξi,与之前模型唯一不同在于αi又多了αi<=C的限制条件。需要提醒的是,b的求值公式也发生了改变,改变结果在SMO算法里面介绍。

如果C值很大,我们的松弛变量ξiξi就会很小,我们允许的误差也就很小,因此分类器会尽量正确分类样本,结果我们就会得到一个小间距的超平面,这样的结果可能会导致在新样本的分类性能很差,而在训练集上的分类性能很好,也就是出现过拟合(overfitting)现象;如果C值很小,我们所允许的误差也就很大,分类器即使要错误地分类样本,它也会找寻大间距的超平面,在这种情况下,如果你的训练集是线性可分的,也有可能出现错误分类的样本。

6、核函数

       如果我们的正常的样本分布如下图左边所示,之所以说是正常的指的是,不是上面说的那样由于某些顽固的离群点导致的线性不可分。它是真的线性不可分。样本本身的分布就是这样的,如果也像样本那样,通过松弛变量硬拉一条线性分类边界出来,很明显这条分类面会非常糟糕。那怎么办呢?SVM对线性可分数据有效,对不可分的有何应对良策呢?是核方法(kernel trick)大展身手的时候了。 

                                                   

       如上图右,如果我们可以把我们的原始样本点通过一个变换,变换到另一个特征空间,在这个特征空间上是线性可分的,那么上面的SVM就可以轻易工作了。也就是说,对于不可分的数据,现在我们要做两个工作:

1)首先使用一个非线性映射Φ(x)将全部原始数据x变换到另一个特征空间,在这个空间中,样本变得线性可分了;

2)然后在特征空间中使用SVM进行学习分类。

       好了,第二个工作没什么好说的,和前面的一样。那第一个粗重活由谁来做呢?它就是核函数,不仅具备这种超能力,同时又不会增加太多计算量的两全其美的方法。

现在,你回去看看我们那个dual problem的最大化目标函数,训练集中的数据样本仅仅是计算两点之间的内积。因此,只要我们能计算特征空间上的内积,我们就不需要显示地映射数据。下面,用我上面那幅图中的映射举个例子。

我们最初样本的输入空间为:

                                                                                    


用映射函数ϕϕ映射以后的结果为:

                                                                   


现在,我们随机挑选出2个映射以后的样本做内积:

                               

最后,如果我们定义一个核函数K(如下),我们就不需要显示地映射样本数据:

                                                                     

当然了,核函数有很多种,相信用过SVM的人都知道有什么样的核函数,这里我就不去介绍不同的核函数了。假定你现在选择了一个合适的核函数KK,现在我们要修改一下dual problem中的优化目标,如下:

                                                         
现在,我挑选出一个测试集中的样本zz来做一下分类:

                                                            

在实际应用中,我建议大家先试试低阶多项式核或者RBF核,这两个核都 是很好的选择。

7、多类分类之SVM

       SVM是一种典型的两类分类器,即它只回答属于正类还是负类的问题。而现实中要解决的问题,往往是多类的问题。那如何由两类分类器得到多类分类器呢?

“一对多”的方法

       One-Against-All这个方法还是比较容易想到的。就是每次仍然解一个两类分类的问题。比如我们5个类别,第一次就把类别1的样本定为正样本,其余2,3,4,5的样本合起来定为负样本,这样得到一个两类分类器,它能够指出一个样本是还是不是第1类的;第二次我们把类别2 的样本定为正样本,把1,3,4,5的样本合起来定为负样本,得到一个分类器,如此下去,我们可以得到5个这样的两类分类器(总是和类别的数目一致)。到了有样本需要分类的时候,我们就拿着这个样本挨个分类器的问:是属于你的么?是属于你的么?哪个分类器点头说是了,文章的类别就确定了。这种方法的好处是每个优化问题的规模比较小,而且分类的时候速度很快(只需要调用5个分类器就知道了结果)。但有时也会出现两种很尴尬的情况,例如拿这个样本问了一圈,每一个分类器都说它是属于它那一类的,或者每一个分类器都说它不是它那一类的,前者叫分类重叠现象,后者叫不可分类现象。分类重叠倒还好办,随便选一个结果都不至于太离谱,或者看看这篇文章到各个超平面的距离,哪个远就判给哪个。不可分类现象就着实难办了,只能把它分给第6个类别了……更要命的是,本来各个类别的样本数目是差不多的,但“其余”的那一类样本数总是要数倍于正类(因为它是除正类以外其他类别的样本之和嘛),这就人为的造成了上一节所说的“数据集偏斜”问题。

       如下图左。红色分类面将红色与其他两种颜色分开,绿色分类面将绿色与其他两种颜色分开,蓝色分类面将蓝色与其他两种颜色分开。                                                                                                                                                                                                                          

       在这里的对某个点的分类实际上是通过衡量这个点到三个决策边界的距离,因为到分类面的距离越大,分类越可信嘛。当然了,这个距离是有符号的,如下所示:

                                                      

       例如下图左,将星星这个点划分给绿色这一类。右图将星星这个点划分给褐色这一类。                                                                                                       

“一对一”的方法

       One-Against-One方法是每次选一个类的样本作正类样本,而负类样本则变成只选一个类(称为“一对一单挑”的方法,哦,不对,没有单挑,就是“一对一”的方法,呵呵),这就避免了偏斜。因此过程就是算出这样一些分类器,第一个只回答“是第1类还是第2类”,第二个只回答“是第1类还是第3类”,第三个只回答“是第1类还是第4类”,如此下去,你也可以马上得出,这样的分类器应该有5 X 4/2=10个(通式是,如果有k个类别,则总的两类分类器数目为k(k-1)/2)。虽然分类器的数目多了,但是在训练阶段(也就是算出这些分类器的分类平面时)所用的总时间却比“一类对其余”方法少很多,在真正用来分类的时候,把一个样本扔给所有分类器,第一个分类器会投票说它是“1”或者“2”,第二个会说它是“1”或者“3”,让每一个都投上自己的一票,最后统计票数,如果类别“1”得票最多,就判这篇文章属于第1类。这种方法显然也会有分类重叠的现象,但不会有不可分类现象,因为总不可能所有类别的票数都是0。如下图右,中间紫色的块,每类的得票数都是1,那就不知道归类给那个类好了,只能随便扔给某个类了(或者衡量这个点到三个决策边界的距离,因为到分类面的距离越大,分类越可信嘛),扔掉了就是你命好,扔错了就不lucky了。

                                       

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值