SVD 函数 returns 维度不兼容的矩阵

SVD function returns matrices with not compatible dimensions

让我们考虑以下矩阵

2 4
1 3
0 0
0 0

在python中创建这个矩阵和相应的奇异值分解可以在python中以简单的方式完成

A =np.array([[2,4],[1,3],[0,0],[0,0]])
u,s,v =np.linalg.svd(A)

当我输入相应矩阵的维度时,我得到了关注

print(u)
print(np.diag(s))
print(v)

[-0.57604844  0.81741556  0.          0.        ]
 [ 0.          0.          1.          0.        ]
 [ 0.          0.          0.          1.        ]]
[[5.4649857  0.        ]
 [0.         0.36596619]]
[[-0.40455358 -0.9145143 ]
 [-0.9145143   0.40455358]]

因此以下重建原始矩阵的代码不起作用

print(u.dot(np.dot(np.diag(s),v)))

我该如何解决这个问题?提前致谢

在SVD的正式定义中,s的形状应该是(4, 2)。然而 NumPy 的例程 returns 一个形状为 (2,) 的奇异值数组。此外,np.diag() 不知道 s "should" 在完全分解中有多大。它只需要一个形状 (n,) 的数组和 returns 一个形状 (n, n) 的二维数组。所以你的内积最终以形状 (4, 4) * (2, 2) * (2, 2) 结束,这当然会失败,因为第一个产品的大小没有意义。

要解决此问题,只需为 s:

构造一个正确大小的数组
>>> u, s, v = np.linalg.svd(A)
>>> true_s = np.zeros((u.shape[1], v.shape[0]))
>>> true_s[:s.size, :s.size] = np.diag(s)
>>> np.allclose(u.dot(true_s).dot(v), A)
True