17

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

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

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

非常感谢您的帮助!

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

4

5 回答 5

13

Python 工具包scikit-learn有一些 PCA 变体,它们RandomizedPCA可以处理scipy.sparse. scipy.io.mmread应该能够解析 Matrix Market 格式(不过我从未尝试过)。

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

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

于 2012-05-23T13:53:10.433 回答
7

您可以尝试使用潜在狄利克雷分配 (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 算法将收敛到给定主题数量的数据的最小描述长度表示。

于 2012-06-24T21:25:34.140 回答
1

在包http://cran.r-project.org/web/packages/bigpca/bigpca.pdf的Rbig.PCA中完成了这项工作。bigpca

于 2015-03-22T14:46:53.847 回答
0

我想您将无法计算所有主要组件。但是您仍然可以获得数据集矩阵的降维版本。我在 MATLAB 中实现了一个简单的例程,可以很容易地在 python 中复制。

计算输入数据集的协方差矩阵,并将其转换为密集矩阵。假设 S 是您输入 120,000 * 22490 稀疏矩阵,这将是:

Smul=full(S.'*S);
Sm=full(mean(S));
Sm2=120000*Sm.'*Sm;
Scov=Smul-Sm2; 

对协方差矩阵应用 eigs 函数以获得前 N 个主要特征向量,

[V,D] = eigs(Scov,N);

并通过将零中心矩阵投影到特征向量上来获得 pcs,

Sr=(S-Sm)*V; 

Sr 是 S 的降维版本。

于 2021-12-30T16:39:28.927 回答
0

文本分类任务

我使用稀疏矩阵的 PCA 技术解决了几乎相同的问题。这种技术可以处理非常大的稀疏矩阵。 结果表明这种简单的 PCA 优于 word2vec。它打算简单的 PCA 优于 LDA。

于 2018-11-19T05:06:51.967 回答