矩阵分解(二)——QR分解

目录

  • 矩阵相关术语
    • 正交矩阵
    • 施密特正交化
  • 矩阵的QR分解
    • 代码实现

矩阵相关术语

正交矩阵

如果ATA=E(E为单位矩阵),则n阶实矩阵A称为正交矩阵,通常用Q表示。
性质:
1、AT的各行(列)是单位向量且两两正交
2、|A|=1或-1
3、AT = A-1
4、两个正交矩阵的积还是正交矩阵

施密特正交化

施密特正交化是求欧氏空间正交基的一种方法。从欧氏空间任意线性无关的向量组α1,α2,……,αm出发,求得正交向量组β1,β2,……,βm,使由α1,α2,……,αm与向量组β1,β2,……,βm等价,再将正交向量组中每个向量经过单位化,就得到一个标准正交向量组,这种方法称为施密特正交化。

设向量组a1a2a3线性无关,我们先来构造正交向量组β1β2β3,按所要求的条件,β1 是a1 的线性组合,β2 是 a1、a2的线性组合。不妨设
β1=a1,β2=a2 - kβ1,其中数值 的选取应满足>β1 与β2 垂直,即
2,β1> = 2,β1 >-k<β1,β1> = 0,所以可得
k = 2,β1 >/<β1,β1>
从而可得:

矩阵分解(二)——QR分解_第1张图片

矩阵的QR分解

定义:一个非奇异方阵A,一定存在一个正交矩阵Q和上三角矩阵R(对角线元素都为正数),使得
A = QR

  • 证明
    把矩阵A按列向量分块,A=[α1,α2,…,αn],则向量组α1,α2,…,αn线性无关。由施密特正交化可得正交向量组
    β1 = α1
    β2 = α2 - k21β1
    … … …
    βn = αn - kn,n-1 βn-1 - …- kn,1 β1
    其中k(i,j) = (αi, βj)/(βjj),上式可改写为:

α1 = β1
α2 = k21β1 + β2
… … …
αn = kn,1 β1 +kn2 β2 … + kn,n-1 βn-1 + βn
于是可得
矩阵分解(二)——QR分解_第2张图片
再对β1,β2,…,βn单位化
矩阵分解(二)——QR分解_第3张图片
则:
矩阵分解(二)——QR分解_第4张图片
令Q = [γ1,γ2,…,γn],是一个单位化的正交矩阵。另R为
矩阵分解(二)——QR分解_第5张图片
即R是正线上三角矩阵,因此A有QR分解为A=QR。

代码实现

import numpy as np
def gram_schmidt(A):
    """Gram-schmidt正交化"""
    Q=np.zeros_like(A)
    cnt = 0
    for a in A.T:  #一个a表示一个列向量
      u = np.copy(a)
      for i in range(0, cnt):  #求出β1、β2....
            u -= np.dot(np.dot(Q[:, i].T, a), Q[:, i]) # 减去待求向量在以求向量上的投影
      e = u / np.linalg.norm(u)  # 归一化,整体的矩阵元素平方和,再开根号
      Q[:, cnt] = e
      cnt += 1
    R = np.dot(Q.T, A) #A.T = A^-1
    return (Q, R)
A = np.array([[3,14,9],[6,43,3],[6,22,15]],dtype=float)
(Q, R) = gram_schmidt(A)
np.set_printoptions(precision=4, suppress=True)
Q,R

(array([[ 0.3333, -0.1333, 0.9333],
[ 0.6667, 0.7333, -0.1333],
[ 0.6667, -0.6667, -0.3333]]),
array([[ 9., 48., 15.],
[ 0., 15., -9.],
[ 0., 0., 3.]]))

你可能感兴趣的:(math)