整理自:《數值線性代數(徐樹方)》
Householder變換是一種能將n維向量x變換到任一n維向量y的正交變換,由於從幾何上看Householder變換通過x和y之間的垂直平分面將x“反射”到y,因此Householder變換又叫鏡面變換;
Householder的主要應用在於它能夠將x變換成任意一個等長的若干個分量為0的向量(這種向量具有某些良好的性質,尤其是在最小二乘法的正交化解法的應用),只需要對變換后的向量再進行一次Householder變換,就能變回x;
本篇先介紹Householder變換的定義及其性質,再推導一種用於求Householder變換的數值化方法
一、Householder變換及其性質
定義:
Householder變換:設ω∈Rn, ||ω||2=1,定義:
H=I-2ωωT(H∈Rn×n) 公式1
稱H為Householder變換(矩陣)
性質:
1.對稱性:HT=H
2.正交性:HTH=I
3.對合性:HH=I
4.反射性:對任意x∈Rn,Hx是x關於ω的垂直超平面(即span{ω⊥})的鏡面反射。
性質1,2,3不難證,這里僅證性質4:
設x∈Rn,則可以將x表示為x=u+αω,其中u∈span{ω⊥}(即ω的正交補空間),α∈Rn,即有:Hx=H(u+αω)=(I-2ωωT)u+(I-2ωωT)αω=u-αω,得證。
從以上證明過程可以看出,H將x沿ω的分量映射到超平面的反方向,而沒有改變垂直ω(即沿超平面方向)的分量方向,因此導致x經過H變換以后變為了關於ω的垂直超平面的鏡面反射,實際上,以上證明的本質可以概括為H的以下兩個性質,即:Hu=u,Hω=-ω。
(由於Householder變換的反射性,Householder變換又被稱為初等反射矩陣或鏡像變換)
定理1:
給定任何兩個向量x和y(x,y∈Rn且||x||2=||y||2),都可以找到一個Householder變換H,使得y=Hx。
采用構造性的方法證明:令ω=(x-y)/||x-y||2,H=I-2ωωT,即有y=Hx,得證。
由定理1自然得到定理2:
定理2:
設0≠x∈Rn, 則可構造單位向量ω∈Rn,使得由公式1定義的Householder變換H滿足Hx=αe1,其中α=±||x||2。
二、Householder算法
正如定理2顯示的那樣,Householder變換的主要用途在於,它能和Guass變換一樣,通過選取指定的單位向量,把一個給定向量的若干個分量置為0,Householder算法就是用來尋找滿足定理2的H,即對任意一個0≠x∈Rn,找到一個H滿足Hx=αe1。雖然ω和H的求法定理1已揭示出,但是Householder算法從數值計算的角度,考慮到計算誤差和時間、空間復雜度的問題,對求解過程做了一定的修改,使得求解算法更加高效准確。
接下來我們推導求解將x變為||x||2e1的Householder變換的算法:
首先,從定理1和定理2可推出,ω和H的基本構造方法:
(1) 計算v=x±||x||2e1
(2)計算ω=v/||v||2
(3)計算H=I-2ωωT
以上方法從數學的角度非常美觀,但是從計算機的角度,存在着計算誤差以及時間、空間復雜度的問題,下面就對其缺點以及解決方法作一定的分析,在最后貼出解決了這些問題的最終版算法。
在步驟(1)中,通常選取v=x-||x||2e1,但這樣在計算時可能會遇到一個問題:如果x1為正 向量且和||x||2大小上比較接近,計算x1-||x||2時,會嚴重地損失有效數字,甚至造成下溢。解決地方法就是對該式做一定的等價變形,即:
v1=x1-||x||2=(x12-||x||22)/(x1+||x||2)=-(x22+x32+...+xn2)/(x1+||x||2) 公式2
(只有在x1為正時才需要做這種變換,當x1為負時x1-||x||2不存在精度損失的問題)
在步驟(2)中,需要計算||v||2,其中包含開方運算,開方運算的效率較低,要盡量避免,將(2)式直接代入(3)式,恰好可以直接避免開方運算:
H=I-2ωωT=I-2vvT/vTv 公式3
整理公式3,令β=2/vTv,即:
H=I-βvvT 公式4
此外,為了避免x2過大造成的上溢出問題,我們在步驟(1)之前令x=x/||x||∞,利用規格化后的x來求β和v,這樣相當於在原來的v之前乘了1/||x||∞,注意,這樣做對最終的H沒有影響,因為1/||x||∞v與v的單位化向量相同,即vvT/vTv 不變。
此外,我們可以在步驟(3)之后,令v=v/v1,這樣做可以使v1=1,v的后n-1個分量正好存在x的后n-1個為0的向量之中(v1=1不需保存),但是注意要將β做相應調整。
綜合以上改進,最終的算法為:
最后補充兩點:
利用Householder變換在一個向量中引入零元素,並不局限於Hx=αe1的形式,例如,我們需要將x的第k+1至j個元素置為0,那么可以構造y=(x1, x2, ...xk-1, α, 0, 0...0 ,xj+1,...xn),(a=Σji=kxi2)注意到||x||2=||y||2,
再構造v=x-y即v=(0,...0,xk-a,xk+1,...xj,0,...0)即可。
注意到算法1中,並沒有直接求出H,而是給出了β和v,這樣做的原因使求vvT的成本太大,實際上,不需要求出H,而利用H=I-βvvT來進行變換更有效率,例如對矩陣A做Householder變換,可以通過以下公式進行:
HA=(I-βvvT )A=A-βv(ATv)2=A-vw 公式5
其中w=βATv,總的運算量為4mn