javajama矩阵

javajama矩阵,java,matrix,jama,Java,Matrix,Jama,我和你一起工作。我把它用于LSI。一切正常。然而,当我通过一个像8000x8000这样的大矩阵时,它会杀死我的整个系统。我只是简单地调用SVD,然后减少矩阵大小并相加。没有别的了 有什么想法吗?我怎样才能解决这个问题 core2du Ram=10GB Java运行时设置 -Xmx5000M 当我执行Jama矩阵代码时,没有其他程序运行您可能面临内存不足的情况。您可能希望通过使用-Xmx选项来增加JVM的可用内存,例如-Xm256m将为JVM提供256 MB的内存,而不是默认的64 MB 您也可以

我和你一起工作。我把它用于LSI。一切正常。然而,当我通过一个像8000x8000这样的大矩阵时,它会杀死我的整个系统。我只是简单地调用SVD,然后减少矩阵大小并相加。没有别的了

有什么想法吗?我怎样才能解决这个问题

core2du

Ram=10GB

Java运行时设置

-Xmx5000M


当我执行Jama矩阵代码时,没有其他程序运行

您可能面临内存不足的情况。您可能希望通过使用-Xmx选项来增加JVM的可用内存,例如-Xm256m将为JVM提供256 MB的内存,而不是默认的64 MB

您也可以考虑使用替代库来处理内存有效的矩阵表示,使用稀疏矩阵的模型,如COO、DOK、CSR等。有关详细信息,请查阅Wikipedia条目中的“稀疏矩阵”


提供了几种Jama的替代方案,也许这也会对您有所帮助。

彼得·泰勒绝对正确

这是一个指数级的大问题。毕竟,计算8000 X 8000矩阵的奇异值并不是一件容易的事,因为您所说的是64000000个元素

如果运行JAMA MagicSquareExample,则使用:

32x32矩阵的消失时间为0.062秒。
64x64将上升到0.0328秒
96x96将在1.891秒
128x128在4.5秒
160x160在11.109秒
192x192在24.063秒
224x224在46.063秒
256x256在83.625秒
512x512在1716.719秒


如果您正在进行LSI,那么您可以进行两个重要的优化。首先,您的矩阵是稀疏的(假设您使用的是文档矩阵中的术语)。JAMA操作密集矩阵,因此您可能希望寻找不同的表示。正如Lolo提到的,这将大大减少您的开销

其次,LSI只需要计算前k个奇异向量。JAMA计算所有的奇异值,这在您的例子中是不必要的。此外,如果只需要将k最大,可以通过使用精简SVD进一步优化,该SVD具有显著更低的内存开销。对于大型文档集合,为LSI计算完整的SVD几乎是不可能的,因此,如果您想要扩展,最终将不得不从JAMA以外的工具进行切换


SVDLIBJ是在Java中执行精简SVD的一种可能性。还有一个SVDLIBJ包装器和用于它的命令行工具,以及一个LSI/LSA实现,如果您想避免完全编写LSI。

我也使用Jama for SVD,在解决大型矩阵时也有同样的问题。 为了减少内存溢出的情况,我将SingularValueDecomposition.java调整为compact。调整是因为矩阵A中有太多的0(零)值,所以所有使用的矩阵(如A、U、V、功等)的压缩只允许内存中的可用值大于0。 在使用compact SVD之前,应该创建一个矩阵文件,如 r/t c/t值/n r/t c/t值/n ... '/t'和'/n'分别表示制表符和新行

例如,(0,0,0),(0,1,0.5),(0,2,0),(0,3,0.2),(1,0,1),(1,2,0),(1,3,0.3),矩阵大小为2*4(R*C),然后您只需将文件 矩阵大小/t 2/t 4/n 0/t 1/t 0.5/n 0/t 3/t 0.2/n 1/t 0/t 1/n 1/t 3/t 0.3/n

如果你想使用它,请给我你的电子邮件地址(mg。hwang@gmail.com). 我会在电子邮件中提供更多详细信息

我检查结果是否正确。然而,我不知道它对电脑有多有效。
不管怎么说,它工作得很好,显示得也更好。

你说的“杀死我的整个系统”是什么意思?如果您得到一个
OutOfMemoryError
,这很可能是因为8000x200数组占用了约12Mb的内存。SVD的构造函数创建了一个新数组的整个堆栈。即使有一个调用,您也可能接近JVM的64Mb默认最大内存分配(假设您使用的是Oracle/Sun JVM)。谢谢您的评论。我的电脑里有10GB内存。它使用的是JDK1.5,我已经为我的程序分配了5GB。我很抱歉搞混了。杀死我的整个系统意味着,用Jama处理这个小矩阵需要几天时间。我没有用其他东西。我只是将简单的矩阵传递给Jama包,我怀疑您是通过使用不同的库或更小的矩阵来解决问题的,因为SVD看起来是O(n^3)。如果做不到这一点,您可以尝试分析(例如,使用jvisualvm)来查看您是内存还是CPU受限,您可以使用较小的案例进行测量并推断以估计所需的运行时间。您浏览了他们的分析吗?关于Jama的SVD实现,有几条消息。