解释一下核主成分分析(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. 代码
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的算法虽然简单,但是个人认为,它的意义更在于一种思想:将数据隐式映射到高维线性可分空间,利用核函数进行处理,无需知道映射函数的具体形式。这种思想实在是太牛了,它让降维变得更有意义。为这种思想点赞!!!
解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程(转载)的更多相关文章
- 核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程
KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实 ...
- Jordan Lecture Note-10: Kernel Principal Components Analysis (KPCA).
Kernel Principal Components Analysis PCA实际上就是对原坐标进行正交变换,使得变换后的坐标之间相互无关,并且尽可能保留多的信息.但PCA所做的是线性变换,对于某些 ...
- R: 主成分分析 ~ PCA(Principal Component Analysis)
本文摘自:http://www.cnblogs.com/longzhongren/p/4300593.html 以表感谢. 综述: 主成分分析 因子分析 典型相关分析,三种方法的共同点主要是用来对数据 ...
- PCA(Principal Component Analysis)主成分分析
PCA的数学原理(非常值得阅读)!!!! PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可 ...
- 从矩阵(matrix)角度讨论PCA(Principal Component Analysis 主成分分析)、SVD(Singular Value Decomposition 奇异值分解)相关原理
0. 引言 本文主要的目的在于讨论PAC降维和SVD特征提取原理,围绕这一主题,在文章的开头从涉及的相关矩阵原理切入,逐步深入讨论,希望能够学习这一领域问题的读者朋友有帮助. 这里推荐Mit的Gilb ...
- (4)主成分分析Principal Component Analysis——PCA
主成分分析Principal Component Analysis 降维除了便于计算,另一个作用就是便于可视化. 主成分分析-->降维--> 方差:描述样本整体分布的疏密,方差越大-> ...
- Robust Principal Component Analysis?(PCP)
目录 引 一些微弱的假设: 问题的解决 理论 去随机 Dual Certificates(对偶保证?) Golfing Scheme 数值实验 代码 Candes E J, Li X, Ma Y, e ...
- Stat2—主成分分析(Principal components analysis)
最近在猛撸<R in nutshell>这本课,统计部分涉及的第一个分析数据的方法便是PCA!因此,今天打算好好梳理一下,涉及主城分析法的理论以及R实现!come on…gogogo… 首 ...
- 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 ...
随机推荐
- 安装了nodejs后在命令行运行npm报错:Error: Cannot find module 'internal/util/types'
报错如下图所示: 解决方法:删除目录“C:\Users\wls\AppData\Roaming\npm\node_modules”下的npm文件夹
- 安装docker跨主机网络flannel
一.实验环境 机器 操作系统 安装服务 172.16.4.36 centos7 docker etcd flannel 172.16.4.37 centos7 docker etcd flanne ( ...
- C#——字符串
aaarticlea/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAAA8CAMAAAA6wCQxAAAAGFBMVEX////w9f5kb9TGyu3b6P6hp
- 为在python中使用dotnet程序安装clr
直接在命令行中录入 pip install pythonnet 会有一个ssl错误提示 ...Could not fetch URL https://pypi.python.org/simple/py ...
- re模块,subprocess模块
""" RE是什么 正则 表达 式子 就是一些带有特殊含义的符号或者符号的组合 它的作用是对字符串进行过滤 在一堆字符串中找到你所关心的内容 你就需要告诉计算机你的过滤规 ...
- css设置自适应屏幕高度
<style type="text/css"> body,html{ margin:0; height:100%; /*这里将高度设置为100%是这个布局实现自适应高度 ...
- Java中方法重写和方法重载
首先方法重写和方法重载是建立在Java的面向对象的继承和多态的特性基础上而出现的.至于面向对象的继承和多态的特性我就不在这里多说了.继承是指在一个父类的基础再创建一个子类,这样子类就拥有了父类的非私 ...
- OC语言-runtime
参考博客 IOS高级开发-Runtime(一) http://blog.csdn.net/lizhongfu2013/article/details/9496705 apple官方参考 Object- ...
- 第83讲:Scala中List的实现内幕源码揭秘
今天我们来学习一下scala的List的方法的内部源码的一些知识. 首先,take方法.take方法就是取列表的从第一个元素开始的前N个元素.如list.take(3),就是取list的前3个元素,返 ...
- Linux (rz、sz命令行)与本地电脑 命令行上传、下载文件
Linux 与本地电脑直接交互, 命令行上传.下载文件. 一.lrzsz命令行安装: 1.rpm安装:(链接: http://pan.baidu.com/s/1cBuTm2 密码: vijf) rpm ...