线性代数-主成分分析(PCA)在R:哪个函数使用



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

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

谢谢!

这两个函数有区别w/r/t

  • 函数参数(调用时可以/必须传递的参数函数);
  • 每个返回值;和
  • 数值技术用于计算本金组件。


PCA的数值计算方法

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

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

协方差矩阵不仅是平方,而且通常比原始数据矩阵小得多(只要属性数小于行数,或n <,这在大多数情况下是正确的。

前者(特征向量分解)不太准确(差异通常不是很大),但速度更快,因为计算是在协方差矩阵上执行的,而不是在原始数据矩阵上执行的;例如,如果数据矩阵的形状通常是n>> m,即1000行10列,那么协方差矩阵是10 × 10;相比之下,prcomp在原始的1000 x 10矩阵上计算SVD。

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

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

> 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返回的加载矩阵。

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

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

函数参数

如果您将参数scalecenter设置为TRUE,则

prcomp将缩放(到单位方差)并为您的数据平均中心。这是两者之间的一个微不足道的区别,因为您可以使用scale函数在单行中缩放和平均居中数据。

相关内容

  • 没有找到相关文章

最新更新