用Python的QR分解解决超定系统

时间:2018-12-11 21:33:54

标签: python numpy least-squares qr-decomposition

我正在尝试使用QR分解和linalg.solve解决一个超定系统,但是我得到的错误是

LinAlgError:数组的最后2个尺寸必须为正方形

当R数组不是正方形时会发生这种情况,对吗?代码看起来像这样

import numpy as np
import math as ma

A = 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 个答案:

答案 0 :(得分:1)

原因确实是矩阵R不是正方形,可能是因为系统超定的缘故。您可以尝试使用np.linalg.lstsq代替,找到使平方误差最小的解决方案(如果存在,则应产生确切的解决方案)。

import numpy as np
import math as ma

A = 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.lstsq(R,Qb)

答案 1 :(得分:1)

您需要使用标志mode ='reduced'呼叫QR。默认的Q R矩阵返回为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更为方便(例如,如果您还计划计算投影矩阵)。

答案 2 :(得分:0)

numpy.linalg.solve的文档中所示:

  

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

您的方程组underdetermined并未被确定。请注意,其中包含3个变量和2个方程式,因此方程式比未知数少。

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

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

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