我正在与Jama Matrix合作。我将它用于 LSI。一切正常。但是,当我传递一个像 8000x8000 这样的大矩阵时,它会杀死我的整个系统。我只是调用 SVD 然后减小矩阵大小并加起来。没有其他的 !
任何的想法?我怎么解决这个问题?
core2du
内存 = 10GB
Java 运行时设置
-Xmx5000M
执行 Jama 矩阵代码时没有其他程序在运行
我正在与Jama Matrix合作。我将它用于 LSI。一切正常。但是,当我传递一个像 8000x8000 这样的大矩阵时,它会杀死我的整个系统。我只是调用 SVD 然后减小矩阵大小并加起来。没有其他的 !
任何的想法?我怎么解决这个问题?
core2du
内存 = 10GB
Java 运行时设置
-Xmx5000M
执行 Jama 矩阵代码时没有其他程序在运行
我也将 Jama 用于 SVD,并且在解决大矩阵时遇到了同样的问题。为了减少内存溢出的情况,我将 SingularValueDecomposition.java 调整为紧凑的。调整是在矩阵 A 中它有很多 0(零)值,因此所有使用的矩阵(例如 A、U、V、Work 等)的紧凑型只允许内存用于大于 0 的可用值。在你之前使用紧凑的 SVD,您应该制作一个矩阵文件,如 r /tc /t value /n r /tc /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)。我将提供更多详细信息以在电子邮件中使用它。
我检查了结果是正确的。但是,我不确定它对计算机有多有效。无论如何,即使不多,它也能工作并且显示得更好。
您可能正面临内存不足的情况。您可能希望通过使用 -Xmx 选项来增加 JVM 可用的内存,例如 -Xm256m 将为您的 JVM 提供 256 MB,而不是默认的 64 MB。
您还可以考虑使用处理内存高效矩阵表示的替代库,使用稀疏矩阵的模型,如 COO、DOK、CSR 等...查找“稀疏矩阵”的 Wikipedia 条目以获取更多详细信息。
该线程提供了 Jama 的几种替代方案,也许这也会对您有所帮助。
彼得泰勒是绝对正确的。
这是一个指数级的大问题。毕竟计算 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 秒内 21x 93.625 秒
761x
如果你在做 LSI,那么你可以做两个重要的优化。首先,您的矩阵是稀疏的(假设您使用的是逐个文档矩阵)。JAMA 对稠密矩阵进行操作,因此您可能希望寻找不同的表示。正如 Lolo 所说,这将大大减少您的开销。
其次,LSI 只需要计算前 k 个奇异向量。JAMA 计算所有奇异值,这在您的情况下是不必要的。此外,如果您只需要 k 最大的,您可以通过使用 Thin-SVD 进一步优化,它具有显着降低的内存开销。对于大型文档集合来说,为 LSI 计算完整的 SVD 几乎是不可能的,因此如果您想扩展,最终将不得不从 JAMA 以外的其他东西中切换。
SVDLIBJ 是在 Java 中执行瘦 SVD 的一种可能性。S-Space 包还有一个 SVDLIBJ 包装器和命令行工具,以及一个 LSI/LSA 实现,如果您想完全避免编写 LSI。