R中的主成分分析(PCA):使用哪个函数?

时间:2013-01-10 00:57:32

标签: r linear-algebra pca unsupervised-learning

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

为什么我应该选择一个而不是另一个?如果这是相关的,我正在研究的应用类型是基因组(表达)数据集的质量控制分析。

谢谢!

1 个答案:

答案 0 :(得分:11)

这两个函数w / r / t

之间存在差异
  • 功能参数(当您调用时,您可以/必须传入的内容) 功能);
  • 每个值返回;和
  • 每个用于计算本金的数值技术 组件。


用于计算PCA的数值技术

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

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

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

前者(特征向量分解)不太准确(差异通常不重要),但速度要快得多,因为计算是在协方差矩阵上而不是在原始数据矩阵上进行的;例如,如果数据矩阵具有通常的形状,使得n>> m,即1000行和10列,则协方差矩阵为10×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 ,返回的最重要的项目是组件得分加载

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

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

最后, prcomp 有一个 情节 方法,该方法提供 scree情节(显示相对和累积的重要性)每个变量/列 - 在我看来最有用的PCA可视化)。

函数参数

如果您设置为prcomp参数TRUEscale

center将缩放(以设置方差)并为您设置数据中心。这两者之间存在微不足道的差别,因为您可以使用scale函数在一行中对数据进行缩放和平均居中。