最近在重新學習線性代數,學習的教材是MIT Gilbert Strang 教授的《INTRODUCTION TO LINEAR ALGEBRA》,在第4.4章節格拉姆-施密特正交化時,書中章節末尾介紹了一種改進的格拉姆-施密特正交化方法,但書中給出了公式,省略了很多細節,給學習理解造成了一定的難度,爲自己今後或者遇到同樣問題的朋友記錄一下公式的來由。
首先,介紹一下格拉姆施密特正交化的思想和方法。介紹正交化還得說說投影矩陣,我們在用最小二乘法解方程組的最優解的時候,由於Ax=b,b一般情況下,b並不一定存在於A的列空間中,這種情況下Ax=b其實是無解的,因爲找不到列空間內合適的線性組合使其結果爲b。這是後最小二乘法就派上用場了,最小二乘法的思想是,既然Ax=b無解,我們在列空間內找到一個向量p,下面這個方程組一定有解,那麼怎麼尋找p呢,最小二乘選取的p是使得||e||=||b-p||誤差最小的那個p,其實這個p就是b在A的列空間上的投影。前面說了那麼一大堆就是爲了引出投影,那這個投影是怎麼做呢,推導這裏我就省略了,直接給出投影矩陣P:
在線上的投影矩陣,這是後a是線上的向量:
在子空間上的投影矩陣:。
知道投影矩陣之後,那麼爲什麼要正交化呢,有什麼好處呢?投影矩陣中包含,使得普通的投影矩陣並不是那麼漂亮,這一向給求解帶來了很大的麻煩,那麼能不能消除它呢?答案就是找到A列空間的一組標準正交基Q,因爲對於標準正交基有如下性質,如果我們能找到列空間的標準正交基(格拉姆-施密特正交化要做的事情),那麼上面的投影矩陣P中A用Q代替,表達式變爲:,神奇的發現投影矩陣中不好的部分不見了。這也是標準正交令人着迷的地方。那麼怎麼尋找標準正交基呢,我們知道一個向量子空間中有多種可能的標準正交基,格拉姆-施密特就爲我們提供了一種尋找標準正交基的方法,思想很簡單:假設矩陣M=( a b c),A列空間的第一列爲第一個標準正交基向量的方向,令A=a,通過除去向量的模得到第一個基向量,那麼第二基向量怎麼求呢,答案就是通過投影得到在A上的投影,根據投影的知識知道這是後有是垂直於的,那麼我們得到第二個基向量,如果M矩陣還有第3個列向量,那我們如何得到呢?思想和得到的思想一樣,對在和上做投影得到,, 重複第二步驟就可以得到所有的n個正交基向量,這就是格拉姆-施密特正交化。
格拉姆-施密特正交化是A的一個因子分解,叫QR分解,A=QR,Q就是格拉姆-施密特正交化的標準正交矩陣,R是一個上3角矩陣,假設M=( a b c),M的QR分解是如下形式:
爲什麼R會是這樣的上3角矩陣呢,原因是格拉姆-施密特正交化的過程,a在和方向一致,所以在上投影爲0,同樣b只在上有分量在上沒有分量,格拉姆-施密特正交化的過程保證了A前面的列不會在後面的正交向量方向有分量,因爲後面的正交分量始終是垂直於前面的列構成的向量子空間,也就是說與前面的列向量都垂直。下面我們推導一下就是b在方向投影的模長,這對後面理解改進的格拉姆-施密特正交化至關重要。
b在上的投影由線上的投影矩陣知道:
,,可以推論R中其他項也是對於的向量在正交基向量上投影的模長。
前面的準備知識夠了,接下來,我們可以搬出改進的格拉姆-施密特正交化的公式了A是mxn階矩陣:
下面的公式從開始計算在上的模長(在上的模場由已經求得):
改進的格拉姆-施密特正交化就是上面的4個公式,下面我們就分析下這四個公式各自的含義:
就是QR分解中R對角線上的值,如果對應上面舉例的QR分解,那麼,前面已經證明了R中的項是對應向量在正交基向量上投影的模長,是在方向上的投影,的表達式對應的正是在方向上的投影的模長。
是的第j個元素值,來源於前面的格拉姆-施密特正交化,,。
是QR分解中對角線之外的元素表達式,像的向量內積展開,這裏有個小小的拐彎要知道,原來R矩陣第j列的元素對應的是,而這裏通過迭代計算的方式,第一步,與元表達式一致,但是從第二次迭代開始,由第四個公式知道,這時,這時候的,因爲,從幾何上理解與正交,在上的分量不會對在上的分量的模長產生貢獻,或者說在上的分量在上的投影爲0,在計算到的投影時,可以先將在上的分量減掉。
就是在迭代過程中從減去前面計算過的方向分量的剩餘補向量。
下面我們用改進的施密特正交化做一下上面介紹施密特正交化對M=(a b 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
v=v-R(i,j)*Q(:,i); %subract the projection
end %v is now perpendicular to all of
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