天天看點

數值分析之QR因子分解篇

                                                                 在數值線性代數中,QR因子分解的思想比其他所有算法的思想更為重要[1]。

                                                                                                                                      --Lloyd N. Trefethen & David Bau, lll

      在給出QR因子分解定理之前,先回顧兩個知識點,一是正交矩陣(它的重要性在數值線性代數中似乎怎麼強調都不過分),二是線性代數中的 Gram-Schmidt 正交化算法,這個算法是把一組線性無關的向量組alpha_1, ... ,alpha_n 轉化為互相正交的向量組 q_1, ... ,q_n的方法,且有下清單達形式

                                                                    q_k = a1*alpha_1+...+ak*alpha_k, k=1,...n

令A=[alpha_1, ... ,alpha_n], Q=[q_1, ... ,q_n], 則上式可以寫成 Q = A*T, 其中T是一個上三角形矩陣。假設 A 是滿秩的,則 T 具有逆矩陣,不妨記成R,在等式兩邊分别右乘矩陣R, 則可以得到A=QR。

     針對一般矩陣,則有下列的 QR 因子分解定理:對于任意m*n維的實矩陣 A(不妨假設m>=n),有相應的QR因子分解,即A=QR, 其中 Q 是具有正交列的m*m矩陣,R 是m*n的上三角矩陣,如圖1.(a) 所示[1]。 

                                                    圖1.(a)   完全 QR 因子分解                                圖1.(b) 約化 QR 因子分解

      如果将矩陣R的零行以及矩陣Q中不起作用的列去掉的話,則A=Q1R1,這裡 Q1 具有列正交的m*n維矩陣,R1 是n*n的上三角矩陣,這種形式稱為約化QR因子分解,如圖1.(b) 所示,相應地,圖1.(a)的分解形式稱為完全QR因子分解。 

      既然矩陣有QR分解,那麼一個自然的問題是給定一個具體的矩陣,如何求它的QR因子分解呢?實際上,從理論的角度來看,Gram-Schmidt正交化給出了一種數值實作的方法。不過,由于舍入誤差的影響,該方法會在計算過程中損失正交性,即理論上求得的向量之間是互相正交的,但是數值求得的向量的正交性很差。是以,在求解QR因子分解中,傳統的Gram-Schmidt正交化方法基本不用,而改用修正的Gram-Schmidt正交化方法。後者和前者相比,得到的向量的正交性更好,後者可以看成是一系列正交投影算子的作用,所謂 P 是一個正交投影算子,即它滿足P*P=P(投影算子)以及P\'=P。做個不恰當的類比,把向量之間的正交性看成是總體誤差的話,前者隻在最後一步進行了誤差校正,而後者在每一步都進行誤差校正,自然地,經過這樣的處理,後者的誤差顯然比前者小。

      觀察 QR 因子分解,不管是傳統還是修正的Gram-Schmidt正交化過程,它們通過對矩陣施行三角化(右乘上三角陣),來依次求出 Q 的每一列,在[2]中稱作三角形對角化。另一種實作的方式是,通過構造一系列的正交矩陣(正交矩陣的乘積依舊是正交矩陣),來依次求出 R 的每一列(由于正交矩陣的轉置即為它的逆,是以相應的Q也很容易求得),這種方法稱為對角三角形化,如圖2所示:

                                                                                     圖2.  對角三角形化QR因子分解

       下面的問題就是 Q 如何構造呢?點解,通過Householder變換或者Givens變換。先說Householder變換,參見圖3,它将一個向量變換到隻有前面數個坐标值非零,而後面的坐标值均為零的向量(參見圖2,将A通過Q1變換後,A的第一列向量發生了改變)v,那麼此時 Householder 變換為 Q1= I-2(vv\')/(v\'v),其中v=-sign(x1)||x||e1,x是A的第一列,x1是向量x的第一個元素值,e1是第一個元素為1的機關向量(注1)。由于矩陣(vv\')/(v\'v)的秩為1,是以該變換也被稱為機關陣的秩1修正。至于 Q2 以及 Q3 的構造,以 Q2 為例,考慮下列分塊矩陣Q2=diag(I1, I2-2(v1v1\')/(v1\'v1)),其中v1是 Q1A 的第二列向量去掉第一個元素剩下的向量經過轉換得到的,容易驗證 Q2Q1A 就是圖2中的結果。Givens 變換是一個旋轉變換,每次将矩陣中的一個元素修改為0,與 Householder 變換相對應,它是機關矩陣的秩2修正。                            

                                                                                                    圖3. Householder變化示意圖

      總結一下,實作矩陣QR分解的方法有三角形對角化(修正的Gram-Schmidt算法,簡稱MGS)以及對角三角形化(Householder三角形化)。從數值結果的精度來看,尤其是正交矩陣之間的正交性來分析,後者比前者更好一些(注2),而Givens三角形化和Householder三角形化的結果相似[2]。但是,MGS可以根據需要在中間的某一步進行終止,而Householder三角形化卻不具備這一特點。

     拉拉雜雜說了這麼多,有一個問題卻沒有提及,那就是 QR 方法有什麼用途呢?點解。矩陣的特征值問題(除了使用QR算法外,還使用了逆疊代以及位移技術,是以QR算法被稱為最複雜的算法),最小二乘法[3]以及多項式求根問題[4]中都有它的身影,而高斯消去法中涉及到的變換矩陣的某些性質在 MGS 中也出現過。

     相應的Matlab指令: qr

     注1. 從數學推導的角度來看,v的符号可以取為sign(x1),之是以取成負數的形式,原因是為了避免兩個相近的數字相減的情形,而這種情形很容易造成數值結果精度的很大損失。

     注2. 簡略地說,Householder三角化得到的正交矩陣的正交性和機器精度成正比,而MGS的正交矩陣的正交性和機器精度與矩陣A的條件數的乘積成正比。

     注3. 文中涉及到的圖檔均取自參考資料[1]。

參考文獻:

     [1] 數值線性代數 Chap7-11,L N. Trefethen,David Bau, lll 著,陸金甫,關治譯,人民郵電出版社,2006年

     [2] 應用數值線性代數,J W. Demmel 著,王國榮譯,人民郵電出版社,2007年

     [3] 矩陣計算(第三版),Gene H.Golub,Charles F.Van Loan 著,袁亞湘等譯,人民郵電出版社,2011年

     [4]矩陣計算六講 Chap2,徐樹方,錢江著,高等教育出版社,2011年