关于核函数

本文主要是转载他人观点,只是用来作为学习笔记,感谢原作者。


Part1:
核函数和映射没有关系。核函数只是用来计算映射到高维空间之后的内积的一种简便方法。

一般英文文献对Kernel有两种提法,一是Kernel Function,二是Kernel Trick。从Trick一词中就可以看出,这只是一种运算技巧而已,不涉及什么高深莫测的东西。

具体巧在哪里呢?我们如果想进行原本就线性不可分的数据集进行分割,那么选项一是容忍错误分类,即引入Soft Margin;选项二是我们可以对Input Space做Feature Expansion,把数据集映射到高维中去,形成了Feature Space。我们几乎可以认为(引用Caltech的课堂用语“We are safe but not certain”)原本在低维中线性不可分的数据集在足够高的维度中存在线性可分的超平面。

围绕选项二,那么我们所做的就是要在Feature Space套用原本在线性可分情况下的Input Space中使用过的优化方法,来找到那个Maximaizing Margin的超平面。原理机制一模一样,是二次规划,唯一不同是代入数据的不同,我们需要代入\phi(x_i)而不是x_i。这时(在假设我们已知了如何选取mapping之后)才有了核函数的概念。

具体Trick的意义,就是简化计算二次规划中间的一步内积计算。也即中间步骤有一步必须求得\phi(x_i)'\phi(x_j),而我们可以定义核函数K(x_i,x_j)=\phi(x_i)'\phi(x_j),使得我们在不需要显式计算每一个\phi(x_i)、甚至不需要知道\phi(\cdot )长什么样的情况下,直接求出\phi(x_i)'\phi(x_j)的值来。

也就是说,核函数、内积、相似度这三个词是等价的。因为inner product其实就是一种similarity的度量。核函数和映射是无关的。

但为什么这么多的认知中核函数是一种映射呢。一来这两件事一般先后进行,所以常常被混为一谈。二来就像前面所述,核函数让人们不需要知道\phi(\cdot )长什么样,不需要知道怎么选取映射,就能够算出内积。因此这常常被认作是一种implicit mapping。这是由Mercer Theorem保证的,即只要核函数满足一定条件,那么映射空间一定存在。

Part2:


来举一个核函数把低维空间映射到高维空间的例子。

下面这张图位于第一、二象限内。我们关注红色的门,以及“北京四合院”这几个字下面的紫色的字母。我们把红色的门上的点看成是“+”数据,紫色字母上的点看成是“-”数据,它们的横、纵坐标是两个特征。显然,在这个二维空间内,“+”“-”两类数据不是线性可分的。
<img src="https://i-blog.csdnimg.cn/blog_migrate/b8e119571ebdd66867791332904349e9.jpeg" data-rawwidth="720" data-rawheight="342" class="origin_image zh-lightbox-thumb" width="720" data-original="https://pic2.zhimg.com/19fa4052ea4f20651d25a1249f1e372d_r.jpg">
我们现在考虑核函数 K(v_1,v_2) = <v_1,v_2>^2,即“内积平方”。
这里面 v_1=(x_1,y_1), v_2=(x_2,y_2)是二维空间中的两个点。

这个核函数对应着一个二维空间到三维空间的映射,它的表达式是:
P(x,y)=(x^2,\sqrt{2}xy,y^2)
可以验证,
<P(v_1),P(v_2)>&= &<(x_1^2,\sqrt{2}x_1y_1,y_1^2),(x_2^2,\sqrt{2}x_2y_2,y_2^2)> \\&= &x_1^2x_2^2 + 2x_1x_2y_1y_2+y_1^2y_2^2 \\&= &(x_1x_2 + y_1y_2)^2 \\&= &<v_1,v_2>^2 \\&= &K(v_1,v_2)

在P这个映射下,原来二维空间中的图在三维空间中的像是这个样子:
&amp;lt;img src=&quot;https://i-blog.csdnimg.cn/blog_migrate/98e22ca3ad5582c47ee66abfaff55c37.jpeg&quot; data-rawwidth=&quot;720&quot; data-rawheight=&quot;342&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;720&quot; data-original=&quot;https://pic2.zhimg.com/c5a7b1b83b844fc5fff033c9a0d5d601_r.jpg&quot;&amp;gt;(前后轴为x轴,左右轴为y轴,上下轴为z轴) (前后轴为x轴,左右轴为y轴,上下轴为z轴)
注意到绿色的平面可以完美地分割红色和紫色,也就是说,两类数据在三维空间中变成线性可分的了。
而三维中的这个判决边界,再映射回二维空间中是这样的:
&amp;lt;img src=&quot;https://i-blog.csdnimg.cn/blog_migrate/06fa7e0b26765ab437c748e44488baa7.jpeg&quot; data-rawwidth=&quot;720&quot; data-rawheight=&quot;329&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;720&quot; data-original=&quot;https://pic3.zhimg.com/8f4a0d456fd9daf934c373024bf15a32_r.jpg&quot;&amp;gt;这是一条双曲线,它不是线性的。 这是一条双曲线,它不是线性的。

================================================

如上面的例子所说,核函数的作用就是隐含着一个从低维空间到高维空间的映射,而这个映射可以把低维空间中线性不可分的两类点变成线性可分的。

当然,我举的这个具体例子强烈地依赖于数据在原始空间中的位置。
事实中使用的核函数往往比这个例子复杂得多。它们对应的映射并不一定能够显式地表达出来;它们映射到的高维空间的维数也比我举的例子(三维)高得多,甚至是无穷维的。这样,就可以期待原来并不线性可分的两类点变成线性可分的了。

================================================

在机器学习中常用的核函数,一般有这么几类,也就是LibSVM中自带的这几类:
1) 线性: K(v_1,v_2)=<v_1,v_2>
2) 多项式: K(v_1,v_2)=(\gamma<v_1,v_2>+c)^n
3) Radial basis function: K(v_1,v_2)=\exp(-\gamma||v_1-v_2||^2)
4) Sigmoid: K(v_1,v_2)=\tanh(\gamma<v_1,v_2>+c)

我举的例子是多项式核函数中 \gamma=1, c=0, n=2的情况。

在实用中,很多使用者都是盲目地试验各种核函数,并扫描其中的参数,选择效果最好的。至于什么样的核函数适用于什么样的问题,大多数人都不懂。很不幸,我也属于这大多数人,所以如果有人对这个问题有理论性的理解,还请指教。

================================================

核函数要满足的条件称为 Mercer's condition
由于我以应用SVM为主,对它的理论并不很了解,就不阐述什么了。
使用SVM的很多人甚至都不知道这个条件,也不关心它;有些不满足该条件的函数也被拿来当核函数用。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值