關於特徵值、特徵向量的講解有很多的教程,對於這些枯燥的數學基礎怎麼運用到自己的實際計算機視覺實驗中,是一項很重要的任務。算法的底層其實就是數學公式的各種結合與推導,有時間不是我們不能很好的去理解這些算法基礎,而是沒有一個很好的教程帶領我們這些小白去一步步的從底層學習。寫博客的目的一方面就是記錄自己的總結,另一方面就是用自己的大白話去描述這些專業的術語與思想,方便自己能看懂學習。(以上純屬個人觀點)
----------矩陣---------
首先,我們把矩陣比作跑步,跑步最重要的就是知道兩個要素方向(朝哪個方向跑)和速度(我要跑的多快),而矩陣的特徵向量就是跑步的方向,矩陣的特徵值就是跑步的速度。(這個比喻只是幫助大家理解怎麼由數學概念轉換到實際生活運用中)
---------線性變換-------
我們知道,矩陣乘法對應了一個變換,是把任意一個向量變成另一個方向或長度都大多不同的新向量。在這個變換的過程中,原向量主要發生旋轉、伸縮的變化。如果矩陣對某一個向量或某些向量只發生伸縮變換,不對這些向量產生旋轉的效果,那麼這些向量就稱爲這個矩陣的特徵向量,伸縮的比例就是特徵值。實際上,上述的一段話既講了矩陣變換特徵值及特徵向量的幾何意義(圖形變換)也講了其物理含義。物理的含義就是運動的圖景:特徵向量在一個矩陣的作用下作伸縮運動,伸縮的幅度由特徵值確定。特徵值大於1,所有屬於此特徵值的特徵向量身形暴長;特徵值大於0小於1,特徵向量身形猛縮;特徵值小於0,特徵向量縮過了界,反方向到0點那邊去了。關於特徵值和特徵向量,這裏請注意兩個亮點。這兩個亮點一個是線性不變量的含義,二個是振動的譜含義。
所謂的線性變換(旋轉、伸縮)就是向量在不同的基(其實就是單位特徵向量組成的座標系)之間進行變來變去。下圖給出了所用的基和原點:
1.在和基下面有一個(如左圖): 2.將左乘一個矩陣A,可得下圖(如中圖): 3.再將左乘一個矩陣A,可得下圖(如右圖):
3.下面改變一下的方向:(如左圖) 4.再將左乘一個矩陣A,可得下圖(如右圖):
得出結論:
如果存在某個或某些向量在A作用之後,它只是伸長或者縮短,其位置仍停留在其原來張成的直線上,那麼稱之爲A的特徵向量,伸長或者縮短的倍數稱爲對應特徵向量的特徵值。
1.未改變方向的A在同一條直線上,只是A的長度要比短。縮短了倍,該是矩陣A的特徵值,對應的A是矩陣A的特徵向量。
2.經過改變方向後的和A在同一條直線上,只是A的長度要比長,則是矩陣A的特徵向量,而A在長度上是的倍,該也是矩陣A的特徵值。即在矩陣A的作用下,保持方向不變,進行倍的拉伸。可寫作:
(從上述結果可以看出,矩陣A不止有一個特徵值與特徵向量,特徵向量所在直線上的向量都是特徵向量)
特徵向量所在直線包含了所有的特徵向量,這些總的組成了特徵空間。
(兩個紅色箭頭就是最大特徵值,最小特徵值,之間組成了特徵空間,改變的位置,以及矩陣A的值,特徵空間會隨着矩陣的變化而改變,即上述所比喻的跑步,所對應的速度最大的方向就是由最大特徵值對應的特徵向量表現出來的)
特徵向量是線性不變量:所謂特徵向量概念的亮點之一是不變量,這裏叫線性不變量。因爲我們常講,線性變換啊線性變換,不就是把一根線(向量)變成另一根線(向量),線的變化的地方大多是方向和長度一塊變。而一種名叫“特徵向量”的向量特殊,在矩陣作用下不變方向只變長度。不變方向的特性就被稱爲線性不變量。(特徵向量之所以被稱爲“特徵”,因爲它具有不變的特性)
特徵值與特徵向量性質:
1.只有方陣纔有特徵值和特徵向量
方陣總有特徵值,因爲總有特徵多項式(特徵方程),但不是所有方陣都有實數特徵解
實方陣一定有實數特徵解
2.不同特徵值對應的特徵向量是線性無關的
3.對於實對稱矩陣或埃爾米特矩陣來說,不同特徵值對應的特徵向量必定正交(相互垂直)
--------舉例--------
以對角矩陣爲例:
------------相似矩陣---------------
設 A,B 都是 n 階矩陣,若有可逆矩陣 P ,使 AP=B, 則稱 B 是 A 的相似矩陣,或說 A 和 B 相似。
運用的幾何意義是:同一線性變換在不同基下的表達形式(類似於直角座標到極座標系下圖像是不會變換的)。(掌握相似矩陣的性質)
----------對角矩陣--------
對角矩陣(diagonal matrix)是一個主對角線之外的元素皆爲0的矩陣,常寫爲diag(a1,a2,…,an) 。對角矩陣可以認爲是矩陣中最簡單的一種,值得一提的是:對角線上的元素可以爲 0 或其他值,對角線上元素相等的對角矩陣稱爲數量矩陣;對角線上元素全爲1的對角矩陣稱爲單位矩陣。對角矩陣的運算包括和、差運算、數乘運算、同階對角陣的乘積運算,且結果仍爲對角陣。
-----矩陣對角化:對n階矩陣A,如果可以找到可逆矩陣P,使得AP=對角陣,就稱爲把方陣A對角化。
矩陣對角化的充要條件:n階矩陣有n個線性無關的特徵向量。
推論:若n階方陣A有n個互不相同的特徵值,則A可對角化。而且:1.對角陣的主對角元素爲A的特徵值。2. 可逆矩陣P由A的n個線性無關的特徵向量作列向量構成。
可對角化,是有條件的,這裏又用到了特徵向量。你只有找到A的n個線性無關的特徵向量,才能將A順利地對角化。
根據特徵值與特徵向量,用於找矩陣的相似對角陣,非常有意義。
舉例:
---------
------特徵值分解---------------
首先解釋一下爲什麼這些值叫特徵值,這些向量叫特徵向量。因爲:
1.在相似變換中,這些東西不變,而且其他不變性質可以通過特徵值不變來推導;所以特徵值是相似的這些矩陣的集合(這一類矩陣)的公共屬性,它當然可以作爲特徵。
2.從幾何意義上講,特徵向量描述了矩陣對應的線性變換的主要變換方向。線性變換對向量的作用是伸縮(新的長度)和旋轉(新的方向),旋轉會消減拉伸的作用,特徵向量只有伸縮沒有旋轉,它就代表了這個線性變換的主要方向;那麼特徵值就是描述該方向上的變換速度(倍數),所以把特徵值排序,從大到小的特徵值及其特徵向量能近似地描述原矩陣的主變換方向和變換速度。
特徵值分解是找最相似的矩陣:
特徵值分解是將一個矩陣分解爲如下形式: A=Q∑,
其中,Q是這個矩陣A的特徵向量組成的矩陣,Σ是一個對角矩陣,每一個對角線元素就是一個特徵值,裏面的特徵值是由大到小排列的,這些特徵值所對應的特徵向量就是描述這個矩陣變化方向(從主要的變化到次要的變化排列)。也就是說矩陣A的信息可以由其特徵值和特徵向量表示。
對於矩陣爲高維的情況下,那麼這個矩陣就是高維空間下的一個線性變換。可以想象,這個變換也同樣有很多的變換方向,我們通過特徵值分解得到的前N個特徵向量,那麼就對應了這個矩陣最主要的N個變化方向。我們利用這前N個變化方向,就可以近似這個矩陣(變換)。
總結一下,特徵值分解可以得到特徵值與特徵向量,特徵值表示的是這個特徵到底有多重要,而特徵向量表示這個特徵是什麼。不過,特徵值分解也有很多的侷限,比如說變換的矩陣必須是方陣。
----------具體應用在圖像壓縮上,比如說,有這麼一副512×512的圖片(方陣纔有特徵值),這個圖片可以放到一個矩陣裏面去,就是把每個像素的顏色值填入到一個512×512512×512的 A 矩陣中。根據之前的矩陣對角化A=p,其中爲對角陣,對角線上是從大到小排列的特徵值,我們只保留前面50個的特徵值(也就是最大的50個,其實也只佔了所有特徵值的百分之十),其它的都填0,重新計算矩陣後,利用新得到的矩陣,進行恢復圖像,效果仍然與原圖像差不多。
----------------
1.左乘矩陣
上述操作發生旋轉變成了標準基(如上述右圖)
2.繼續左乘矩陣,
得到如下圖:
這兩次相乘對應於前邊的講解,第一次乘以P特徵向量,(就是對基進行旋轉)相當於指明瞭跑步的方向。第二次乘以特徵值,就是指明瞭跑步的速度的大小。
因此如果特徵向量正交,這樣就能保證變換的最大方向在基方向,如果特徵向量不正交就不能保證變換在最大方向上。因此,在實際應用中就要去找正交基,但是特徵向量很有可能不是正交的,故需要奇異值分解(SVD)。
3.在上述基礎上再次的左乘,就會把基變換回去。如下圖:
(在此整個過程中只是把整個圖像座標系給旋轉、拉伸了而已。圖像並沒有變化)
//Python求特徵值與特徵向量
>>> import numpy as np
>>> a=np.array([[2,-1],[-1,2]])
>>> a
array([[ 2, -1],
[-1, 2]])
>>> e,q=np.linalg.eig(a)
>>> e # 特徵值
array([ 3., 1.])
>>> q # 特徵向量作爲列向量
array([[ 0.70710678, 0.70710678],
[-0.70710678, 0.70710678]])
>>>
>>> a=np.array([[1,2,3],[3,2,5],[1,10,8]])
>>> e,q=np.linalg.eig(a)
>>> e
array([ 13.50864036, -0.42667365, -2.0819667 ])
>>> q
array([[-0.27543318, -0.6534998 , -0.23748816],
[-0.44255955, -0.44847532, -0.67779488],
[-0.85339183, 0.60976053, 0.69584012]])
>>>
>>> E=np.diag(e) # 對角陣
>>> E
array([[ 13.50864036, 0. , 0. ],
[ 0. , -0.42667365, 0. ],
[ 0. , 0. , -2.0819667 ]])
圖片截取來自知乎。