特徵值和奇異值分解(SVD)

特徵值分解和奇異值分解兩者有着很緊密的關係,兩者的目的都是爲了提取矩陣最重要的特徵。本節先解釋特徵值分解。先用一個實例來說明特徵值和特徵向量的起因和實際意義,然後給出定義,計算方法,python代碼以及其他解釋。

特徵值分解

實例

某城市有10000名女性,其中8000名已婚,2000名未婚。每年有30%的已婚女性離婚,有20%的未婚女性結婚。計算若干年後該城市已婚女性和未婚女性的數量。

10000名女性可以用一個向量來表示,即w0=[8000,2000]T ,每年的婚姻情況變化可以用矩陣來表示。

A=[0.70.20.30.8]

這樣,一年後已婚人數和未婚人數可以表示爲
w1=Aw0=[0.70.20.30.8][80002000]=[60004000]

一直這麼變化下去,從第12年開始已婚未婚人數就穩定下來,到達一個穩態(steady state)。
w12=A12w0=[0.70.20.30.8]12[80002000]=[0.40.40.60.6][80002000]=[40006000]

這裏會提出一個疑問,如果一開始已婚和未婚人數不是w0=[8000,2000]T ,結果還會是w12=[4000,6000]T 嗎?從上式可以看出,只要An 收斂到等式中的值,不管初值是多少,結果總會是[4000,6000]T 。如果我們把初值就設置爲向量[4000,6000]T ,那麼結果也會是[4000,6000]T 。根據這一點我們可以得到以下等式,設置向量 x1=[2,3]T
Ax1=A[23]=1[23]

接下來看另一個等式,設置向量x2=[1,1]T

Ax2=A[11]=1/2[11]

假設初始狀態,未婚女性人數爲p ,已婚女性人數爲10000p ,即w0=[p,10000p]T 使用向量x1,x2 來表示,引入兩個變量c1,c2 ,則有
w0=c1x1+c2x2
w1=Aw0=c1x1+(12)c2x2
wn=Anw0=c1x1+(12)nc2x2
展開x1,x2 得到以下方程,可以解得c1=2000
(5)2c1c2=p(6)3c1+c2=10000p

這樣,wn 可以得到以下分解
wn=Anw0=2000[23]+(12)n(4000p)[11]

wn 由兩部分組成,第一部分是穩態部分,變換A 對其不會造成影響。第二部分是瞬態部分,變換A 會對其造成衰減。這樣,變換Aw0 的作用就可以分解成兩個部分,分別由特徵向量x1,x2 ,和特徵值λ1,λ2 來表示。

定義

如果說一個向量v 是方陣A 的特徵向量,將一定可以表示成下面的形式:

Av=λv

這時候λ 就被稱爲特徵向量v 對應的特徵值,矩陣的特徵向量是一組正交向量。特徵值分解是將一個矩陣分解成下面的形式:
A=QΣQ1

其中Q 是這個矩陣A 的特徵向量組成的矩陣,Σ 是一個對角陣,每一個對角線上的元素就是一個特徵值。求特徵值和特徵向量分別使用以下方程
(1)det(AλI)=0
(2)(AλI)x=0

計算

計算過程是先求解行列式(1) ,得到特徵值λ ,然後分別將特徵值代入方程(2) 求得對應的特徵向量x

[0.7λ0.20.30.8λ]=0

解方程得到λ=[0.5,1]
λ=0.5 時,有
[0.20.20.30.3][x1x2]=0

解得x1=x2 ,即屬於特徵值λ1=0.5 有特徵向量[0.707,0.707]T ,這裏做了歸一化,要求||x||=1 。同理可以求得屬於特徵值λ2=1 的特徵向量[0.5547,0.832]T

代碼

python 代碼和輸出結果如下

import numpy as np
A = np.array([[0.7, 0.2],[0.3, 0.8]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print('eigenvlues are', eigenvalues)
print('eigenvectors are \n',eigenvectors)
eigenvlues are [0.5 1. ]
eigenvectors are 
 [[-0.70710678 -0.5547002 ]
 [ 0.70710678 -0.83205029]]

其他解釋

(以下部分來自其他人的博客)
首先,要明確的是,一個矩陣其實就是一個線性變換,因爲一個矩陣乘以一個向量後得到的向量,其實就相當於將這個向量進行了線性變換。比如說下面的一個矩陣:

M=[3001]

它其實對應的線性變換是下面的形式:
這裏寫圖片描述
因爲這個矩陣M 乘以一個向量[x,y]T 的結果是:
[3001][xy]=[3xy]

上面的矩陣是對稱的,所以這個變換是一個對xy 軸的方向一個拉伸變換(每一個對角線上的元素將會對一個維度進行拉伸變換,當值>1 時拉長,當值<1 時縮短),當矩陣不是對稱的時候,假如說矩陣是下面的樣子:
M=[1101]

它所描述的變換是下面的樣子:
這裏寫圖片描述

這其實是在平面上對一個軸進行的拉伸變換(如藍色的箭頭所示),在圖中,藍色的箭頭是一個最主要的變化方向(變化方向可能有不止一個),如果我們想要描述好一個變換,那我們就描述好這個變換主要的變化方向就好了。反過頭來看看之前特徵值分解的式子,分解得到的Σ矩陣是一個對角陣,裏面的特徵值是由大到小排列的,這些特徵值所對應的特徵向量就是描述這個矩陣變化方向(從主要的變化到次要的變化排列)

當矩陣是高維的情況下,那麼這個矩陣就是高維空間下的一個線性變換,這個線性變化可能沒法通過圖片來表示,但是可以想象,這個變換也同樣有很多的變換方向,我們通過特徵值分解得到的前N個特徵向量,那麼就對應了這個矩陣最主要的N個變化方向。我們利用這前N個變化方向,就可以近似這個矩陣(變換)。也就是之前說的:提取這個矩陣最重要的特徵。總結一下,特徵值分解可以得到特徵值與特徵向量,特徵值表示的是這個特徵到底有多重要,而特徵向量表示這個特徵是什麼,可以將每一個特徵向量理解爲一個線性的子空間,我們可以利用這些線性的子空間幹很多的事情。不過,特徵值分解也有很多的侷限,比如說變換的矩陣必須是方陣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章