特徵值分解和奇異值分解兩者有着很緊密的關係,兩者的目的都是爲了提取矩陣最重要的特徵。本節先解釋特徵值分解。先用一個實例來說明特徵值和特徵向量的起因和實際意義,然後給出定義,計算方法,python代碼以及其他解釋。
特徵值分解
實例
某城市有10000名女性,其中8000名已婚,2000名未婚。每年有30%的已婚女性離婚,有20%的未婚女性結婚。計算若干年後該城市已婚女性和未婚女性的數量。
10000名女性可以用一個向量來表示,即 ,每年的婚姻情況變化可以用矩陣來表示。
這樣,一年後已婚人數和未婚人數可以表示爲
一直這麼變化下去,從第12年開始已婚未婚人數就穩定下來,到達一個穩態(steady state)。
這裏會提出一個疑問,如果一開始已婚和未婚人數不是 ,結果還會是 嗎?從上式可以看出,只要 收斂到等式中的值,不管初值是多少,結果總會是 。如果我們把初值就設置爲向量 ,那麼結果也會是 。根據這一點我們可以得到以下等式,設置向量
接下來看另一個等式,設置向量
假設初始狀態,未婚女性人數爲 ,已婚女性人數爲 ,即 使用向量 來表示,引入兩個變量 ,則有
展開 得到以下方程,可以解得 。
這樣, 可以得到以下分解
由兩部分組成,第一部分是穩態部分,變換 對其不會造成影響。第二部分是瞬態部分,變換 會對其造成衰減。這樣,變換 對 的作用就可以分解成兩個部分,分別由特徵向量 ,和特徵值 來表示。
定義
如果說一個向量 是方陣 的特徵向量,將一定可以表示成下面的形式:
這時候 就被稱爲特徵向量 對應的特徵值,矩陣的特徵向量是一組正交向量。特徵值分解是將一個矩陣分解成下面的形式:
其中 是這個矩陣 的特徵向量組成的矩陣, 是一個對角陣,每一個對角線上的元素就是一個特徵值。求特徵值和特徵向量分別使用以下方程
計算
計算過程是先求解行列式 ,得到特徵值 ,然後分別將特徵值代入方程 求得對應的特徵向量 。
解方程得到 。
當 時,有
解得 ,即屬於特徵值 有特徵向量 ,這裏做了歸一化,要求 。同理可以求得屬於特徵值 的特徵向量 。
代碼
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]]
其他解釋
(以下部分來自其他人的博客)
首先,要明確的是,一個矩陣其實就是一個線性變換,因爲一個矩陣乘以一個向量後得到的向量,其實就相當於將這個向量進行了線性變換。比如說下面的一個矩陣:
它其實對應的線性變換是下面的形式:
因爲這個矩陣 乘以一個向量 的結果是:
上面的矩陣是對稱的,所以這個變換是一個對 軸的方向一個拉伸變換(每一個對角線上的元素將會對一個維度進行拉伸變換,當值 時拉長,當值 時縮短),當矩陣不是對稱的時候,假如說矩陣是下面的樣子:
它所描述的變換是下面的樣子:
這其實是在平面上對一個軸進行的拉伸變換(如藍色的箭頭所示),在圖中,藍色的箭頭是一個最主要的變化方向(變化方向可能有不止一個),如果我們想要描述好一個變換,那我們就描述好這個變換主要的變化方向就好了。反過頭來看看之前特徵值分解的式子,分解得到的Σ矩陣是一個對角陣,裏面的特徵值是由大到小排列的,這些特徵值所對應的特徵向量就是描述這個矩陣變化方向(從主要的變化到次要的變化排列)
當矩陣是高維的情況下,那麼這個矩陣就是高維空間下的一個線性變換,這個線性變化可能沒法通過圖片來表示,但是可以想象,這個變換也同樣有很多的變換方向,我們通過特徵值分解得到的前N個特徵向量,那麼就對應了這個矩陣最主要的N個變化方向。我們利用這前N個變化方向,就可以近似這個矩陣(變換)。也就是之前說的:提取這個矩陣最重要的特徵。總結一下,特徵值分解可以得到特徵值與特徵向量,特徵值表示的是這個特徵到底有多重要,而特徵向量表示這個特徵是什麼,可以將每一個特徵向量理解爲一個線性的子空間,我們可以利用這些線性的子空間幹很多的事情。不過,特徵值分解也有很多的侷限,比如說變換的矩陣必須是方陣。