前言
最近看了Andrew Ng的机器学习视频中的支持向量机,视频的内容比较浅显,没有深入解释支持向量机中的数学原理。但是对于一个比较执着于知道为什么的人,笔者还是去网上查找了有关支持向量机原理以及实现的相关资料。在查找的过程中,笔者发现支持向量机的内容还是蛮多的,于是笔者根据自己的理解,并且参考了一些相关资料,最终写下了支持向量机的四篇博客。
机器学习:支持向量机(SVM)与Python实现第(一)篇——此篇主要介绍了分类间隔,引入SVM。
机器学习:支持向量机(SVM)与Python实现第(二)篇——此篇主要介绍了使用拉格朗日乘子来简化SVM问题的优化。
机器学习:支持向量机(SVM)与Python实现第(三)篇——此篇主要介绍非线性分类(核函数)以及松弛变量。
机器学习:支持向量机(SVM)与Python实现第(四)篇——此篇主要介绍SMO算法并用python实现了简单的SVM分类器。
核函数
前面我们介绍了很多东西,但一直都是基于数据是线性可分的。那么对于那些非线性的数据呢?
比如上面的图,数据显然不是线性可分的(事实上得用圆来作边界)。我们知道二次曲线方程(圆是特殊的二次曲线)一般可以写成:
w1x21+w2x22+w3x1x2+w4x1+w5x2+w6=0在这里我们的特征变量可以写成:
ϕ(x)=⎡⎣⎢⎢⎢⎢⎢⎢x21x22x1x2x1x2⎤⎦⎥⎥⎥⎥⎥⎥回顾以前的输入是向量x,现在由于是非线性的,所以我们的输入映射成ϕ(x),也就是为了使用之前博文说的算法,要把向量x替换成ϕ(x)。
但是我们注意到一个问题,就是上一篇博文最后推导出来的式子中,x都是以内积的形式存在的,即⟨xT,z⟩的形式。现在我们替换成了ϕ(x),就会变成⟨ϕ(x)T,ϕ(z)⟩。具体一点,我们定义这个内积为:
K(x,z)=⟨ϕ(x)T,ϕ(z)⟩所以上一篇博文最后推导出来的内积都可以用K(x,z)替换。也就是:
maxα s.t W(α)=∑i=1mαi−12∑i,j=1my(i)y(j)αiαj⟨xT,x⟩αi≥0, i=1,...,m∑i=1mαiy(i)=0
这个优化问题可以替换成:
maxα s.t W(α)=∑i=1mαi−12∑i,j=1my(i)y(j)αiαjK(x,z)αi≥0, i=1,...,m∑i=1mαiy(i)=0这样问题好像解决了,一旦遇到非线性的分类,就去找一个映射,然后替换掉内积部分,就可以了。然而,这里有一个问题,就是维度呈指数型增长,上面二维空间就得映射成五维,三维空间就得映射成十九维。这样的话,计算量就会非常大。所以这样是行不通的。必须寻找另外的方法。
让我们来看一个例子,假设x=(x1,x2), z=(z1,z2)。考虑:
K(x,z)=(xTz)2将其展开得到:
K(x,z)=x21z21+x22z22+2x1x2z1z2=∑i,j=12(xixj)(zizj)而如果:
ϕ(x)=⎡⎣⎢x1x1x1x2x2x2⎤⎦⎥那么,
K(x,z)=⟨ϕ(x)T,ϕ(z)⟩=x21z21+x22z22+2x1x2z1z2
另外如果注意到:
K(x,z)=(xTz+1)2==x21z21+x22z22+2x1x2z1z2+2x1z1+2x2z2+1同样,映射成:
ϕ(x)=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢x1x12√x12√x2x1x2x2x21⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥你会发现这与内积⟨ϕ(x)T,ϕ(z)⟩的结果是一样的。也就是说,如果我们写成K(x,z)=(xTz+1)2的形式,我们就不用映射成ϕ(x)。这样就没有维度爆炸带来的后果了。
核函数的选择
现在我们来看两个直观的效果。核函数我们写成内积的形式:K(x,z)=⟨ϕ(x)T,ϕ(z)⟩。如果内积之后的值很大,那么说明ϕ(x)与ϕ(z)的距离比较远,反过来,如果它们的内积很小,说明这两个向量接近于垂直。所以K(x,z)可以来衡量ϕ(x)与ϕ(z)有多接近,或者说x与z有多接近。所以我们要如何选择核函数?如果从这个角度看,或许高斯函数是一个不错的选择:
K(x,z)=exp(−∥x−z∥22σ2)从高斯函数的表达式中可以看到,如果x与z很接近,那么K(x,z)的值就比较大(接近1),反正就比较小(接近0)。这个就被称为高斯核。
从K(x,z)=(xTz+1)2的形式也可以看出,K(x,z)的值是大于0的。另外核函数也要关于y轴对称。
松弛向量与软间隔最大化
另外一个问题是松弛变量的问题。我们之前一直谈论的分类是基于数据都比较优雅易于区分的。但是如果是这样的情况呢?
左图是理想的数据集,有图会发现有一个点比较偏离正常值。它也许是一个噪点,也许是人工标记的时候标错了。但在使用SVM分类时,却会因为这个点的存在而导致分类超平面是实线那个,但是一般来说,我们都知道虚线那个分类超平面是比较合理的。那么我们应该怎么做呢?
为了处理这种情况,我们允许数据点在一定程度上偏离超平面。
所以我们重新罗列出我们的优化问题:
minγ,w,b 12∥w∥2+C∑i=1mξis.t. y(i)(wTx(i)+b)≥1−ξi, i=1,...,mξi≥0, i=1,...,m这样我们就允许一些点的间距小于1了。并且如果有些点的间距为1−ξi,我们就会给目标函数一些惩罚,即增加了Cξi。于是我们重新写下新的拉格朗日函数:
L(w,b,ξ,α,r)=12wTw+C∑i=1mξi−∑i=1mαi[y(i)(xTw+b)−1+ξi]−∑i=1mriξi其中,αi与ri是拉格朗日乘子(都大于0)。经过相同的推导,我们会得到:
maxα s.t W(α)=∑i=1mαi−12∑i,j=1my(i)y(j)αiαj⟨x(i),x(j)⟩0≤αi≤C, i=1,...,m∑i=1mαiy(i)=0所以现在,加上松弛变量,我们的问题就变成上面那样了。接下来就是如何写代码来实现训练了。