Mav*_*78f 4 java matrix colt matrix-decomposition
我想对最好的 2 或 3 个库进行基准测试,以计算截断奇异值分解 (SVD),即仅保留 k 个最大奇异值的 SVD。此外,我还有这些限制:
我遇到过相当多的库,但例如,对于 Colt,我什至不知道 SVD 算法是否考虑到我的矩阵稀疏的事实。另外,我没有找到一个可以直接计算截断解决方案的库(这应该要快得多)。实际上,我最感兴趣的是从截断的 SVD 获得的近似矩阵。
预先感谢您的帮助,
罗曼·拉罗什
我遇到了完全相同的问题,我的解决方案是:
您获得的是原始矩阵的截断 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();
}
Run Code Online (Sandbox Code Playgroud)