为什么 numeric.js 和 numpy 的 SVD 结果不一致?

Why do SVD results from numeric.js and numpy disagree?

我有一个输入矩阵:

let t = [
      [0,1,0],
      [0,1,0],
      [0,0,0]
    ]

我想使用 numeric.js:

计算它的 SVD
let U = N.svd(t).U; 

U

[-0.7071067811865475, 0.7071067811865475, 0]
[-0.7071067811865475, -0.7071067811865475, 0]
[0, 0, 1]

我使用 numpy 执行相同的过程:

A=np.array([[0,1,0],[0,1,0],[0,0,0]])
np.linalg.svd(A)[0]

输出:

[0.7071067811865475,   0,   -0.7071067811865475]
[0.7071067811865475,   0,    0.7071067811865475]
[0, 1, 0]

这是一个错误吗?这不是他们唯一一次结果不同。我应该信任他们中的哪一个?

在 SVD 结果中,由于不同的算法,可能存在一些差异。可以有

  • U 和 V 的完整列的相同符号变化和
  • 当相应的奇异值相同时,U 和 V 中列的相同排列。实际上,任何类型的正交矩阵混合都可能发生。

这都发生在这里。您的输入是一个秩为 1 的矩阵,即 2 个奇异值为零,这解释了最后 2 列的排列。符号翻转也很明显。