在java中计算截断奇异值分解的最佳方法

我想基准最好的2或3个库来计算截断奇异值分解(SVD),即只保留k个最大奇异值的SVD。 而且,我有这些限制:

  • 它必须是一个Java库
  • 我的矩阵很稀疏(大约1%的非零值)
  • 我的矩阵非常大(通常为10k x 5k)
  • 我的矩阵也可以大于高(5k x 10k)
  • 我遇到了相当多的库,但是例如在Colt中,我甚至不知道SVD算法是否考虑到我的矩阵很稀疏的事实。 另外,我没有找到能够直接计算截断解决方案的单个库(这应该快得多)。 实际上,我最感兴趣的是从截断SVD得到的近似矩阵。

    感谢您的帮助,

    罗曼·拉罗什


    我用了很好的http://math.nist.gov/javanumerics/jama/库。


    我有完全相同的问题,我的解决方案是:

  • 在您的矩阵上运行Apache Commons Math的SVD
  • 截断对角矩阵只保留top-k奇异值
  • 截取其他两个矩阵,只取第一个顶k列和最后一个顶k行
  • 乘以三个矩阵
  • 你得到的是你的原始矩阵的截断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();
    }
    
    链接地址: http://www.djcxy.com/p/49107.html

    上一篇: Best way to compute a truncated singular value decomposition in java

    下一篇: Large Sparse Matrix Eigendecomposition in JAVA