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. 实验结论

1. 从2.1中我们可以看出,PCA与KPCA对于非线性数据各自的处理能力,仔细观察PCA其实只对原始数据进行了旋转操作,这是由于其寻找的是数据的“主要分布方向”。KPCA可以将原始数据投影至线性可分情况,其原因就是第一部分所说的内容。
 
2. 至于为何将数据分为“无重叠”,“部分重叠”,“无高斯扰动”,是自己在试验中发现,对于部分重叠的数据,KPCA不能将数据投影至完全线性可分的程度(2.3第三幅图中,不同类别数据仍旧存在重叠现象),这说明KPCA只是个无监督的降维算法,它不管样本的类别属性,只是降维而已。
 
3. 这里提供了高斯核与多项式核的效果,我们很容易发现,二者的效果有很大不同,这直观地说明不同核函数具有不同的特质。并且,针对于无高斯扰动数据,始终没有找到参数p,有可能针对这类数据,多项式核函数无能为力。
 
4. 2.5中展示了多项式核的参数影响,我们可以发现,往往p值是偶数时,数据可以做到近似线性可分,p是奇数时,数据分布的形态也属于另外一种固定模式,但是不再是线性可分。
 

4. 代码

前面给出了自己对KPCA的理论解释,以及做的一些基础实验,不给出实现代码,就不厚道了,代码如下所示,一部分是KPCA算法代码,另一部分是实验代码。
 function [eigenvalue, eigenvectors, project_invectors] = kpca(x, sigma, cls, target_dim)
% kpca进行数据提取的函数
psize=size(x);
m=psize(); % 样本数
n=psize(); % 样本维数 % 计算核矩阵k
l=ones(m,m);
for i=:m
for j=: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 = ;
for i = : size(v, )
if e(i) < 1e-
break;
else
v(:, i) = v(:, i) ./ sqrt(e(i));
end
rank = rank + ;
end
eigenvectors = v(:, : target_dim);
eigenvalue = e( : target_dim); % 投影
project_invectors = kl*eigenvectors; %计算在特征空间向量上的投影
end
function [eigenvalue, eigenvectors, project_invectors] = kpca(x, sigma, cls, target_dim)
% kpca进行数据提取的函数
psize=size(x);
m=psize(); % 样本数
n=psize(); % 样本维数 % 计算核矩阵k
l=ones(m,m);
for i=:m
for j=: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 = ;
for i = : size(v, )
if e(i) < 1e-
break;
else
v(:, i) = v(:, i) ./ sqrt(e(i));
end
rank = rank + ;
end
eigenvectors = v(:, : target_dim);
eigenvalue = e( : target_dim); % 投影
project_invectors = kl*eigenvectors; %计算在特征空间向量上的投影
end

5. 总结

KPCA的算法虽然简单,但是个人认为,它的意义更在于一种思想:将数据隐式映射到高维线性可分空间,利用核函数进行处理,无需知道映射函数的具体形式。这种思想实在是太牛了,它让降维变得更有意义。为这种思想点赞!!!

 
转自: http://blog.csdn.net/wsj998689aa/article/details/40398777                      作者:迷雾forest

解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程(转载)的更多相关文章

  1. 核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程

    KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实 ...

  2. Jordan Lecture Note-10: Kernel Principal Components Analysis (KPCA).

    Kernel Principal Components Analysis PCA实际上就是对原坐标进行正交变换,使得变换后的坐标之间相互无关,并且尽可能保留多的信息.但PCA所做的是线性变换,对于某些 ...

  3. R: 主成分分析 ~ PCA(Principal Component Analysis)

    本文摘自:http://www.cnblogs.com/longzhongren/p/4300593.html 以表感谢. 综述: 主成分分析 因子分析 典型相关分析,三种方法的共同点主要是用来对数据 ...

  4. PCA(Principal Component Analysis)主成分分析

    PCA的数学原理(非常值得阅读)!!!!   PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可 ...

  5. 从矩阵(matrix)角度讨论PCA(Principal Component Analysis 主成分分析)、SVD(Singular Value Decomposition 奇异值分解)相关原理

    0. 引言 本文主要的目的在于讨论PAC降维和SVD特征提取原理,围绕这一主题,在文章的开头从涉及的相关矩阵原理切入,逐步深入讨论,希望能够学习这一领域问题的读者朋友有帮助. 这里推荐Mit的Gilb ...

  6. (4)主成分分析Principal Component Analysis——PCA

    主成分分析Principal Component Analysis 降维除了便于计算,另一个作用就是便于可视化. 主成分分析-->降维--> 方差:描述样本整体分布的疏密,方差越大-> ...

  7. Robust Principal Component Analysis?(PCP)

    目录 引 一些微弱的假设: 问题的解决 理论 去随机 Dual Certificates(对偶保证?) Golfing Scheme 数值实验 代码 Candes E J, Li X, Ma Y, e ...

  8. Stat2—主成分分析(Principal components analysis)

    最近在猛撸<R in nutshell>这本课,统计部分涉及的第一个分析数据的方法便是PCA!因此,今天打算好好梳理一下,涉及主城分析法的理论以及R实现!come on…gogogo… 首 ...

  9. Simplicial principal component analysis for density functions in Bayes spaces

    目录 问题 上的PCA Hron K, Menafoglio A, Templ M, et al. Simplicial principal component analysis for densit ...

随机推荐

  1. hdu6444 2018中国大学生程序设计竞赛 - 网络选拔赛 1007 Neko's loop

    Neko's loop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total S ...

  2. ubuntu16.04 编译安卓4.2

    1. root@ge-Lenovo:/usr/lib/jvm# cd /home/material/install/jdk/    jdk-6u29-linux-x64.bin  jdk-6u45-l ...

  3. oracle如何快速导入导出文本格式数据

    导出工具:sqluldr2工具说明:sqluldr2再以安装oracle客户端的环境下下无需再安装其它软件,只需将对应的软件包拷贝至对应目录,即可运行导出数据导出示例:--linux环境导出示例:/d ...

  4. 【repost】Javascript操作DOM常用API总结

    Javascript操作DOM常用API总结 文本整理了javascript操作DOM的一些常用的api,根据其作用整理成为创建,修改,查询等多种类型的api,主要用于复习基础知识,加深对原生js的认 ...

  5. 标记化结构初始化语法 在结构体成员前加上小数点 如 “.open .write .close ”C99编译器 .

    今天在看串口驱动(四)的时候 有这样一个结构体初始化 我很不理解 如下: static struct s3c24xx_uart_port s3c24xx_serial_ports[NR_PORTS] ...

  6. 20155326刘美岑2016-2017-2《Java程序设计》第一周学习总结

    20155326刘美岑 2006-2007-2 <Java程序设计>第1周学习总结 教材学习内容总结 在老师的要求下我看了这门课的考察方式.这门课和以前上的课有些差别,成绩是由平时一点一点 ...

  7. [转]Windows中使用命令行方式编译打包Android项目

    http://my.oschina.net/liux/blog/37875 网上很多用Ant来编译打包Android应用的文章,毕竟Ant是纯Java语言编写的,具有很好的跨平台性.今天想写个纯win ...

  8. A - Class Statistics

    A - Class Statistics Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Subm ...

  9. 3.表单form

    表单 表单的作用是收集信息. 表单的组成 ◆提示信息 表单控件 1.表单域 属性:action:处理信息 method=”get | post” get通过地址栏提供(传输)信息,安全性差. post ...

  10. Windows下Node.js的安装与配置

    一.下载和安装 1. 前往官网https://nodejs.org/或https://nodejs.org/en/download/下载最新推荐版的Node.js,本文使用10.13.0版本. 对于W ...