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

在 Python 中使用 QR 分解解决超定系统

在 Python 中使用 QR 分解解决超定系统

MMMHUHU 2021-09-14 17:22:27
我试图用 QR 分解和 linalg.solve 解决一个超定系统,但我得到的错误是LinAlgError: 数组的最后 2 个维度必须是 square。当 R 数组不是正方形时会发生这种情况,对吗?代码看起来像这样import numpy as npimport math as maA = np.random.rand(2,3)b = np.random.rand(2,1) Q, R = np.linalg.qr(A)Qb = np.matmul(Q.T,b)x_qr = np.linalg.solve(R,Qb)有没有办法以更有效的方式为任意 A 维度编写此代码?如果没有,我如何使这个代码片段工作?
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

您需要使用标志 mode='reduced' 调用 QR。默认的 QR 矩阵返回为 M x M 和 M x N,因此如果 M 大于 N,那么您的矩阵 R 将是非方阵。如果您选择缩减(经济)模式,您的矩阵将为 M x N 和 N x N,在这种情况下,求解程序将正常工作。


但是,对于超定系统,您也有反向方程/未知数。你的代码片段应该是


import numpy as np 


A = np.random.rand(3,2)

b = np.random.rand(3,1) 

Q, R = np.linalg.qr(A, mode='reduced')

#print(Q.shape, R.shape)

Qb = np.matmul(Q.T,b)

x_qr = np.linalg.solve(R,Qb)

正如其他贡献者所指出的,您也可以直接调用 lstsq,但有时直接使用 Q 和 R 会更方便(例如,如果您还计划计算投影矩阵)。


查看完整回答
反对 回复 2021-09-14
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

原因确实是矩阵R不是方阵,可能是因为系统是超定的。您可以尝试np.linalg.lstsq找到最小化平方误差的解决方案(如果存在,应该会产生精确的解决方案)。


import numpy as np


A = np.random.rand(2, 3)

b = np.random.rand(2, 1) 

x_qr = np.linalg.lstsq(A, b)[0]


查看完整回答
反对 回复 2021-09-14
?
慕仙森

TA贡献1827条经验 获得超8个赞

如文档所示numpy.linalg.solve

计算明确确定的,即满秩线性矩阵方程 ax = b 的“精确”解 x。

你的方程组是欠定的而不是超定的。请注意,其中有 3 个变量和 2 个方程,因此方程比未知数少。

还要注意它是如何提到 in numpy.linalg.solve(a,b),a必须是一个MxM矩阵。这背后的原因是求解方程组Ax=b涉及计算 的逆A,并且只有方阵是可逆的。

在这些情况下,常用的方法是采用 Moore-Penrose 伪逆,这将计算系统的最佳拟合(最小二乘法)解。因此,与其尝试解决确切的解决方案,不如使用numpy.linalg.lstsq

x_qr = np.linalg.lstsq(R,Qb)


查看完整回答
反对 回复 2021-09-14
  • 3 回答
  • 0 关注
  • 322 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号