【问题标题】:principal component analysis (PCA) in R: which function to use?R中的主成分分析(PCA):使用哪个函数?
【发布时间】:2012-12-24 07:45:03
【问题描述】:

谁能解释一下 prcomp 和 princomp 函数之间的主要区别是什么?

有什么特别的原因让我应该选择其中之一吗?如果这是相关的,我正在研究的应用类型是基因组(表达)数据集的质量控制分析。

谢谢!

【问题讨论】:

标签: r linear-algebra pca unsupervised-learning


【解决方案1】:

这两个函数之间存在差异 w/r/t

  • 函数参数(当你调用 函数);
  • 每个人返回的值;和
  • 每个人用来计算本金的数值技术 组件。


用于计算 PCA 的数值技术

特别是,princomp 应该更快(并且性能差异会随着数据矩阵的大小而增加),因为它通过 eigenvector 计算主成分协方差矩阵上的分解,与通过奇异值分解计算主成分的prcomp strong> (SVD) 在原始数据矩阵上。

特征值分解仅针对方阵定义(因为该技术只是求解特征多项式)但这不是实际限制,因为特征值分解总是涉及从原始计算的谓词步骤数据矩阵,协方差矩阵。

协方差矩阵不仅是平方的,而且通常比原始数据矩阵小很多(只要属性数小于行数,或者 n

前者(特征向量分解)不太准确(差异通常并不重要),但要快得多,因为计算是在协方差矩阵上而不是在原始数据矩阵上执行的;例如,如果数据矩阵具有通常的形状,即 n >> m,即 1000 行和 10 列,则协方差矩阵为 10 x 10;相比之下,prcomp 在原始 1000 x 10 矩阵上计算 SVD。

我不知道基因组表达数据的数据矩阵的形状,但是如果行数为数千甚至数百,那么 prcomp 会明显比 princomp时间>。我不知道您的上下文,例如,pca 是否在更大的数据流中作为单个步骤执行,以及净性能(执行速度)是否值得关注,所以我不能说这种性能是否确实与您的使用相关案子。同样,很难说这两种技术之间的数值精度差异是否显着,实际上这取决于数据。

返回值

princomp 返回一个由 七个 项组成的列表; prcomp 返回 五个 的列表。

> names(pc1)    # prcomp
    [1] "sdev"     "rotation" "center"   "scale"    "x"       

> names(pc2)    # princomp
    [1] "sdev"     "loadings" "center"   "scale"    "n.obs"    "scores"   "call"    

对于 princomp,返回的最重要的项目是组件 scoresloadings

两个函数返回的值可以通过这种方式进行协调(比较):prcomp 返回一个称为 rotation 的矩阵,它等价于载荷princomp 返回的矩阵。

如果您将 prcomp 的 旋转 矩阵乘以原始数据矩阵,则结果将存储在以 x 为键的矩阵中

最后,prcomp 有一个 plot 方法,它给出了 scree plot(显示相对重要性和累积重要性每个变量/列——我认为 PCA 最有用的可视化)。

函数参数

如果您将参数scalecenter 设置为TRUEprcomp 将缩放(到单位方差)并为您的数据平均居中。鉴于您可以使用 scale 函数在一行中缩放和平均居中数据,这只是两者之间的一个微不足道的区别。

【讨论】:

  • 只是指出princomp 默认情况下会进行居中以计算协方差矩阵。此外,如果要通过设置参数 cor = TRUE 对相关矩阵进行 PCA,则进行缩放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 2022-07-06
  • 2013-04-07
  • 2017-04-09
  • 2015-07-29
  • 2013-10-29
  • 2012-11-10
相关资源
最近更新 更多