我有一个非常大的矩阵(大约500000 * 20000),其中包含我将用pca分析的数据。为此,我使用ParallelColt库,但都使用奇异值分解和特征值分解,以获得协方差矩阵的特征向量和特征值。但是这些方法浪费了堆,我得到“OutOfMemory”错误......
同样使用SparseDoubleMatrix2D(数据非常稀疏),错误仍然存在,所以我问你:我该如何解决这个问题?
更改库?
答案 0 :(得分:2)
您可以使用Oja规则计算PCA:它是一种迭代算法,可以改善PCA的估计值,一次一个向量。它比通常的PCA慢,但要求你只在内存中存储一个向量。它的数值也非常稳定
答案 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测试应该有助于使用。