为什么 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 列的排列。符号翻转也很明显。
我有一个输入矩阵:
let t = [
[0,1,0],
[0,1,0],
[0,0,0]
]
我想使用 numeric.js:
计算它的 SVDlet 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 列的排列。符号翻转也很明显。