前言

   在机器学习中,分类问题占了很大一部分,而对于分类问题的处理有很多方法,比如决策树、随机森林、朴素贝叶斯、前馈神经网络等等;而最为常见的分类需求一般是二分类问题,即将样本分为两个集合,然后通过学习某些参数,对新的输入进行识别并划分到正确的类别中。

   在解决分类问题中,应该说线性分类器就是最为简单的一类,虽然说起来较为简单,但其能处理的情况还是比较多的,而最为常用的一种线性分类器就是所谓的支持向量机(Support Vector Machine,简称SVM);其基本原理就是构建一个(对于而分类而言,如是多分类则显然不止一个)超平面,这个平面能尽量将两类样本进行分离,从而达到分类的目的,通过这些描述可知支持向量机所需要学习的东西其实就是这个超平面的相关系数。

   其实关于支持向量机的讨论或论述已经非常多,但笔者感觉可能还没有十分全面的介绍,故本文主要从以下几个方面对支持向量机说明:

   其一,对线性分类器进行一定的讨论,并重新证明下一个重要定理,即Novicoff定理,此定理在线性感知器以及支持向量机中有着重要的地位,但可能一般读者观其传统证明过程(发表于1962年)会有些困惑;

   其二,对支持向量机的本身原理进行描述,给出求解的目标函数(这个部分大多数文章都有);

   其三,对相关核方法进行讨论,包括一些常用的核方法,如多项式核方法、径向核(即RBF,主要是高斯核)等,对多核方法也会有一些涉及;

   其四,专注于讨论支持向量机目标函数的求解,主要是使用流行的SMO算法(这部分网上相关文章也讨论的比较多,但推导过程可能有些复杂或含混,不是很一目了然),并讨论下第一和第二变量的选择方法;

   其五,比较简单的对支持向量机在多分类场景的应用进行一些讨论。

线性二分类

           应该说在所有函数中,常数函数应该是最为简单的函数,但它对样本的识别能力有限,一般不太可能使用它来作为分类的函数,故限免可以考虑来作为分类函数的、较为简单的一类就是线性函数了。一般而言对于形如:

5f2a5e0098432fec9c40e81bea370f36.png-wh_

   的函数被称作线性判别函数,其中Sim是相似性函数,即表明x对于类别Yi的归属情况(使用Y是为了和输入区分,因为样本输入不一定和输出的形式一样;这里样本的输入集合使用X),而wi0其实是偏置,可以认为在其它公式中,就是那个b。那么有了这个公式,按照一般原则而言,我们可以定义最为简单的情况,即二分类线性判别函数,如下式所给出:

16f5966bc6b388920b1563a0b2efc65f.png-wh_

   其可以决策的超平面为:

379966fd0b18a55a1e4d612afc37f74c.png-wh_

   322f896d9916bb353973468aa34e6d41.png-wh_


   这个结论和之前的形式其实是完全相同的。即利用这个判定超平面将样本中的正例和负例进行分离;这里暂不讨论多分类的线性判定问题,待完全给出了支持向量机的所有内容再进行一般性的说明(多分类问题,在现阶段下最好不要使用支持向量机,有其他算法可以处理)。

 

   在给出了线性判别函数后,如何通过训练将每类的类进行标识,就是线性感知机(Linear Perceptron)算法,本部分也不会具体讨论其算法过程,这个留到阐述支持向量机的时候再详细描述(其实是在SMO算法中),这里仅给出一些基本的内容并证明一个重要定理。

            根据对象归类原理可知,感知机归类判别的依据就是找到最优的类预测函数,即寻找能将输入训练集中正负实例分开的超平面;因此对于同一个样本,其输入的类标应和输出的类标如果一致,则其类内差异应为0,如果不一致则该错误样本应距离超平面越近越好,否则如果离超平面越远则错误越大。以下定义类内差异(xkt表示输入,ykt表示输出):

49f42fe9dda71d46802c5290df26ff18.png-wh_


   其中uk是类别归属标识(在支持向量机中就是1-1),而我们记spacer.gif为其中错误分类样本到超平面的距离。

            显然,对于感知机来说,针对误分类的样本而言其值是小于0的,而正确分类(无论是正例还是负例)的样本是大于0的,因此可得感知机对归类判别依据为最小化如下之公式(针对所有样本):

9efd97fe4f51199efb6bdc523d0ef680.png-wh_

   由于任意正确分类样本会使得求和函数中每一项都为0,故可以简化错误分类样本到超平面的距离为:

  b30ca75a41c03ec2b0f3080eace6671c.png-wh_


    其中M是错误分类样本的集合。为了学习决策超平面,最小化公式8就是求解参数wb的过程。

   故在感知机算法就是通过如下方式更新这两个参数的(对公式8wb分别求导后可得):

7459a0670c46b07b53eb641623306b49.png-wh_


    其中η为步长,又被称作学习率,通过不断地迭代是归类判据最小化。以上就是线性感知机算法的一个比较原始的形式(正常的支持向量机其实是处理其对偶形式再加上惩罚系数及松弛变量)。

 

   在结束本节前,我们再来看一个非常重要的定理,它论述了这个算法的收敛性,这就是Novicoff定理,如下:

 

    Novicoff定理:样本训练集X={x1,x2,...,xN}及其对应的类标集合U={u1,u2,...,uN}线性可分,其中样本是p维实数空间的点,而类标取值为-11,则:


a13a4eded5586ab503a3d8b978708989.png-wh_

   关于此定理的论证在李航的《统计学习方法》一书中也有证明,笔者以下的证明是结合了这本书的相关内容以及原作者给出的证明。

6d9ea9e81ca11d561b37bfc41503782a.png-wh_

42aa71d139761480864de27eff77df95.png-wh_

1da3dce6b94d8e885996ae814e338a40.png-wh_

49138d283de7e16d53cfbc85d9ead5ed.png-wh_


   从Novicoff定理的内容来看,第一部分主要描述的是线性可分性(这个和描述极限有点类似,总是存在一个足够小的量,当然这里是离散的);第二部分主要描述的是算法一定会在有限步内结束。笔者认为直观上讲,其迭代步骤的多少至多和具有最大范数的样本有关(应该就是最远点)。

支持向量机

   在比较简单地阐述完线性二分类问题以及证明了线性感知机算法的收敛定理后,以下正式讨论支持向量机的相关内容,但一种针对支持向量机的、比较理想的求解算法将单独介绍;本节主要论述支持向量机的一些概念和目标函数的推导过程。

线性可分支持向量机

d7988982bfbd3b9bba6967319a792d25.png-wh_

   下利用点到平面的距离公式可以得出样本距两类判别平面的距离为:

8a56db3dfff9e26706032f763fbc15ec.png-wh_

   以上两个超平面相互平行,没有样本点落入这个区间内,分离超平面恰位于这两个平面中央(即到两个平面的距离是完全相同的),而w就是超平面的法向量,所以w就是所谓的支持向量。因此,线下行可分支持向量机的原始目标函数是:

4dddb65a1631135302aa468d9b83452b.png-wh_

   对于上式,由于w在分母,故不太好求,我们求解其对偶问题,即:

7239462b72f5ab76e9bdbcd425cdf967.png-wh_

  可以从公式12中看出,这实际上是一个凸二次规划最优化问题,使用拉格朗日乘子,将原始优化问题改写成非约束的拉格朗日函数:

7496157fb75ce1d9319e0b44ff9a52c4.png-wh_

  因此目标函数变为:


da8e5d619ef92cd04e4cc604095c1316.png-wh_

   可以看出,经过一定的推演后,目标函数变成只含一种变量的形式。

近似线性可分支持向量机

   在解决实际问题时,其实很多数据是线性不可分的,此时线性可分支持向量机就无效了。当然造成线性不可分的原因很多(可能数据需要放在更高维度方可分离),如果我们假设可以剔除其中一部分数据后还能保持线性可分,那么就是近似线性可分支持向量机。所谓近似线性可分是针对那些异常样本不满足与类判别超平面的间隔大于等于1,为解决此问题,定义一种所谓的松弛变量spacer.gif来表达间隔的差距,这个也被称作软间隔。当然如果这个值为0则样本没有问题,否则如过其在01之间则样本分类正确,但距离超平面过近,而如果它大于等于1则样本分类错误(从图形上看样本点已经游离到另外一个分类中了)。

   为了解决这个问题,需在原目标函数的基础之上增加一项,变为如下形式:

c364bb2b1052808c4e82bc5f4d769758.png-wh_


   其中C被称为惩罚系数(它大于等于0),其值越大惩罚力度越大;它和支持向量的范数大小也有一定的关系。

            同样地,按照上节的方法把公式17的优化问题转化成其对偶问题,可得加入拉格朗日乘子的目标函数如下:

cbe9ac01dd35d862a6635131ecfa558a.png-wh_

  在上式中,为了同时保证spacer.gif的非负性,故增加了一个参数spacer.gif。分别对上式的相关参数求取偏导数并带回,可得如下公式:

8e3131c0881579fae0e3da81792a0d76.png-wh_


   通过比较公式19和公式16,可知其主要不同就在于参数spacer.gif被限定在了一个更为狭窄的空间,这个可以在后面的SMO算法中充分地体现出来。

   对于这个支持向量的求解,主要就是针对公式19而言的,但是因为某些原因,这个形式还不是最终的目标函数,只能说是非常接近,因为在实际使用中,它无法解决所有相关二分类的问题,这就引出了关于核方法的内容。

数据升维——核方法

   在之前的讨论中,我们用于划分类别的是超平面,而且是使用线性函数表达的超平面(实际上是支持向量及截距),而基于线性函数的分类方法毕竟比较简单,无法处理另外一些线性不可分的情况(这个不是指一些异常点),或者是完全不可分,比如一类数据被另一类数据包裹,此时只要我们将这两类数据进行一定程度的维度变换(就是升维),就可以区分这种情况,比如在二维情况下,被包裹数据和包括数据在z轴进行分离。

   那么应该如何比较方便地处理升维这种情况?BoserGuyonVapnik为解决这个问题引入了核方法(当然在目前,核方法的应用更为广泛,不再限于支持向量机),该方法将训练数据通过非线性变换映射到更到的维度,那么利用核方法就可以设计非线性的支持向量机。

    简而言之,其形式化的表达如下

278896c6aec5b4ded429dcf8318d61f6.png-wh_


    即对于具有p维的样本点,将其通过函数转换进行映射,映射后的维度为d,这里d是大于p的。

   那么这个进行转换的函数就被成为核函数,对于支持向量机言,经过转换后(即输出)的线性判别函数就是:

591f0718e8b163556c3706058df95023.png-wh_


   在知道这个特征映射的情况下,可以通过计算上述内积得到核函数。不过在很多情况下核函数容易构造,而spacer.gif很难得到,因此这里就自然而然的有个问题需要解决,什么样的函数可以被用来作为核函数?

   关于这个问题其实早有定论,就是能作为核函数的函数其构造出来的Gram矩阵是半正定的(这是充分必要条件),Gram矩阵就是spacer.gif,这个定理被称作Mercer定理。

   

   以下给出几个常用的核函数:

1.q次多项式:

774d35d488a4adc0192597a73bc68d06.png-wh_

3ca276318a7787b8aadeddfdadf0e270.png-wh_

    从上面给出的特征映射函数可以看出它将数据从2维转换成了6维。

 

2.径向基函数(Radius Basis Function,简称RBF

   径向基函数可能最为常用的一种核函数,其形式如下:

0e64312f3d2d9b8170dc8a6540712751.png-wh_

   此函数定义的是球形核(又被称作高斯核),而spacer.gif为中心,spacer.gif是球的半径,这个半径可以作为参数自由定义。而这个函数的特征映射函数稍微复杂点,需要通过泰勒公式进行展开而得到,它具有将数据升成任意维度的能力。

 

3.S形函数

           S形函数定义如下(利用双曲正切):

7e19f9546a97bcdc38cb17666ebb6380.png-wh_

   其中c和γ可以定义。

 

            在比较简单地讨论完核函数后,最终给出支持向量机的目标函数如下:

96ba2973e96aa0aabffcfca752932486.png-wh_

    与公式19相比较,可以发现在此公式中增加了使用核函数的部分。

 

   在结束核方法的说明之前,我们再简单地讨论下多核方法(本文其实还用不到)。因为在解决实际时,可能只使用一个核方法还是无法达到目的,这时我们可以利用一些方法对其扩展,增加其它核方法,例如乘以一个常数、将两个核方法相加或将两个核方法相乘,以产生新的核方法,其中一种常用的方法是利用累加法,如下:

6587a2bbecfc2ee5e47fb792942b5aa0.png-wh_

   在上式中,m是被合成的核函数的数量,而加入限制是为了保证合成后的函数的凸性。故如果用公式30来替换公式29的对应部分,就能得到一个更为通用的支持向量机目标函数:

9d8da797c48443c9ba55ee701b81d42a.png-wh_

SMO方法求解目标函数

   如果不使用感知器算法求取目标函数的解,那是否有更好、更快的方法得到公式29的解?SMOSequential Minimal Optimization,即序列最小优化)算法就是为了解决这个问题而提出的,目前它是最快的二次规划算法。

目标函数变形

             由于已将其化为了对偶形式,故对于公式29我们需要求解的参数只有一种,就是一个维度为N的向量(即拉格朗日乘子),按照解决这类问题的一般思路可以固定其它N-1个参数,然后求取另外一个,但是这个和约束相冲突(这个约束是spacer.gif,即如果只固定其中一个参数,则这个参数实际上可以由其它参数来表达,所以它也被固定住了),那么换个思路,就是我们选取其中两个参数进行求解,则公式变形为如下形式:


896db15bb4adf92c33126155f5e2f46f.png-wh_

   不失一般性的,公式32就是把这两个参数设定为spacer.gifspacer.gif,而且Const是一个常数项,因其不包含这两个变量,在后面的求导过程中可以忽略。

   由于只有两个变量,我们利用约束可以得到:

72e0db9ad644375ee69fba693a88f710.png-wh_

   19a494bf2915a356e5190fe9b97fa3fe.png-wh_

    可以看出,通过公式36得到spacer.gif的解,然后再将其带回到公式34则能够得到参数spacer.gif的解,但这种表达方式过于复杂,现做一些调整。

   现定义误差(即样本真实值和预测值之间的差):

e26629eb02ee35b3085ed2d8e5e4118f.png-wh_

   至此我们得到了关于参数的解,但它是未经剪裁的(这就是为什么参数上会被标识为unclipped),即还需要使用约束条件对其进一步处理。

参数剪裁及边界处理

            由于对公式41所得到的结果未考虑其应被约束在一个固定范围内,故需要对其进行剪裁,这个约束就是:

49a74671f9be01a22cbeccb8434afb39.png-wh_

   这个在图像上的表现就是其取值必须在一个限定的正方形内,正方形的边长就是C。如果取值在其内则可根据第二个约束(这是一个直线)得到相应的值,否则只能取0或者C,具体如下:

8b81eaae45cca586afefecaf699eaf30.png-wh_

053fa6160869d3965d29b8e8289bcc3b.png-wh_

   在大多数情况下η都是大于零的,但如果其小于零该如何取值?这个问题可以这样理解即η实际上是公式36求取二阶导数的值,当其小于零时函数不再保持凸性,故其无法得到极值,也就是说这个违反了Mercer定理,矩阵不再是半正定的;而如果其等于零(无定义了),则说明两个样本的输入特征相同。对于这两种情况而言,函数都应该在边界上取值。

613d6a1296f0d732d8dafc370d799b0d.png-wh_

其它问题

28cbcd3368a50b6d10bc10f432994d74.png-wh_

c93dc84cd4fff3d424ec3a45bcabc39d.png-wh_

   在结束这些讨论之前,还有个问题需要说明,就是在SMO算法中如何选取这两个变量,选择?或者说选择的顺序和逻辑是什么?那么根据原作者给出的伪代码可以看出其流程是这样的:

   这种启发式的搜索的逻辑是先选择违背KKT条件的那个参数,而根据Osuna定理可知目标函数在一步迭代后就会减小;但是违背了KKT条件并不代表其值会在被限定的区域内(就是大于0而小于C),在界上的也可能会违背,因此算法会对所有样本进行搜索,只要遇到KKT违反的都会更新,如果没有收敛,则后面只针对界内的样例进行迭代,这是对于第一个参数的处理,而针对第二个参数而言,则选择能最大化之间误差的那个样本,即选取Max(|E2-E1|)对应之样本。

多分类支持向量机

   在本文的最后再来简单地讨论下关于多分类的支持向量机。

             假定样本中包含了c类,就是说样本有c个类标,而不是两个,每个类都有线性判别式可以将某类和其它类别相区分,那么最终就有c个线性判别式,如下:


ef57ce9df698dc2b3a420e2459e32e33.png-wh_

   这些判别式表明对于每个类而言,都存在一个超平面,使得相应的样本点都在该超平面的正侧。当然这是一种比较理想的情况,而在现实中显然很难满足这样的要求,超平面的正侧经常会出现重叠的情况,同时还可能出现对于某个输入x的所有判别式的结果都小于0,这样这个样本就无法被划分到任何一类,对于这种情况,可以做如下处理:将它划分到判别函数值最大的那个类中。

   以上的判别方式是处理多分类情况的一种,还有一种处理多分类情况的方法,即两两判别法,相应的公式如下:

efbe2fa48e13be3ab001dc41dc17aebc.png-wh_