KPCA原理及部分代码

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原理及部分代码_第1张图片

三、KPCA部分代码

  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  




你可能感兴趣的:(学习日记)