1. 程式人生 > >視覺SLAM常見的QR分解SVD分解等矩陣分解方式求解滿秩和虧秩最小二乘問題

視覺SLAM常見的QR分解SVD分解等矩陣分解方式求解滿秩和虧秩最小二乘問題

內容一 
首先直接給出AX=B解的情況: 
(1)R(A)< r(A|B),方程組無解 
(2)r(A)=r(A|B)=n,方程組有唯一解 
(3)r(A)=r(A|B) < n,方程組有無窮解 
(4)r(A)>r(A|B),這種情況不存在 
其中r()代表矩陣的秩,A|B是增廣矩陣,n是X未知數個數。
這裡就引出最小二乘問題,最小二乘問題就是用來解決第二、三種情況求最優解。當出現第二種情況下(也就是A滿秩下,稱為滿秩最小二乘問題),為了提高效率通常使用QR分解、LTLD分解、Cholesky分解和SVD分解(奇異分解)等。當出現第三種情況時(也就是A秩虧,稱為虧秩最小二乘問題),只能使用SVD分解方法,其他方法將失效。下面分別介紹QR分解、LTLD分解、cholesky分解和SVD分解的方法,然後探討其對最小二乘的解法。

內容二: 
這裡有必要提下線性最小二乘問題 

可見一般在視覺SLAM中後端優化就是約束項大於未知數的個數(超定問題),採用最小二乘問題求解

內容三: 
為什麼需要矩陣分解 
個人認為,首先,當資料量很大時,將一個矩陣分解為若干個矩陣的乘積可以大大降低儲存空間;其次,可以減少真正進行問題處理時的計算量,畢竟演算法掃描的元素越少完成任務的速度越快,這個時候矩陣的分解是對資料的一個預處理;再次,矩陣分解可以高效和有效的解決某些問題;最後,矩陣分解可以提高演算法數值穩定性,關於這一點可以有進一步的說明。 
例如方程: 
 


結果變成了上式,可以看出當方程組中的常數矩陣發生微小的擾動時,會導致最終的結果發生較大的變化,這種結果的不穩定不是因為方程求解的方法,而是方程組矩陣本身的問題。這回給我們帶來很大的危害,例如像上面的情況,計算機求解出現舍入誤差,矩陣本身不好的話會直接導致結果失敗。 
當對矩陣A或者b進行小擾動的時候,最後影響結果的是||A||||A^(-1) ||,與矩陣病態性成正相關。定義矩陣的條件數cond(A)= ||A||||A^(-1) ||來描述矩陣的病態程度,一般認為小於100的為良態,條件數在100到1000之間為中等程度的病態,條件數超過1000存在嚴重病態。以上面的矩陣A為例,採用2範數的條件數cond(A)=222.9955, 矩陣處於中等病態程度。 

內容四: 
視覺SLAM中常用矩陣 
1.正交矩陣 
有一種經典的矩陣,叫正交矩陣, 什麼叫正交矩陣呢?其實某種意義上,正交矩陣也是通過矩陣乘法來定義的。 如果一個矩陣和它的轉置矩陣的乘積為單位矩陣, 那麼這個矩陣就是正交矩陣。李群中旋轉矩陣就是一種正交陣,所以一般其逆的形式直接寫成轉置,因為轉置計算簡單。 
 
為什麼叫正交矩陣呢?因為如果我們把這個矩陣寫成向量的形式, 那麼這些向量除了自己和自己的點積為1,其他任意兩個不同向量之間的點積全部為0.而向量點積為0的情況叫正交。正交矩陣是因此得名的,其實就可以理解成一組基,也就是座標系。為什麼要講正交矩陣呢?還記得在矩陣的加法分解裡面,有求逆矩陣的情況麼?試想一下,如果不要求逆矩陣了,而是求解轉置矩陣的話,那是不是異常方便?對的,這就是正交矩陣的強大的優勢,因此下面的矩陣分解中都希望直接轉換成正交矩陣相乘的形式。 
 
我們可以看到正交矩陣,並不改變物體的形狀,但是進行了旋轉。 


2.對角矩陣 
乘以一個對角矩陣,好比對每個座標軸進行縮放,包括方向,和壓縮。正數的乘法:正數好比在原方向上的縮放, 大於1,表示伸長,小於1,表示縮小。負數的乘法:負數表示反反向。零的乘法:零表示空間壓縮。 
 
 
3. 三角矩陣 
和對角矩陣相比,三角矩陣要多一些角上的元素,那麼這些元素有什麼作用呢?上三角矩陣:上三角矩陣的作用好比進行右上的切變,水平的斜拉。下三角矩陣:同樣是切邊,不過是往左下切邊,垂直方向的下拉。 
 
 
矩陣分解就是分解成上面三種形式,綜上所述,矩陣分解的幾何意義就是把一個線性變換分解開來,分別是縮放,切邊和旋轉。矩陣因子的作用就是要把縮放,切邊和旋轉分解出來理解一個矩陣的作用。

內容五: 
1.QR分解 
當A是非奇異的實方陣(滿秩,只有方陣才存在奇異性,奇異矩陣秩虧,行列式為0,非奇異矩陣滿秩,行列式不為0),實方陣A能夠表示成一個正交矩陣Q(QTQ=I)與上三角矩陣R的積,QR分解的實際計算有很多方法,例如 Givens 旋轉、Householder 變換,以及 Gram-Schmidt正交化等等。A=Q*R稱為A的QR分解。如下圖所示 
 
前面我們提到單位矩陣也是正交矩陣, 所以正交矩陣可以看成是座標系的轉換。所以有時候,QR分解也可以表示成如下形式。 


QR分解的意義 
從幾何上QR分解,就是先進行旋轉,然後再進行切變的過程。 


QR分解解滿秩最小二乘問題 


2.LDLT分解 
對稱矩陣A可以分解成一個下三角矩陣L(Lower下)和一個對角矩陣D(Diagonal對角線)以及一個下三角矩陣L的轉置LT三個矩陣相乘的形式。如下式 
 
由A的分解可知AT=A,即A的轉置等於A矩陣本身。

LDLT分解解滿秩最小二乘問題 
一般無法得到滿足對稱矩陣A,因此需要使對ATA(滿足對稱)進行分解。將求解問題轉換成下面的式子 


由於r(A)=n,所以ATA是對稱(正定)矩陣,式子有唯一解,使用LDLT分解的步驟是: 
(1)定義矩陣C=AT*A,d=AT*b; 
(2)對C進行cholesky分解C=L*D*LT,原式變成L*D*LT*x=d 
(3)令y=LT*x,原式變成L*D*y=d,求解此方程得到y,然後求解y=LT*x得到x。 
LDLT分解速度要快於QR分解。

3.Cholesky分解 
Cholesky分解是LDLT分解的一種特殊形式,也就是其中的D是單位矩陣。正定對稱矩陣 A可以分解成一個下三角矩陣L和這個下三角矩陣L的轉置LT相乘的形式。如下式 


Cholesky分解解滿秩最小二乘問題 
一般無法得到滿足對稱矩陣A,因此需要使對ATA(滿足對稱)進行分解。將求解問題轉換成下面的式子 


由於r(A)=n,所以ATA是對稱正定矩陣,式子有唯一解,使用cholesky分解的步驟是: 
(1)定義矩陣C=AT*A,d=AT*b; 
(2)對C進行cholesky分解C=G*GT,原式變成G*GT*x=d 
(3)令y=GT*x,原式變成G*y=d,求解此方程得到y,然後求解y=GT*x得到x。 
Cholesky分解要快於LDLT分解。

4.SVD分解 
矩陣的奇異值分解(SVD)在最優化問題、特徵值問題、最小二乘問題及廣義逆問題中有巨大作用,奇異值分解將QR分解推廣到任意的實矩陣,不要求矩陣式可逆,也不要求是方陣。奇異值和特徵值相似的重要意義,都是為了提取出矩陣的主要特徵。假設A是一個m∗n階矩陣,如此則存在一個分解m階正交矩陣U、非負對角陣Σ和n階正交矩陣V使得 
A=UΣVT 


 
Σ對角線上的元素Σi,i即為A的奇異值。而且一般來說,我們會將Σ上的值按從大到小的順序排列。 
通過上面對SVD的簡單描述,不難發現,SVD解決了特徵值分解中只能針對方陣而沒法對更一般矩陣進行分解的問題。所以在實際中,SVD的應用場景比特徵值分解更為通用與廣泛。將將上面的SVD分解用一個圖形象表示如下。 
 
截止到這裡為止,很多同學會有疑問了:你這不吃飽了撐得。好好的一個矩陣A,你這為毛要將他表示成三個矩陣。這三個矩陣的規模,一點也不比原來矩陣的規模小好麼。而且還要做兩次矩陣的乘法。要知道,矩陣乘法可是個複雜度為O(n3)的運算。如果按照之前那種方式分解,肯定是沒有任何好處的。矩陣規模大了,還要做乘法運算。關鍵是奇異值有個牛逼的性質:在大部分情況下,當我們把矩陣Σ裡的奇異值按從大到小的順序呢排列以後,很容易就會發現,奇異值σ減小的速度特別快。在很多時候,前10%甚至前1%的奇異值的和就佔了全部奇異值和的99%以上。換句話說,大部分奇異值都很小,基本沒什麼卵用。。。既然這樣,那我們就可以用前面r個奇異值來對這個矩陣做近似。於是,SVD也可以這麼寫: 
Am×n≈Um×rΣr×rVr×n 
其中,r≪m,r≪n。如果用另外一幅圖描述這個過程,如下圖: 
 
看了上面這幅圖,同學們是不是就恍然大悟:原來的那個大矩陣A,原來可以用右邊的那三個小矩陣來表示。當然如果r越大,跟原來的矩陣相似度就越高。如果r=n,那得到的就是原來的矩陣A。但是這樣儲存與計算的成本就越高。所以,實際在使用SVD的時候,需要我們根據不同的業務場景與需求還有資源情況,合理選擇r的大小。本質而言,就是在計算精度與空間時間成本之間做個折中。

SVD分解意義 
按照前面給出的幾何含義,SVD 分解可以看成先旋轉,然後進行分別縮放,然後再旋轉的過程。 


SVD分解解滿秩(虧秩)最小二乘問題 
SVD分解不僅可以解決滿秩最小二乘問題,最重要的是可以解決虧秩最小二乘問題(r(A)< n,理解下其實就相當於這裡取r < n的情況),而前面的方法在秩虧的時候都會失效。 
設A的SVD分解為: 



參考:https://blog.csdn.net/wangshuailpp/article/details/80209863