SVD 函数返回维度不兼容的矩阵

让我们考虑以下矩阵


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)))

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


犯罪嫌疑人X
浏览 165回答 1
1回答

撒科打诨

在 SVD 的正式定义中, 的形状s应该是(4, 2)。然而 NumPy 的例程返回一个 shape 的奇异值数组(2,)。此外,对于完全分解中的“应该”有np.diag()多大一无所知。s它只需要一个 shape 数组(n,)并返回一个 shape 的 2D 数组(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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python