本文主要包含以下内容:
1.从线性不可分谈起
2.将低维特征映射到高维空间
3.核函数的有效性
4.常用核函数
1.从线性不可分谈起
我们之前谈到的情况都是线性可分的,也就是说总能找到一个超平面将数据集分开。 但现实总是那么不完美,大多情况都是线性不可分的。如下图所示:

我们应该怎么才能将其分开呢?有人说用曲线能将其分开;对,曲线确实能将数据集分开,但如果用曲线,那还能叫支持向量机么。那到底又该怎么弄?你说!不慌,请看下图:

看到没,现在我们已经用一个平面完美的将其分开了。不过此时可能传来这么一个声音“我瞎啊,这是刚刚的数据集么?明明刚刚在二维平面,现在却跑到三维平面去了,靠谱点好不?”对,数据集确确实实不是同一个数据集,但是:每个数据集所对应的类别依旧和原来的一样,只不过现在我给它穿上了一件“马甲”。也就是说,假如xi是正样本,那么它穿上马甲变成x^i之后仍然属于正样本。正如那句:你大妈(数据集)已经不是你原来的(数据集)大妈了,但(每个样本点所对应的类别)你大爷仍旧(和先前一样)是你大爷。
一句话:将低维数据集映射到高维空间中去,这样就一定能找到一个平面将其分开。
2.将低维特征映射到高维空间
所谓将低维特征映射到高维空间指的是用一定的映射关系,将其映射到更高维度的空间。比如通过函数ϕ(x)将一维x映射到三维x,x2,x3。
相信大家应该还记得SVM求解中,最小化目标函数后的结果吧:
w=∑i=1mαiy(i)x(i)(2.1)
假设αi和b已知;此时若对一个新的样本点进行预测,则其预测结果为:
y(i)=wTx+b=∑i=1mαiy(i)x(i)x+b=∑i=1mαiy(i)⟨x(i),x⟩+b(2.2)
其中x(i)表示训练集中的样本点(其实只是支持向量),x测试集的样本点;⟨a,b⟩表示a,b之间的点积(数量积)。
按照我们上面提到的通过函数ϕ(x),将低维映射到高维的思想,那么此时只需要将之前的x,全部替换成ϕ(x)即可:
y(i)=∑i=1mαiy(i)⟨x(i),x⟩+b=∑i=1mαiy(i)⟨ϕ(x),ϕ(z)⟩+b(2.3)
其中ϕ(x)表示训练集映射之后的结果,ϕ(z)表示测试集映射之后的结果,用不同字母只是为了区分。
但是这样一来虽然解决了线性不可分的困难,但是又出现了一个新的问题“维度爆炸”,如下:
现有数据集χ,其样本点xi有3个维度,分别为xi1,xi2,xi3(下面简写为x1,x2,x3),现通过函数ϕ(x)将其映射到某个9维空间中,其分别为(x1x1,x1x2,x1x3,x2x1,x2x2,x2x3,x3x1,x3x2,x3x3)(至于为啥这样映射,往下看你就知道了)。如果此时进行预测则先要进行计算⟨ϕ(x),ϕ(z)⟩:
ϕ(x)ϕ(z)⟨ϕ(x),ϕ(z)⟩=(x1x1,x1x2,x1x3,x2x1,x2x2,x2x3,x3x1,x3x2,x3x3)T=(z1z1,z1z2,z1z3,z2z1,z2z2,z2z3,z3z1,z3z2,z3z3)T=(x1x1z1z1+x1x2z1z2+⋯+x3x3z3z3)T(2.4)
此时你应该发现,这样计算量太大了,复杂度为o(n2)(三个复杂度分别为o(n2),o(n2),o(n))。若进行更为复杂的映射,那么其复杂度将不可想象,而这就是“维度爆炸”。所以此时我们就要认真想一想,“映射”和“预测”之间到底是什么关系了。“映射”是作为一种思想,将低维映射到高维,从而解决线性不可分到可分的问题;而“预测”时所计算的⟨ϕ(x),ϕ(z)⟩,说穿了它就是一个值,不管你采取何种规则的映射,在预测时都要计算这么一个值;如果我们能通过某种“黑箱”直接计算出这么一个值,岂不乐哉?有没有呢?当然有,而这一“黑箱”操作就称为核函技巧(Kernel Trick)。
定义:
设X是输入空间(欧式空间Rn的子集或离散集合),又设H为特征空间(希尔伯特空间),如果存在一个从X到H的映射ϕ(x):X⟶H使得对所有x,z∈X,函数K(x,z)满足条件K(x,z)=ϕ(x)⋅ϕ(z),则称K(x,z)为核函数,ϕ(x)称为映射函数。
说人话就是:所有的映射都能找到一个与之对应的核函数K(x,z)用来计算⟨ϕ(x),ϕ(z)⟩,从而避免了上面出现的“维度爆炸”的问题。核函数可以看做是实现“黑箱”操作(核技巧)的工具。
还是举个例子:
假设(2.4)中,有两个样本点,x为训练集中的样本点,z为测试集中的样本点,其分别为x=(1,2,3),z=(2,3,4),则:
ϕ(x)ϕ(z)⟨ϕ(x),ϕ(z)⟩K(x,z)=(x1x1,x1x2,x1x3,x2x1,x2x2,x2x3,x3x1,x3x2,x3x3)T=(1×1,1×2,1×3,2×1,2×2,2×3,3×1,3×2,3×3)T=(z1z1,z1z2,z1z3,z2z1,z2z2,z2z3,z3z1,z3z2,z3z3)T=(2×2,2×3,2×4,3×2,3×3,3×4,4×2,4×3,4×4)T=(x1x1z1z1+x1x2z1z2+⋯+x3x3z3z3)T=4+12+24+12+36+72+24+72+144=400=(xTz)2=(2+6+12)2=400
有没有发现,两者的结果一样,但是在计算上相差甚远。有人会问,(xTz)2=ϕ(x)⋅ϕ(z)下面是怎么来的,那下面就是推导:
(xTz)2=(∑i=1nxizi)(∑j=1nxjzj)=∑i=1n∑j=1nxixjzizj=∑i=1n∑j=1nxixjzizj=x1x1z1z1+x1x2z1z2+x1x3z1z3+⋯+xnxnznzn=ϕ(x)⋅ϕ(z)
3.核函数的有效性
上面我们说到不管是什么样的一个映射,总能找到一个与之对应的核函数来实现核技巧。但是话又说回来,我们用得着一定要写出一个映射,然后找到他的核函数么?显然不需要,因为我们最终要的只是一个“值”,一个既可以通过映射关系映射后计算得到的值,也可以直接通过核函数计算得到的值。所以,事实上我们只需要有一个核函数,而不必关心他到底是以何种规则来映射的。
但是问题又来了,我怎么知道一个函数是否可以作为核函数呢?也就是说,这个函数是否对应着某个映射关系呢?比如(xTz)n和exp(−||x−z||22σ2),前者明显是,那后者呢?
对于什么样的函数能够做核函数,我们有如下定理:
令X为输入空间,k(⋅,⋅)是定义在X×X上的对称函数,则k是核函数当且仅当对于任意数据D+{x1,x2,⋯,xm},核矩阵(kernel matrix)K总是半正定的:
K=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢k(x1,x2)⋮k(xi,x1)⋮k(xm,x1)⋯k(x1,xj)⋮⋯k(xi,xj)⋮⋯k(xm,xj)⋯⋮⋯⋮⋯k(x1,xm)⋮k(xi,xm)⋮k(xm,xm)⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
也就是说:k是核函数的充要条件是,核矩阵K为半正定矩阵
方阵P为正定⟺所有的特征值λi>0;
方阵P为半正定⟺所有的特征值λi≥0;
举个例子:
现有D=(x(1),x(2),x(3))=⎡⎣⎢132242215121⎤⎦⎥,维度为4则,
对于(xTz)2有:
k(x1,x2)⋮K=(x(1)⋅(x(2))T)2=(1×3+2×4+2×1+1×2)=15=⎡⎣⎢101517153021172134⎤⎦⎥⟹λ1=0.26,λ2=11,λ3=63
对于e(−||x−z||22σ2),σ=1)有:
k(x1,x2)⋮K=e−||x1−x2||22=e−5=⎡⎣⎢1e−5e−5e−51e−11e−5e−111⎤⎦⎥⟹λ1=0.99,λ2=1,λ3=1.01
由此我们可以知道,以上两个函数都可以作为核函数。
4.常用核函数
我们在实际解决问题的时候甚至都不用关心它到底是如何映射的,只需要正确选用核函数,实现分类的目的即可。下面是一些常见的核函数:
(1).线性核(Linear Kernel)
k(xi,xj)=xTixj+C
(2).多项式核(Polynolial Kernel)
k(xi,xj)=(xTixj)d+C
其中C为常数
(3).高斯核(Gaussian Kernel)
k(xi,xj)=exp(−||xi−xj||22σ2)
其中,σ>0为高斯核的带宽(width)
(4).拉普拉斯核(Laplacian Kernel)
k(xi,xj)=exp(−||xi−xj||σ),σ>0
(5).Sigmoid核
k(xi,xj)=tanh(βxTixj+θ)
其中,thanh为双曲正切函数,β>0,θ<0
通过前面的讨论可知,我们希望样本在特征空间内线性可分,因此特征空间的好坏对支持向量机的性能至关重要。需要注意的是,在不知道特征映射的形式时,我们并不知道什么样的核函数的合适的,而核函数也仅是隐式地定义了这个特征空间。于是,核函数的选择称为支持向量机最大的变数。

另外,核技巧不仅仅只用于SVM中,在任何一个学习算法中,只要某些项能够写成内积的形式,都可以用到核函数。
SVM——(七)SMO(序列最小最优算法)
SVM——(六)软间隔目标函数求解
SVM——(五)线性不可分之核函数
SVM——(四)目标函数求解
SVM——(三)对偶性和KKT条件(Lagrange duality and KKT condition)
SVM——(二)线性可分之目标函数推导方法2
SVM——(一)线性可分之目标函数推导方法1
参考: