机器学习有很多关于核函数的说法,核函数的定 义和作用是什么?

原文地址:http://www.360doc.com/content/16/0601/05/33848074_564071015.shtml

(360图书馆你不是不让复制么,劳资就是复制下来了!你个恶心家伙!)

机器学习,具体以RBF网络里面的核函数为例,有童鞋说是通过径向基核函数可以把原始数据 投影到更高维的空间里去(从而增加数据可分的概率),对于这种说法,实在不是很理解(怎 么就投影到高维空间里面去了呢)?
先给个定义:核函数K(kernel function)就是指K(x, y) = ,其中x和y是n维的输入值,f(·)  是从n维到m维的映射(通常而言,m>>n)。是x和y的内积(inner product),严格来说 应该叫欧式空间的标准内积,也就是很多人常说的点积(dot product)。  
光看这一段还是不明白kernel是什么,用来干什么的...对吧?不要急。一个好的知识分享者是 不会把一篇空洞的定义扔下就不管的,TA会告诉你这个概念的intuition,然后给你举个小小 的栗子,最后告诉你几个应用场景。Andrew Ng的Machine Learning为什么会成为一门现象 级的MOOC?原因之一就是因为他除了是个学术上的大神,也同样是个极有质素的知识分享 者。所以我要学习他。 
 好了,intuitively(这也模仿得太生硬了吧...),要计算,我们要先分别计算f(x)和f(y),然后 再求它们的内积。上面的定义里也说了,经过映射后的x和y,维数大大增加,计算内积的成 本可能会非常之大,而且在高位空间费力牛劲儿地计算内积,内积又是一个scalar,相当于说 又把我们的计算从高维空间拉回到一维空间!所以我们特别想要一个“简便运算法”,帮助我 们不需要奔向高维空间就能在家门口计算得到想要的内积。这时候该轮到我们的猪脚——ker nel登场了,它能帮我们做到这一点。 
 举个小小栗子。 
令 x = (x1, x2, x3, x4); y = (y1, y2, y3, y4); 
令 f(x) = (x1x1, x1x2, x1x3, x1x4, x2x1, x2x2, x2x3, x2x4, x3x1, x3x2, x3x3, x3x4, x4x1, x4 x2, x4x3, x4x4); f(y)亦然; 
令核函数 K(x, y) = ()^2. 
接下来,让我们带几个简单的数字进去看看是个什么效果:x = (1, 2, 3, 4); y = (5, 6, 7, 8).  那么: f(x) = ( 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16) ; 
f(y) = (25, 30, 35, 40, 30, 36, 42, 48, 35, 42, 49, 56, 40, 48, 56, 64) ; 
= 25+60+105+160+60+144+252+384+105+252+441+672+160+384+672+1024 =  4900. 
好累,对不对?可谁让f(·)把四维空间的数据映射到十六维空间里呢? 如果我们用核函数呢?  K(x, y) = (5+12+21+32)^2 = 70^2 = 4900. 就是这样!  所以现在你看出来了吧,kernel 其实就是帮我们省去在高维空间里进行繁琐计算的“简便运算法”。甚至,它能解决无限维空 间无法计算的问题!因为有时f(·)会把n维空间映射到无限维空间去,对此我们常常束手无策, 除非是用kernel,尤其是RBF kernel(K(x,y) = exp(-||x-y||^2) )。 
 在有kernel之前,做machine learning的典型的流程应该是:data --> features --> learni ng algorithm,但kernel给我们提供了一个alternative,那就是,我们不必定义从data到fea ture的映射函数,而是可以直接kernel(data) --> learning algorithm,也可以是data --> fe atures --> kernel(features) --> learning algorithm。
 所以虽然我们看到kernel常被应用在SVM(SVM中的kernel应该是后一种用法,后文再 说),但其实要用到内积的learning algorithm都可以使用kernel。“用到内积的learning al gorithm”其实并不少见,不信你可以想一想最普通不过的linear classifier/regressor有没有 一个步骤是计算特征向量(feature vectors)的内积呢?
不过作为曾经也困惑的过的过来人,我试图直观的去解释一下问题。
1.Kernel是什么? Kernel是一个函数,一个二元函数,一个从的二元函数。至于什么是二元函数,这个就不用 解释了吧,你懂的。。。
2.关于Kernel的一些
首先如kernel直接翻译过来一样就是核心,而kernel就是machine learning中最核心的部分 的东西。它有效的描述了点和点之间的关系,或者说是距离,当然这里的距离严格的说应该是 广义的距离。所以按照其作用kernel原本的名字应该叫“covariance function”. 有人会问, 明明字母都不像么,为什么是一样的呢?其实这就好像,一个人叫张三,然后做了公司老板, 你可以叫他老板,而且你叫习惯了,因为在公司中就是无可替代的老板,但是他的真名就是张 三。可能有人还是不明白,为什么这是一致的。那么下一个直观的问题是,什么是machine l earning中最要的部分呢,也就是核心呢?Of course, training & learning! 那什么是trainin g&learning中最重要的呢?对,那就是点与点之间的关系,无论是training点之间的关系还 是training与learning点之间的关系都是这整个过程的必不可少的信息。好的,那我们再来看 看covariance function 的意义吧。wiki上说,在概率论与统计学中,covariance是一种两个 变量如何相关变化的度量,而covariance function 是自然就是描述对应协方差的函数喽!O K,现在看着应该很像了吧,不是像,应该说是一样的嘛。
3. Kernel心中的kernel 之前说了,Kernel是描述点和点之间关系的,或者说是距离。距离是一个非常的有趣的词 语。北京到上海的距离是1463 公里, 而你到我距离却只有那心动的一瞬间。好了,不文艺 了,事实上距离是一个有歧义的词语,因为在不同的情况下距离有着不同的描述方法,比如常 用的欧氏距离(Euclidean Distance) 和曼哈顿距离(Manhattan Distance),当然还有更复杂 的,比如切比雪夫距离 ( Chebyshev Distance ),闵可夫斯基距离(Minkowski Distance), 马氏距离(Mahalanobis Distance),汉明距离(Hamming distance),这里就不多说了,其实 我也不知道具体这些东东具体是做什么的,不过有人知道,比如“机器学习中的各种距离”
http://blog.csdn.net/lifeitengup/article/details/8450545
好了,问题又来了,距离有那么多定义,可是万一弱水三千就没有我需要的一瓢怎么办呢?没 关系,数学如此博大精深,自然有办法的,那就是去定义嘛。深奥的functional data analysi s (泛函分析)告诉我们,从距离空间出发,我们可以一步步往前走可以得到赋范向量空间,内 积空间,然后是优美的希尔伯特空间。对就是你了,希尔伯特空间,这里面有好多概念,这里 就不多说了,主要就是一个范数,一个内积。那什么是范数呢,范数就是我们之前强调的距 离,或者说广义的距离。而什么又是内积呢?没错,内积就是这个距离的定义的方式。这就是 为什么说由内积可以诱导出范数的原因了。因此,如果我们用到相关希尔伯特空间的知识的 话,这个“自定义”距离的问题就不在话下喽。OK,现在我们回到这个kernel的问题,既然k ernel是用来描述点与点之间的关系或者说距离的话,那么一种可行的有效的方法就是用内积 去刻画,也就是说,根本不同的内积定义,我们就可以构造出不同的核函数。当然由于这是内 积定义的,那么自然学过一点泛函的小朋友都知道,这里的kernel也就会有正定和对称的性质 啦,回头想想我们的发出点,这两个性质是不是也理所应当的是kernel所应该具备的呢?Defi nitely! 然而,现实的问题是,内积虽然可以有各种定义方式,但是局限性还是蛮大的,玩来 玩去一共就那么几种,如果我们可以得到更加一般化的结论怎么办呢?没错,只能动一动内积 里面的东西啦,也就是。这样一来的好处就是,无论x,y 本身是如何的,维数也好,形式也 罢,我们都可以调整这个来保证一般的常见的内积定义,而其中这里的呢,自然可以看做了一 个映射,从一个从映射到一个一般的希尔伯特空间的映射,而此时内积仍旧是定义在希尔伯特 空间的内积。这也就是好多小伙伴正在说到的所谓高维到低维还是不知是从低维到高维的feat ure mapping。(事实上,就我所知比较多用的应该是从低维到高维的投射吧,因为这会让 一些低维空间上不明显的feature在高维空间容易显示出来)。当然这一切都可以有个大神叫 Mercer 给出的定理去解释,Mercer定理说,任何满足对称性和正定性的二元函数都能找到H ilbert space 和函数 使得 . 不过实际问题中,feature space 下计算feature 的复杂度极高, 所以说定义一个合格kernel可以大大降低这个计算feature 的复杂度。从而这边又可以引出ke rnel第二个别名,kernel trick。
另外也有小伙伴提到Reproducing Kernel Hilbert Space (RKHS),这个嘛,事实上也就 是一种在希尔伯特这个大的游泳池里面一种复杂而漂亮的游泳方式啦,如果你各方面条件合 适,事实上你也可以直接创造一种优美的游泳方式,是不是很炫酷,想试试?呵呵,真的似乎 好难。。。一旦涉及泛函,事实上没有一定的功底,基本就是举步维艰。
4. Kernel有什么用?
这个就海了去了。。。这就是machine learning中的一大块,kernel learning嘛,其中最为 典型的要数Support Vector Machine (SVM), Gaussian Process (GP),还有Principal Comp onent Analysis (PCA)。看到这里有木有觉得非常熟悉,叱咤风云的SVM和PCA,不过这里 怎么还有个似乎显得那么冷门的Gaussian process呢,这是什么东东呢,详见Carl Edward R asmussen
https://mitpress.mit.edu/authors/carl-edward-rasmussen
and Christopher K. I. Williams
https://mitpress.mit.edu/authors/christopher-k-i-williams
大神写的书Gaussian Processes for Machine Learning。简单的说呢,这也是一种非常有效 的supervised leaning的方法,至于什么是supervised leaning呢,简单理解就是有一个学习 明确的学习方向的learning。这边还需要强调一下的是,这些learning的方法都是有classifica tion和regression的,大多数小伙伴都知道SVM吧,不过大多数中的大多数或许只知道SVM 可以做classification,所以也多在说kernel对SVM的作用。我弱弱的想说一句是regression 和classification大家都有,只是在大多数情况下,SVM在classification方面比较有优势而GP 会在regression上有较好的结果,仅此而已。不过总的来说还是一句话,kernel不论对regres sion还是classification都是意义重大的,谁叫人家叫kernel呢!至于具体的作用么,本人做的 是GP的regression,我可以确认是在GP的regression中,kernel主要是对应数据的pattern 的,直接想想就是如果数据是一维,那么这个所谓的pattern就是这个图形走势啦,图形长的 想什么函数,就对应着是什么具体的经典kernel,有光滑的无限可微的Squared Exponential  (SE),有具有完全周期性的(Periodic),还有一些奇奇怪怪的kernel,比如Rational Qu adratic (RQ), Matern(MA) 等等。这里有更详细的解释:http://crsouza.com/2010/03/ker nel-functions-for-machine-learning-applications/

猜你喜欢

转载自www.cnblogs.com/lzhu/p/10398439.html