机器学习(数据分析)数学基础——线性代数篇(七)QR分解的代码实现

矩阵的分解有很多种,例如LU分解、QR分解、EVD分解、SVD分解。

        首先我们来看QR分解的定义:如果实(复)非奇异矩阵A能够化成正交(酉)矩阵Q与实(复)非奇异上三角矩阵R的乘积,即A=QR,则称其为A的QR分解。

【注1】非奇异矩阵可以理解为行列式不为0的矩阵,也就是可逆矩阵。

【注2】Q是m*n实(复)矩阵,且满足Q^{T}Q=E;R是n阶实(复)非奇异上三角矩阵。

然而.... 关于实际问题的求解,书中的定理并没有强制要求A是一个方阵,也就是说只要A和Q是一个m*n就行,我们来看一下具体的代码。

# 用施密特正交化方法求解QR矩阵
M = np.array([[12,9,-4],
              [7,4,5],
              [6,-3,21],
              [6,15,8],
              ], dtype=float
             )
Q = np.zeros((4,3))
j = 0
for a in M.T:
    b = np.copy(a)
    for i in range(0,j):
        b = b-np.dot(np.dot(Q[:,i].T, a),Q[:,i])
    e = b / np.linalg.norm(b)
    Q[:,j] = e
    j += 1
R = np.dot(Q.T, M)
np.set_printoptions(precision=3, suppress=True)

上面的代码是求QR四大方法之一的施密特正交化方法

1.M是已知矩阵,我们要将它分解。Q是一个空的矩阵,定义和M格式相同就OK

2.把M中的列向量按照施密特正交化方法进行正交,Q[:,i]就是取矩阵的列向量,下面的代码行是正交化公式的具体体现:

b = b-np.dot(np.dot(Q[:,i].T, a),Q[:,i])

循环就是全部走完一边。之后的代码就是单位化公式的体现,norm是我们在上一篇所学到的范数随后将其转回给Q。

3.R就是根据公式左面同时乘上Q的转置

R = np.dot(Q.T, M)

扫描二维码关注公众号,回复: 14845278 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_40981869/article/details/122199714