由于下一篇要学机器学习的另外一种模型——核模型,里面涉及到核函数,所以先找了一下核函数的相关知识。
在知乎上看到了一些比较好的解答,详细参考:http://www.zhihu.com/question/24627666
首先举一个核函数把低维空间映射到高维空间的例子(这也解决了大部分人认为只有降维才能简化问题的错误观点~~)
上图放在直角坐标系中,位于一二象限,我们关注的是北京四合院下面的紫色字体和红色的大门,我们把红色大门看成'+'数据,把紫色的字看成'-'数据,他们的横纵坐标是两个特征,显然在这个二维空间内,'+'、'-'两类数据不是线性可分的。
我们现在考虑核函数,即"内积平方"。
这里面 是二维空间中的两个点。
这个核函数对应着二维空间到三维空间的映射,表达式是:
可以验证
在这个P映射下,原来二维空间的图就转换为三维空间的图了(前后为x周,左右为y轴,上下为z轴):
注意到绿色平面可以完美分割紫色和红色,也就是说二类数据('+' '-')在三维空间中变成线性可分的了。
三维空间的这个判决边界再映射回二维空间中是这样的:
这是一条双曲线,不是线性的。
================================================
如上面的例子所说,核函数的作用就是隐含着一个从低维空间到高维空间的映射,而这个映射可以把低维空间中线性不可分的两类点变成线性可分的。
当然,我举的这个具体例子强烈地依赖于数据在原始空间中的位置。
事实中使用的核函数往往比这个例子复杂得多。它们对应的映射并不一定能够显式地表达出来;它们映射到的高维空间的维数也比我举的例子(三维)高得多,甚至是无穷维的。这样,就可以期待原来并不线性可分的两类点变成线性可分的了。
================================================
在机器学习中常用的核函数,一般有这么几类,也就是LibSVM中自带的这几类:
1>线性:
2>多项式:
3>Radial basis function(RBF径向基函数):
4>Sigmoid:
上面的例子是多项式核函数的情况。
在实用中,很多使用者都是盲目地试验各种核函数,并扫描其中的参数,选择效果最好的。至于什么样的核函数适用于什么样的问题,大多数人都不懂。
================================================
下面是另外一个人对核函数相关概念的区分和解释:
1. kernel 和 SVM 完全是两个正交的概念。早在SVM提出之前,reproducing kernel Hilbert space(RKHS)的应用就比较广泛了,一个经典的例子就是信号处理中signal detection的问题:给一条time series我如何知道它不是一个random walk的噪音而是有一个特定的pattern在里面呢?在这个情景下,RKHS理论就给出了一个通过现实求解likelihood ratio的假设检验方案,其中的kernel实际上是某个随机过程 R(t) 在两个不同时间点的correlation。
2. 很多人觉得kernel定义了一个从低维度到高维度的映射,这是不准确(而非不正确)的。首先,并不是所有空间都像欧式空间那样有所谓“维度”的良好定义,很多空间是没有维度的意义的,或者可以认为维度都是无穷大,这样就无法区分不同的RKHS了。但是kernel确实可以定义一个映射,而且确实是一个非常强大的映射,很多方法在这个映射下是可以直接推广到kernel space的,包括SVM,logistic regression, least squre,dimension reduction。
3.那么这个映射是什么呢?我略过数学的setup(估计也没有人看)简单讲讲RKHS是什么一个故事:实际上RKHS的定义是反过来的,首先在原空间上考虑所有连续函数,这些连续函数可以做加法和数乘,所以真主给他们(中的一部分)施加一个内积结构,比如所有二阶多项式其系数在欧式空间展开构成的内积就是高票主提供的例子;这个内积实现中的一部分就可以对应到原空间中的两两之间点的kernel。所以RKHS是先有内积才有kernel的,但是另个一个牛逼的定理说,只要kernel满足一些条件,就存在这样一个(唯一的)内积结构与之对应。
4. kernel有什么作用?kernel不仅可以建立点对点的映射(如SVM那样),还可以建立原空间上一个分布对点的映射,有兴趣的读者请谷歌 kernel embedding of distributions。 在这一个映射下,人们会关心这么一个问题,给两组数据,我如何知道他们是不是从同一个分布中来的呢?在kernel map下,两组数据被map成了kernel space的两个点,我们可以看看在那个空间里他们距离是远还是近,如果很近就很可能是同一个点加上一点sample variance,以此来判断两组数据是不是同一个分布(two sample test)。
5. 最后谈一谈不同的核函数,应用中最常见的估计就是RBF kernel了比如Gaussian kernel,这类kernel的强大之处在于他们提供的embedding space非常丰富(当然有人可以理解为维度非常高,但是既然是无穷维,谈维度已经没有意义了),以至于原空间中不同的分布可以被直接map到不同的点,这类kernel有个名字叫characteristic kernel。回到我们最初的kernel 定义到底什么样的kernel才能reproduce如此丰富的embedding 空间呢?答案是能把整个连续函数空间填满(dense)的kernel。比如一般的多项式kernel就不行,因为二阶多项式的线性组合不能表示更高阶的多项式函数了。这种能把整个连续函数空间填满的kernel,叫universal kernel。一个重要的结果是universal kernel就是characteristic kernel,换句话说只要你能把连续函数空间填满,那么原空间上不同的分布在这个map下都会变成不同的点。
================================================
下面是另一位学者关于核函数背后的intuition的介绍
intuition也很简单,比如我们有一个一维的数据分布是如下图的样子,你想把它用一个直线来分开,你发现是不可能的,因为他们是间隔的。所以不论你画在哪,比如绿色竖线,都不可能把两个类分开。
但是我们使用一个简单的升维的方法,把原来一维的空间投射到二维中,x->(x, x^2)。比如:
0->(0,0)
1->(1,1)
2->(2,4)
这时候就线性可分了。
再举个例子,在一个二维平面里面,这样的情况是不可能只用一个平面来分类的,但是只要把它投射到三维的球体上,就可能很轻易地分类。
理论上,由于train set是有限的,当你把data投射到无限维度的空间上是一定可以在train set上完美分类的,至于在test set上当然就呵呵了。
记得要选取合适(试试各种)kernel function来“避免过拟合”。
此外推荐一个比较好的支持向量机(SVM)的文章: 支持向量机通俗导论(理解SVM的三层境界)