关于核函数的一些思考

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于核函数的一些思考相关的知识,希望对你有一定的参考价值。

参考技术A

想写一下我自己对于核函数的理解,虽然并不知道核函数的发明过程,但我想以自己的理解,来重现这个过程。

核函数的应用很广,在SVM上的应用只是冰山一角。即便如此,我还是假设发明人是在解决SVM问题的过程了发明的核函数。

对于一个二分类问题,有一个理想的数据集,假设它是线性可分的,这时直接应用SVM算法即可进行分类。

假设现在的数据集不是线性可分的,如图1所示:

该数据集在二维空间中,每个数据点都可用一个二维向量(x1,x2)\'\'\'来表示(3个单引号\'\'\'表示转置)。我们可以用一个椭圆形状的超平面在该2维空间中对数据集进行分类,我们写出椭圆的一般方程:

如果我们令:

其中:

你会发现,2维向量x被映射成另一个5维向量z后,分类超平面是一个线性超平面,数据点变得线性可分!也即是下面的变换:

也就是说,数据集在二维空间中线性不可分,若想实现线性可分,须把该数据集映射到一个5维空间中!考虑SVM的的原始优化问题:

(式中的点号代表内积运算)式(5)中的xi对应数据集中的样本点,现在在二维空间中。我们要实现该数据集线性可分,需要把每个点都映射到5维空间中去。也就变成了下式:

根据式(6)可以推知,对于一个线性不可分的数据集,我们只要把xi替换成相应的映射后的点就可以了。所以,原来二维空间中的分类决策函数:

也就变成了5维空间中的分类决策函数:

好了,因为x的映射函数已知,所以我们就能轻松根据上式得到决策超平面了。

看似问题到这里就结束了,但是,考虑到本例中只是实现二维空间中数据的线性可分,就把数据映射到了5维空间。想像如果数据本身的维度就很高,那映射后的空间维度会更高,甚至是无限维!我们该怎么求这个映射函数呢?即便知道了这个映射函数,也没法算啊,因为它是无限维的。所以, 我们应该找一个合适的二元函数,它的输入是原空间的两个向量,它的输出是映射到高维空间的两个向量的内积! 给这个合适的二元函数起个霸气的名字,就叫做 核函数

为什么这样定义?对照(8)式中的两个映射函数的内积来思考一下:我们要求出(8)式两个映射函数的内积,所以要构造一个二元函数,它的输入就是原二维空间中的x和xi两个向量,它的输出就是映射到5维空间的两个向量的内积。

这样,我们就避免了求映射函数,只通过一个核函数就可以在低维空间完成高维空间中才能完成的事!

(至此,有些童鞋会想,既然映射后的向量的内积不好求,你咋知道你构造的核函数的值就是映射后的向量的内积?!一会儿会说这个问题。)

先考虑一个简单的例子:

现在有两个二维空间中的数据点x=(x1,x2)\'\'\'和y=(y1,y2)\'\'\',考虑下面这个二元函数:

把x,y代表(9)式,解之得:

你会发现,最后的函数值竟然等于两个向量p和q的内积,而且两个向量分别是二维空间数据点x和y在三维空间中的映射!想到刚才定义的核函数,我们很容易想到,f(x,y)就是一个核函数。它给出了一个二维的表达式,使得x,y代入即可求值,而不再需要先把x,y映射成3维空间中的向量p,q,再求内积。

这也正是我们定义核函数的目的,即 虽然没有显式地给出原空间中向量的映射函数,但却达到了可以在原空间中计算映射后的向量内积的目的!

回到我们刚才讨论的问题,对于(8)式,假设我不知道这个5维的映射是啥,但我要求映射后向量的内积,所以我要构造一个核函数K(x,xi)来代替映射后向量的内积,即可得到下面的决策分类面:

那么问题来了:

有几个经典的核函数可供选用,如:多项式核函数,高斯核函数等。当然你也可以自己构造核函数,但也不是任意一个函数就可以当做核函数的,需要满足Mercer条件(有兴趣的童鞋可以自己研究一下)。

我没专门研究过,我也不知道自己构造的核函数一定能把数据点在高维空间中线性地分开。但是你可以选择上面提到的常用的核函数,选择合适的参数,就能使得原空间中的数据点在高维空间中变得线性可分。至于为什么,我是这样理解的:

常用的核函数把原空间的数据映射到了高维空间中,使得数据变得“更容易”线性可分,考虑下图所示的例子:

二维空间中的点只能用非线性的超平面才能分开,但把数据映射到高维空间中,就可以用一个线性的平面给分开了。虽然更高维的画面无法脑补,但是可以参考我们在文章开始举的椭圆方程的例子。即 空间的维度越高,数据越容易线性可分。

总结一下:

以上是关于关于核函数的一些思考的主要内容,如果未能解决你的问题,请参考以下文章

关于rnn神经网络的loss函数的一些思考

一些关于面向对象的思考

关于函数式编程的思考

关于单元测试编写,我的一些思考和总结

关于单元测试编写,我的一些思考和总结

关于面向对象设计的一些思考