为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

犯罪嫌疑人X 2022-06-02 18:04:56
让我们考虑以下矩阵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


查看完整回答
反对 回复 2022-06-02
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信