在大矩阵上用java做PCA

时间:2011-12-05 23:45:02

标签: java heap pca svd

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

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

更改库?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我不确定更改库会有所帮助。你需要双打(每个8字节)。在这种情况下,我不知道协方差矩阵的维数是多少,但切换库不会更改基础计算。

运行时-Xmx设置是什么?烫发的大小怎么样?也许你可以增加它们。

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

来自Google的Google search用于“大型matricies的Java特征值”this library。如果你在评论中向下滚动,我想知道块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

答案 2 :(得分:0)

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

之上

请参阅下面的trickl-cluster库中的HallMarshalMartin类。您可以一次提供大量行,因此它可以解决您的内存问题。

该代码在GPL下提供。我担心我只是刚刚发布它,因此文档很简短,希望它是相当自我解释的。有一些JUnit测试应该有助于使用。

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