關於使用SVD分解方法求解AX 0方程的一點說明

2021-07-28 13:59:20 字數 3066 閱讀 5894

研究生這麼多年,遇到ax=0的求解問題,從來都是使用svd分解直接取 v矩陣的最後一列作為方程的解,但是始終沒有弄明白其中的原理,最近找到幾篇文章,講解了這個問題,感覺一下子清晰了很多。

核心部分:

齊次線性方程組的最小二乘問題可以寫成如下:

min ||ax|| 

s.t    ||x||=1

目標函式:||ax|| = x'a'ax = x'lamda x=lamda||x||=lamda,其中lamda是a'a的特徵值。

於是可知,得到了a'a的最小特徵值,就得到了最優值,而其最小特徵值對應的特徵向量就是最優解.

使用svd分解矩陣a,[u s v] = svd(a); u 由 a*a'的特徵向量組成,v 由 a'*a的特徵向量組成,因此,奇異值矩陣s中最小的奇異值對應的v中的奇異向量即為最小二乘解。

ps: 上述目標函式推導這段有些問題,但是不妨礙理解,目標就是要最小化||ax|| 

點我進入原文

ax=0

這是乙個齊次線性方程組(一般的非齊次線性方程組ax=b其實也都可以化為齊次方程組的形式,所以比較普遍)

先要說明在非齊次方程組中,a到底有沒有解析解,可以由增廣矩陣來判斷:

而在齊次方程中(

r(a | b) =r

(a | 0)=r(a) 

),根據a來分,只剩下了兩種情況:

1.r(a)=未知數個數n(約束較強)

1.1.a是方陣

由克萊姆法則可知:

如果a是n*n的方陣而且r(a)=n,那麼該方程組有唯一的零解。

1.2.a不是方陣,a是m×n的(m>n)

由另乙個定理:齊次線性方程解空間維數 = n - r(a) 可知,該解空間維數為0, 也就是說該解空間只含有零向量。

2.r(a)《未知數個數n(約束不夠)

這裡a是不是方陣已經無所謂了,也沒有什麼法則可以用,就只分成一種情況。

由齊次線性方程組解空間維數 = n - r(a) >0,所以該齊次線性方程組有非零解,而且不唯一(自由度為 n - r(a))。

(多謝wereineky指出錯誤)

在我們做一些實際問題的時候,經常在 1.2(當然嚴格來說1.1也有可能啦)會卡住,這時實際上是沒有真正的非零解析解的,因為約束太多了,沒法都滿足(零向量除外)。但是可以折中一下,每乙個方程都滿足個大概,這就要求最小二乘解。求取最小二乘解的方法一般使用svd,即奇異值分解。

解空間維數與r(a)的關係的感性認識:

r(a)可以理解為一種約束條件的強弱的表現(約束的強弱不只是表面上的方程個數)。比如有乙個方程組,每個方程都是一樣的,那麼其秩為1,方程的個數對約束毫無貢獻。

繼續看a的秩,也就是約束的個數是怎麼影響解空間的維數的。 比如

x1 +   x2 +  x3 = 0

x1 + 2x2 + 3x3 = 0

r(a)=2,消去x1之後得到:

x2 + 2x3 = 0

x2或者x3一旦確定,其餘的未知量就都隨之確定了,所以自由度為1,所以解空間維數為1。 即:

如果 r(a)=c,那麼c個方程一共最多可以消去c-1個未知數(比如滿秩方陣,最後只留乙個未知數,得到唯一解),於是得到的方程由n-(c-1)個未知數組成,該方程有 n-c個自由度,也就是說解空間的維數為 n-c。

上述過程在高斯消去法中表現:

假設消去過後的a如下:

x     x      x      x      x

0     x      x      x      x

0     0      x      x      x

0     0      0      x      x

0     0      0      0      0

那麼最後乙個非全0行的x個數為 num = n-r(a)+1,則可以看到,該行的自由度,決定了所有解的自由度(因為一旦改行確定,其他都確定了,自由區其實可以理解為用將多少變數固定,就能夠確定整個矩陣),而該行的自由度=num-1=n-r(a)=齊次線性方程組解空間的維數,bingo!

svd與最小二乘解:

svd:奇異值分解,是在a不為方陣時的對特徵值分解的一種拓展。奇異值和特徵值的重要意義相似,都是為了提取出矩陣的主要特徵。 對於

齊次線性方程 a*x =0;當a的秩大於列數時,就需要求解

最小二乘解,在||x||=1的約束下,其最小二乘解為矩陣a'a最小特徵值所對應的特徵向量。

假設x為a'a的特徵向量的情況下,為什麼是最小的特徵值對應的x能夠是目標函式最小證明(多謝hukexin0000指出錯誤,這個約束太強,只能提供一點點感性認識,具體的證明請查閱相關教科書):

齊次線性方程組的最小二乘問題可以寫成如下:

min ||ax|| 

s.t    ||x||=1

目標函式:||ax|| = x'a'ax = x'lamda x=lamda||x||=lamda,其中lamda是a'a的特徵值。

於是可知,得到了a'a的最小特徵值,就得到了最優值,而其最小特徵值對應的特徵向量就是最優解.

而對m進行svd分解(*表示共軛轉置):

可見m*m的特徵向量就是v的列向量。

求解:

求解方法有兩種(matlab):

1. 

[v d] =eig(a'*a);d為a'*a的特徵值對角矩陣,v為對應的特徵向量。找到最小特徵值對應的v中的特徵向量即為最小二乘解。

2.使用svd分解矩陣a,[u s v] = svd(a); u 由 a*a'的特徵向量組成,v 由 a'*a的特徵向量組成,因此,奇異值矩陣s中最小的奇異值對應的v中的奇異向量即為最小二乘解。

對於超定方程(非齊次線性方程的一種)的最小二乘解的情況。a*x =b ; 

當a的行數大於列數時,方程組無解,就需要求解最小二乘解。在matlab中使用乙個

左除命令就可以得到最小二乘意義下的解。這個解沒有模製的限制,就是實際的解。matlab:a\b

兩種方法其實是乙個意思。

這篇資料還是很不錯的,講述了svd與pca的關係,其中的推薦資料也很不錯。

理解矩陣系列!強烈推薦

OpenCV中使用SVD分解與重構

原文 opencv中svd分解函式compute c static void svd compute inputarray src,outputarray w,outputarray u,outputarray vt,int flags 0 src decomposed matrix w compu...

關於HLS中SVD分解的精度研究

近期對svd分解的精度進行初步的測試 對比如下方法 1 採用vs上的opencv 進行svd分解 2 採用matlab進行svd分解 3 採用hls進行svd分解 vs和matlab,奇異值在0附近的演算法精度比較統一。而hls在奇異值0附近精度,二維或者三維矩陣上精度還可以,隨維度的變化精度變差,...

關於AX操作Excel的方法

這幾天用空餘時間好好的看了下excel在ax中的操作.很多東東不是很準確,還有一些東東沒有搞明白,不過基本的要求是可以達到了.可以對工作表內的特定行,列或單元格進行讀 寫操作,以及定義字型顏色,粗體,背景色,還有就是風格,不過好象只有一種,怎麼變動都沒有改變,鬱悶。static void job15...