1. 程式人生 > >數值分析:矩陣求逆-奇異性、條件數

數值分析:矩陣求逆-奇異性、條件數

本blog主要內容有:矩陣的奇異性、條件數與病態矩陣、矩陣求逆。

奇異矩陣和非奇異矩陣singular matrix&nonsingular matrix

概念和定義

若n階矩陣A的行列式不為零,即 |A|≠0,則稱A為非奇異矩陣或滿秩矩陣,否則稱A為奇異矩陣或降秩矩陣。

奇異矩陣是線性代數的概念,就是對應的行列式等於0的方陣。

奇異矩陣和非奇異矩陣的判斷和性質

奇異矩陣一定是方陣嗎

首先,看這個矩陣是不是方陣(即行數和列數相等的矩

陣。若行數和列數不相等,那就談不上奇異矩陣和非奇異矩陣)。

不過限定在某個知識範圍內是指方陣,例如線性代數當中只對方陣進行奇異矩陣的定義。正常來講是不限定必須是方陣的,比如在奇異值分解當中,用作估計的時候會定義奇異值矩陣不滿秩的矩陣為奇異陣,當然就不再限定是方陣。這種情況下矩陣不可求廣義逆,即使求莫奈偽逆也要用特殊的方法,另外這種矩陣如果有物理意義的話,往往不滿足正交核函式分解的條件。


一個矩陣A非奇異當且僅當:(等價的概念)
A的所有特徵值都不為零(lambda=0則|A|=0,只要矩陣A有一個特徵值為零,一定是奇異矩陣。即零特徵值反映矩陣的奇異性)
或A的行列式不為零,即 |A|≠0(A 為可逆矩陣,也即A的行列式不為零)
或A可逆
或A的秩為n(非奇異矩陣 A滿秩,Rank(A)=n;奇異矩陣 A的秩Rank(A)<n)
或A的列向量線性無關
或矩陣方程AX=b有唯一非零解(如果A為奇異矩陣,則AX=b有無窮解或者無解)或矩陣方程AX=0有且僅有零解(如果A為奇異矩陣,則AX=0有無窮解)
一個非奇異矩陣可表示成若干個初等矩陣之積。
一個矩陣非奇異當且僅當它代表的線性變換是個自同構。Note: 若A為非奇異矩陣,其順序主子陣Ai(i=1,...,n-1)不一定均非奇異。
如果n 階方陣A奇異,則一定存在一個n*1階非零向量X使: X'AX=0;成立。
[更詳細的描述ref:張賢達: 矩陣分析與應用 1.7逆矩陣與偽逆矩陣]

注意事項

計量經濟學中,當樣本容量太少或是當變數間存在完全相關性時會提示“near singular matrix”,意為“近奇異矩陣”。
在訊號處理中,當訊號協方差矩陣不是奇異矩陣時,則訊號不相關或者部分相關。

優化有兩大難題,一是:區域性最小值,二是:ill-condition病態問題。前者俺就不說了,大家都懂吧,我們要找的是全域性最小值,如果區域性最小值太多,那我們的優化演算法就很容易陷入區域性最小而不能自拔,這很明顯不是觀眾願意看到的劇情。那下面我們來聊聊ill-condition。

條件數condition number與病態矩陣

ill-condition對應的是well-condition,分別代表什麼?

假設我們有個方程組AX=b,我們需要求解X。如果A或者b稍微的改變,會使得X的解發生很大的改變,那麼這個方程組系統就是ill-condition的,反之就是well-condition的。

舉個例子

       左邊的那個。第一行假設是我們的AX=b,第二行我們稍微改變下b,得到的x和沒改變前的差別很大。第三行我們稍微改變下係數矩陣A,可以看到結果的變化也很大。換句話來說,這個系統的解對係數矩陣A或者b太敏感了。又因為一般我們的係數矩陣A和b是從實驗資料裡面估計得到的,所以它是存在誤差的,如果我們的系統對這個誤差是可以容忍的就還好,但系統對這個誤差太敏感了,以至於我們的解的誤差更大,那這個解就太不靠譜了。所以這個方程組系統就是ill-conditioned病態的,不正常不穩定有問題的。

    右邊那個就叫well-condition的系統了。

     對於一個ill-condition的系統,輸入稍微改變下,輸出就發生很大的改變,這表明我們的系統不能實用。例如對於一個迴歸問題y=f(x),我們是用訓練樣本x去訓練模型f,使得y儘量輸出我們期待的值,例如0。那假如我們遇到一個樣本x’,這個樣本和訓練樣本x差別很小,面對他,系統本應該輸出和上面的y差不多的值的,例如0.00001,最後卻給我輸出了一個0.9999,這很明顯不對呀。就好像,你很熟悉的一個人臉上長了個青春痘,你就不認識他了,那你大腦就太差勁了,哈哈。

奇異的本質原因在於矩陣有0特徵值,x在對應特徵向量的方向上運動不改變Ax的值。如果一個特徵值比其它特徵值在數量級上小很多,x在對應特徵向量方向上很大的移動才能產生b微小的變化,這就解釋了為什麼這個矩陣為什麼會有大的條件數,事實上,正規陣在二範數下的條件數就可以表示成 abs(最大特徵值/最小特徵值)。

病態的衡量標準:條件數condition number

所以如果一個系統是ill-conditioned病態的,我們就會對它的結果產生懷疑。那到底要相信它多少呢?我們得找個標準來衡量吧,因為有些系統的病沒那麼重,它的結果還是可以相信的。終於回來了,上面的condition number就是拿來衡量ill-condition系統的可信度的。

condition number的定義

條件數是線性方程組Ax=b的解對b中的誤差或不確定度的敏感性的度量。數學定義為矩陣A的條件數等於A的範數與A的逆的範數的乘積,即cond(A)=‖A‖·‖A的逆‖,對應矩陣的3種範數,相應地可以定義3種條件數。

condition number衡量的是輸入發生微小變化的時候,輸出會發生多大的變化。也就是系統對微小變化的敏感度。

從線性代數的分析可知,矩陣的條件數總是大於1,正交矩陣的條件數等於1,奇異矩陣的條件數為無窮大,而病態矩陣的條件數則為比較大的資料(遠大於1)。也就是說奇異矩陣一定是病態的!

如果方陣A是非奇異的,那麼A的conditionnumber定義為:

也就是矩陣A的norm乘以它的逆的norm。所以具體的值是多少,就要看你選擇的norm是什麼了。

如果方陣A是奇異的,那麼A的condition number就是正無窮大了

實際上,每一個可逆方陣都存在一個condition number。但如果要計算它,我們需要先知道這個方陣的norm(範數)和Machine Epsilon(機器的精度)。

當然,這個定義依賴於範數的選取。

  • \|\cdot \|l_2 矩陣範數
\kappa(A) = \frac{\sigma_{max}(A)}{\sigma_{min}(A)} 其中\sigma_{max}(A)\sigma_{min}(A)分別是A的極大和極小奇異值。因此
  • A是正規矩陣則
\kappa(A) = \left|\frac{\lambda_{max}(A)}{\lambda_{min}(A)}\right| (\lambda_{max}(A),\ \lambda_{min}(A)分別是A的極大和極小(根據模數)特徵值
  • A是酉矩陣則
\kappa(A) = 1
  • \|\cdot \|l_{\infty} 矩陣範數A是下三角矩陣,非奇異(也即a_{ii} \ne 0 \; \forall i)則:\kappa(A) \geq \frac{\max_i(|a_{ii}|)}{\min_i(|a_{ii}|)}

其它意義下的條件數

奇異值分解,多項式求根,特徵值和其它許多問題的條件數也可以有定義。

通常,如果一個數值問題是適定的,它可以表達為一個函式f對映它的資料(一個實數的m元組x)到它的解(一個實數的n元組y)。

它的條件數則定義為解中的相對誤差的半徑和資料中的相對誤差的比的最大值,取遍整個問題的定義域:

\max \left\{ \left| \frac{f(x) - f(x^*)}{f(x)} \right| \left/ \left| \frac{x - x^*}{x} \right| \right. : |x - x^*| < \epsilon \right\}

其中\epsilon是問題中的資料的偏差的某個合理的小數值。

如果f也是可微的,這可以近似的表示為

\left| \frac{ f'(x) }{ f(x) } \right|. \left| x \right|.

為什麼要範數?

範數就相當於衡量一個矩陣的大小,我們知道矩陣是沒有大小的,但上面不是要衡量一個矩陣A或者向量b變化的時候,我們的解x變化的大小嗎?所以肯定得要有一個東西來度量矩陣和向量的大小吧?它就是範數,表示矩陣大小或者向量長度。對於AX=b,我們可以有以下的結論:

也就是我們的解x的相對變化和A或者b的相對變化是有像上面那樣的關係的,其中k(A)的值就相當於倍率,相當於x變化的界。

一句話總結:condition number是一個矩陣(或者它所描述的線性系統)的穩定性或者敏感度的度量,如果一個矩陣的condition number在1附近,那麼它就是well-conditioned的,如果遠大於1,那麼它就是ill-conditioned的,如果一個系統是ill-conditioned的,它的輸出結果就不要太相信了。

矩陣求逆

非奇異正方矩陣A的逆矩陣A-1

m*n(m!=n)的長方形滿列秩矩陣的左偽逆矩陣(A^HA)^-1A^H, 滿行秩矩陣的右偽逆矩陣A^H(AA^H)^-1

秩虧缺矩陣的逆矩陣:Moore-Penrose逆矩陣

[張賢達: 矩陣分析與應用 1.7逆矩陣與偽逆矩陣]

奇異矩陣/病態矩陣的求逆

 L2範數有助於處理條件數 condition number不好的情況下矩陣求逆很困難的問題。

如將下面的奇異矩陣XTX改造一下再求逆:

 

還有SVD分解的方法?Moore-Penrose逆矩陣?

ref: [張賢達: 矩陣分析與應用]

相關推薦

數值分析矩陣-異性件數

本blog主要內容有:矩陣的奇異性、條件數與病態矩陣、矩陣求逆。奇異矩陣和非奇異矩陣singular matrix&nonsingular matrix概念和定義若n階矩陣A的行列式不為零,即 |A|≠0,則稱A為非奇異矩陣或滿秩矩陣,否則稱A為奇異矩陣或降秩矩陣。奇

P4783 【模板】矩陣

傳送門 線性代數真的好珂怕……以下如果有漏洞歡迎指出 定義矩陣的三種初等行變換: 1.交換某兩行 2.將某一行的所有元素乘上\(k\)(\(k\neq 0\)) 3.將某一行的所有元素乘上\(k\)加到另一行去 每一個初等變換都對應一個初等矩陣,即矩陣\(A\)做某一線性變換等價於用一個對應的初等

python 矩陣

mat = np.array( [[ 65.481, 128.553, 24.966 ], [-37.797, -74.203, 112.0 ], [ 112.0, -93.786, -18.214]]) mat_inv = np.linalg.inv(mat

矩陣 LUP 分解 解線性方程組 行列式值 矩陣 演算法說解

演算法:矩陣 LUP 分解 本文著筆於矩陣 LUP 分解演算法,以及利用矩陣的 LUP 分解來解線性方程組、求矩陣對應行列式的值、求逆矩陣。 對於矩陣的定義程式碼如下: struct Matrix { double dat[MAX_N][MAX_N],det,

024矩陣引理

  記得以前在學序貫平差的時候就用過矩陣求逆引理,但是當時只是死記,當然早就忘了。在此作個筆記記錄一下引理的推導過程。 (A+BCD)−1=A−1+X \begin{aligned} (A+BCD)^{-1} &amp;= A^{-1} + X \en

洛谷 P4783 【模板】矩陣

題目分析 模板題。 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod=1e9+7; int n,a[405][405],b[405][405]; int Pow(int x,int

資料結構實驗之排序五歸併序數(SDUT 3402)

歸併排序詳解(戳我)。 以下是搬了別人的。 #include<stdio.h> #include<stdlib.h> long long sum = 0; int a[100005]; int temp[100005]; void Merge(int s1

luoguP4783 [模板]矩陣 線性代數

求\(n^2\)的矩陣的逆 翻了翻題解,看到了初等矩陣這個東西,突然想起來在看線代的時候看到過.... 然後又溫習了一遍線性代數的知識 不妨設\(PA = E\),其中\(P\)是一堆初等矩陣的積(必須同時是行變換) 由於\(PA = E, PE = P\),因此\(P(A, E) = (E, P

矩陣引理推導及理解

問題引入: 在遞推最小二乘法估計問題中,因為每次推導運算時必須計算矩陣和的逆,這樣做工作量非常大,為了簡化,通常使用矩陣求逆引理來簡化計算量。     矩陣求逆引理的結論及推導如下:   矩陣求逆引理要解決的問題是: 已知一個高維矩陣A

要好好總結一下超大矩陣的技巧了

直接算會死人的。根據矩陣特點用不用的分解,寫成幾個例程,每次實驗之前進行嘗試,根據嘗試結果在演算法裡決定裡決定用哪個。 irst 我想問: 1.全階矩陣A的求逆運算inv(A) 和稀疏矩陣B(階數和a一樣) 的求逆運算inv(B)是不是採取一樣的方法啊?也就是說他們的 計算量是不是一樣的啊?不會因為

OpenCV中LU分解實現矩陣invert(DECOMP_LU)

OpenCV3.0中實現矩陣求逆有四種方法(LU、cholesky、eig以及SVD),使用187*187矩陣測試,100輪計算耗時如下(cholesky方法並沒有得到結果): 179*179矩陣測試,100輪耗時如下: Cholesky方法對輸入矩陣限制嚴格(共軛對稱

數值分析資料插值方法

插值、擬合和逼近的區別據維基百科,科學和工程問題可以通過諸如取樣、實驗等方法獲得若干離散的資料,根據這些資料,我們往往希望得到一個連續的函式(也就是曲線)或者更加密集的離散方程與已知資料相吻合,這過程就叫做擬合。通過擬合得到的函式獲得未知點的資料的方法,叫做插值。其中,擬合函

矩陣常見演算法

前言     不知道從哪天開始,看到矩陣就頭疼,特別是矩陣的運算更是蛋疼,都不好意思說自己是數學專業的,哈哈。這兩天在搞opencv影象處理,又涉及到這一塊,無語之,乾脆收集整理下,以饗同痛苦者。 一、逆矩陣的概念 利用矩陣的乘法和矩陣相等的含義,可以把線性方程組寫成

矩陣

fort complex The 也有 com func fortran 驗證 驗證過 // 轉載自: http://fortranwiki.org/fortran/show/Matrix+inversion// 這裏僅適用於 小型矩陣 2*2,3*3,4*4 的矩陣求逆

gemm() 與 gesvd() 到矩陣(inverse)(根據 SVD 分解和矩陣乘法矩陣)

可逆方陣 A 的逆記為,A−1,需滿足 AA−1=I。 在 BLAS 的各種實現中,一般都不會直接給出 matrix inverse 的直接實現,其實矩陣(方陣)的逆是可以通過 gemm()和gesv

矩陣-Warning: Matrix is singular to working precision.

用inv進行矩陣求逆時,出現矩陣奇異的情況。 只需將inv替換為pinv求偽逆即可。 1.對於方陣A,如果為非奇異方陣,則存在逆矩陣inv(A)2.對於奇異矩陣或者非方陣,並不存在逆矩陣,但可以使用pinv(A)求其偽逆、 很多時候你不需要求逆矩陣,例如:inv(A)*

C語言之單位下三角矩陣

#include<stdio.h> int main(){ //矩陣儲存在二位陣列也可以隨機生成    double l[4][4]={1,0,0,0,2,1,0,0,3,2,1,0,5,4,2,1};    long bs=4,i,j,n; //矩陣第一列求逆

LUOGU P4783 【模板】矩陣(高斯消元)

line org git == clu fas 解題思路 reg 操作 傳送門 解題思路   用高斯消元對矩陣求逆,設\(A*B=C\),\(C\)為單位矩陣,則\(B\)為\(A\)的逆矩陣。做法是把\(B\)先設成單位矩陣,然後對\(A\)做高斯消元的過程,對\(B\)

矩陣論(三)矩陣分解—從Schur分解特徵值分解EVD到奇異值分解SVD

本篇部落格針對三種聯絡十分緊密的矩陣分解(Schur分解、特徵值分解、奇異值分解)依次介紹,它們的關係是Schur→EVD→SVDSchur\rightarrow{}EVD\rightarrow{}SVDSchur→EVD→SVD,也就是說由Schur分解可以推

luogu P4238 多項式 (模板題FFT)

pac namespace 有一個 計算 dft csdn include tmp eof 手動博客搬家: 本文發表於20181125 13:21:46, 原地址https://blog.csdn.net/suncongbo/article/details/84485718