1. 程式人生 > >SVD解線性方程組——祕密大起底

SVD解線性方程組——祕密大起底

奇異值分解(SVD)是計算機視覺領域中一種使用最為廣泛的矩陣分解技術。我們已經知道了一個矩陣A可以分解為下面這樣一種形式: A = VDV' (1),這裡V是一個正交矩陣(AA' = I),V' 代表V的轉置, D是一個對角矩陣, 對角矩陣A中的每一個對角元都是A的特徵值。

對於一個方陣A,我們總能找到一種特徵值分解的方式,A可以表達為 (1)所示的形式,但當A不是一個方陣時,我們需要知道是否也存在一個相似的分解方法。幸運的是,這樣的分解方式是存在的,這就是SVD。

對於任一給定的矩陣A(m * n),都存在這樣的分解:A = UDV' 。 這裡, U是一個m * m的正交矩陣,D是一個m * n的對角矩陣, V是一個n * n的正交矩陣。

D中的對角元叫做A的奇異值,U中的列向量叫做A的左奇異向量, V中的列向量叫做A的右奇異向量。

由於我們主要講解如何用SVD解線性方程組,對於SVD的一些性質,我們不再詳述,感興趣的可以參考相關資料。

SVD解優化問題:

(1)解非齊次線性方程組(Ax = b)

我們可以用SVD解諸如 Ax = b 這樣的線性方程組。這個問題其實就等價於最小化|| Ax - b ||2 (2),這是一個分線性優化問題。

已經知道svd(A) = UDV',並且對於一個正交矩陣M,滿足這樣一條性質: || Mv || = || v || (3), v是列向量。把(3)代入(2)中,得到:

min(|| Ax - b ||2)  = min(|| UDV' x - b ||) = min(DV' x - U'b) (4)。設y = V'x, b' = U'b,(4)式可重新表述為Dy = b'(D是一個對角矩陣),表達成矩陣的形式如下:


(ps: 如果無法瀏覽圖片,可以訪問這個網址https://img-blog.csdn.net/20140719101625906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdWxpeWFuZzE5OTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

根據上式,方程組的解很容易得到 yi = bi' / di。

(2)解齊次方程組(Ax = 0)

相似的情況,我們把問題轉化為最小化|| Ax ||2的非線性優化問題,我們已經知道了x = 0是該方程組的一個特解,為了避免x = 0這種情況(因為在實際的應用中x = 0往往不是我們想要的),我們增加一個約束,比如|| x ||2 = 1,這樣,問題就變為:

min(|| Ax ||2) , || x ||2 = 1 或 min(|| Ax ||) , || x || = 1

再次應用(3)式, || Ax || = || UDV' x || = || DV' x||,令y = V'x, 因此,問題變為min(|| Dy ||), || y || = 1。由於D是一個對角矩陣,對角元的元素按遞減的順序排列,因此最優解在y = (0, 0,..., 1)'是取得,又因為x = Vy, 所以最優解就是V的最小奇異值對應的列向量,比如,最小奇異值在第8行8列,那麼x = V的第8個列向量。