我正在使用R进行文本分类任务,并且我获得了一个大小为22490×120,000的文档术语矩阵(只有400万个非零条目,少于1%的条目) . 现在我想通过利用PCA(主成分分析)来降低维数 . 遗憾的是,R无法处理这个巨大的矩阵,所以我将这个稀疏矩阵存储在“矩阵市场格式”的文件中,希望使用其他一些技术来做PCA .
因此,任何人都可以给我一些有用库(无论编程语言)的提示,它可以轻松地使用这个大型矩阵进行PCA,或者自己做一个简单的PCA,换句话说, calculate the covariance matrix at first, and then calculate the eigenvalues and eigenvectors for the covariance matrix .
我想要的是 calculate all PCs (120,000), and choose only the top N PCs, who accounts for 90% variance . 显然,在这种情况下,我必须先给出一个阈值,将一些非常小的方差值设置为0(在协方差矩阵中),否则,协方差矩阵将不会稀疏,其大小将为120,000乘120,000,这是用一台机器无法处理 . 此外,载荷(特征向量)将非常大,并且应以稀疏格式存储 .
非常感谢您的帮助!
注意:我使用的是具有24GB RAM和8个CPU内核的机器 .
4 回答
Python工具包scikit-learn有一些PCA变体,其中RandomizedPCA可以处理scipy.sparse支持的任何格式的稀疏矩阵 . scipy.io.mmread应该能够解析Matrix Market格式(我从未尝试过) .
免责声明:我是scikit-learn开发团队的成员 .
EDIT :来自
RandomizedPCA
的稀疏矩阵支持已在scikit-learn 0.14中弃用 . 应该使用TruncatedSVD
代替它 . 有关详细信息,请参阅文档您可以尝试使用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算法将收敛到给定指定主题数量的数据的最小描述长度表示 .
在
bigpca
的big.PCA
中,包http://cran.r-project.org/web/packages/bigpca/bigpca.pdf完成了这项工作 .我使用technique for PCA of sparse matrix解决了almost same problem . 该技术可以处理非常大的稀疏矩阵 . The result显示了这样简单的PCA outperfoms word2vec . 它打算简单的PCA优于LDA .