【问题标题】:Solve overdetermined system with QR decomposition in Python在 Python 中使用 QR 分解解决超定系统
【发布时间】:2018-12-11 21:33:54
【问题描述】:

我正在尝试使用 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 维度编写此代码?如果没有,我该如何让这段代码 sn-p 工作?

【问题讨论】:

    标签: python numpy least-squares qr-decomposition


    【解决方案1】:

    原因确实是矩阵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]
    

    【讨论】:

    • 应该直接计算x_qr = np.linalg.lstsq(A, b)[0],而不是先计算A的QR分解,这是多余的,已经由lstsq完成。
    【解决方案2】:

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

    但是,对于超定系统,您也有向后的方程/未知数。你的代码 sn-p 应该是

    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 会更方便(例如,如果您还计划计算投影矩阵)。

    【讨论】:

      【解决方案3】:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-18
        • 2014-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多