我正在对相当多的数据(3000 个变量,100079 个数据点)进行主成分分析(PCA)。我这样做主要是为了好玩;数据分析不是我的日常工作。
通常,要进行 PCA,我会计算协方差矩阵,然后找到它的特征向量和相应的特征值。我非常了解如何解释这两者,并发现它是最初掌握数据集的有用方法。
但是,我已经读到,对于如此大的数据集,最好(更快,更准确)通过对数据矩阵进行奇异值分解(SVD)来进行主成分分析。
我已经使用SciPy 的svd
函数完成了这项工作。我不太了解 SVD,所以我可能做得不对(见下文),但假设我有,我最终得到的是 (1) a matrix U
,它的大小; s
长度向量V
, 和一个大小矩阵. (我使用了这个full_matrices=False
选项,否则它会是,这很愚蠢。)
我的问题如下:
s
向量中的奇异值可能与相关矩阵的特征值相同,这似乎是合理的。这个对吗?如果是这样,我如何找到相关矩阵的特征向量?它们是 的行
U
,还是它的列,还是别的什么?似乎合理的是, 的列
V
可能是转换为由主成分定义的基础的数据。这个对吗?如果没有,我怎么能得到它?
为了进行分析,我只是把我的数据放在一个大numpy 数组并将其传递给svd
函数。(我知道通常应该首先将数据居中,但我的直觉表明我可能不想为我的数据执行此操作,至少最初是这样。)这是正确的方法吗?或者我应该在将数据传递给这个函数之前对我的数据做一些特别的事情吗?