我在做一个文本分类任务与R,和我12万(只有4万次无零项,不到1%的条目)获得大小为22490文档长期矩阵。 现在我想利用PCA(主成分分析)来降低维数。 不幸的是,R不能处理这个庞大的矩阵,所以我这个稀疏矩阵存储在“矩阵市场格式”文件,希望用一些其他的方法做PCA。
所以,任何人都可以给我有用的库(任何编程语言),它可以做PCA与缓解这种大型矩阵,或者自己做一个手写PCA,换句话说一些提示, 首先计算协方差矩阵,然后计算的协方差矩阵的特征向量 。
我要的是计算所有PC(120,000),并且只选择前N个电脑,谁占了90%的变异 。 显然,在这种情况下,我必须给的阈值的先验一些非常微小的差异值设置为0(在协方差矩阵),否则,协方差矩阵不会是稀疏和其大小将是120000 120,000,这是无法用一台机器来处理。 此外,载荷(特征向量)会非常大,应存放在稀疏的格式。
非常感谢您的帮助!
注:我使用的是机24GB RAM和8个CPU内核。
Python的工具包scikit学习有几个PCA变种,其中的RandomizedPCA
可以在任何所支持的格式处理稀疏矩阵scipy.sparse
。 scipy.io.mmread
应该能够解析矩阵市场格式(我从来没有尝试过,虽然)。
免责声明:我在scikit学习开发团队。
编辑 :从稀疏矩阵支持RandomizedPCA
已被弃用scikit学习0.14。 TruncatedSVD
应该代替它被使用。 详情请参阅文档。
而不是运行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算法将收敛到指定的给定的主题数的数据的最小描述长度表示。
在该R big.PCA
的bigpca
包http://cran.r-project.org/web/packages/bigpca/bigpca.pdf做这项工作。
文本分类任务
我解决了几乎同样的问题,采用的技术为稀疏矩阵的PCA 。 这种技术可以处理非常大的稀疏矩阵。 结果表明这种简单的PCA outperfoms word2vec。 它打算在简单的PCA优于LDA。