我们之前讨论的情况分两种,在样例线性可分的假设上,介绍了SVM的硬间隔,当样例线性不可分时,介绍了SVM软间隔,引入松弛变量,将模型进行调整,以保证在不可分的情况下,也能够尽可能地找出分隔超平面。 上两节介绍的SVM硬间隔和SVM软间隔,它们已经可以很好的解决有异常点的线性问题,但是如果本身是非线性的问题,目前来看SVM还是无法很好的解决的。所以本文介绍SVM的核函数技术,能够顺利的解决非线性的问题。

1.前言

为什么要引入核函数:

当样本在原始空间线性不可分时,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。如下图所示。(图片来自于知乎:SMON)

          

支持向量机核函数西瓜书 支持向量机 核函数_核函数


而引入这样的映射后,所要求解的对偶问题的求解中,无需求解真正的映射函数,而只需要知道其核函数K(x,y)。核函数的定义:K(x,y)=<ϕ(x),ϕ(y)>,即在特征空间的内积等于它们在原始样本空间中通过核函数 K 计算的结果。一方面数据变成了高维空间中线性可分的数据,另一方面不需要求解具体的映射函数,只需要给定具体的核函数即可,这样使得求解的难度大大降低。

2.核函数原理

在解释核函数原理之前,介绍非线性变化。

例如,一个二维的特征数据集支持向量机核函数西瓜书 支持向量机 核函数_支持向量机核函数西瓜书_02,这里的支持向量机核函数西瓜书 支持向量机 核函数_特征空间_03是实数,结果是y。要找到y与两个特征的变化关系,在线性变化过程中:支持向量机核函数西瓜书 支持向量机 核函数_机器学习_04找不到合适的参数a,b。于是考虑非线性变化,寻找到合适的参数来反映结果y数据集的特征之间的关系。
在非线性变化中,不再只有两个特征,可能变成了三个特征甚至五个特征,这个过程叫做低维空间到高维空间的映射。
  支持向量机核函数西瓜书 支持向量机 核函数_支持向量机核函数西瓜书_05
  支持向量机核函数西瓜书 支持向量机 核函数_支持向量机_06
此时,将二维的空间转换成高维的空间,寻找合适的参数来反映原始特征集的变化过程。

核函数的原理和非线性变化的原理如出一辙,也就是说对于在低维线性不可分的数据,在映射到了高维以后,就变成线性可分的了。也就是说,对于SVM线性不可分的低维特征数据,我们可以将其映射到高维,就能线性可分,此时就可以运用前两篇的线性可分SVM的算法思想了。

我们首先回顾下SVM软间隔的模型公式:

支持向量机核函数西瓜书 支持向量机 核函数_机器学习_07


注意到上式低维特征仅仅以内积支持向量机核函数西瓜书 支持向量机 核函数_支持向量机核函数西瓜书_08的形式出现,如果我们定义一个低维特征空间到高维特征空间的映射ϕ,将所有特征映射到一个更高的维度,让数据线性可分,我们就可以继续按前两篇的方法来优化目标函数,求出分离超平面和分类决策函数了。也就是说现在的SVM的优化目标函数变成:

支持向量机核函数西瓜书 支持向量机 核函数_机器学习_09

公式中的内积从支持向量机核函数西瓜书 支持向量机 核函数_机器学习_10,映射到支持向量机核函数西瓜书 支持向量机 核函数_支持向量机_11中时,在高维计算向量的内积是很困难的。比如最初的特征是n维的,我们将其映射到支持向量机核函数西瓜书 支持向量机 核函数_支持向量机_12维,然后再计算,这样需要支持向量机核函数西瓜书 支持向量机 核函数_机器学习_13的时间。那么我们能不能想办法减少计算时间呢?

引入核函数形式化定义,如果原始特征内积是支持向量机核函数西瓜书 支持向量机 核函数_特征空间_14,映射后为支持向量机核函数西瓜书 支持向量机 核函数_特征空间_15,那么定义核函数(Kernel)为支持向量机核函数西瓜书 支持向量机 核函数_核函数_16,映射函数为支持向量机核函数西瓜书 支持向量机 核函数_支持向量机核函数西瓜书_17

先看一个例子,假设x和z都是2维的输入空间,核函数是支持向量机核函数西瓜书 支持向量机 核函数_支持向量机核函数西瓜书_18,将二维特征空间映射成三维的空间中支持向量机核函数西瓜书 支持向量机 核函数_机器学习_19

支持向量机核函数西瓜书 支持向量机 核函数_机器学习_20


得到了支持向量机核函数西瓜书 支持向量机 核函数_特征空间_21支持向量机核函数西瓜书 支持向量机 核函数_核函数_22,此时支持向量机核函数西瓜书 支持向量机 核函数_支持向量机_23的值为支持向量机核函数西瓜书 支持向量机 核函数_支持向量机核函数西瓜书_24.

这个时候发现我们可以只计算原始特征x和z内积的平方,也就是说我们的时间复杂度为支持向量机核函数西瓜书 支持向量机 核函数_机器学习_25,就等价与计算映射后特征的内积支持向量机核函数西瓜书 支持向量机 核函数_支持向量机_11

当然,在使用了核函数是支持向量机核函数西瓜书 支持向量机 核函数_支持向量机核函数西瓜书_18,映射函数可以不同,例如

支持向量机核函数西瓜书 支持向量机 核函数_机器学习_19支持向量机核函数西瓜书 支持向量机 核函数_特征空间_21

支持向量机核函数西瓜书 支持向量机 核函数_机器学习_19支持向量机核函数西瓜书 支持向量机 核函数_特征空间_31

支持向量机核函数西瓜书 支持向量机 核函数_支持向量机_32支持向量机核函数西瓜书 支持向量机 核函数_支持向量机_33

但是映射函数的内积仍然满足支持向量机核函数西瓜书 支持向量机 核函数_特征空间_34。所以,得出一个结论在使用了核函数之后,不用找映射函数到底是哪一个,如何变化的,找支持向量机核函数西瓜书 支持向量机 核函数_核函数_35很麻烦,回想我们之前说过的

支持向量机核函数西瓜书 支持向量机 核函数_特征空间_36

只需将支持向量机核函数西瓜书 支持向量机 核函数_机器学习_37替换成支持向量机核函数西瓜书 支持向量机 核函数_特征空间_38,然后值的判断同上。

3.核函数的介绍

由上面的介绍可知,我们只需要定义核函数就可以了。但是如何通过映射支持向量机核函数西瓜书 支持向量机 核函数_核函数_35判断给定的一个函数支持向量机核函数西瓜书 支持向量机 核函数_支持向量机_40是不是核函数呢?或者说,支持向量机核函数西瓜书 支持向量机 核函数_支持向量机_40需要满足什么条件才是一个核函数。

通常所说的核函数就是正定核函数,具体证明略显复杂,有兴趣的可以参考《统计学习方法》,或者查看这篇博客:核函数有效性判定.

支持向量机核函数西瓜书 支持向量机 核函数_支持向量机核函数西瓜书_42


虽然有了上述定义,但是实际应用时验证支持向量机核函数西瓜书 支持向量机 核函数_支持向量机_40是否是正定核依然不容易,因此在实际问题中一般使用已有的核函数,下面给出一些常用的核函数。线性核函数:

线性核函数(Linear Kernel)其实就是我们前两篇的线性可分SVM,也就是说,线性可分SVM我们可以和线性不可分SVM归为一类,区别仅仅在于线性可分SVM用的是线性核函数。

                   

支持向量机核函数西瓜书 支持向量机 核函数_机器学习_44


多项式核函数:

多项式核函数(Polynomial Kernel)是线性不可分SVM常用的核函数之一,公式如下:

                   

支持向量机核函数西瓜书 支持向量机 核函数_支持向量机核函数西瓜书_45


高斯核函数:

高斯核函数(Gaussian Kernel),在SVM中也称为径向基核函数(Radial Basis Function,RBF),它是非线性分类SVM最主流的核函数。libsvm默认的核函数就是它。公式如下:

                   

支持向量机核函数西瓜书 支持向量机 核函数_机器学习_46


Sigmoid核函数:

Sigmoid核函数(Sigmoid Kernel)也是线性不可分SVM常用的核函数之一,公式如下:

                  

支持向量机核函数西瓜书 支持向量机 核函数_特征空间_47

4.核函数的选择

1、根据样本量m和特征量n进行选择:

(1)特征相比样本较大(如m=10~1000,n=10000):选逻辑回归或者线性函数SVM

(2)特征较少,样本量中(如m=10~10000,n=1~1000):选择高斯SVM

(3)特征量少,样本多(如m=50000+,n=1~1000):选多项式或高斯SVM

2、核函数优缺点的对比:

支持向量机核函数西瓜书 支持向量机 核函数_支持向量机核函数西瓜书_48