矩阵QR分解

  • 矩阵的QR分解
  • 概述
  • 演示分析
  • 实现QR分解



矩阵的QR分解和LU分解的目的都是为了便于矩阵计算。

矩阵的QR分解

概述

矩阵QR分解tensorflow_矩阵QR分解tensorflow这一过程将矩阵分解为矩阵QR分解tensorflow_线性系统_02矩阵QR分解tensorflow_线性系统_03两部分,其中矩阵QR分解tensorflow_线性系统_02是标准正交矩阵,矩阵QR分解tensorflow_线性系统_03是一个上三角矩阵。

矩阵的矩阵QR分解tensorflow_矩阵QR分解tensorflow_06分解能够简化计算可以以线性系统的计算为例,
矩阵QR分解tensorflow_线性系统_07
矩阵QR分解tensorflow_QT_08
矩阵QR分解tensorflow_矩阵QR分解tensorflow_09是非常好计算的,矩阵QR分解tensorflow_线性系统_03是一个上三角矩阵(相当于Gauss-Jordan消元法的前向过程结束),从下往上推就可以很快计算出线性系统的结果。

因为涉及到求取标准正交矩阵矩阵QR分解tensorflow_线性系统_02的过程,所以矩阵矩阵QR分解tensorflow_QT_12可以进行矩阵QR分解tensorflow_矩阵计算_13分解的条件矩阵QR分解tensorflow_矩阵QR分解tensorflow_14的各个列向量是线性无关的。因为只有满足这一点才能进行Gram-Schmidt过程。

演示分析

矩阵QR分解tensorflow_线性系统_15

对矩阵矩阵QR分解tensorflow_矩阵QR分解tensorflow_14的各列执行Gram-Schmidt过程,得到正交向量矩阵QR分解tensorflow_线性系统_17,归一化后得到标准正交向量矩阵QR分解tensorflow_矩阵QR分解tensorflow_18

矩阵QR分解tensorflow_矩阵QR分解tensorflow_19

矩阵QR分解tensorflow_矩阵QR分解tensorflow_20

得到上三角矩阵矩阵QR分解tensorflow_线性系统_03的过程如下,以矩阵QR分解tensorflow_矩阵QR分解tensorflow_14矩阵前3个列向量为例,

矩阵QR分解tensorflow_矩阵QR分解tensorflow_23


矩阵QR分解tensorflow_矩阵计算_24


求取矩阵QR分解tensorflow_线性系统_03的过程是使用已经求取的标准正交基反推原来的列向量。每一个系数都是可以找到规律的。故矩阵的矩阵QR分解tensorflow_矩阵QR分解tensorflow_06分解实际上将矩阵A分解为如下形式,

矩阵QR分解tensorflow_矩阵计算_27


可以对该矩阵再进行推导,

矩阵QR分解tensorflow_矩阵QR分解tensorflow_28

实现QR分解

上面的推导过程很复杂,但是在实际的计算过程中根本不需要求取矩阵QR分解tensorflow_线性系统_03中的每个值,而是只需通过Gram-Schmidt过程得到矩阵QR分解tensorflow_矩阵QR分解tensorflow_14的标准正交矩阵矩阵QR分解tensorflow_线性系统_02,很快速的求取出矩阵QR分解tensorflow_线性系统_03,通过如下形式,
矩阵QR分解tensorflow_矩阵计算_33
由正交矩阵性质可得,
矩阵QR分解tensorflow_矩阵QR分解tensorflow_34

def qr(A):
    """
    :param A: 一个矩阵对象,本节A是方阵,实际上一般矩阵也可以QR分解,只是本次不涉及
    """
    assert A.row_num() == A.col_num(), "A must be square"
    
    basis = [A.col_vector(i) for i in range(A.col_num())]
    P = gram_schmidt_process(basis)
    # 这里转置是因为在自定义的Matrix类中,是通过行向量创建矩阵的
    Q = Matrix([v/v.norm() for v in P]).T()    
    R = Q.T.dot(A)

    return Q, R


if __name__ == "__main__":
    A = Matrix([[1, 1, 2], [1, 1, 0], [1, 0, 0]])
    Q, R = qr(A)
    print(Q.dot(R))