1. 程式人生 > >改進的格拉姆-施密特正交化(modified Gram-Schmidt Process)

改進的格拉姆-施密特正交化(modified Gram-Schmidt Process)

        最近在重新學習線性代數,學習的教材是MIT Gilbert Strang 教授的《INTRODUCTION TO LINEAR ALGEBRA》,在第4.4章節格拉姆-施密特正交化時,書中章節末尾介紹了一種改進的格拉姆-施密特正交化方法,但書中給出了公式,省略了很多細節,給學習理解造成了一定的難度,為自己今後或者遇到同樣問題的朋友記錄一下公式的來由。

        首先,介紹一下格拉姆施密特正交化的思想和方法。介紹正交化還得說說投影矩陣,我們在用最小二乘法解方程組的最優解的時候,由於Ax=b,b一般情況下,b並不一定存在於A的列空間中,這種情況下Ax=b其實是無解的,因為找不到列空間內合適的線性組合使其結果為b。這是後最小二乘法就派上用場了,最小二乘法的思想是,既然Ax

=b無解,我們在列空間內找到一個向量p,下面這個方程組一定有解A\widehat{x}=p,那麼怎麼尋找p呢,最小二乘選取的p是使得||e||=||b-p||誤差最小的那個p,其實這個p就是b在A的列空間上的投影。前面說了那麼一大堆就是為了引出投影,那這個投影是怎麼做呢,推導這裡我就省略了,直接給出投影矩陣P

        在線上的投影矩陣,這是後a是線上的向量:P=\frac{aa^{T}}{a^{T}a},p=\frac{aa^{T}}{a^{T}a}b,\widehat{x}=\frac{a^{T}b}{a^{T}a}

        在子空間上的投影矩陣:P=A(A^{T}A)^{-1}A^{T},p=A(A^{T}A)^{-1}A^{T}b,A^{T}A\widehat{x}=A^{T}b

        知道投影矩陣之後,那麼為什麼要正交化呢,有什麼好處呢?投影矩陣中包含(A^{T}A)^{-1},使得普通的投影矩陣並不是那麼漂亮,這一向給求解帶來了很大的麻煩,那麼能不能消除它呢?答案就是找到A列空間的一組標準正交基Q,因為對於標準正交基有如下性質Q^{T}Q=I

,如果我們能找到列空間的標準正交基(格拉姆-施密特正交化要做的事情),那麼上面的投影矩陣P中A用Q代替,表示式變為:P=Q(Q^{T}Q)^{-1}Q^{T}=QQ^{T},神奇的發現投影矩陣中不好的部分不見了。這也是標準正交令人著迷的地方。那麼怎麼尋找標準正交基呢,我們知道一個向量子空間中有多種可能的標準正交基,格拉姆-施密特就為我們提供了一種尋找標準正交基的方法,思想很簡單:假設矩陣M=( a b c),A列空間的第一列為第一個標準正交基向量的方向,令A=a,通過除去向量的模得到第一個基向量q_{1} =A/||A||,那麼第二基向量怎麼求呢,答案就是通過投影得到bA上的投影\frac{A^{T}b}{A^{T}A}A,根據投影的知識知道這是後有B=b-\frac{A^{T}b}{A^{T}A}A是垂直於A的,那麼我們得到第二個基向量q_{2}=B/||B||,如果M矩陣還有第3個列向量c,那我們如何得到q_{3}
呢?思想和得到q_{2}的思想一樣,對cAB上做投影得到C=c-\frac{A^{T}c}{A^{T}A}A-\frac{B^{T}c}{B^{T}B}B,q_{3}=C/||C||, 重複第二步驟就可以得到所有的n個正交基向量,這就是格拉姆-施密特正交化。

        格拉姆-施密特正交化是A的一個因子分解,叫QR分解,A=QR,Q就是格拉姆-施密特正交化的標準正交矩陣,R是一個上3角矩陣,假設M=( a b c),M的QR分解是如下形式:

        \begin{bmatrix} a& b& c \end{bmatrix}=\begin{bmatrix} q_{1}& q_{2}& q_{3} \end{bmatrix}\begin{bmatrix} q_{1}^{T}a &q_{1}^{T}b &q_{1}^{T}c \\ & q_{2}^{T}b&q_{2}^{T}c \\ & &q_{3}^{T}c \end{bmatrix}

        為什麼R會是這樣的上3角矩陣呢,原因是格拉姆-施密特正交化的過程,a在和q_{1}方向一致,所以在q_{2},q_{3}上投影為0,同樣b只在上q_{1},q_{2}有分量在q_{3}上沒有分量,格拉姆-施密特正交化的過程保證了A前面的列不會在後面的正交向量方向有分量,因為後面的正交分量始終是垂直於前面的列構成的向量子空間,也就是說與前面的列向量都垂直。下面我們推導一下q_{1}^{T}b就是b在q_{1}方向投影的模長,這對後面理解改進的格拉姆-施密特正交化至關重要。

        b在q_{1}上的投影由線上的投影矩陣知道:

       p=\frac{q_{1}q_{1}^{T}}{q_{1}^{T}q_{1}}b=q_{1}q_{1}^{T}b,||p||=\sqrt{p^{T}p}=\sqrt{(q_{1}q_{1}^{T}b)^{T}(q_{1}q_{1}^{T}b)}=\sqrt{(q_{1}^{T}b)^2q_{1}^{T}q_{1}}=q_{1}^Tb,可以推論R中其他項也是對於的向量在正交基向量上投影的模長。

        前面的準備知識夠了,接下來,我們可以搬出改進的格拉姆-施密特正交化的公式了A是mxn階矩陣:

        r_{jj}=\sqrt{\sum_{i=1}^{m}v_{ij}}   

        q_{ij}=\frac{v_{ij}}{r_{jj}}     

        下面的公式從v=A_{j}開始計算A_{j}q_{1}...q_{j-1}上的模長(A_{j}q_{j}上的模場由r_{jj}已經求得):

        r_{kj}=\sum_{i=1}^{m}q_{ik}v{ij}

        v_{ij} = v_{ij}-q_{ik}r_{kj}     

        改進的格拉姆-施密特正交化就是上面的4個公式,下面我們就分析下這四個公式各自的含義:

        r_{jj}就是QR分解中R對角線上的值,如果對應上面舉例的QR分解,那麼r_{11} = q_{1}^{T}a,前面已經證明了R中的項是對應向量在正交基向量上投影的模長,v_{:j}A_{j}q_{i}方向上的投影,r_{jj}的表示式對應的正是A_{j}q_{i}方向上的投影的模長。

        q_{ij}q_{i}的第j個元素值,來源於前面的格拉姆-施密特正交化q_{1}=A_{1}/||A_{1}||,q_{2}=B/||B||,q_{3}=C/||C||

        r_{kj}是QR分解中對角線之外的元素表示式,像q_{1}^{T}b,q_{1}^{T}c的向量內積展開,這裡有個小小的拐彎要知道,原來R矩陣第j列的元素對應的是q_{1}^{T}A_{j},q_{2}^{T}A_{j},...,q_{j}^{T}A_{j},而這裡通過迭代計算的方式,第一步v=A_{j}r_{1j}=q_{1}^{T}A_{j}與元表示式一致,但是從第二次迭代開始,由第四個公式知道,這時v=A_{j}-q_{1}r_{1j}=A_{j}-q_{1}q_{1}^{T}A_{j},這時候的r_{2j}=q_{2}^{T}(A_{j}-q_{1}q_{1}^{T}A_{j})=q_{2}^{T}A_{j}-q_{2}^{T}q_{1}q_{1}^{T}A_{j}=q_{2}^{T}A_{j},因為q_{2}^{T}q_{1}q_{1}^{T}A_{j}=0,從幾何上理解q_{1}q_{2}正交,A_{j}q_{1}上的分量不會對A_{j}q_{2}上的分量的模長產生貢獻,或者說A_{j}q_{1}上的分量在q_{2}上的投影為0,在計算A_{j}q_{2}的投影時,可以先將A_{j}q_{1}上的分量減掉。

        v_{ij}就是在迭代過程中從A_{j}減去前面計算過的q_{k}方向分量的剩餘補向量。

        下面我們用改進的施密特正交化做一下上面介紹施密特正交化對M=(a b c)矩陣做的事情,直觀的看看它和標準的施密特正交化的不同之處:

        A=a,q_{1}=A/||A|| 

        B=b-(q_{1}^{T}b)q_{1},q_{2}=B/||B||

        C^{*}=c-(q_{1}^{T}c)q_{1},C=C^{*}-(q_{2}^{T}C^{*})q_{2},q_{3}=C/||C||

        摘抄一段書上改進的格萊姆-施密特正交化的matlab程式碼:

         for j=1:n                      %modified Gram-Schmidt              v=A(:,j);                  %v begins as column j of A              for i=1:j-1               %columns up to j-1, already settled in Q                   R(i,j)=Q(:,i)'*v;   %compute r_{ij}=q_{i}^{T}a_{j}                   v=v-R(i,j)*Q(:,i); %subract the projection (q_{i}^{T}a_{j})q_{i}=(q_{i}^{T}v)q_{i}               end                        %v is now perpendicular to all of q_{1},...,q_{j-1}              R(j,j)=norm(v);       %diagonal entries of R               Q(:,j)=v/R(j,j);         %normalize v to be the next unit vector q_{j}          end