机器学习(3)——支持向量机(Support Vector Machine)

一:支持向量机

首先请大家思考一个测试场景,假设我们有一个数据集,这个数据集是线性可分的(换句话说就是我们可以完全的将这个数据集分成两个组)。如果从几何的角度来讲,我们就是需要寻找一个超平面,这个超平面可以完全的将这个数据集按照要求分隔开。但是这个超平面却可能会存在很多个(可能数都数不清),那么怎么在该情况下寻找最优平面呢?这里给大家展示一副如下所示的图形:
机器学习(3)——支持向量机(Support Vector Machine)

这个图形其实就是我们刚才描述的场景的几何展示。圈和三角分别代表可以完全被分割的两个数据集。我们分别用-1和1代表对应的值。我们同时有列出了三条比较典型的超平面:两条虚线代表位于分割边界处的超平面,而实线则代表位于两条虚线之间最中间的超平面。当然其它还有很多可以把这个两个数据分割好的超平面,这里没有展示出来。

那么我们思考一下,那一条线应该是最优超平面呢?

正确答案是位于中间的那条。实线实际上代表的是最小限定线,它会与边界线(虚线)保持尽可能大的距离。我们反过来想一下,由于我们是通过提供的显示生活中的数据集去反推出一个可以判断总样本集中所有数据的模型,我们并没有获取到总样本集,只是样本集中的一个子集。所以该条线向任何一方偏移都可能会导致模型的过拟合。只有当该条线离边界线的数据都尽可能远的时候,我们才可能尽享避免过拟合的问题。而支持向量机就是寻找这样超平面的一种算法。

最小限定线是在训练的时候避免过拟合额一种处理方式。

二:平面之间的距离

关于超平面的表示方法如下所示:

y=wTx+b

x代表我们的特征值向量,也可以说是我们的输入特征值;w代表超平面的系数,是我们需要通过样本集确定的系数向量,通过确定这些系数我们就获取到了一个对应的超平面,也可以说是一个模型;b是让超平面离开原点的一个因素;y作为方程的输出值就代表了我们的分类标签。而这个公式就是我们线性分类器的真正样子,或者说数学表达式,这个公式不仅仅指的低纬,还可以代表高维。

机器学习(3)——支持向量机(Support Vector Machine)

经过前一节的分析,我们可以得出,我们需要使两条分界线之间的间隔要尽可能的大。

首先我们思考一下上图中wTx1+b=1wTx2+b=1两个超平面之间的距离是多少,用w表示超平面之间的距离?

首先将两个方程相减,我们可以得到如下所示的公式:

wT(x1x2)=2

这里我们需要将w转换到方程的右边去,一个做法是我们对方程的两边同时做除以||w||(w是一个向量,这个值表示的是这个向量的长度)的操作。那么我们就得到如下的方程式:

wT||w||(x1x2)=2||w||

我们思考下方程左边的部分:wT||w||代表的是一个归一化的向量——我们称为A,这个向量是有一些特点的,它是垂直于我们超平面的一个向量。如中w那个箭头。而x1x2这代表位于两个超平面上的两个点的查,他们的结果也是一个向量——我们称之为B。AB两个向量乘积的几何意义在于他们的结果,实际上就是B在A上的投影的长度。到这里你是不是豁然开朗的,因为A,B分别位于两个超平面上,向量A垂直于两个超平面,那么AB实际上就是我们要找的超平面之间的距离。这个我们还有一个名称,我们成超平面之间的距离为间隔(Margin)

三:支持向量机

3.1 最佳间隔分割器(optimal margin classifier)

支持向量机的核心在于最大化两个边界线之间的间隔。而在第二章我们得到了两条超平面之间的间隔,所以我们就需要解决下边的问题:

max2||w||s.t.whileclassifyingeverythingcorrectly

针对这个问题的,我们需要将文字的限制条件转化成数学表达式的形式,这样才能够进一步的分析。我们将其如下所示的表达式:

yi(wTxi+b)0

这个表达式完全可以替代我们的文字表达式。为什么呢?

  • yi0wTxi+b)0
  • yi0wTxi+b)0

但是这里有两个条件,我们在实际分析的时候比较麻烦。为了方便操作呢,我们用yiwTxi+b的乘积来作为我们的约束表达式。这样我们就只需要研讨一个表达式即可。

经过那些数学家的证明,求解max2||w||的过程比较复杂,所以他们做了一步转换(这是一个二次规划的问题,这个变换过程,笔者没有仔细研究,如果感兴趣,大家私下研究一下),并且转换后的求解过程也被证明是比较简单的。事实证明,这个处理不仅保证始终有解而且保证了只有唯一的解(具体的证明是科学家的事,这里就不做进一步的研究了)。经过转换后的表达式变成了如下的结果:

min||w||22s.t.yi(wTxi+b)1,i=1,,m

这里我们采用导数的方式来将求最大值的问题转换为最小值,但是这里有多做了一步——求平方,为什么呢?因为平方可以保持表达式的单调性;它会放大结果但不会改变表达式的顺序。

到了这部我们的问题就变成了一个不等式约束求最优值的问题了。这里就要用到拉格朗日乘子法或者KKT条件来解决这个问题。如果大家对这部分的内容不熟悉的话,我这里有单独的一篇文章讲解这个内容的——拉格朗日乘子法和KKT条件

为了使用拉格朗日乘子法,这里我们需要先将不等式约束条件做如下的转换:

yi(wTxi+b)1,i=1,,m

这里呢我们构造拉格朗日函数如下:

L(w,b,α)=12||w||2i=1mαi[yi(wTxi+b)1]

根据拉格朗日对偶,我们就将问题转换成如下的内容:

d=maxα,b,αi0minwL(w,b,α)

这里首先我们需要求解方程关于变量w的最小值,这种情况下我们的αi是固定的,方程的最小值只和wb有关。我们分别对其求导。过程如下所示:

wL(w,b,α)=wi=1mαiy(i)x(i)=0b=i=1mαiy(i)=0

通过上边的公式我们可以得到如下的式子:

w=i=1mαiy(i)x(i)

这是一个很巧妙的式子,我们将在后续的内容中介绍到为什么所他是一个很巧妙的式子。

我们将上一部得到的式子带入到我们前边获取到的拉格朗日函数中,我们得到如下的式子:

L(w,x,α)=12||w||2i=1mαi[yi(wTxi+b)1]=12wTwi=1mαiy(i)wTx(i)i=1mαiy(i)b+i=1mαi=12wTi=1mαiy(i)x(i)i=1mαiy(i)wTx(i)i=1mαiy(i)b+i=1mαi=12wTi=1mαiy(i)x(i)wTi=1mαiy(i)x(i)i=1mαiy(i)b+i=1mαi=12wTi=1mαiy(i)x(i)i=1mαiy(i)b+i=1mαi=12wTi=1mαiy(i)x(i)bi=1mαiy(i)+i=1mαi=12(i=1mαiy(i)x(i))Ti=1mαiy(i)x(i)bi=1mαiy(i)+i=1mαi=12i=1,j=1mαiy(i)(x(i))Tαjy(j)x(j)bi=1mαiy(i)+i=1mαi=i=1mαi12i=1,j=1mαiy(i)(x(i))Tαjy(j)x(j)bi=1mαiy(i)=i=1mαi12i=1,j=1mαiαjy(i)y(j)(x(i))Tx(j)bi=1mαiy(i)

根据前边我们求导的过程,我们可以得到最后结果中的最后一项的结果为0 ,那么我们的问题就可以转变为如下的内容:

maxαL(w,x,α)=i=1mαi12i=1,j=1mαiαjy(i)y(j)(x(i))Tx(j)s.t.αi0,i=1mαiy(i)=0

这里我们将(x(i))Tx(j)称为向量的内积,表示为x(i),x(j)。在下一节我们将基于这个方程式做相应的分析。

3.2二次规划方程式分析

这里我们首先要说明一点的是,上述表达式中关于xTixj的几何意义的问题,两个向量的点积,我们可以看作是向量的映射,他们的结果是一个数字,这个数字代表的是就是映射的长度。此时你会不会发现这个方程式的恐怖之处,他的后半部分在计算我们关注的点之间的距离。有人说如果他们方向相反的话,得出的结果是一个负值,但是前边的y(i)y(j)的乘积却可以帮我们抵消这一点。

如果我们去求解上一节中讲解到的方程的话,就是求解αi的值。我们求解出αi的值实际上也就简介求解出相应的α向量的值。根据上一节中得到到关于w(原问题的解)的等式(如下所示),我们可以反向求出w的值。

w=iαiyixi

然后我们根据如下的方程式得出b的结果:

b=maxi:y(i)=1wTx(i)+mini:y(i)=1wTx(i)2

即离超平面最近的正的函数间隔要等于离超平面最近的负的函数间隔,换句话说就是超平面位于两条分割超平面正中间的位置。

前边我们考虑的出发点都是以wTx+b为出发点的,现在我们得到了使用αi的表达式来表达w,如下所示:

wTx+b=(iαiy(i)x(i))Tx+b=iαiy(i)x(i)x

我们就将相应的求w的过程转换成了求α的过程。以前新来的样本首先需要根据wb做一次,然后看求得结果是大于0还是小于0。现在有αi,我们不需要求出w,只需要将新来的样本和训练数据中的所有样本做一次内积即可。这个过程相比前边来说要少很多的耗时,为什么呢?因为在这个过程中只有支持向量的αi0,其它的情况αi=0(因为对我们的求解过程无用)。因此在运算上实际没有比前边的耗时更多。

题外话:

大部分的αi的值都将为零。为什么呢?我们从几何角度讲解,我们需要找到的是一个能是两个分界面之间间隔最大的超平面。如果是这样一个超平面的话,我们只需要关注那些位于分界线上的值既可以,而不需要关注那些原理分界线的值,而当αi=0的时候往往值得就是这些特征点。因为这些点在我们对w的定义中没有任何实质性的意义。

基于这个,我们可以总结出这样一段话:由于每个点都是向量,但是我们只需要一些向量就足以找到我们需要的支持,来得到w的最优值。而这也就是我们这个算法名称的由来。

四:非线性数据的处理

要使用支持向量机的话,我们必须保证一个前提就是:数据可以被完全分割为两个部分的数据。那么对于不能够进行先行分割的数据的话,我们应该怎么处理呢?首先我们先看下如下所示的图形:
机器学习(3)——支持向量机(Support Vector Machine)
如果一个数据集如上边的内容所示,我们应该怎么处理呢?我们所讲的wT+b=0的超平面就不能够解决这个问题了,那么我们也就不能够使用支持向量机了。

关于这一类的问题我们就需要引入另外一个概念——核函数。这样我们的公式就会转变为如下所示的形式:

L(w,x,α)=i=1mαi12i=1,j=1mαiαjy(i)y(j)K(xi,xj)

公式中的K(xi,xj)就是我们使用的核函数。比较常用的核函数有:

  • (xTixj)2;x,y
  • xTixj
  • (xTixj+c)p
  • e(||xixj||22ð2)
  • tanh(αxTixj+θ)

具体的核函数相关的内容,我将在两外一片文章中给大家讲解一下——支持向量机——核函数