特徵值和奇異值在大部分人的印象中,每每是停留在純粹的數學計算中。並且線性代數或者矩陣論裏面,也不多講任何跟特徵值與奇異值有關的應用背景。html
奇異值分解是一個有着很明顯的物理意義的一種方法,它能夠將一個比較複雜的矩陣用更小更簡單的幾個子矩陣的相乘來表示,這些小矩陣描述的是矩陣的重要的特性。就像是描述一我的同樣,給別人描述說這我的長得濃眉大眼,方臉,絡腮鬍,並且帶個黑框的眼鏡,這樣寥寥的幾個特徵,就讓別人腦海裏面就有一個較爲清楚的認識,實際上,人臉上的特徵是有着無數種的,之因此能這麼描述,是由於人天生就有着很是好的抽取重要特徵的能力,讓機器學會抽取重要的特徵,SVD是一個重要的方法。算法
在機器學習領域,有至關多的應用與奇異值均可以扯上關係,好比作feature reduction的PCA,作數據壓縮(以圖像壓縮爲表明)的算法,還有作搜索引擎語義層次檢索的LSI(Latent Semantic Indexing) app
1、特徵值與奇異值 框架
特徵值分解和奇異值分解在機器學習領域都是屬於滿地可見的方法。二者有着很緊密的關係,接下來會談到特徵值分解和奇異值分解的目的都是同樣,就是提取出一個矩陣最重要的特徵。先談特徵值分解。機器學習
1.1 特徵值 學習
若是說一個向量v是方陣A的特徵向量,將必定能夠表示成下面的形式子 : Av = λv搜索引擎
這時候λ就被稱爲特徵向量v對應的特徵值,一個矩陣的一組特徵向量是一組正交向量。特徵值分解是將一個矩陣分解成下面的形式:A = Q∑Q-1雲計算
其中Q是這個矩陣A的特徵向量組成的矩陣,Σ是一個對角陣,每個對角線上的元素就是一個特徵值。我這裏引用了一些參考文獻中的內容來講明一下。htm
首先,要明確的是,一個矩陣其實就是一個線性變換,由於一個矩陣乘以一個向量後獲得的向量,其實就至關於將這個向量進行了線性變換。好比說下面的一個矩陣:blog
它其實對應的線性變換是下面的形式:
由於這個矩陣M乘以一個向量(x,y)的結果是:
上面的矩陣是對稱的,因此這個變換是一個對x,y軸的方向一個拉伸變換(每個對角線上的元素將會對一個維度進行拉伸變換,當值>1時,是拉長,當值<1時時縮短),當矩陣不是對稱的時候,假如說矩陣是下面的樣子:
它所描述的變換是下面的樣子:
這實際上是在平面上對一個軸進行的拉伸變換(如藍色的箭頭所示),在圖中,藍色的箭頭是一個最主要的變化方向(變化方向可能有不止一個),若是咱們想要描述好一個變換,那咱們就描述好這個變換主要的變化方向就行了。反過頭來看看以前特徵值分解的式子,分解獲得的Σ矩陣是一個對角陣,裏面的特徵值是由大到小排列的,這些特徵值所對應的特徵向量就是描述這個矩陣變化方向(從主要的變化到次要的變化排列)。
考慮更通常的非對稱矩陣
很遺憾,此時咱們再也找不到一組網格,使得矩陣做用在該網格上以後只有拉伸變換(找不到背後的數學緣由是對通常非對稱矩陣沒法保證在實數域上可對角化,不明白也不要在乎)。
咱們退而求其次,找一組網格,使得矩陣做用在該網格上以後容許有拉伸變換和旋轉變換,但要保證變換後的網格依舊互相垂直,這是能夠作到的,以下圖所示。
簡言之,當矩陣是高維的狀況下,那麼這個矩陣就是高維空間下的一個線性變換,這個變換也一樣有不少的變換方向,咱們經過特徵值分解獲得的前N個特徵向量,那麼就對應了這個矩陣最主要的N個變化方向。咱們利用這前N個變化方向,就能夠近似這個矩陣(變換)。
也就是以前說的:提取這個矩陣最重要的特徵。總結一下,特徵值分解能夠獲得特徵值與特徵向量,特徵值表示的是這個特徵到底有多重要,而特徵向量表示這個特徵是什麼,能夠將每個特徵向量理解爲一個線性的子空間,咱們能夠利用這些線性的子空間幹不少的事情。不過,特徵值分解也有不少的侷限,好比說變換的矩陣必須是方陣。
下面咱們就能夠天然過渡到奇異值分解的引入。
1.2 奇異值
下面談談奇異值分解。特徵值分解是一個提取矩陣特徵很不錯的方法,可是它只是對方陣而言的,在現實的世界中,咱們看到的大部分矩陣都不是方陣,
好比說有N個學生,每一個學生有M科成績,這樣造成的一個N * M的矩陣就不多是方陣,咱們怎樣才能描述這樣普通的矩陣呢的重要特徵呢?
奇異值分解能夠用來幹這個事情,奇異值分解是一個能適用於任意的矩陣的一種分解的方法: A = UΣVT
假設A是一個N * M的矩陣,那麼獲得的U是一個N * N的方陣(裏面的向量是正交的,U裏面的向量稱爲左奇異向量)
Σ是一個N * M的矩陣(除了對角線的元素都是0,對角線上的元素稱爲奇異值)
V’(V的轉置)是一個N * N的矩陣,裏面的向量也是正交的,V裏面的向量稱爲右奇異向量),從圖片來反映幾個相乘的矩陣的大小可得下面的圖片
那麼奇異值和特徵值是怎麼對應起來的呢?首先,咱們將一個矩陣A的轉置 * A,將會獲得一個方陣,咱們用這個方陣求特徵值能夠獲得:
這裏獲得的v,就是咱們上面的右奇異向量。此外咱們還能夠獲得:
這裏的σ就是上面說的奇異值,u就是上面說的左奇異向量。奇異值σ跟特徵值相似,在矩陣Σ中也是從大到小排列,並且σ的減小特別的快,在不少狀況下,前10%甚至1%的奇異值的和就佔了所有的奇異值之和的99%以上了。也就是說,咱們也能夠用前r大的奇異值來近似描述矩陣,這裏定義一下部分奇異值分解:
r是一個遠小於m、n的數,這樣矩陣的乘法看起來像是下面的樣子:
右邊的三個矩陣相乘的結果將會是一個接近於A的矩陣,在這兒,r越接近於n,則相乘的結果越接近於A。而這三個矩陣的面積之和(在存儲觀點來講,矩陣面積越小,存儲量就越小)要遠遠小於原始的矩陣A,咱們若是想要壓縮空間來表示原矩陣A,咱們存下這裏的三個矩陣:U、Σ、V就行了。
說句大白話,稱做「奇異值」可能沒法顧名思義迅速理解其本質,那我們換個說法,稱做「主特徵值」,你可能就迅速瞭然了。
而奇異值分解的幾何含義爲:對於任何的一個矩陣,咱們要找到一組兩兩正交單位向量序列,使得矩陣做用在此向量序列上後獲得新的向量序列保持兩兩正交。
繼續拿1.1節的例子進一步闡述,奇異值的幾何含義爲:這組變換後的新的向量序列的長度。
奇異值的計算是一個難題,是一個O(N^3)的算法。在單機的狀況下固然是沒問題的,matlab在一秒鐘內就能夠算出1000 * 1000的矩陣的全部奇異值,可是當矩陣的規模增加的時候,計算的複雜度呈3次方增加,就須要並行計算參與了。Google的吳軍老師在數學之美系列談到SVD的時候,提及Google實現了SVD的並行化算法,說這是對人類的一個貢獻,可是也沒有給出具體的計算規模,也沒有給出太多有價值的信息。
其實SVD仍是能夠用並行的方式去實現的,在解大規模的矩陣的時候,通常使用迭代的方法,當矩陣的規模很大(好比說上億)的時候,迭代的次數也可能會上億次,若是使用Map-Reduce框架去解,則每次Map-Reduce完成的時候,都會涉及到寫文件、讀文件的操做。我的猜想Google雲計算體系中除了Map-Reduce之外應該還有相似於MPI的計算模型,也就是節點之間是保持通訊,數據是常駐在內存中的,這種計算模型比Map-Reduce在解決迭代次數很是多的時候,要快了不少倍。
Lanczos迭代就是一種解對稱方陣部分特徵值的方法(以前談到了,解A’* A獲得的對稱方陣的特徵值就是解A的右奇異向量),是將一個對稱的方程化爲一個三對角矩陣再進行求解。按網上的一些文獻來看,Google應該是用這種方法去作的奇異值分解的。請見Wikipedia上面的一些引用的論文,若是理解了那些論文,也「幾乎」能夠作出一個SVD了。
2、奇異值的直觀應用
參考文獻
1 https://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
2 https://www.zhihu.com/question/22237507 3 We Recommend a Singular Value Decomposition(Feature Column from the AMS)
僅供我的學習使用 轉載請註明來源
編輯 ∑Pluto
來源:七月算法