解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程(转载)
KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实验,PCA能够达到的识别率只有88%,而同样是无监督学习的KPCA算法,能够轻松的达到93%左右的识别率(虽然这二者的主要目的是降维,而不是分类,但也可以用于分类),这其中很大一部分原因是,KPCA能够挖掘到数据集中蕴含的非线性信息。
今天突然心血来潮,想重新推导一下KPCA的公式,期间遇到了几个小问题,上博客查阅,发现目前并没有一个专注于KPCA公式推导的文章,于是决定写一篇这样的博客(转载请注明:http://blog.csdn.NET/wsj998689aa/article/details/40398777)。
1. 理论部分
KPCA的公式推导和PCA十分相似,只是存在两点创新:
1. 为了更好地处理非线性数据,引入非线性映射函数,将原空间中的数据映射到高维空间,注意,这个是隐性的,我们不知道,也不需要知道它的具体形式是啥。
2. 引入了一个定理:空间中的任一向量(哪怕是基向量),都可以由该空间中的所有样本线性表示,这点对KPCA很重要,我想大概当时那个大牛想出KPCA的时候,这点就是它最大的灵感吧。话说这和”稀疏“的思想比较像。
假设中心化后的样本集合X(d*N,N个样本,维数d维,样本”按列排列“),现将X映射到高维空间,得到,假设在这个高维空间中,本来在原空间中线性不可分的样本现在线性可分了,然后呢?想啥呢!果断上PCA啊!~
于是乎!假设D(D >> d)维向量为高维空间中的特征向量,为对应的特征值,高维空间中的PCA如下:
(1)
和PCA太像了吧?这个时候,在利用刚才的定理,将特征向量利用样本集合线性表示,如下:
(2)
然后,在把代入上上公式,得到如下的形式:
(3)
进一步,等式两边同时左乘,得到如下公式:
(4)
你可能会问,这个有啥用?
这样做的目的是,构造两个出来,进一步用核矩阵K(为对称矩阵)替代,其中:
(5)
第二个等号,是源于核函数的性质,核函数比较多,有如下几种:
于是,公式进一步变为如下形式:
(6)
两边同时去除K,得到了PCA相似度极高的求解公式:
(7)
求解公式的含义就是求K最大的几个特征值所对应的特征向量,由于K为对称矩阵,所得的解向量彼此之间肯定是正交的。
但是,请注意,这里的只是K的特征向量,但是其不是高维空间中的特征向量,回看公式(2),高维空间中的特征向量w应该是由进一步求出。
这时有的朋友可能会问,这个时候,如果给定一个测试样本,应该如何降维,如何测试?
是这样的,既然我们可以得到高维空间的一组基,这组基可以构成高维空间的一个子空间,我们的目的就是得到测试样本在这个子空间中的线性表示,也就是降维之后的向量。具体如下:
(8)
于是呼~就可以对降维了,然后就做你想要做的事情。。。。
2. 实验部分
做了一些仿真实验,分别比较了PCA与KPCA之间的效果,KPCA基于不同核函数的效果,二者对于原始数据的要求,以及效果随着参数变化的规律。
1)下面展示的是“无重叠的”非线性可分数据下,PCA与KPCA(基于高斯核)的区别,注意,原始数据是二维数据,投影之后也是二维数据
2)下面展示的是“部分重叠的”非线性可分数据下,PCA与KPCA的区别
3)下面展示的是“无高斯扰动的”非线性可分数据下,PCA与KPCA的区别
4)下面展示的是上述三类数据下,基于多项式核函数的KPCA效果
5)下面展示的是在“部分重叠的”非线性可分数据下,基于多项式核函数的KPCA在不同多项式参数下的效果图
3. 实验结论
4. 代码
1 function [eigenvalue, eigenvectors, project_invectors] = kpca(x, sigma, cls, target_dim) 2 % kpca进行数据提取的函数 3 psize=size(x); 4 m=psize(1); % 样本数 5 n=psize(2); % 样本维数 6 7 8 % 计算核矩阵k 9 l=ones(m,m); 10 for i=1:m 11 for j=1:m 12 k(i,j)=kernel(x(i,:),x(j,:),cls,sigma); 13 end 14 end 15 16 17 % 计算中心化后的核矩阵 18 kl=k-l*k/m-k*l/m+l*k*l/(m*m); 19 20 21 % 计算特征值与特征向量 22 [v,e] = eig(kl); 23 e = diag(e); 24 25 26 % 筛选特征值与特征向量 27 [dump, index] = sort(e, 'descend'); 28 e = e(index); 29 v = v(:, index); 30 rank = 0; 31 for i = 1 : size(v, 2) 32 if e(i) < 1e-6 33 break; 34 else 35 v(:, i) = v(:, i) ./ sqrt(e(i)); 36 end 37 rank = rank + 1; 38 end 39 eigenvectors = v(:, 1 : target_dim); 40 eigenvalue = e(1 : target_dim); 41 42 43 % 投影 44 project_invectors = kl*eigenvectors; %计算在特征空间向量上的投影 45 end
function [eigenvalue, eigenvectors, project_invectors] = kpca(x, sigma, cls, target_dim) % kpca进行数据提取的函数 psize=size(x); m=psize(1); % 样本数 n=psize(2); % 样本维数 % 计算核矩阵k l=ones(m,m); for i=1:m for j=1:m k(i,j)=kernel(x(i,:),x(j,:),cls,sigma); end end % 计算中心化后的核矩阵 kl=k-l*k/m-k*l/m+l*k*l/(m*m); % 计算特征值与特征向量 [v,e] = eig(kl); e = diag(e); % 筛选特征值与特征向量 [dump, index] = sort(e, 'descend'); e = e(index); v = v(:, index); rank = 0; for i = 1 : size(v, 2) if e(i) < 1e-6 break; else v(:, i) = v(:, i) ./ sqrt(e(i)); end rank = rank + 1; end eigenvectors = v(:, 1 : target_dim); eigenvalue = e(1 : target_dim); % 投影 project_invectors = kl*eigenvectors; %计算在特征空间向量上的投影 end