0x01. 到底什么是核函数?

最早的分类问题是线性分类,因此仅靠一条线可以进行划分。如图:
在这里插入图片描述

但是对求解非线性问题,则是通过某种非线性变换 φ ( x ) \varphi (x) φ(x),将输入空间映射到高维特征空间,从而找到一个超平面进行分类。其实在svm中,就用到了核函数的思想,为了更清晰的呈现,特意去找了个视频:

核函数思想

摘自油管

好了,看完视频,我们也知道了其实对于不可分的平面,在支持向量过程中,采用的是通过映射到高维空间后,从而可以形成一个超平面,最终实现了超平面分类。即多项式回归通过将数据从低维映射到高维,将原本线性不可分的情况变成了线性可分的情况。

0x02. 为什么引入核函数?

使用多项式回归,随着维度的增加,会存在一个问题,那就是计算量会以几何级数增加。这么说其实看官估计还是一脸懵逼,因此,我们先叙述核函数的定义:

核函数K(kernel function):指 K ( x , y ) = < f ( x ) , f ( y ) > K(x, y) = <f(x), f(y)> K(x,y)=<f(x),f(y)>,其中x和y是n维的输入值,f(·) 是从n维到m维的映射(通常,m>>n)。<x, y>是x和y的内积(inner product)(也称点积(dot product))。


在此假设定义两个向量:

x = ( x 1 , x 2 , x 3 ) x = (x_1, x_2, x_3) x=(x1,x2,x3) y = ( y 1 , y 2 , y 3 ) y = (y_1, y_2, y_3) y=(y1,y2,y3)

定义映射函数: f ( 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 ​ ) f(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​) f(x)=(x1x1,x1x2,x1x3,x2x1,x2x2,x2x3,x3x1,x3x2,x3x3)

定义核函数: K ( x , y ) = ( < f ( x ) , f ( y ) > ) 2 K(x,y)=(<f(x),f(y)>)^2 K(x,y)=(<f(x),f(y)>)2

假设: x = ( 1 , 2 , 3 ) x = (1,2,3) x=(1,2,3) y = ( 4 , 5 , 6 ) y = (4,5,6) y=(4,5,6)


如果不用核函数,我们如何求解?

先通过映射函数转换:
f ( x ) = ( 1 , 2 , 3 , 2 , 4 , 6 , 3 , 6 , 9 ) f(x)=(1, 2,3,2,4,6,3,6,9) f(x)=(1,2,3,2,4,6,3,6,9)
f ( y ) = ( 16 , 20 , 24 , 20 , 25 , 36 , 24 , 30 , 36 ) f(y)=(16,20,24,20,25,36,24,30,36) f(y)=(16,20,24,20,25,36,24,30,36)
再进行内积运算:
< f ( x ) , f ( y ) > = 1 × 16 + 2 × 20 + 3 × 24 + 2 × 20 + 4 × 25 + 6 × 36 + 3 × 24 + 6 × 30 + 9 × 36 = 16 + 40 + 72 + 40 + 100 + 180 + 72 + 180 + 324 = 1024 <f(x),f(y)>=1 \times 16 + 2 \times 20 + 3 \times 24 + 2 \times 20 + 4 \times 25 + 6 \times 36 + 3 \times 24 + 6 \times 30 + 9 \times 36 \\ =16+40+72+40+100+180+72+180+324 \\=1024 <f(x),f(y)>=1×16+2×20+3×24+2×20+4×25+6×36+3×24+6×30+9×36=16+40+72+40+100+180+72+180+324=1024


使用核函数,求解:

K ( x , y ) = ( 1 × 4 + 2 × 5 + 3 × 6 ) 2 = ( 4 + 10 + 18 ) 2 = 322 = 1024 K(x,y)=(1 \times 4+2 \times 5+ 3 \times 6)^2=(4 + 10 + 18)^2 = 322=1024 K(x,y)=(1×4+2×5+3×6)2=(4+10+18)2=322=1024


我们可以看到计算成本是不是一下就减小了。这还只是三维的映射,那如果是10维度甚至更高维度的呢?不得把人算死了,因此回到刚抛出的问题:使用多项式回归,随着维度的增加,会存在一个问题,那就是计算量会以几何级数增加。是不是这下就能理解了~kernel其实就是帮我们省去在高维空间里进行繁琐计算的“简便运算法”。甚至,它能解决无限维空间无法计算的问题!

0x03. 核函数在哪里应用?

在参考的众多资料中,SVM中的应用最为经典。在SVM中,遇到线性不可分的样本时,SVM就通过一个非线性映射的核函数把样本映射到一个线性可分的高维空间中,在此高维空间中建立线性函数(如二维空间的直线、三维空间的平面和高维空间的超平面)来划分样本的高维空间,此高维空间的线性分类面对应到输入样本空间的话就是一个非线性的分类面。结合第一部分的视频,是不是也很容易理解了划分的真实含义。

此处再借用一张图:
在这里插入图片描述

0x04. 常见的核函数

  1. 线性核函数: K ( v 1 , v 2 ) = < v 1 , v 2 > K(v_{1}, v_{2}) = <v_{1}, v_{2}> K(v1,v2)=<v1,v2>
  2. 多项式核函数: K ( v 1 , v 2 ) = ( γ < v 1 , v 2 > + c ) n K(v_{1}, v_{2}) = (\gamma<v_{1}, v_{2}>+c)^{n} K(v1,v2)=(γ<v1,v2>+c)n
  3. sigmoid核函数: K ( v 1 , v 2 ) = t a n h ( γ < v 1 , v 2 > + c ) K(v_{1},v_{2}) = tanh(\gamma<v_{1}, v_{2}>+c) K(v1,v2)=tanh(γ<v1,v2>+c)
  4. 高斯核函数: K ( v 1 , v 2 ) = e x p ( − ∣ ∣ v 1 − v 2 ∣ ∣ 2 2 σ 2 ) K(v_{1}, v_{2}) = exp(-\frac{||v_{1} - v_{2}||^{2}}{2\sigma^{2}}) K(v1,v2)=exp(2σ2∣∣v1v22)
  5. 拉普拉斯核函数: K ( v 1 , v 2 ) = e x p ( − ∣ ∣ v 1 − v 2 ∣ ∣ σ ) K(v_{1}, v_{2}) = exp(-\frac{||v_{1} - v_{2}||}{\sigma}) K(v1,v2)=exp(σ∣∣v1v2∣∣)

0x05. 参考

  1. https://yaoyz.blog.csdn.net/article/details/88071930?spm=1001.2014.3001.5502
  2. https://zhuanlan.zhihu.com/p/30009055?utm_source=qq
  3. https://blog.csdn.net/kateyabc/article/details/79980880
  4. https://www.zhihu.com/question/30371867
  5. http://songcy.net/posts/story-of-basis-and-kernel-part-2/
  6. https://blog.csdn.net/sinat_40624829/article/details/100894160
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐