c# - 使用 Mathnet 数字库进行 Svd 重组似乎是错误的

标签 c# svd regression-testing math.net

我正在寻找 Mathnet.Iridium 和 Mathnet.Numerics 之间的非回归。这是我的代码,使用 Mathnet.Numerics :

double[][] symJaggedArray = new double[5][];
symJaggedArray[0] = new double[] { 3, 0, 0, 0, 0 };
symJaggedArray[1] = new double[] { 0, 2, 4, 0, 0 };
symJaggedArray[2] = new double[] { 0, 4, 5, -4, 5 };
symJaggedArray[3] = new double[] { 0, 0, -4, -8, 12 };
symJaggedArray[4] = new double[] { 0, 0, 5, 12, -5 };
symDenseMatrix = DenseMatrix.OfArray(new Matrix(symJaggedArray).CopyToArray());// not optimal but it's not the point

Svd svd = new UserSvd(symDenseMatrix , true);
Matrix<double> recompo = svd.U().Multiply(svd.W()).Multiply(svd.VT());

当我比较重组和初始矩阵时,它们是不同的。 在将每个分解矩阵与之前的实现进行比较时,我发现了这个差异:

  • U 和 singleValueDecomposition.LeftSingularVectors 相等
  • W 和 singleValueDecomposition.S 相等
  • VT 和 Matrix.Transpose(singulaValueDecomposition.RightSingularVectors) 不同

最后,使用旧 API 进行重组是正确的。

使用的MathNet.Numerics版本:Math.NET Numerics v2.5.0

所以我的问题是:使用新 API 重建初始矩阵时我的错误在哪里?

重组矩阵=

  • 3 0 0 0 0
  • 0 -1.216846655456 2.83903817786199 1.4472680220698 2.89215520227421
  • 0 -2.46695399700557 8.657344064164 0.92863757484644 -0.31963101527516
  • 0 0.349540484418384 8.20515629935223 -2.26741625715781 -12.3049605878983
  • 0 -0.402667067831389 -6.32914150795323 9.13315298351198 8.3884053064068

最佳答案

我很快尝试重现这一点,但失败了。我使用了 Math.NET Numerics v2.6(NuGet 包),但此版本中的 SVD 分解没有任何变化。这是我的代码:

var m = DenseMatrix.OfArray(new double[,] {
   { 3, 0, 0, 0, 0 },
   { 0, 2, 4, 0, 0 },
   { 0, 4, 5, -4, 5 },
   { 0, 0, -4, -8, 12},
   { 0, 0, 5, 12, -5 }});

var svd = m.Svd(true);
//var svd = new UserSvd(m, true);

svd.U() * svd.W() * svd.VT()

最后一行的计算结果为:

DenseMatrix 5x5-Double
           3            0            0            0            0
           0            2            4 -1.23512E-15   -3.747E-16
           0            4            5           -4            5
           0  3.26128E-16           -4           -8           12
           0 -1.15186E-15            5           12           -5

本例中的 VT 为:

DenseMatrix 5x5-Double
           0   -0.0449147     0.249507     0.718099    -0.648123
           0     0.466822     0.823535    0.0324572     0.320646
           0     0.208479     0.176729    -0.670706    -0.689534
          -1            0            0            0            0
           0     0.858252    -0.477811     0.182848   -0.0408292

我想知道为什么你会得到完全不同的结果? 您可以使用我上面发布的相同代码再试一次吗?

关于c# - 使用 Mathnet 数字库进行 Svd 重组似乎是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18100873/

相关文章:

c# - 使用 Linq 从另一个表中获取按记录数排序的列表

c# - 使用最小起订量模拟 HttpContext 进行单元测试

c++ - 与 MATLAB 相比,使用 cuSolver 时 SVD 非常慢

javascript - cy.url 未按预期返回字符串

jenkins - 有关如何使用 jmeter 对页面加载时间进行回归测试的任何建议

testing - 回归测试如何最适合 CI/CD 工作流?

c# - 部署 webAPI 服务器端所需的最少文件

c# - 什么设计模式适合将数据表转换为域对象列表?

c++ - OpenCV SVD 返回与 MATLAB 不同的结果

r - 大型稀疏矩阵的完整 SVD(仅需要特征值)