(十一)KPCA非线性降维与核函数

Python012

(十一)KPCA非线性降维与核函数,第1张

在前文讲述PCA降维算法时提到,PCA只能处理线性数据的降维,本质上都是线性变换,并且它仅是筛选方差最大的特征,去除特征之间的线性相关性。对于线性不可分的数据常常效果很差。

KPCA算法其实很简单,数据在低维度空间不是线性可分的,但是在高维度空间就可以变成线性可分的了。利用这个特点,KPCA只是将原始数据通过核函数(kernel)映射到高维度空间,再利用PCA算法进行降维,所以叫做K PCA降维。因此KPCA算法的关键在于这个核函数。

假设现在有映射函数φ(不是核函数),它将数据从低维度映射到高维度。得到高维度数据后,我们还需要计算协方差矩阵,从前文可以看出,协方差矩阵每个元素都是向量的内积。映射到高维度空间后,向量维度增加,计算量大幅度增大。即便计算量不是问题,那么这个φ应该把数据映射到多少维度呢?怎么求这个φ呢?这些都是很困难的。但是核函数刚好可以解决这个问题,下面我们看一下什么是核函数。

核函数K(kernel function) 可以直接得到低维数据映射到高维后的内积,而忽略映射函数具体是什么 ,即

K(x, y) = <φ(x), φ(y)> ,其中x和y是低维的输入向量,φ是从低维到高维的映射,<x, y>是x和y的内积。

核函数是一个非常有趣和强大的工具。 它是强大的,因为它提供了一个从线性到非线性的连接以及任何可以只表示两个向量之间的点积的算法。 如果我们首先将我们的输入数据映射到更高维的空间,那么我在这个高维的空间进行操作出的效果,在原来那个空间就表现为非线性。

在KPCA中,刚好可以利用核函数的特点,反正我们的目的就是求数据在高维空间的内积而已(协方差矩阵),又何必知道怎么映射的呢?

核函数有很多限制要求,比如要求是连续的,对称的,等等。这里不做深入探讨,毕竟不是数学系的,不用深入研究(恩,其实是看不懂)。下面列举一些常用的核函数,至于怎么选择,恩,目前是世界性难题。

以二维向量为例,如果y固定,那么y就充当着对称轴的作用;sigma控制着函数的胖瘦,也就是作用范围。下图中,距离对称轴小于sigma的范围内,图像是有高度的,sigma之外的范围,函数基本没有高度(没起作用)。

为了进一步理解KPCA,我们这里做一个简单的推导,看看KPCA究竟是什么鬼东西!

假设原始数据是如下矩阵X:(数据每一列为一个样本,每个样本有m个属性,一共有n个样本)

注意,协方差矩阵是X乘X的转置,落实到计算是任意2个特征(行)的点积;而此处的核矩阵K是反过来的,X的转置乘X,它落实到计算是任意2个样本(列)的点积。这个核矩阵是n维的,维度和样本数相同,而不是特征数。

根据核函数的性质,上面这个核矩阵K可以直接在低维空间计算得到:

 PCA与KPCA二者都是降维的算法,PCA基于指标,KPCA基于样本

 应用PCA算法前提是假设存在一个线性超平面,进而投影。如果数据不是线性,就需要KPCA,数据集从n 维映射到线性可分的高维N>n ,然后再从N 维降维到一个低维度,二者在特定变量相等。