Introduction
full QR
A∈Rm×ns.t. m≥n, rank(A)=n,则存在一个分解,使得
A=QR
其中,
Q∈Rm×m 是一个正交矩阵 (Q⊤Q=QQ⊤=I)R∈Rm×n 是一个上三角阵
Economic QR
Q∈Rm×n 是一个 (Q⊤Q=I)R∈Rn×n 是一个上三角阵(对角线非零)
Theorem
令
AQ=[a1⋯an]=[q1⋯qn⋯qm]
对于任意k=1,⋯,n, {q1,⋯,qk}是span{a1,⋯,ak}的一组正交基
proof
{q1,⋯,qk}是一组基
[a1⋯an]=[q1⋯qn]r11⋯⋱r1k⋮rkk
span{a1,⋯,ak}=Range(A)={[a1⋯ak]x∣x∈Rk}=⎩⎨⎧[q1⋯qk]r11⋯⋱r1k⋮rkkxx∈Rk⎭⎬⎫={[q1⋯qk]yy∈Rk}
{q1,⋯,qk}之间彼此正交
QQ⊤=I⇒⟨qi,qj⟩=qi⊤qj={10if i=jif i=j
得证。
Application
求解线性方程组
Ax=b⇔QRx=b⇔Rx=Q⊤b
由于R是一个上三角阵,因此使用back substitution很容易求解
求解最小二乘
由于Q的列向量是Range(A)的一组正交基,因此QQ⊤是投影到Range(A)的一个正交投影,(I−QQ⊤)是投影到Range(A)⊥的一个正交投影。
b=QQ⊤b+(I−QQ⊤)b
∥Ax−b∥22=∥QRx−(QQ⊤b+(I−QQ⊤)b)∥22=∥Q(Rx−Q⊤b)−(I−QQ⊤)b∥22=(1)∥Q(Rx−Q⊤b)∥22+∥(I−QQ⊤)b∥22=∥Q(Rx−Q⊤b)∥22+C
(1)成立是因为Q(Rx−Q⊤b)∈Range(Q)=Range(A), (I−QQ⊤)b∈Range(A)⊥,因此这两个向量正交。
x∈Rnmin∥Ax−b∥22⇔x∈Rnmin∥Rx−Q⊤b∥
R是一个上三角阵,因此新问题很好求解(back substitution)
Used as subroutines in other matrix computation algorithms, e,g, SVD, eigen value problems
Computation of QR decomposition
Gram Schmidt procedure (格拉姆-施密特正交化)
形式1
βn=αn−i=1∑n−1⟨βi,βi⟩⟨αn,βi⟩βi
形式2

Householder QR algorithm
思路:一个正交阵的转置、逆矩阵是正交阵,两个正交阵的乘积是正交阵,使用一系列简单的正交阵逼近Q
Q1AQ2Q1A=∗0⋮0∗∗⋮∗⋯⋯⋱∗∗∗⋮∗=∗00⋮0∗∗0⋮0∗∗∗⋮∗⋯⋯⋯⋱∗∗∗∗⋮∗
使用 Householder transform 来构建Qi
Definition
u,v∈Rm 满足∥u∥2=∥v∥2,Householder Transform matrix Hu,v定义为:
Hu,v=I−2ww⊤,where w=∥u−v∥2u−v
性质
Hu,v⊤=Hu,vHu,v⊤Hu,v=Hu,vHu,v⊤=IHu,vv=u and Hu,v is symmetricHu,v is square orthogonalHu,vu=v
proof of property 2
(I−2ww⊤)⊤(I−2ww⊤)=(I−2ww⊤)(I−2ww⊤)=I−4ww⊤+4w(w⊤w)w⊤=(2)I
(2)成立是因为w⊤w=1
proof of property 3
由于∥u∥=∥v∥
(u−v)⊤(u+v)=∥u∥2−∥v∥2+u⊤v−v⊤u=0⇒u−v⊥u+v
由于w=∥u−v∥2u−v, ww⊤u=−ww⊤v
ww⊤(u+v)=w∥u−v∥2(u−v)⊤(u+v)=0⇒ww⊤u=−ww⊤v
接下来证(I−ww⊤)u=(I−ww⊤)v
ww⊤(u−v)=u−v⇒(I−ww⊤)(u−v)=0⇒(I−ww⊤)u=(I−ww⊤)v
因此有,
Hu,vv=(I−2ww⊤)v=(I−ww⊤)v−ww⊤v=(I−ww⊤)u+ww⊤u=u
相似地
Hu,vu=(I−2ww⊤)u=(I−ww⊤)u−ww⊤u=(I−ww⊤)v+ww⊤v=v
Algorithm
Recall that we want
Q1A=∗0⋮0∗∗⋮∗⋯⋯⋱∗∗∗⋮∗
取Q1a1=Ha1,c1e1
c1的选取:
首先我们需要:
∥a1∥2=∥c1e1∥2⇒c1={−∥a1∥2∥a1∥2
为了避免数值精度问题,希望分母上的数更大,因此选择c1=∥a1∥2

Q1A=[Q1A1Q1A[:,2:n]]=[c1e1(I−2w1w1⊤)A[:,2:n]]=c10⋮0A[:,2:n]−2w1w1⊤A[:,2:n]≡A(1)
以此类推,在第k步有:
计算复杂度
如果只计算R和w1,⋯wn 而不显式地计算Q
k=1∑nO(m−k+1)(n−k)=O(mn2)
在第k步时,剩余矩阵大小为(m−k+1,n−k+1),需要计算的部分为(m−k+1,n−k)(第一列不用计算,结果已知)
如果要计算full QR 中的Q,则还要计算
Q=Q1Q2⋯QnI
计算复杂度为O(m2n)
如果只需要Q的前n列,则需要计算
Q[:,1:n]=Q1Q2⋯QnI[:,1:n]
计算复杂度为O(mn2)
code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import numpy as np
def H(x, y): w = (x - y) / np.linalg.norm(x - y) return np.eye(x.shape[0]) - 2 * w @ w.T
def QR(A): Q = np.eye(A.shape[0]) for k in range(A.shape[0]): a_k = A[k:, k:k + 1] a_k_norm = np.linalg.norm(a_k) e_k = np.zeros_like(a_k) e_k[0, 0] = 1 if np.linalg.norm(a_k - a_k_norm * e_k) >= np.linalg.norm(a_k + a_k_norm * e_k): c_k = a_k_norm else: c_k = -a_k_norm H_k = H(a_k, c_k * e_k) A[k:, k:] = H_k @ A[k:, k:] Q_k = np.eye(A.shape[0]) Q_k[k:, k:] = H_k Q = Q@Q_k return Q, A
A = np.array([[0, 3, 1], [0, 4, -2], [2, 1, 1]],dtype=np.float64)
Q, R = QR(A)
|
Given’s rotation QR algorithm
思路:
11c−ssc××××××××××××=×××0××××××××1c−ssc1×××0××××××××=××00××××××××
假设要将[a,b]⊤中的b变为0,则
c=a2+b2as=a2+b2b
code
1 2 3 4 5 6 7 8 9 10 11
| def GivensRotation(A): G = np.eye(A.shape[0]) for i in range(A.shape[1]): for j in range(A.shape[0] - 1, i, -1): c = A[j - 1, i] / np.sqrt(A[j - 1, i] ** 2 + A[j, i] ** 2) s = A[j, i] / np.sqrt(A[j - 1, i] ** 2 + A[j, i] ** 2) G_ij = np.eye(A.shape[0]) G_ij[j - 1:j + 1, j - 1:j + 1] = np.array([[c, s], [-s, c]]) A[j - 1:j + 1, :] = G_ij[j - 1:j + 1, j - 1:j + 1] @ A[j - 1:j + 1, :] G = G_ij @ G return G.T, A
|
Rank Revealing QR
只做简要介绍,无算法
Definition
存在P,Q,R,r 满足AP=QR
其中
P∈Rn×nis a permutation on columns of Ar∈Rnumerical rankQ=[Q1,Q2]s.t. QQ⊤=Q⊤Q=IR=[R110R12R22]R11是一个上三角阵,R22相比于R11 norm很小
接下来证明{a~1,⋯,a~r}是A的representative columns
AP=[a~1,⋯,a~n]⇒AP=[a~1,⋯,a~r,a~r+1,⋯a~n]=[Q1,Q2][R11R12R22]=[Q1R11,Q1R12+Q2R22]≈(3)[Q1R11,Q1R12]
(3)成立是因为R22≈0
Range(A)=Range(AP)≈Range(Q1[R11,R12])=Range(Q1)=Range([a~1,⋯,a~n])
span([a~1,⋯,a~n])≈span([a~1,⋯,a~r])