Java Jama矩阵

3
我正在使用 Jama Matrix 进行LSI相关工作。它的表现很好。但是,当我传递一个大矩阵,比如8000x8000时,会导致我的整个系统崩溃。我只是简单地调用SVD,然后减小矩阵大小并相加。没有其他操作!
有什么想法吗?我该如何解决这个问题?
core2du
Ram = 10GB
Java运行时设置
-Xmx5000M
在执行Jama矩阵代码时没有其他程序运行

1
“整个系统崩溃”是什么意思?如果出现“OutOfMemoryError”,那很可能是因为一个8000x200的数组需要大约12Mb的内存。SVD的构造函数会创建一堆新的数组。即使只有这一个调用,你也可能接近JVM的64Mb默认最大内存分配(假设你正在使用Oracle/Sun JVM)。 - Ash
感谢您的评论。我电脑有10GB RAM。它正在使用JDK 1.5,我已经为我的程序分配了5GB。对于混淆我感到抱歉。“杀死整个系统”意味着使用Jama处理这个小矩阵需要数天时间。我没有使用其他任何东西。我只是将简单的矩阵传递给Jama软件包。 - Tweet
2
我会怀疑你可以通过使用不同的库或更小的矩阵来解决问题,因为SVD似乎是O(n^3)。如果失败了,你可以尝试进行分析(例如使用jvisualvm)以查看你是否受到内存或CPU限制,并且你可以使用较小的案例进行测量并推断出所需的运行时间。 - Peter Taylor
你有浏览过他们的邮件列表档案吗?有几封关于Jama的SVD实现的消息。 - Bart Kiers
4个回答

3
我也使用Jama来进行奇异值分解,但在解决大矩阵时遇到了同样的问题。为了减少内存溢出情况,我对SingularValueDecomposition.java进行了调整以使其更加紧凑。调整的方法是,在矩阵A中有很多0值,因此对于所有使用的矩阵(如A、U、V、Work等),只允许为可用值保留内存,而这些可用值大于0。
在使用紧凑SVD之前,您应该制作一个A矩阵文件,例如 r /t c /t value /n r /t c /t value /n ... '/t'和'/n'分别表示制表符和换行符。
例如,(0, 0, 0), (0, 1, 0.5), (0, 2, 0), (0, 3, 0.2), (1, 0, 1), (1, 1, 0), (1, 2, 0), (1, 3, 0.3)且矩阵大小为2*4(R*C),则可以制作如下文件: MATRIXSIZE /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)。我会在邮件中提供更多使用细节。
我检查了结果是正确的。但是,我不确定它对计算机有多大的效果。无论如何,它可以工作并显示得更好,即使不是很多。

2
您可能面临内存不足的情况。您可以通过使用-Xmx选项来增加JVM可用的内存,例如-Xm256m将为JVM提供256 MB,而不是默认的64 MB。
您还可以考虑使用处理内存高效矩阵表示的替代库,使用稀疏矩阵模型,如COO、DOK、CSR等。请查阅“稀疏矩阵”的维基百科条目以获取更多详细信息。 此线程提供了几个Jama的替代方案,也许这对您有所帮助。

0
如果你正在进行LSI,那么你可以进行两个重要的优化。首先,你的矩阵是稀疏的(假设你使用的是按词项-文档的矩阵)。JAMA操作密集矩阵,因此你可能需要寻找不同的表示方法。正如Lolo所提到的,这将大大减少你的开销。
其次,LSI只需要计算前k个奇异向量。JAMA计算所有奇异值,在你的情况下是不必要的。此外,如果你只需要k个最大的奇异向量,你可以通过使用thin-SVD进一步优化,它具有显着较低的内存开销。对于大型文档集合,计算LSI的完整SVD将变得几乎不可能,因此如果你想扩展规模,最终必须切换到其他东西而不是JAMA。
在Java中执行thin-SVD的一个可能性是SVDLIBJ。S-Space Package还有一个SVDLIBJ包装器和命令行工具,以及一个LSI/LSA实现,如果你想避免编写LSI的话。

0

Peter Taylor 绝对是正确的。

这是一个指数级的大 O 问题。毕竟,计算一个 8000 X 8000 矩阵的 SVD 不是一件轻松的事情,因为你要处理 64,000,000 个元素!

如果你运行 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 秒

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接