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

Javascript 为什么numeric.js和numpy的SVD结果不一致?,javascript,python,numpy,linear-algebra,Javascript,Python,Numpy,Linear Algebra,我有一个输入矩阵: 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([[

我有一个输入矩阵:

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列的排列。符号翻转也很明显。

你知道SVD分解在做什么吗?我想在numerics js输出中找到右零空间的基向量,它们不在ASee的零空间中。感谢你提供有用的参考。为了澄清问题,V,U中的n-r向量不保证在A的零/左零空间中?在通常的算法中,奇异值按降序排列,因此最后的
n-r
列实际上跨越了矩阵的左空和右空。但是,这些列中出现这些空空间的哪个正交基可能因实现而异。