热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pca主成份分析方法

1.应用pca的前提应用pca的前提是,连续信号具有相关性。相关性是什么,是冗余。就是要利用pca去除冗余。2.pca的定义pca是一种去除随机变量间相关性的线性变换。是一种常用的多元数

1.应用pca的前提

  应用pca的前提是,连续信号具有相关性。相关性是什么,是冗余。就是要利用pca去除冗余。

2.pca的定义

  pca是一种去除随机变量间相关性的线性变换。是一种常用的多元数据分析方法。pca将互相关的输入数据转换成统计上不相干的主成分(或者特征),所得到的主成份通常是按照方差大小进行降序排列的。

reference :基于CCA的fMRI时空模型数据处理方法的研究,肖柯,硕士论文。

———————————————————下面来参考一下代码—————————————————————————————————---

参考:http://blog.csdn.net/watkinsong/article/details/8234766 

我在网上看了很多pca降维的例子,都大同小异,原理差不多,都是活的原来矩阵的协方差矩阵,然后计算协方差矩阵的特征值和特征向量,最后通过特征向量的根据特征值由大到小的排序进行KL变换神马的获得一个转换矩阵。
 

1. matlab自带的实现方式

 
 PCA在matlab中的实现举例
 
  以下资料来自matlab的help,翻译和注解部分由笔者添加:(重点部分添加了翻译!)
 
   princomp-----函数名称
 
  Principal component analysis (PCA) on data
 
  Syntax------函数调用语法
 
  [COEFF,SCORE] = princomp(X)
 
  [COEFF,SCORE,latent] = princomp(X)
 
  [COEFF,SCORE,latent,tsquare] = princomp(X)
 
  [...] = princomp(X,'econ')
 
   Description -----函数描述
 
   COEFF = princomp(X)  performs principal components analysis (PCA) on the n-by-p data matrix X, and returns the principal component coefficients, also known as loadings. Rows of X correspond to observations, columns to variables. COEFF is a p-by-p matrix, each column containing coefficients for one principal component. The columns are in order of decreasing component variance.
 
  在n行p列的数据集X上做主成分分析。返回主成分系数。X的每行表示一个样本的观测值,每一列表示特征变量。COEFF是一个p行p列的矩阵,每一列包含一个主成分的系数,列是按主成分变量递减顺序排列。(按照这个翻译很难理解,其实COEFF是X矩阵所对应的协方差阵V的所有特征向量组成的矩阵,即变换矩阵或称投影矩阵,COEFF每列对应一个特征值的特征向量,列的排列顺序是按特征值的大小递减排序,后面有具体例子解释,见 说明1 )
 
  princomp centers X by subtracting off column means, but does not rescale the columns of X. To perform principal components analysis with standardized variables, that is, based on correlations, use princomp(zscore(X)). To perform principal components analysis directly on a covariance or correlation matrix, use pcacov.
 
  计算PCA的时候,MATLAB自动对列进行了去均值的操作,但是并不对数据进行规格化,如果要规格化的话,用princomp(zscore(X))。另外,如果直接有现成的协方差阵,用函数pcacov来计算。
 
   [COEFF,SCORE] = princomp(X)  returns SCORE, the principal component scores; that is, the representation of X in the principal component space. Rows of SCORE correspond to observations, columns to components.
 
  返回的SCORE是对主分的打分,也就是说原X矩阵在主成分空间的表示。SCORE每行对应样本观测值,每列对应一个主成份(变量),它的行和列的数目和X的行列数目相同。
 
   [COEFF,SCORE,latent] = princomp(X)  returns latent, a vector containing the eigenvalues of the covariance matrix of X.
 
  返回的latent是一个向量,它是X所对应的协方差矩阵的特征值向量。
 
   [COEFF,SCORE,latent,tsquare] = princomp(X)  returns tsquare, which contains Hotelling's T2 statistic for each data point.
 
  返回的tsquare,是表示对每个样本点Hotelling的T方统计量(我也不很清楚是什么东东)。
 
  The scores are the data formed by transforming the original data into the space of the principal components. The values of the vector latent are the variance of the columns of SCORE. Hotelling's T2 is a measure of the multivariate distance of each observation from the center of the data set.
 
  所得的分(scores)表示由原数据X转变到主成分空间所得到的数据。latent向量的值表示SCORE矩阵每列的方差(见 说明2 )。Hotelling的T方是用来衡量多变量间的距离,这个距离是指样本观测值到数据集中心的距离。
 
  When n <= p, SCORE(:,n:p) and latent(n:p) are necessarily zero, and the columns of COEFF(:,n:p) define directions that are orthogonal to X.
 
   [...] = princomp(X,'econ')  returns only the elements of latent that are not necessarily zero, and the corresponding columns of COEFF and SCORE, that is, when n <= p, only the first n-1. This can be significantly faster when p is much larger than n.
 
  当维数p超过样本个数n的时候,用[...] = princomp(X,'econ')来计算,这样会显著提高计算速度
 
   Examples--举例
 
  (上面说了那么多废话,看了还不一定懂,还不如举例容易理解,下面样本数据集为ingredients,这个数据集是matlab自带的)
 
  Compute principal components for the ingredients data in the Hald data set, and the variance accounted for by each component.
 
  load hald; %载入matlab内部数据
 
  [pc,score,latent,tsquare] = princomp(ingredients); %调用pca分析函数
 
  ingredients,score,pc,latent,tsquare %显示得到的结果
 
  ingredients =
 
  7 26 6 60
 
  1 29 15 52
 
  11 56 8 20
 
  11 31 8 47
 
  7 52 6 33
 
  11 55 9 22
 
  3 71 17 6
 
  1 31 22 44
 
  2 54 18 22
 
  21 47 4 26
 
  1 40 23 34
 
  11 66 9 12
 
  10 68 8 12
 
  score =
 
  36.8218 -6.8709 -4.5909 0.3967
 
  29.6073 4.6109 -2.2476 -0.3958
 
  -12.9818 -4.2049 0.9022 -1.1261
 
  23.7147 -6.6341 1.8547 -0.3786
 
  -0.5532 -4.4617 -6.0874 0.1424
 
  -10.8125 -3.6466 0.9130 -0.1350
 
  -32.5882 8.9798 -1.6063 0.0818
 
  22.6064 10.7259 3.2365 0.3243
 
  -9.2626 8.9854 -0.0169 -0.5437
 
  -3.2840 -14.1573 7.0465 0.3405
 
  9.2200 12.3861 3.4283 0.4352
 
  -25.5849 -2.7817 -0.3867 0.4468
 
  -26.9032 -2.9310 -2.4455 0.4116
 
  pc =
 
  -0.0678 -0.6460 0.5673 0.5062
 
  -0.6785 -0.0200 -0.5440 0.4933
 
  0.0290 0.7553 0.4036 0.5156
 
  0.7309 -0.1085 -0.4684 0.4844
 
  latent =
 
  517.7969
 
  67.4964
 
  12.4054
 
  0.2372
 
  tsquare =
 
  5.6803
 
  3.0758
 
  6.0002
 
  2.6198
 
  3.3681
 
  0.5668
 
  3.4818
 
  3.9794
 
  2.6086
 
  7.4818
 
  4.1830
 
  2.2327
 
  2.7216
 
  %下面我们来做一个验证
 
  %下面为计算ingredients协方差矩阵:
 
  cov_ingredients=cov(ingredients)
 
  cov_ingredients =
 
  34.6026 20.9231 -31.0513 -24.1667
 
  20.9231 242.1410 -13.8782 -253.4167
 
  -31.0513 -13.8782 41.0256 3.1667
 
  -24.1667 -253.4167 3.1667 280.1667
 
  %下面为计算ingredients所对应的协方差矩阵(也就是cov_ingredients矩阵)的特征值和特征
 
  %向量,下面的矩阵V为特征向量,D为特征值(对比上面的latent)组成的对角线矩阵
 
  [V,D] = eig(cov_ingredients)
 
  V =
 
  0.5062 0.5673 0.6460 -0.0678
 
  0.4933 -0.5440 0.0200 -0.6785
 
  0.5156 0.4036 -0.7553 0.0290
 
  0.4844 -0.4684 0.1085 0.7309
 
  D =
 
  0.2372 0 0 0
 
  0 12.4054 0 0
 
  0 0 67.4964 0
 
  0 0 0 517.7969
 
  % 说明1 :对比一下矩阵V和矩阵pc,现在很容易明白为什么COEFF是按列递减顺序排列的
 
  % 了!(V中第三列与pc中倒数第三列差个负号,学过线性代数的人都知道这没问题)
 
  %下面再验证一下说明2
 
  diag(cov(score))
 
  ans =
 
  517.7969
 
  67.4964
 
  12.4054
 
  0.2372
 
  % 说明2 :以上结果显示latent确实表示SCORE矩阵每列的方差,517.7969表示第一列方差
 
  下面做图表示结果:
 
  上面说了半天还没有达到我们终极想要的,其实我们要的是由函数[pc,score,latent,tsquare] = princomp(ingredients)它所产生的pc和latent。由latent可以算出降维后的空间所能表示原空间的程度,只要这个累积的值大于95%就行了。
 
  The following command and plot show that two components account for 98% of the variance:
 
  cumsum(latent)./sum(latent)
 
  ans =
 
  0.86597
 
  0.97886
 
  0.9996
 
  1
 
  %由以上ans值可以看出前两个主成分就能表示原空间的97.886%,所以取pc中的前两列可
 
  %做主成分变换矩阵tranMatrix = pc(:,1:2)。则从原来的4维空间降到2维空间。对任意一个
 
  %原空间样本,例如a=(7 ,26 ,6 ,60)变到低维空间的表达式为a1 = a*tranMatrix。(当然你也可
 
  %以取pc中的前三列,由原来的4维空间变到3维空间)
 
  biplot(pc(:,1:2),'Scores',score(:,1:2),'VarLabels',...
 
  {'X1' 'X2' 'X3' 'X4'})

 

 


推荐阅读
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
author-avatar
black丶烽火
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有