本文主要包含以下内容:

1.从线性不可分谈起

2.将低维特征映射到高维空间

3.核函数的有效性

4.常用核函数

1.从线性不可分谈起

我们之前谈到的情况都是线性可分的,也就是说总能找到一个超平面将数据集分开。 但现实总是那么不完美,大多情况都是线性不可分的。如下图所示:

SVM——(五)线性不可分之核函数_svm

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

SVM——(五)线性不可分之核函数_特征空间_02

看到没,现在我们已经用一个平面完美的将其分开了。不过此时可能传来这么一个声音“我瞎啊,这是刚刚的数据集么?明明刚刚在二维平面,现在却跑到三维平面去了,靠谱点好不?”对,数据集确确实实不是同一个数据集,但是:​每个数据集所对应的类别依旧和原来的一样​,只不过现在我给它穿上了一件“马甲”。也就是说,假如 x i x^i xi是正样本,那么它穿上马甲变成 x ^ i \hat{x}{^i} x^i之后仍然属于正样本。正如那句:你大妈 ​(数据集)已经不是​ 你​原来的(数据集)大妈了,但(每个样本点所对应的类别)你大爷仍旧(和先前一样)​ 是你大爷。

一句话:将低维数据集映射到高维空间中去,这样就一定能找到一个平面将其分开。

2.将低维特征映射到高维空间

所谓将低维特征映射到高维空间指的是用一定的映射关系,将其映射到更高维度的空间。比如通过函数 ϕ ( x ) \phi(x) ϕ(x)将一维 x x x映射到三维 x , x 2 , x 3 x,x^2,x^3 x,x2,x3。

相信大家应该还记得​​SVM求解​​中,最小化目标函数后的结果吧:

w = ∑ i = 1 m α i y ( i ) x ( i ) (2.1) w=\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}\tag{2.1} w=i=1∑m​αi​y(i)x(i)(2.1)

假设 α i \alpha_i αi​和 b b b已知;此时若对一个新的样本点进行预测,则其预测结果为:

y ( i ) = w T x + b = ∑ i = 1 m α i y ( i ) x ( i ) x + b = ∑ i = 1 m α i y ( i ) ⟨ x ( i ) , x ⟩ + b (2.2) \begin{aligned} y^{(i)}&=w^Tx+b\\[1ex] &=\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}x+b\\[1ex] &=\sum_{i=1}^m\alpha_iy^{(i)}\langle x^{(i)},x\rangle+b\tag{2.2} \end{aligned} y(i)=wTx+b=i=1∑mαiy(i)x(i)x+b=i=1∑mαiy(i)⟨x(i),x⟩+b(2.2)

其中 x ( i ) x^{(i)} x(i)表示训练集中的样本点(其实只是支持向量), x x x测试集的样本点; ⟨ a , b ⟩ \langle a,b\rangle ⟨a,b⟩表示 a , b a,b a,b之间的点积(数量积)。

按照我们上面提到的通过函数 ϕ ( x ) \phi(x) ϕ(x),将低维映射到高维的思想,那么此时只需要将之前的 x x x,全部替换成 ϕ ( x ) \phi(x) ϕ(x)即可:

y ( i ) = ∑ i = 1 m α i y ( i ) ⟨ x ( i ) , x ⟩ + b = ∑ i = 1 m α i y ( i ) ⟨ ϕ ( x ) , ϕ ( z ) ⟩ + b (2.3) \begin{aligned} y^{(i)}&=\sum_{i=1}^m\alpha_iy^{(i)}\langle x^{(i)},x\rangle+b\\[1ex] &=\sum_{i=1}^m\alpha_iy^{(i)}\langle \phi(x),\phi(z)\rangle+b\tag{2.3} \end{aligned} y(i)​=i=1∑m​αi​y(i)⟨x(i),x⟩+b=i=1∑m​αi​y(i)⟨ϕ(x),ϕ(z)⟩+b​(2.3)

其中 ϕ ( x ) \phi(x) ϕ(x)表示训练集映射之后的结果, ϕ ( z ) 表 示 测 试 集 映 射 之 后 的 结 果 \phi(z)表示测试集映射之后的结果 ϕ(z)表示测试集映射之后的结果,用不同字母只是为了区分。

但是这样一来虽然解决了线性不可分的困难,但是又出现了一个新的问题“​维度爆炸​”,如下:

现有数据集 χ \chi χ,其样本点 x i x^i xi有3个维度,分别为 x 1 i , x 2 i , x 3 i x^i_1,x^i_2,x^i_3 x1i​,x2i​,x3i​(下面简写为 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​),现通过函数 ϕ ( x ) \phi(x) ϕ(x)将其映射到某个9维空间中,其分别为( x 1 x 1 , x 1 x 2 , x 1 x 3 , x 2 x 1 , x 2 x 2 , x 2 x 3 , x 3 x 1 , x 3 x 2 , x 3 x 3 x_1x_1,x_1x_2,x_1x_3,x_2x_1,x_2x_2,x_2x_3,x_3x_1,x_3x_2,x_3x_3 x1​x1​,x1​x2​,x1​x3​,x2​x1​,x2​x2​,x2​x3​,x3​x1​,x3​x2​,x3​x3​)(至于为啥这样映射,往下看你就知道了)。如果此时进行预测则先要进行计算 ⟨ ϕ ( x ) , ϕ ( z ) ⟩ \langle \phi(x),\phi(z)\rangle ⟨ϕ(x),ϕ(z)⟩:

ϕ ( x ) = ( x 1 x 1 , x 1 x 2 , x 1 x 3 , x 2 x 1 , x 2 x 2 , x 2 x 3 , x 3 x 1 , x 3 x 2 , x 3 x 3 ) T ϕ ( z ) = ( z 1 z 1 , z 1 z 2 , z 1 z 3 , z 2 z 1 , z 2 z 2 , z 2 z 3 , z 3 z 1 , z 3 z 2 , z 3 z 3 ) T ⟨ ϕ ( x ) , ϕ ( z ) ⟩ = ( x 1 x 1 z 1 z 1 + x 1 x 2 z 1 z 2 + ⋯ + x 3 x 3 z 3 z 3 ) T (2.4) \begin{aligned} \phi(x)&=(x_1x_1,x_1x_2,x_1x_3,x_2x_1,x_2x_2,x_2x_3,x_3x_1,x_3x_2,x_3x_3)^T\\[1ex] \phi(z)&=(z_1z_1,z_1z_2,z_1z_3,z_2z_1,z_2z_2,z_2z_3,z_3z_1,z_3z_2,z_3z_3)^T\\[1ex] \langle \phi(x),\phi(z)\rangle&=(x_1x_1z_1z_1+x_1x_2z_1z_2+\cdots+x_3x_3z_3z_3)^T\tag{2.4} \end{aligned} ϕ(x)ϕ(z)⟨ϕ(x),ϕ(z)⟩​=(x1​x1​,x1​x2​,x1​x3​,x2​x1​,x2​x2​,x2​x3​,x3​x1​,x3​x2​,x3​x3​)T=(z1​z1​,z1​z2​,z1​z3​,z2​z1​,z2​z2​,z2​z3​,z3​z1​,z3​z2​,z3​z3​)T=(x1​x1​z1​z1​+x1​x2​z1​z2​+⋯+x3​x3​z3​z3​)T​(2.4)

此时你应该发现,这样计算量太大了,复杂度为 o ( n 2 ) o(n^2) o(n2)(三个复杂度分别为 o ( n 2 ) , o ( n 2 ) , o ( n ) o(n^2),o(n^2),o(n) o(n2),o(n2),o(n))。若进行更为复杂的映射,那么其复杂度将不可想象,而这就是“维度爆炸”。所以此时我们就要认真想一想,“映射”和“预测”之间到底是什么关系了。“映射”是作为一种思想,将低维映射到高维,从而解决线性不可分到可分的问题;而“预测”时所计算的 ⟨ ϕ ( x ) , ϕ ( z ) ⟩ \langle \phi(x),\phi(z)\rangle ⟨ϕ(x),ϕ(z)⟩,说穿了它就是一个值,不管你采取何种规则的映射,在预测时都要计算这么一个值;如果我们能通过某种“黑箱”直接计算出这么一个值,岂不乐哉?有没有呢?当然有,而这一“黑箱”操作就称为核函技巧( Kernel Trick \textrm{Kernel Trick} Kernel Trick)。

定义:

设 X \mathcal{X} X是输入空间(欧式空间 R n R^n Rn的子集或离散集合),又设 H \mathcal{H} H为特征空间(希尔伯特空间),如果存在一个从 X \mathcal{X} X到 H \mathcal{H} H的映射 ϕ ( x ) : X ⟶ H \phi(x):\mathcal{X}\longrightarrow \mathcal{H} ϕ(x):X⟶H使得对所有 x , z ∈ X x,z\in\mathcal{X} x,z∈X,函数 K ( x , z ) K(x,z) K(x,z)满足条件 K ( x , z ) = ϕ ( x ) ⋅ ϕ ( z ) K(x,z)=\phi(x)\cdot\phi(z) K(x,z)=ϕ(x)⋅ϕ(z),则称 K ( x , z ) K(x,z) K(x,z)为核函数, ϕ ( x ) \phi(x) ϕ(x)称为映射函数。

说人话就是:所有的映射都能找到一个与之对应的核函数 K ( x , z ) K(x,z) K(x,z)用来计算 ⟨ ϕ ( x ) , ϕ ( z ) ⟩ \langle \phi(x),\phi(z)\rangle ⟨ϕ(x),ϕ(z)⟩,从而避免了上面出现的“维度爆炸”的问题。核函数可以看做是实现“黑箱”操作(核技巧)的工具。

还是举个例子:

假设 ( 2.4 ) (2.4) (2.4)中,有两个样本点, x x x为训练集中的样本点, z z z为测试集中的样本点,其分别为 x = ( 1 , 2 , 3 ) , z = ( 2 , 3 , 4 ) x=(1,2,3),z=(2,3,4) x=(1,2,3),z=(2,3,4),则:

ϕ ( x ) = ( x 1 x 1 , x 1 x 2 , x 1 x 3 , x 2 x 1 , x 2 x 2 , x 2 x 3 , x 3 x 1 , x 3 x 2 , x 3 x 3 ) T = ( 1 × 1 , 1 × 2 , 1 × 3 , 2 × 1 , 2 × 2 , 2 × 3 , 3 × 1 , 3 × 2 , 3 × 3 ) T ϕ ( z ) = ( z 1 z 1 , z 1 z 2 , z 1 z 3 , z 2 z 1 , z 2 z 2 , z 2 z 3 , z 3 z 1 , z 3 z 2 , z 3 z 3 ) T = ( 2 × 2 , 2 × 3 , 2 × 4 , 3 × 2 , 3 × 3 , 3 × 4 , 4 × 2 , 4 × 3 , 4 × 4 ) T ⟨ ϕ ( x ) , ϕ ( z ) ⟩ = ( x 1 x 1 z 1 z 1 + x 1 x 2 z 1 z 2 + ⋯ + x 3 x 3 z 3 z 3 ) T = 4 + 12 + 24 + 12 + 36 + 72 + 24 + 72 + 144 = 400 K ( x , z ) = ( x T z ) 2 = ( 2 + 6 + 12 ) 2 = 400 \begin{aligned} \phi(x)&=(x_1x_1,x_1x_2,x_1x_3,x_2x_1,x_2x_2,x_2x_3,x_3x_1,x_3x_2,x_3x_3)^T\\[1ex] &=(1\times1,1\times2,1\times3,2\times1,2\times2,2\times3,3\times1,3\times2,3\times3)^T\\[1ex] \phi(z)&=(z_1z_1,z_1z_2,z_1z_3,z_2z_1,z_2z_2,z_2z_3,z_3z_1,z_3z_2,z_3z_3)^T\\[1ex] &=(2\times2,2\times3,2\times4,3\times2,3\times3,3\times4,4\times2,4\times3,4\times4)^T\\[1ex] \langle \phi(x),\phi(z)\rangle&=(x_1x_1z_1z_1+x_1x_2z_1z_2+\cdots+x_3x_3z_3z_3)^T\\[1ex] &=4+12+24+12+36+72+24+72+144=400\\[3ex] K(x,z)&=(x^Tz)^2=(2+6+12)^2=400 \end{aligned} ϕ(x)ϕ(z)⟨ϕ(x),ϕ(z)⟩K(x,z)​=(x1​x1​,x1​x2​,x1​x3​,x2​x1​,x2​x2​,x2​x3​,x3​x1​,x3​x2​,x3​x3​)T=(1×1,1×2,1×3,2×1,2×2,2×3,3×1,3×2,3×3)T=(z1​z1​,z1​z2​,z1​z3​,z2​z1​,z2​z2​,z2​z3​,z3​z1​,z3​z2​,z3​z3​)T=(2×2,2×3,2×4,3×2,3×3,3×4,4×2,4×3,4×4)T=(x1​x1​z1​z1​+x1​x2​z1​z2​+⋯+x3​x3​z3​z3​)T=4+12+24+12+36+72+24+72+144=400=(xTz)2=(2+6+12)2=400​

有没有发现,两者的结果一样,但是在计算上相差甚远。有人会问, ( x T z ) 2 = ϕ ( x ) ⋅ ϕ ( z ) (x^Tz)^2=\phi(x)\cdot\phi(z) (xTz)2=ϕ(x)⋅ϕ(z)下面是怎么来的,那下面就是推导:

( x T z ) 2 = ( ∑ i = 1 n x i z i ) ( ∑ j = 1 n x j z j ) = ∑ i = 1 n ∑ j = 1 n x i x j z i z j = ∑ i = 1 n ∑ j = 1 n x i x j z i z j = x 1 x 1 z 1 z 1 + x 1 x 2 z 1 z 2 + x 1 x 3 z 1 z 3 + ⋯ + x n x n z n z n = ϕ ( x ) ⋅ ϕ ( z ) \begin{aligned} (x^Tz)^2&=\large(\sum_{i=1}^nx_iz_i)\large(\sum_{j=1}^nx_jz_j)\\[2ex] &=\sum_{i=1}^n\sum_{j=1}^nx_ix_jz_iz_j\\[2ex] &=\sum_{i=1}^n\sum_{j=1}^n\color{red}{x_ix_j}\color{blue}{z_iz_j}\\[2ex] &=x_1x_1z_1z_1+x_1x_2z_1z_2+x_1x_3z_1z_3+\cdots+x_nx_nz_nz_n\\[2ex] &=\phi(x)\cdot\phi(z) \end{aligned} (xTz)2​=(i=1∑n​xi​zi​)(j=1∑n​xj​zj​)=i=1∑n​j=1∑n​xi​xj​zi​zj​=i=1∑n​j=1∑n​xi​xj​zi​zj​=x1​x1​z1​z1​+x1​x2​z1​z2​+x1​x3​z1​z3​+⋯+xn​xn​zn​zn​=ϕ(x)⋅ϕ(z)​

3.核函数的有效性

上面我们说到不管是什么样的一个映射,总能找到一个与之对应的核函数来实现核技巧。但是话又说回来,我们用得着一定要写出一个映射,然后找到他的核函数么?显然不需要,因为我们最终要的只是一个“值”,一个既可以通过映射关系映射后计算得到的值,也可以直接通过核函数计算得到的值。所以,事实上我们只需要有一个核函数,而不必关心他到底是以何种规则来映射的。

但是问题又来了,我怎么知道一个函数是否可以作为核函数呢?也就是说,这个函数是否对应着某个映射关系呢?比如 ( x T z ) n 和 e x p ( − ∣ ∣ x − z ∣ ∣ 2 2 σ 2 ) (x^Tz)^n和exp(-\frac{||x-z||^2}{2\sigma^2}) (xTz)n和exp(−2σ2∣∣x−z∣∣2),前者明显是,那后者呢?

对于什么样的函数能够做核函数,我们有如下定理:

令 X \mathcal{X} X为输入空间, k ( ⋅ , ⋅ ) k(\cdot,\cdot) k(⋅,⋅)是定义在 X × X \mathcal{X}\times\mathcal{X} X×X上的对称函数,则 k k k是核函数当且仅当对于任意数据 D + { x 1 , x 2 , ⋯   , x m } D+\{x_1,x_2,\cdots,x_m\} D+{x1​,x2​,⋯,xm​},核矩阵(kernel matrix)K总是半正定的:

K = [ k ( x 1 , x 2 ) ⋯ k ( x 1 , x j ) ⋯ k ( x 1 , x m ) ⋮ ⋮ ⋮ ⋮ k ( x i , x 1 ) ⋯ k ( x i , x j ) ⋯ k ( x i , x m ) ⋮ ⋮ ⋮ ⋮ k ( x m , x 1 ) ⋯ k ( x m , x j ) ⋯ k ( x m , x m ) ] \begin{aligned} K=\begin{bmatrix} k(x_1,x_2)&\cdots k(x_1,x_j)&\cdots & k(x_1,x_m) \\ \vdots&\vdots&\vdots&\vdots&\\ k(x_i,x_1)&\cdots k(x_i,x_j)&\cdots & k(x_i,x_m)\\ \vdots&\vdots&\vdots&\vdots&\\ k(x_m,x_1)&\cdots k(x_m,x_j)&\cdots & k(x_m,x_m)\\ \end{bmatrix} \end{aligned} 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 k是核函数的充要条件是,核矩阵 K K K为半正定矩阵

方阵P为正定    ⟺    \iff ⟺所有的特征值 λ i > 0 \lambda_i>0 λi​>0;

方阵P为半正定    ⟺    \iff ⟺所有的特征值 λ i ≥ 0 \lambda_i\geq0 λi​≥0;

举个例子:

现有 D = ( x ( 1 ) , x ( 2 ) , x ( 3 ) ) = [ 1 2 2 1 3 4 1 2 2 2 5 1 ] D=(x^{(1)},x^{(2)},x^{(3)})=\begin{bmatrix}1&2&2&1\\3&4&1&2\\2&2&5&1\end{bmatrix} D=(x(1),x(2),x(3))=⎣⎡​132​242​215​121​⎦⎤​,维度为4则,

对于 ( x T z ) 2 (x^Tz)^2 (xTz)2有:

k ( x 1 , x 2 ) = ( x ( 1 ) ⋅ ( x ( 2 ) ) T ) 2 = ( 1 × 3 + 2 × 4 + 2 × 1 + 1 × 2 ) = 15 ⋮ K = [ 10 15 17 15 30 21 17 21 34 ]    ⟹    λ 1 = 0.26 , λ 2 = 11 , λ 3 = 63 \begin{aligned} k(x_1,x_2)&=(x^{(1)}\cdot (x^{(2)})^T)^2=(1\times3+2\times4+2\times1+1\times2)=15\\ \vdots\\ K&=\begin{bmatrix} 10&15&17\\ 15&30&21\\ 17&21&34 \end{bmatrix} \implies\lambda_1=0.26,\lambda_2=11,\lambda_3=63 \end{aligned} k(x1​,x2​)⋮K​=(x(1)⋅(x(2))T)2=(1×3+2×4+2×1+1×2)=15=⎣⎡​101517​153021​172134​⎦⎤​⟹λ1​=0.26,λ2​=11,λ3​=63​

对于 e ( − ∣ ∣ x − z ∣ ∣ 2 2 σ 2 ) , σ = 1 ) e^{\large(-\frac{||x-z||^2}{2\sigma^2})},\sigma=1) e(−2σ2∣∣x−z∣∣2​),σ=1)有:


k ( x 1 , x 2 ) = e − ∣ ∣ x 1 − x 2 ∣ ∣ 2 2 = e − 5 ⋮ K = [ 1 e − 5 e − 5 e − 5 1 e − 11 e − 5 e − 11 1 ]    ⟹    λ 1 = 0.99 , λ 2 = 1 , λ 3 = 1.01 \begin{aligned} k(x_1,x_2)&=e^{-\frac{||x_1-x_2||^2}{2}}=e^{-5}\\[2ex] \vdots\\ K&=\begin{bmatrix} 1&e^{-5}&e^{-5}\\ e^{-5}&1&e^{-11}\\ e^{-5}&e^{-11}&1 \end{bmatrix}\implies\lambda_1=0.99,\lambda_2=1,\lambda_3=1.01 \end{aligned} k(x1​,x2​)⋮K​=e−2∣∣x1​−x2​∣∣2​=e−5=⎣⎡​1e−5e−5​e−51e−11​e−5e−111​⎦⎤​⟹λ1​=0.99,λ2​=1,λ3​=1.01​

由此我们可以知道,以上两个函数都可以作为核函数。

4.常用核函数

我们在实际解决问题的时候甚至都不用关心它到底是如何映射的,只需要正确选用核函数,实现分类的目的即可。下面是一些常见的核函数:

(1).线性核(Linear Kernel)

k ( x i , x j ) = x i T x j + C k(x_i,x_j) = x_i^Tx_j + C k(xi​,xj​)=xiT​xj​+C

(2).多项式核(Polynolial Kernel)

k ( x i , x j ) = ( x i T x j ) d + C k(x_i,x_j) = (x_i^Tx_j)^d + C k(xi​,xj​)=(xiT​xj​)d+C

其中 C C C为常数

(3).高斯核(Gaussian Kernel)

k ( x i , x j ) = e x p ( − ∣ ∣ x i − x j ∣ ∣ 2 2 σ 2 ) k(x_i,x_j) = exp\large({-\frac{||x_i-x_j||^2}{2\sigma^2}}) k(xi​,xj​)=exp(−2σ2∣∣xi​−xj​∣∣2​)

其中, σ > 0 \sigma>0 σ>0为高斯核的带宽(width)

(4).拉普拉斯核(Laplacian Kernel)

k ( x i , x j ) = e x p ( − ∣ ∣ x i − x j ∣ ∣ σ ) , σ > 0 k(x_i,x_j) = exp\large({-\frac{||x_i-x_j||}{\sigma}}),\sigma>0 k(xi​,xj​)=exp(−σ∣∣xi​−xj​∣∣​),σ>0

(5).Sigmoid核

k ( x i , x j ) = t a n h ( β x i T x j + θ ) k(x_i,x_j) = tanh(\beta x_i^Tx_j+\theta) k(xi​,xj​)=tanh(βxiT​xj​+θ)

其中,thanh为双曲正切函数, β > 0 , θ < 0 \beta>0,\theta<0 β>0,θ<0

通过前面的讨论可知,我们希望样本在特征空间内线性可分,因此特征空间的好坏对支持向量机的性能至关重要。需要注意的是,在不知道特征映射的形式时,我们并不知道什么样的核函数的合适的,而核函数也仅是隐式地定义了这个特征空间。于是,核函数的选择称为支持向量机最大的变数。

SVM——(五)线性不可分之核函数_svm_03

另外,核技巧不仅仅只用于SVM中,在任何一个学习算法中,只要某些项能够写成内积的形式,都可以用到核函数。


参考:


SVM——(五)线性不可分之核函数_特征空间_04