KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展。PCA是线性的,其对于非线性数据往往显得无能为力(虽然这二者的主要目的是降维,而不是分类,但也可以用于分类),其中很大一部分原因是,KPCA能够挖掘到数据集中蕴含的非线性信息。
一、KPCA较PCA存在的创新点:
1. 为了更好地处理非线性数据,引入非线性映射函数,将原空间中的数据映射到高维空间,注意,这个
是隐性的,我们不知道,也不需要知道它的具体形式是啥。
2. 引入了一个定理:空间中的任一向量(哪怕是基向量),都可以由该空间中的所有样本线性表示,这点对KPCA很重要,我想大概当时那个大牛想出KPCA的时候,这点就是它最大的灵感吧。话说这和”稀疏“的思想比较像。
二、公式推导
假设D(D >> d)维向量为高维空间中的特征向量,
为对应的特征值,高维空间中的PCA如下:
(1)
将特征向量利用样本集合
线性表示,如下:
(2)
然后,在把代入上上公式,得到如下的形式:
(3)
进一步,等式两边同时左乘,得到如下公式:
(4)
这样做的目的是,构造两个出来,进一步用核矩阵K(为对称矩阵)替代,其中:
(5)
第二个等号,是源于核函数的性质,核函数比较多,有如下几种:
(1)线性核函数
(2)多项式核函数
(3)高斯径向基核函数
(4)多层感知器核函数
于是,公式进一步变为如下形式:
(6)
两边同时去除K,得到了PCA相似度极高的求解公式:
(7)
含义就是求K最大的几个特征值所对应的特征向量,由于K为对称矩阵,所得的解向量彼此之间肯定是正交的。
但是,请注意,这里的只是K的特征向量,但是其不是高维空间中的特征向量,回看公式(2),高维空间中的特征向量w应该是由
进一步求出。
既然我们可以得到高维空间的一组基,这组基可以构成高维空间的一个子空间,我们的目的就是得到测试样本
在这个子空间中的线性表示,也就是降维之后的向量。
三、KPCA部分代码
- 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