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

Ens*_*der 17 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内核的机器.

Fre*_*Foo 12

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

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

编辑:稀疏矩阵支持RandomizedPCA已被scikit-learn 0.14弃用.TruncatedSVD应该用它代替.有关详细信息,请参阅文档

  • 请注意,“RandomizedPCA”已被弃用,取而代之的是带有关键字参数“svd_solver='randomized”的“PCA” (2认同)

use*_*913 7

您可以尝试使用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算法将收敛到给定指定主题数量的数据的最小描述长度表示.