在非常大的稀疏矩阵上应用PCA

时间:2012-05-23 10:51:08

标签: language-agnostic machine-learning sparse-matrix pca

我正在使用R进行文本分类任务,并且我获得了一个大小为22490×120,000的文档术语矩阵(只有400万个非零条目,小于1%的条目)。现在我想通过利用PCA(主成分分析)来降低维数。遗憾的是,R无法处理这个巨大的矩阵,所以我将这个稀疏矩阵存储在“矩阵市场格式”的文件中,希望使用其他一些技术来做PCA。

所以任何人都可以给我一些有用库的提示(无论编程语言是什么),它可以轻松地使用这个大型矩阵进行PCA,或者自己做一个简单的PCA,换句话说, 首先计算协方差矩阵,然后计算协方差矩阵 的特征值和特征向量。

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

非常感谢您的帮助!

注意:我使用的是具有24GB RAM和8个CPU内核的计算机。

4 个答案:

答案 0 :(得分:12)

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

免责声明:我是scikit-learn开发团队的成员。

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

答案 1 :(得分:7)

您可以尝试使用Latent Dirichlet Allocation(LDA)代替运行PCA,LDA将文档字矩阵分解为文档主题和主题词矩阵。这是一个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算法将收敛到给定主题数量的数据的最小描述长度表示。

答案 2 :(得分:1)

big.PCA bigpcahttp://cran.r-project.org/web/packages/bigpca/bigpca.pdf的R {{1}}中完成工作。

答案 3 :(得分:0)

  

文本分类任务

我使用almost same problem解决了 technique for PCA of sparse matrix 。 该技术可以处理非常大的稀疏矩阵。 The result显示了这种简单的PCA胜过word2vec。 它希望简单的PCA优于LDA。