最近解Homography的問題,看到這個解法,甚是科學。
通常情況下,一個線性方程組Ax = b,如果A不可逆,可以在等式兩邊乘上AT,變成ATAx = ATb,可以證明ATA一定可逆,其逆稱為偽逆。把偽逆乘到右邊就可以了。
但是如果是齊次方程組Ax = 0,求非零解,這招就不靈了。因為右邊乘上AT還是零,再乘上偽逆還是零。本來,Ax=0的偽逆解法求的就是近似解,Ax=0無解,委屈求ATAx = ATb。看起來像是作弊,其實是最小化|Ax – b|的結果。等同於把向量b投影到A的列空間。用這個投影代替b,這樣才有了解。但是Ax = 0,怎么可能無解,明明就存在一個解就是0,而且是毫無瑕疵的精確解(雖然往往沒什么用)。所以這個方法就不好使了。
首先要解這個方程必須加上一些約束,否則0向量是必然的解。如果說0不要,那么越是接近0,就是一個越近似的解,那也沒有意義。其實我們要求的是一個方向,使得經過A變換后模長“相對”最小。相對就是相對原來的模長來說。因為線性變換嘛,x縮放多少倍,Ax還縮放多少倍。因此可以約定|x|=1,求一個單位向量。最小化Ax。
SVD的方法是把A分解成UWVT,UV是正交矩陣,W是一個對角矩陣。正交的意義在於模長不變,僅僅轉了一個方向。想想對角化是做一件什么事情,對角化之后得到的特征向量,在線性變換之后方向不變而只有長度的變化。而任何一個向量可以放到特征向量組成的那個坐標系,然后每個分量在線性變換下就只有長度的變化,因此在這個坐標系下可以表示成一個對角陣。SVD差不多是對角化的推廣,只不過現在不要求變換后的空間(值域)和原來的空間(定義域)使用同樣的坐標系。現在,定義域用V坐標系,而值域使用U坐標系,則線性變換可以表示成對角矩陣。
齊次方程組里面右邊的0,無論在哪個坐標系也還是0。太好了!因此把x放到V坐標系中,經過A變換,再放到U坐標系中看的話,數值上就只有每個分量縮放了一個奇異值的大小。並且,由於UV是正交的,整個過程除了A變換,是不改變模長的。原來模長是1,之后模長變了,完完全全是A在作怪。這也是為什么UV除了列向量正交還要求轉置自乘為單位陣,也就是把各個維度歸一化了。
現在要最小化|Ax|,UV兩個坐標系,放到哪個下面看其實都一樣。所以就不用變回去了,就在V下看吧,奇異值絕對值最小的那個方向就是咯。想象一下把x投影到V的各個列向量也就是坐標軸,得到n個互相垂直的小箭頭。然后在A變換的作用下,每個小箭頭伸縮了一下(有的還可能反向哦),伸縮的比例就是對應的奇異值。為了變換之后最短,當然取abs奇異值最小的那個方向了。還不清楚的話,想象一個橢球吧。原來x模長為1,所有可能的x集合組成一個球面。變換后每個方向按比例縮放,球就變成了橢球。這個橢球也是所有可能的Ax所組成的集合,模最小的在什么地方,短軸吧,也就是縮得最小的那個坐標軸方向。
如果有奇異值為0,那個方向施加A之后就成0了,那就是一個精確解。對應橢球就是被壓扁了一個維度…
線性變換是不依賴矩陣而存在的,矩陣只是“皮相”,在一定坐標系下才有意義。前面的討論都針對抽象的“向量”和“變換”,應該把向量想象成一個箭頭,變換想象成這個箭頭的一次運動,而不是一串不知所雲的數字。但是最后要結束了,還是要接地氣,畢竟要求的是一串數字。現在知道解是V坐標系下的一個坐標軸的方向,對應奇異值最小的那只,大小么,模為一。那他的坐標是什么呢?如果放在V坐標系下看,其中一個坐標軸,也就是一個基,也就是其中一個列向量,坐標為(0,0,…,1,…,0),對應位置一個1,其他全0。放在原坐標下看呢,就是V的這個列本身了。原坐標也就是單位陣E對應的坐標。兩個坐標系下同一個向量有不同的坐標,之間的轉換就是一個V。原坐標下V的一列,變到V坐標,要乘上V的逆,是不是就變成了這個(0,0,…,1,…,0)?因為V是正交的,其逆也就是VT,然后每行和這個列作內積,其它行都和它正交,唯獨它自己和自己內積為1。
所以最后的結果就是V中對應abs奇異值最小的那一列。