机器学习:支持向量机(SVM)与Python实现第(三)篇

来源:互联网 发布:体检数据 编辑:程序博客网 时间:2024/06/18 10:40

前言

最近看了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αi12i,j=1my(i)y(j)αiαjxT,xαi0, i=1,...,mi=1mαiy(i)=0

这个优化问题可以替换成:
maxα s.t  W(α)=i=1mαi12i,j=1my(i)y(j)αiαjK(x,z)αi0, i=1,...,mi=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)=x1x12x12x2x1x2x2x21
你会发现这与内积ϕ(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(xz22σ2)
从高斯函数的表达式中可以看到,如果x与z很接近,那么K(x,z)的值就比较大(接近1),反正就比较小(接近0)。这个就被称为高斯核。

K(x,z)=(xTz+1)2的形式也可以看出,K(x,z)的值是大于0的。另外核函数也要关于y轴对称。

松弛向量与软间隔最大化

另外一个问题是松弛变量的问题。我们之前一直谈论的分类是基于数据都比较优雅易于区分的。但是如果是这样的情况呢?
这里写图片描述
左图是理想的数据集,有图会发现有一个点比较偏离正常值。它也许是一个噪点,也许是人工标记的时候标错了。但在使用SVM分类时,却会因为这个点的存在而导致分类超平面是实线那个,但是一般来说,我们都知道虚线那个分类超平面是比较合理的。那么我们应该怎么做呢?

为了处理这种情况,我们允许数据点在一定程度上偏离超平面。
这里写图片描述
所以我们重新罗列出我们的优化问题:

minγ,w,b 12w2+Ci=1mξis.t.  y(i)(wTx(i)+b)1ξi, i=1,...,mξi0, i=1,...,m
这样我们就允许一些点的间距小于1了。并且如果有些点的间距为1ξi,我们就会给目标函数一些惩罚,即增加了Cξi。于是我们重新写下新的拉格朗日函数:
L(w,b,ξ,α,r)=12wTw+Ci=1mξii=1mαi[y(i)(xTw+b)1+ξi]i=1mriξi
其中,αiri是拉格朗日乘子(都大于0)。经过相同的推导,我们会得到:
maxα s.t  W(α)=i=1mαi12i,j=1my(i)y(j)αiαjx(i),x(j)0αiC, i=1,...,mi=1mαiy(i)=0
所以现在,加上松弛变量,我们的问题就变成上面那样了。接下来就是如何写代码来实现训练了。

阅读全文
1 0
原创粉丝点击