【问题标题】:Apply PCA on very large sparse matrix在非常大的稀疏矩阵上应用 PCA
【发布时间】:2012-05-29 21:55:28
【问题描述】:

我正在使用 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 内核的机器。

【问题讨论】:

  • 我不确定它是否 100% 正确,但我认为 MatLab 可以完成这项工作。
  • 如果你在这里没有得到任何快乐,可能值得在stats.stackexchange.com提问
  • @aix 感谢您的建议,我已将其移至计算科学测试版,并获得了一些有用的提示。你也可以关注这个URL
  • @EnsomHodder:我不知道那个新网站。看起来很有趣,谢谢指出:)

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


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢@larmans,在某种程度上,你提出的方法可以用稀疏矩阵做PCA,但由于内存消耗大,它只能计算少量的PC:-(
  • 请注意,RandomizedPCA 已被弃用,取而代之的是带有关键字参数 svd_solver='randomized'PCA
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    bigpca 的R big.PCAhttp://cran.r-project.org/web/packages/bigpca/bigpca.pdf 中完成这项工作。

    【讨论】:

      【解决方案4】:

      文本分类任务

      我使用 technique for PCA of sparse matrix 解析了almost same problem。 这种技术可以处理非常大的稀疏矩阵。 The result 显示了如此简单的 PCA 优于 word2vec。 它打算让简单的 PCA 优于 LDA。

      【讨论】:

        【解决方案5】:

        我想您将无法计算所有主成分。但是您仍然可以获得数据集矩阵的降维版本。我在 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 的降维版本。

        【讨论】:

          猜你喜欢
          • 2011-03-11
          • 2016-07-31
          • 2018-05-12
          • 2016-11-22
          • 2012-11-15
          • 2016-02-09
          • 2015-07-30
          • 1970-01-01
          • 2015-10-11
          相关资源
          最近更新 更多