【问题标题】:Doing PCA in java on large matrix在大矩阵上用java做PCA
【发布时间】:2012-01-13 16:16:56
【问题描述】:

我有一个非常大的矩阵(大约 500000 * 20000),其中包含我将使用 pca 分析的数据。为此,我使用 ParallelColt 库,但都使用奇异值分解和特征值分解来获得协方差矩阵的特征向量和特征值。但是这些方法浪费了堆,我得到“OutOfMemory”错误......

同样使用 SparseDoubleMatrix2D (数据非常稀疏)错误仍然存​​在,所以我问你:我该如何解决这个问题?

更改库?

【问题讨论】:

  • Java 是唯一考虑的语言吗,我可以想象这个矩阵非常大......?
  • 我看不出切换到另一种语言会有什么改变。

标签: java heap-memory pca svd


【解决方案1】:

您可以使用 Oja 规则计算 PCA:它是一种迭代算法,改进了 PCA 的估计,一次一个向量。它比通常的 PCA 慢,但只需要在内存中存储一​​个向量。它在数值上也非常稳定

http://en.wikipedia.org/wiki/Oja%27s_rule

【讨论】:

    【解决方案2】:

    我不确定更改库是否会有所帮助。您将需要双打(每个 8 个字节)。我不知道在这种情况下协方差矩阵的维度是多少,但切换库不会对底层计算产生太大影响。

    运行时的 -Xmx 设置是什么? perm gen 的大小呢?也许你可以增加它们。

    算法是立即停止还是运行一段时间?如果是后者,您可以使用 Visual VM 1.3.3 附加到该进程(下载并安装所有插件)。它会让你看到堆、线程等上发生了什么。可以帮助你找出根本原因。

    “大型矩阵的 Java 特征值”的 Google search 来自 Google 的 this library。如果您在 cmets 中向下滚动,我想知道块 Lanczos 特征值分析可能会有所帮助。如果你能得到特征值的一个子集就足够了。

    这些 SVM 实现声称对大型数据集很有用:

    http://www.support-vector-machines.org/SVM_soft.html

    我认为你不能为 JVM 要求超过 2GB 的空间:

    http://www.theserverside.com/discussions/thread.tss?thread_id=26347

    根据 Oracle 的说法,您需要一个在 64 位操作系统上运行的 64 位 JVM:

    http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit

    【讨论】:

    • 结果的尺寸为 500000x500000。
    • 确定吗?不是 20K x 20K?
    • 这是协方差矩阵。 (X 是输入)upload.wikimedia.org/wikipedia/en/math/6/7/6/…
    • 我们还是跑吧...... :) 我认为他应该逐块进行,将中间结果保存到硬盘,或者?
    • LOL - 我不知道 SVD 是否可以那样工作,因为您必须构建正交基。但这是一个很好的研究方向。我喜欢早期的迭代推荐。是否存在具有迭代校正的 SVD?
    【解决方案3】:

    我为这类问题构建了一些稀疏的增量算法。方便的是,它建立在 Colt 之上。

    请参阅下面的trickl-cluster 库中的 HallMarshalMartin 类。你可以一次喂它大块的行,所以它应该可以解决你的内存问题。

    代码在 GPL 下可用。恐怕我才刚刚发布它,所以它的文档很短,希望它是相当不言自明的。有一些 JUnit 测试应该有助于使用。

    http://open.trickl.com/trickl-pca/index.html

    【讨论】:

      猜你喜欢
      • 2012-05-29
      • 2012-11-15
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 2015-11-18
      • 2016-07-31
      • 2014-01-22
      • 2020-07-31
      相关资源
      最近更新 更多