2012-05-23 69 views
13

我正在用R进行文本分类任务,并且我获得了大小为22490乘以120,000(仅400万个非零条目,小于1%条目)的文档项矩阵。现在我想通过使用PCA(主成分分析)来降低维度。不幸的是,R无法处理这个巨大的矩阵,所以我把这个稀疏矩阵存储在一个文件中的“矩阵市场格式”,希望使用一些其他技术来做PCA。因此,任何人都可以给我一些有用的库的提示(无论编程语言如何),它可以轻松地用这个大型矩阵做PCA,或者自己做一个longhand PCA,换句话说,计算首先计算协方差矩阵,然后计算协方差矩阵的特征向量和特征向量,即在非常大的稀疏矩阵上应用PCA

我想是计算所有的PC(120,000),并且只选择前N个电脑,谁占了90%的变异。显然,在这种情况下,我必须先给出一个阈值,以便将一些非常小的方差值设置为0(在协方差矩阵中),否则协方差矩阵将不会稀疏并且其大小将为120,000乘以120,000,即单台机器无法处理。另外,加载(特征向量)将会非常大,并且应该以稀疏格式存储。

非常感谢您的帮助!

注意:我使用的机器有24GB RAM和8个cpu核心。

+0

我不确定它是否100%正确,但我认为MatLab可以完成这项工作。 – Anton

+0

如果你在这里没有得到任何喜悦,可能值得在http://stats.stackexchange.com/ – NPE

+0

@aix上提问。感谢您的建议,我已将它移至计算科学测试版,并获得一些有用的信息提示。你也可以按照这个[URL](http://scicomp.stackexchange.com/questions/2313/apply-pca-on-very-large-sparse-matrix) –

回答

11

Python工具包scikit-learn有几个PCA变体,其中RandomizedPCA可以处理scipy.sparse支持的任何格式的稀疏矩阵。 scipy.io.mmread应该能够解析Matrix Market格式(但我从来没有尝试过)。

声明:我在scikit-learn开发团队。

编辑:在scikit-learn 0.14中已弃用来自RandomizedPCA的稀疏矩阵支持。应该使用TruncatedSVD代替。详情请参阅文档。

+0

非常感谢@larmans,在某种程度上,你提出的方法可以用稀疏矩阵做PCA,但由于大内存消耗,它只能计算一些少量的PC: - ( –

+0

请注意'RandomizedPCA'已被弃用,支持使用关键字参数'svd_solver ='randomized''的'PCA' – BallpointBen

6

您可以尝试Latent Dirichlet Allocation(LDA),它可以将文档词矩阵分解为文档主题和主题词矩阵,而不用运行PCA。这是一个R实现的链接:http://cran.r-project.org/web/packages/lda/ - 这里有不少实现,尽管如果你是谷歌。

对于LDA,您需要提前指定固定数量的主题(类似于主要组件)。一个更好的选择是HDP-LDA(http://www.gatsby.ucl.ac.uk/~ywteh/research/npbayes/npbayes-r21.tgz),它可以学习形成你的语料库的良好表示的主题的数量。

如果你能适合我们的数据集在内存中(这看起来你可以),那么你也应该没有问题运行LDA代码。

正如scicomp论坛上的许多人所指出的,不应该计算所有的120k主成分。诸如http://en.wikipedia.org/wiki/Power_iteration的算法计算矩阵的最大特征值,并且LDA算法将收敛到给定指定主题数量的数据的最小描述长度表示。