3

I want to benchmark the best 2 or 3 libraries to compute a truncated singular value decomposition (SVD), i.e. an SVD where only the k largest singular values are kept. Moreover, I have those constraints :

  • It has to be a java library
  • My matrices are sparse (around 1% non zero values)
  • My matrices are quite big (typically 10k x 5k)
  • My matrices can also be larger than high (5k x 10k)

I've encountered quite a large range of libraries, but for instance, with Colt, I don't even know if the SVD algorithm takes into account the fact that my matrix is sparse. Also, I did not find a single library that can directly compute the truncated solution (which is supposed to be much faster). Actually, I'm mostly interested in the approximate matrix obtained from the truncated SVD.

Thanks by advance for your help,

Romain Laroche

4

2 に答える 2

4

私はまったく同じ問題を抱えていましたが、私の解決策は次のとおりです。

  1. マトリックスでApache Commons Mathを使用してSVDを実行します
  2. 対角行列を切り捨てて、上位k 個の特異値のみを保持します
  3. 最初の列には上位k列、最後の列には上位k行のみを取得して、他の 2 つの行列を切り捨てます。
  4. 3 つの行列を掛ける

得られるのは、元の行列の切り捨てられた 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();
}
于 2014-04-15T13:27:28.967 に答える
0

私はかなり良いhttp://math.nist.gov/javanumerics/jama/ライブラリを使用しました。

于 2013-11-13T15:15:27.553 に答える