強大的矩陣奇異值分解(SVD)及其應用

2021-01-14 凡人機器學習

前言:

    上一次寫了關於PCA與LDA的文章,PCA的實現一般有兩種,一種是用特徵值分解去實現的,一種是用奇異值分解去實現的。在上篇文章中便是基於特徵值分解的一種解釋。特徵值和奇異值在大部分人的印象中,往往是停留在純粹的數學計算中。而且線性代數或者矩陣論裡面,也很少講任何跟特徵值與奇異值有關的應用背景。奇異值分解是一個有著很明顯的物理意義的一種方法,它可以將一個比較複雜的矩陣用更小更簡單的幾個子矩陣的相乘來表示,這些小矩陣描述的是矩陣的重要的特性。就像是描述一個人一樣,給別人描述說這個人長得濃眉大眼,方臉,絡腮鬍,而且帶個黑框的眼鏡,這樣寥寥的幾個特徵,就讓別人腦海裡面就有一個較為清楚的認識,實際上,人臉上的特徵是有著無數種的,之所以能這麼描述,是因為人天生就有著非常好的抽取重要特徵的能力,讓機器學會抽取重要的特徵,SVD是一個重要的方法。

    在機器學習領域,有相當多的應用與奇異值都可以扯上關係,比如做feature reduction的PCA,做數據壓縮(以圖像壓縮為代表)的算法,還有做搜尋引擎語義層次檢索的LSI(Latent Semantic Indexing)

    另外在這裡抱怨一下,之前在百度裡面搜索過SVD,出來的結果都是俄羅斯的一種狙擊槍(AK47同時代的),是因為穿越火線這個遊戲裡面有一把狙擊槍叫做SVD,而在Google上面搜索的時候,出來的都是奇異值分解(英文資料為主)。想玩玩戰爭遊戲,玩玩COD不是非常好嗎,玩山寨的CS有神馬意思啊。國內的網頁中的話語權也被這些沒有太多營養的帖子所佔據。真心希望國內的氣氛能夠更濃一點,搞遊戲的人真正是喜歡製作遊戲,搞Data Mining的人是真正喜歡挖數據的,都不是僅僅為了混口飯吃,這樣談超越別人才有意義,中文文章中,能踏踏實實談談技術的太少了,改變這個狀況,從我自己做起吧。

    前面說了這麼多,本文主要關注奇異值的一些特性,另外還會稍稍提及奇異值的計算,不過本文不準備在如何計算奇異值上展開太多。另外,本文裡面有部分不算太深的線性代數的知識,如果完全忘記了線性代數,看本文可能會有些困難。

一、奇異值與特徵值基礎知識:

    特徵值分解和奇異值分解在機器學習領域都是屬於滿地可見的方法。兩者有著很緊密的關係,我在接下來會談到,特徵值分解和奇異值分解的目的都是一樣,就是提取出一個矩陣最重要的特徵。先談談特徵值分解吧:

   1)特徵值:

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

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

    其中Q是這個矩陣A的特徵向量組成的矩陣,Σ是一個對角陣,每一個對角線上的元素就是一個特徵值。我這裡引用了一些參考文獻中的內容來說明一下。首先,要明確的是,一個矩陣其實就是一個線性變換,因為一個矩陣乘以一個向量後得到的向量,其實就相當於將這個向量進行了線性變換。比如說下面的一個矩陣:

       它其實對應的線性變換是下面的形式:

    因為這個矩陣M乘以一個向量(x,y)的結果是:

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

 

 

 

 

    它所描述的變換是下面的樣子:

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

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

   (說了這麼多特徵值變換,不知道有沒有說清楚,請各位多提提意見。)

 

   2)奇異值:

    下面談談奇異值分解。特徵值分解是一個提取矩陣特徵很不錯的方法,但是它只是對方陣而言的,在現實的世界中,我們看到的大部分矩陣都不是方陣,比如說有N個學生,每個學生有M科成績,這樣形成的一個N * M的矩陣就不可能是方陣,我們怎樣才能描述這樣普通的矩陣呢的重要特徵呢?奇異值分解可以用來幹這個事情,奇異值分解是一個能適用於任意的矩陣的一種分解的方法

    假設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就好了。

 

二、奇異值的計算:

    奇異值的計算是一個難題,是一個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了。

    由於奇異值的計算是一個很枯燥,純數學的過程,而且前人的研究成果(論文中)幾乎已經把整個程序的流程圖給出來了。更多的關於奇異值計算的部分,將在後面的參考文獻中給出,這裡不再深入,我還是focus在奇異值的應用中去。

本文由LeftNotEasy發布於http://leftnoteasy.cnblogs.com,



相關焦點

  • 奇異值、奇異矩陣、SVD分解、正交矩陣
    然後,再看此方陣的行列式|A|是否等於0,若等於0,稱矩陣A為奇異矩陣;若不等於0,稱矩陣A為非奇異矩陣。 同時,由|A|≠0可知矩陣A可逆,這樣可以得出另外一個重要結論:可逆矩陣就是非奇異矩陣,非奇異矩陣也是可逆矩陣。如果A為奇異矩陣,則AX=0有非零解或無解。如果A為非奇異矩陣,則AX=0有且只有唯一零解。
  • 奇異值分解及其應用
    特徵值和奇異值在大部分人的印象中,往往是停留在純粹的數學計算中。而且線性代數或者矩陣論裡面,也很少講任何跟特徵值與奇異值有關的應用背景。奇異值分解是一個有著很明顯的物理意義的一種方法,它可以將一個比較複雜的矩陣用更小更簡單的幾個子矩陣的相乘來表示,這些小矩陣描述的是矩陣的重要的特性。
  • SVD奇異值分解的數學涵義及其應用實例
    [online]Ams.org.Availableat: http://www.ams.org/publicoutreach/feature-column/fcarc-svd [Accessed 27 Feb. 2019].[2] Wikipedia contributors. "酉矩陣."維基百科, 自由的百科全書.
  • 數據科學中需要知道的5個關於奇異值分解(SVD)的應用
    線性代數的一種這樣的用途是奇異值分解(SVD)用於降維。你在數據科學中一定很多次遇到SVD。它無處不在,特別是當我們處理降維時。但它是什麼?它是如何工作的?SVD應用有什麼?事實上,SVD是推薦系統的基礎,而推薦系統是谷歌,YouTube,亞馬遜,Facebook等大公司的核心。
  • 奇異值分解(SVD) 的 幾何意義
    這樣我們就把尋找矩陣的奇異值分解過程縮小到了優化函數|Mx|上了。結果發現(具體的推到過程這裡就不詳細介紹了)這個函數取得最優值的向量分別是矩陣 MT M 的特徵向量。由於MTM是對稱矩陣,因此不同特徵值對應的特徵向量都是互相正交的,我們用vi 表示MTM的所有特徵向量。奇異值σi = |Mvi| , 向量 ui 為Mvi 方向上的單位向量。但為什麼ui也是正交的呢?
  • 奇異值分解簡介:從原理到基礎機器學習應用
    矩陣分解在機器學習應用中的重要性無需多言。本文對適用範圍很廣的奇異值分解方法進行了介紹,並通過代碼演示說明了其工作方式、計算方法及其常見的幾種基礎應用。矩陣分解也叫矩陣因子分解,涉及到用給定矩陣的組成元素描述該矩陣。
  • 矩陣的奇異值與特徵值有什麼相似之處與區別之處?
    奇異值分解正是對線性變換這三種效應的一個析構。A=,和是兩組正交單位向量,是對角陣,表示奇異值,它表示我們找到了和這樣兩組基,A矩陣的作用是將一個向量從這組正交基向量的空間旋轉到這組正交基向量空間,並對每個方向進行了一定的縮放,縮放因子就是各個奇異值。如果維度比大,則表示還進行了投影。可以說奇異值分解將一個矩陣原本混合在一起的三種作用效果,分解出來了。
  • 幾何角度理解奇異值分解SVD
    二、SVD的幾何意義奇異值分解SVD ( The singular value decomposition )從幾何意義上來說:對於任意矩陣M,通過SVD。可以將一個相互垂直的坐標變換到另外一個相互垂直的坐標。問題描述:用v1和v2分別表示原來坐標系中的單位向量, 經過左乘矩陣M後,向量Mv1和 Mv2正交。
  • 通俗易懂的講解奇異值分解(SVD)和主成分分析(PCA)
    本教程包含以下內容特徵分解對稱矩陣的特徵分解奇異值分解(The Singular Value Decomposition,奇異值分解(SVD)特徵分解適用於n×n維的方形矩陣,而由於m×n維的矩形矩陣在變換過程中會改變矩陣原本的維數,從而對於矩形矩陣並沒有對其特徵值進行過定義。
  • 推薦系統 | 矩陣分解(SVD)原理和實戰
    推薦系統中的SVD3.1 問題定義3.2 SVD應用3.2.1 traditional-SVD3.2.2 FunkSVD3.2.3 BiasSVD3.2.4 SVD++3.3 矩陣分解推薦小結3.4 SVD實現用戶評分預測(MovieLens數據集)特徵分解——>奇異值分解(
  • 奇異值分解和矩陣分解傻傻分不清楚?一文幫你理清兩者差異!
    在推薦系統的相關研究中,我們常常用到兩個相關概念:矩陣分解和奇異值分解。這兩個概念是同一種算法嗎?兩者到底有什麼差別?在本文中,作者梳理了兩種算法的概念、來源和內容,並進行了比較。通過對相關內容的梳理,作者提出,矩陣分解是推薦系統中最初使用的概念,奇異值分解是對該方法的進一步發展。在現在的討論中,一般將兩種方法統一成為奇異值分解。
  • 深入了解SVD與糾纏
    讓我們聊聊SVD吧。奇異值分解SVD可以說是線性代數中最重要、最著名的工具之一。你可能已經對它非常熟悉了,但這裡還是要快速地回顧一下。每個矩陣MM都可以分解為M=UDV† ,如下圖所示,稱為M的奇異值分解。對角矩陣D的元素為非負數,稱為奇異值,它們的數量等於M的秩,比如說k。更重要的是,U和V正好有k列,分別稱為左、右奇異值向量。
  • 矩陣分解 (乘法篇)
    試想一下,如果不要求逆矩陣了, 而是求解轉置矩陣的話, 那是不是異常方便? 對的, 這就是正交矩陣的強大的優勢。 那麼, 常見的LU, LDL, QR,SVD分解到底是什麼? 我們已經知道, 首先他們全是乘法分解。常見乘法分解LU分解LU分解, 故名思議就是, 把矩陣分成下三角矩陣(Lower)和上三角矩陣(Upper)的一種分解。
  • 「矩陣接近奇異值,或者縮放錯誤」解決方法
    對矩陣求逆或者求解線性方程組時,若出現「矩陣接近奇異值,或者縮放錯誤。結果可能不準確。Matrix is close to singular or badly scaled.直接求逆使用函數x=inv(A)*b,此方法等價於x=A^(-1)*b,但這種方法是通過構造顯式逆矩陣,如果A接近奇異或奇異,會返回不準確的結果。並且實際很少需要知道矩陣求逆結果,一般求解線性方程組時很少使用此種方法。2.
  • 另一個角度看矩陣分析
    為何要引入矩陣 這個問題很好解釋,矩陣使得公式表達更加的方便。就這一便利性而言就值得引入矩陣這一概念,譬如: 在引入基本的矩陣乘法之後,就可以將上述的方程組表達成為按照求解線性方程組的思路,矩陣的逆、廣義逆、偽逆、矩陣的秩出現得就自然而然了。求解過程中需要應用到矩陣的滿秩分解,範數等知識。2. 矩陣計算的根本是什麼 當然,計算過程中,不是求解一個線性方程組的解就夠了的。就拿優化問題來說,解決問題的基本思路中要使用求導(求梯度)。
  • 馬氏距離及其幾何解釋
    協方差矩陣考慮了它們之間的相關性,那麼這裡逆矩陣到底有什麼幾何意義呢。為了更好地揭示馬氏距離的幾何意義,先對協方差矩陣作奇異值分解(SVD),因為協方差矩陣對稱,所以就等價於特徵值分解,同時也得到協方差矩陣的逆矩陣。
  • 如何用張量分解加速深層神經網絡?(附代碼)
    SVD概況奇異值分解使我們能夠分解任何具有n行和m列的矩陣A:S是一個對角矩陣,其對角線上有非負值(奇異值),並且通常被構造成奇異值按降序排列的。U和V是正交矩陣:它認為SVD的推廣的原因是近似為低秩矩陣