【问题标题】:Best way to compute a truncated singular value decomposition in java在java中计算截断奇异值分解的最佳方法
【发布时间】:2013-11-13 15:01:45
【问题描述】:

我想对最好的 2 或 3 个库进行基准测试,以计算截断奇异值分解 (SVD),即仅保留 k 个最大奇异值的 SVD。此外,我有这些限制:

  • 必须是 java 库
  • 我的矩阵是稀疏的(大约 1% 的非零值)
  • 我的矩阵非常大(通常为 10k x 5k)
  • 我的矩阵也可以大于高 (5k x 10k)

我遇到过相当多的库,但例如,对于 Colt,我什至不知道 SVD 算法是否考虑到我的矩阵是稀疏的这一事实。此外,我没有找到可以直接计算截断解决方案的单个库(应该更快)。实际上,我最感兴趣的是从截断的 SVD 获得的近似矩阵。

提前感谢您的帮助,

罗曼·拉罗什

【问题讨论】:

  • colt 在我的设置下绝对是太慢了。我打算试试 jama,但从我目前所读到的内容来看,应该不会更好。
  • Colt 太慢了,但更重要的是,它只适用于高于宽度的矩形矩阵。
  • 我正在尝试EJML,遵循benchmark 的java 矩阵库的建议。只要 java 内存不堆空间,它就比 Colt 好得多。
  • 同样的问题@Maveric。我想在稀疏矩阵中运行 SVD,但没有运气。我发现 apache.common.math 有效,但它返回所有矩阵的 NaN 值。

标签: java matrix colt matrix-decomposition


【解决方案1】:

我遇到了完全相同的问题,我的解决方案是:

  1. 在矩阵上使用 Apache Commons Math 运行 SVD
  2. 截断对角矩阵以仅保留前-k 个奇异值
  3. 截断其他两个矩阵,仅将前-k 列作为第一个,将前-k 行作为最后一个
  4. 将三个矩阵相乘

你得到的是原始矩阵的截断 SVD。

以下是完整的解决方案,使用具有数千行/列的矩阵进行测试。

public static double[][] getTruncatedSVD(double[][] matrix, final int k) {
    SingularValueDecomposition svd = new SingularValueDecomposition(new Array2DRowRealMatrix(matrix));

    double[][] truncatedU = new double[svd.getU().getRowDimension()][k];
    svd.getU().copySubMatrix(0, truncatedU.length - 1, 0, k - 1, truncatedU);

    double[][] truncatedS = new double[k][k];
    svd.getS().copySubMatrix(0, k - 1, 0, k - 1, truncatedS);

    double[][] truncatedVT = new double[k][svd.getVT().getColumnDimension()];
    svd.getVT().copySubMatrix(0, k - 1, 0, truncatedVT[0].length - 1, truncatedVT);

    RealMatrix approximatedSvdMatrix = (new Array2DRowRealMatrix(truncatedU)).multiply(new Array2DRowRealMatrix(truncatedS)).multiply(new Array2DRowRealMatrix(truncatedVT));

    return approximatedSvdMatrix.getData();
}

【讨论】:

  • 我在这里得到组件,所有的 NaN 值可能是什么解决方案?
  • @GauravKoradiya 我在 6 年前发布了这个,老实说我不记得了 :)
【解决方案2】:

我用过http://math.nist.gov/javanumerics/jama/ 库,非常不错。

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多