让我们考虑以下矩阵2 41 30 00 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)))我该如何解决这个问题?提前致谢
1 回答
撒科打诨
TA贡献1934条经验 获得超2个赞
在 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
添加回答
举报
0/150
提交
取消