首页 > 代码库 > 主成分分析(PCA)

主成分分析(PCA)

相对与网上很多人分享的有关PCA的经历,我第一次接触PCA却不是从人脸表情识别开始的,但我所在的实验室方向之一是人脸的研究,最后也会回到这个方向上来吧。

PCA(principal components analysis)是一种非常有用的统计技术,它已经应用于人脸识别和图像压缩领域中,并且是高维数据计算模型的常用技术。简单说是把高维数据将成低维数据,比如100000x100000的矩阵降成100000x100的。

从例子中也看得出在数学模型中直观看到的是对矩阵进行的各种各样的变形最终达到我们所需要的矩阵形式。所以一定的关于矩阵的线性代数的知识是不可或缺的数学基础。

pca的原理我暂且不写,我要按照我所认识的PCA经历一点点写吧。

我一开始接触到PCA是偏于实践的,因为实验室的一个项目的大量数据需要用PCA做分析,所以安排我负责PCA这一部分,对数据进行降维处理。我是在matlab中进行的。

matlab中的PCA

http://blog.csdn.net/wangzhiqing3/article/details/12193131

这个里面比较全,有讲解和例子。

原文地址:http://www.cnblogs.com/sunwufan/archive/2011/08/31/2159952.html

主要涉及一个函数:[coef,score,latent,t2] = princomp(x);

 

x:为要输入的n维原始数据。带入这个matlab自带函数,将会生成新的n维加工后的数据(即score)。此数据与之前的n维原始数据一一对应。

score:生成的n维加工后的数据存在score里。它是对原始数据进行的分析,进而在新的坐标系下获得的数据。他将这n维数据按贡献率由大到小排列。(即在改变坐标系的情况下,又对n维数据排序)

latent:是一维列向量,每一个数据是对应score里相应维的贡献率,因为数据有n维所以列向量有n个数据。由大到小排列(因为score也是按贡献率由大到小排列)。

降维操作的时候也是根据latent中前n个的贡献率之和与全部的比例(一般为85%-90%以上),取前n个,即完成降维操作。

coef:是系数矩阵。通过cofe可以知道x是怎样转换成score的。

则模型为从原始数据出发:
score= bsxfun(@minus,x,mean(x,1))*coef;(作用:可以把测试数据通过此方法转变为新的坐标系)
逆变换:
x= bsxfun(@plus,score*inv(coef),mean(x,1))

 原文地址:http://www.ilovematlab.cn/thread-54600-1-1.html

我的个人见解:
这里我想说的是,再对测试样本进行降维的时候,一定要减去训练样本的均值,使用训练样本得到的转换矩阵,保证训练样本和测试样本转换到相同的样本空间中,这样才有意思。大家有时间可以去看看英文的资料,说的都比较详细。再用测试样本减去均值以后,就可以进行转换了。

很多同学可能在开始的时候和我一样,都是不知道如果对测试样本进行降维,很多人就选择了还是使用princomp这个函数处理测试样本,那么这样测试样本被映射到一个新的空间中,和原来的训练样本完全不是在一个空间,一点意义都没有,还是要使用测试样本减去均值,然后乘上训练样本降维的时候获得降维矩阵,转换到相同的空间中。


我的做法:对于训练数据利用princomp函数降维得到相应的coef和latent后都取其前n列保证贡献率在90%以上。

测试数据要减去训练数据样本均值后乘上面得到的coef得到测试数据的降维后的数据。

参考:

1

http://blog.csdn.net/rogerzhanglijie/article/details/8251359

PCA简单的说,它是一种通用的降维工具。在我们处理高维数据的时候,
了能降低后续计算的复杂度,在“预处理”阶段通常要先对原始数据进行降维,而PCA就是干这个事的
本质上讲,PCA就是将高维的数据通过线性变换投影到低维空间上去,但这个投影可不是随便投投,
遵循一个指导思想,那就是:找出最能够代表原始数据的投影方法。这里怎么理解这个思想呢?“最
表原始数据”希望降维后的数据不能失真,也就是说,被PCA降掉的那些维度只能是那些噪声或是冗
数据。这里的噪声和冗余我认为可以这样认识:
噪声:我们常说“噪音污染”,意思就是“噪声”干扰我们想听到的真正声音。同样,假设样本中某
主要的维度A,它能代表原始数据,是“我们真正想听到的东西”,它本身含有的“能量”(即该维度
方差,为啥?别急,后文该解释的时候就有啦~)本来应该是很大的,但由于它与其他维度有那
些千丝万缕的相关性,受到这些个相关维度的干扰,它的能量被削弱了,我们就希望通过PCA
理后,使维度A与其他维度的相关性尽可能减弱,进而恢复维度A应有的能量,让我们“听的更清
楚”!
冗余:冗余也就是多余的意思,就是有它没它都一样,放着就是占地方。同样,假如样本中有
个维度,在所有的样本上变化不明显(极端情况:在所有的样本中该维度都等于同一个数),也
说该维度上的方差接近于零,那么显然它对区分不同的样本丝毫起不到任何作用,这个维度即
冗余的,有它没它一个样,所以PCA应该去掉这些维度。

,PCA的目的就是“降噪”和“去冗余”。“降噪”的目的就是使保留下来的维度间的相关性尽可
能小,而“去冗余”的目的就是使保留下来的维度含有的“能量”即方差尽可能大。那首先的首先,我们得需
要知道各维度间的相关性以及个维度上的方差啊!那有什么数据结构能同时表现不同维度间的相关性以
及各个维度上的方差呢?自然是非协方差矩阵莫属。协方差矩阵度量的是维度与维度之间的关系,而非样本与样本之间。协方差矩阵的主对角线上的元素是各个维度上的
方差(即能量),其他元素是两两维度间的协方差(即相关性)。我们要的东西协方差矩阵都有了,先来
看“降噪”,让保留下的不同维度间的相关性尽可能小,也就是说让协方差矩阵中非对角线元素都基本为
零。达到这个目的的方式自然不用说,线代中奖的很明确——矩阵对角化。而对角化后得到的矩阵,其
对角线上是协方差矩阵的特征值,它还有两个身份:首先,它还是各个维度上的新方差;其次,它是各
个维度本身应该拥有的能量(能量的概念伴随特征值而来)。这也就是我们为何在前面称“方差”为“能量”的
原因。也许第二点可能存在疑问,但我们应该注意到这个事实,通过对角化后,剩余维度间的相关性已
经减到最弱,已经不会再受“噪声”的影响了,故此时拥有的能量应该比先前大了。看完了“降噪”,我们
的“去冗余”还没完呢。对角化后的协方差矩阵,对角线上较小的新方差对应的就是那些该去掉的维度。
所以我们只取那些含有较大能量(特征值)的维度,其余的就舍掉即可。PCA的本质其实就是对角化协方
差矩阵。
 
 
我也是刚学的,代码如下
for i=1:29
Xnor(i,:)=X(i,:)./sum(X(i,:));
end
[p,t,latent]=princomp(Xnor,‘econ‘);
latent=latent./sum(latent)*100;
latent(1:10)

第一步导入矩阵29 X 14 前15对照组求特征值
plot(t(1:15,1),t(1:15,2),‘o‘)
hold on
plot(t(16:29,1),t(16:29,2),‘*‘)
xlabel(‘PC1(36.3%)‘)
ylabel(‘PC2(26.9%)‘)
 
 
2
http://blog.csdn.net/rogerzhanglijie/article/details/8251400
因为经常做一些图像和信号处理的工作,要用到主元分析(Principal Components Analysis)作为工具。写出来供自己和朋友参考。

    PCA是一种统计技术,经常应用于人面部识别和图像压缩以及信号去噪等领域,是在高维数据中提取模式的一种常用技术。要了解PCA首先要了解一些相关的数学知识,这里主要介绍协方差矩阵、特征值与特征矢量的概念。

1、  协方差矩阵

    协方差总是在两维数据之间进行度量,如果我们具有超过两维的数据,将会有多于两个的协方差。例如对于三维数据(x, y, z维),需要计算cov(x,y),cov(y,z)和cov(z,x)。获得所有维数之间协方差的方法是计算协方差矩阵。维数据协方差矩阵的定义为

(1)

这个公式告诉我们,如果我们有一个n维数据,那么协方差矩阵就是一个n行n列的方矩阵,矩阵的每一个元素是两个不同维数据之间的协方差。

    对于一个3维数据(x,y,z),协方差矩阵有3行3列,它的元素值为:

(2)

需要注意的是:沿着主对角线,可以看到元素值是同一维数据之间的协方差,这正好是该维数据的方差。对于其它元素,因为cov(a,b)=cov(b,a),所以协方差矩阵是关于主对角线对称的。

2、特征值和特征矢量

    只要矩阵大小合适,就可以进行两矩阵相乘,特征矢量就是其中的一个特例。考虑图2.1中两个矩阵和矢量乘法。

 

2.1 一个非特征矢量和一个特征矢量的例子

2.2 一个缩放的特征矢量仍然是一个特征矢量

在第一个例子中,结果矢量不是原来因子矢量与整数相 乘,然而在第二个例子中,结果矢量是原来因子矢量的4倍,为什么会这样呢?该矢量是一个2维空间矢量,表示从原点(0,0)指向点(3,2)的箭矢。方矩 阵因子可以看作是转换矩阵,一个矢量左乘该转换矩阵,意味着原始矢量转换为一个新矢量。

    特征矢量来自于转换特性。设想一个转换矩阵,如果用其左乘一个矢量,映射矢量是它自身,这个矢量(以及它的所有尺度缩放)就是该转换矩阵的特征矢量。

    特征矢量有什么特性呢?首先只有方阵才有特征矢量,而且并不是所有方阵都有特征矢量,如果一个nXn方阵有特征矢量,那么它有n个特征矢量。

    特征矢量的另外一个性质是对特征矢量的缩放会得到缩放前同样地结果,如图2.2所示,这是因为你对矢量的缩放只是改变它的长度,不会改变它的方向。最后, 矩阵的所有特征矢量是正交的。这是一个非常重要的性质,因为这意味着你可以在这些正交矢量上表示一组数据,而不仅是在x和y轴上。在下面的PCA小节内我 们将作这个工作。

    另外一个需要了解的是数学家寻找特征矢量,总喜欢寻找长度为1的那一个特征矢量,这是因为矢量的长度不影响它是否是特征矢量,因此,为了保证特征矢量是标准的矢量,我们通常将特征矢量的长度缩放为1,从而所有的特征矢量都有相同的长度。

    怎样去找到这些神秘的特征矢量呢?不幸的是,只有对相当小维数的矩阵才有简单地方法,比如不超过3X3,对于较大维数的矩阵,需要复杂的迭代算法。

    特征值是与特征矢量极其相关的,事实上,在图2.1中我们已经看到了一个特征值。注意在两个例子中,原始矢量左乘方阵后与矢量缩放数一样。在这个例子中,缩放数为4。4就是对应该特征矢量的特征值。不管在左乘方阵之前如何缩放特征矢量,我们总是得到该矢量的4倍(如图2.2)。所以特征值和特征矢量总是成对出现,当你使用程序计算特征矢量时,你总是同时得到对应的特征值。

3、主成分分析(PCA)

    最后我们将进行主成分分析的介绍,那么什么是主成分分析呢?它是一种在数据中辨别模式的方法,表达数据的相似与不同之处的方法。因为高维数据的模式难以发现——图形表述不可用,PCA是一个有力的数据分析工具。

    PCA的另外一个重要优势是,一旦你找到了数据的这些模式,你可以压缩它,也就是在不丢失很多信息的基础上,降低数据的维数。在下一节将会看到,这种技术被用于图像压缩。

本节将一步一步地带你对一组数据进行PCA操作。我将不具体描述该技术为什么适用,只是介绍怎样使用该技术。

§3.1 方法

第一步:获得数据

    在我简单的例子中,将使用我自己制作的2维数据,使用2维数据的原因是我可以提供这些数据的图形,以便直观地观察PCA的操作步骤。下面就是我使用的数据

x=[2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2, 1, 1.5, 1.1]T
y=[2.4, 0.7, 2.9, 2.2, 3.0, 2.7, 1.6, 1.1, 1.6, 0.9]T

第二步:减去均值

    要使PCA正常工作,必须减去数据的均值。减去的均值为每一维的平均,所有的x值都要减去,同样所有的y值都要减去,这样处理后的数据都具有0均值。

x=[0.69, -1.31, 0.39, 0.09, 1.29, 0.49, 0.19, -0.81, -0.31, -0.71]T

y=[0.49, -1.21, 0.99, 0.29, 1.09, 0.79, -0.31, -0.81, -0.31, -1.01]T;

第三步:计算协方差矩阵

    因为数据是2维的,它的协方差矩阵就是2X2维的,这里直接给出结果:

因为非对角元素是正的,我们可以期望 和 变量一起增大。

第四步:计算协方差矩阵的特征矢量和特征值

    因为协方差矩阵为方阵,我们可以计算它的特征矢量和特征值,它可以告诉我们数据的有用信息。我们数据的特征值和特征矢量分别为

我们可以看到这些矢量都是单位矢量,也就是它们的长度为1,这对于PCA是非常重要的,幸运的是,大多数数学程序包,当你计算特征矢量时,总是会得到单位特征矢量。

第五步:选择成分组成模式矢量

现在可以进行数据压缩降低维数了。如果你观察上一节中的特征矢量和特征值,会注意到那些特征值是十分不同的。事实上,可以证明对应最大特征值的特征矢量就是数据的主成分。在我们的例子中,对应大特征值的特征矢量就是那条穿过数据中间的矢量,它是数据维数之间最大的关联。

一般地,从协方差矩阵找到特征矢量以后,下一步就是按照特征值由大到小进行排列,这将给出成分的重要性级别。现在,如果你喜欢,可以忽略那些重要性很小的成分,当然这会丢失一些信息,但是如果对应的特征值很小,你不会丢失很多信息。如果你已经忽略了一些成分,那么最后的数据集将有更少的维数,精确地说,如果你的原始数据是n维的,你选择了前p个主要成分,那么你现在的数据将仅有p维。

现在要做的是你需要组成一个模式矢量,这只是几个矢量组成的矩阵的一个有意思的名字而已,它由你保持的所有特征矢量构成,每一个特征矢量是这个矩阵的一列。

对于我们的数据集,因为有两个特征矢量,因此我们有两个选择。我们可以用两个特征矢量组成模式矢量:

我们也可以忽略其中较小特征值的一个特征矢量:

下一节我们将会看到它们的结果。

x=[-0.828, 1.778, -0.992, -2.742, -1.676, -0.913, 0.099, 1.145, 0.438,1.224]T

第六步:获得新数据

这是PCA最后一步,也是最容易的一步。一旦你选择了须要保留的成分(特征矢量)并组成了模式矢量,我们简单地对其进行转置,并将其左乘原始数据的转置:

其中rowFeatureVector是由特征矢量作为列组成的矩阵的转置,因此它的行就是原来的特征矢量,而且对应最大特征值的特征矢量在该矩阵的最上一行。rowdataAdjust是减去均值后的数据,即数据项目在每一列中,每一行就是一维。FinalData是最后得到的数据,数据项目在它的列中,维数沿着行。

这将给我们什么结果呢?这将仅仅给出我们选择的数据。我们的原始数据有两个轴(x和y),所以我们的原始数据按这两个轴分布。我们可以按任何两个我们喜欢的轴表示我们的数据。如果这些轴是正交的,这种表达将是最有效的,这就是特征矢量总是正交的重要性。我们已经将我们的数据从原来的xy轴表达变换为现在的单个特征矢量表达。如果我们已经忽略了一些特征矢量,则新数据将会用我们保留的矢量表达。

§3.2 恢复原来的数据

 

3

http://wenku.baidu.com/link?url=rLdBkVzZ1OrDdF53K23mSclZR3U85xEQ0EIAXeZsWyD6jitn2uOtBlRSDvOAChUpeVx7YgoIaAyZtYxArIZNr056_arZKaY75JrQ88XxUFG

主成分分析模型:

基本思想PCA采用数学降维的方法,找出几个综合变量来代替原来众多的变量,使这些综合变量能尽可能的代表原来变量的信息量,而且彼此之间互不相关。这种将把很多个变量化为少数几个互相无关的综合变量的统计分析方法就叫做主成分分析或主分量分析。

通常,数学上的处理方法就是将原来的变量做线性组合,作为新的综合变量,但关键是如何选择这种线性组合呢?

如果将选取的第一个线性组合即第一个综合变量记为F1,自然希望它尽可能多的反映原来变量的信息,这里的“信息”用方差来测量,即希望Var(F1)越大,表示F1包含的信息越多。因此在所有的线性组合中所选取的F1应该是方差最大的,故称F1为第一主成分。如果第一主成分不足以代表原来p个变量的信息,再考虑选取F2即第二个线性组合,为了有效地反映原来的信息,F1已有的信息就不需要再出现在F2中,用数学语言表达式就是要求Cov(F1,F2)=0,称F2为第二主成分,依此类推可以构造出第三,四,,,,第p个主成分。

数学模型:

 

 

 

 

 

对于一个样本资料,观测个变量个样品的数据资料阵为:

其中:

主成分分析就是将个观测变量综合成为个新的变量(综合变量),即

简写为:

               

要求模型满足以下条件:

互不相关(

的方差大于的方差大于的方差,依次类推

 

于是,称为第一主成分,为第二主成分,依此类推,有第个主成分。主成分又叫主分量。这里我们称为主成分系数。

上述模型可用矩阵表示为:

,其中

           

称为主成分系数矩阵。

()主成分分析的几何解释

假设有个样品,每个样品有二个变量,即在二维空间中讨论主成分的几何意义。设个样品在二维空间中的分布大致为一个椭园,如下图所示:

1  主成分几何解释图

将坐标系进行正交旋转一个角度,使其椭圆长轴方向取坐标,在椭圆短轴方向取坐标,旋转公式为

写成矩阵形式为:

其中为坐标旋转变换矩阵,它是正交矩阵,即有,即满足

经过旋转变换后,得到下图的新坐标:

2  主成分几何解释图

新坐标有如下性质:

(1)个点的坐标的相关几乎为零。

(2)二维平面上的个点的方差大部分都归结为轴上,而轴上的方差较小。

称为原始变量的综合变量。由于个点在轴上的方差最大,因而将二维空间的点用在轴上的一维综合变量来代替,所损失的信息量最小,由此称轴为第一主成分,轴与轴正交,有较小的方差,称它为第二主成分。