gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:57 28 4
gpt4 key购买 nike

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

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

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

预先感谢您的帮助,

罗曼拉罗什

最佳答案

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

  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();
}

关于java - 在 Java 中计算截断奇异值分解的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19957076/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com