1. 程式人生 > >降維之奇異值分解(SVD)

降維之奇異值分解(SVD)

出現 復雜度 display 分享 碎碎念 .html 表示 奇異值分解 整理

看了幾篇關於奇異值分解(Singular Value Decomposition,SVD)的博客,大部分都是從坐標變換(線性變換)的角度來闡述,講了一堆坐標變換的東西,整了一大堆圖,試圖“通俗易懂”地向讀者解釋清楚這個矩陣分解方法。然而這個“通俗易懂”到我這就變成了“似懂非懂”,這些漂亮的圖可把我整懵了。

就像《沒想到吧》裏王祖藍對一個碎碎念的觀眾說的,“我問你的問題是,你是很熟悉鄧紫棋的歌嗎,我只問了你一個問題,你回我這麽多幹嘛”(上B站忍不住又看了鄧紫棋3個視頻,差點回不來)。我就想知道這個奇異值分解的數學公式是什麽,然後明白它是怎麽一步步推導出來的,以及怎麽推導出奇異值分解和主成分分析法的關系,咋就要整這麽多圖呢?

如果你也有這種感覺,那這篇博客就帶著你,以數學推導為主,一步步搞清楚奇異值分解是什麽。這篇博客反其道而行之,全是數學推導,沒有一個圖,就是這麽任性。當然相信我,這些推導並不難。

這篇博客整理如下的內容:

1、奇異值分解的數學公式;

2、奇異值分解的流程總結和案例;

3、用奇異值分解進行降維;

4、特征分解、奇異值分解和主成分分析法的關系;

5、奇異值分解在詞向量降維中的應用。

一、奇異值分解的數學公式

我們直接拋出相關結論,不推導也不證明。

一個n×m的矩陣X的奇異值分解定義為:

技術分享圖片

其中U稱為左奇異矩陣,是一個n×n的正交矩陣,即滿足UT

U=E,UT=U-1;而V稱為右奇異矩陣,是一個m×m的正交矩陣。Σ為n×m的對角矩陣,對角線上的非零元素是奇異值(Singular Value)。

1、求奇異值

首先看Σ或者說奇異值是什麽。如果矩陣X的秩rank(A)=r,那麽實對稱矩陣XTX與X的秩相等,XTX有r個非零的特征值和m-r個零特征值:λ1≥λ2≥ λ3...≥λrr+1=...=λm=0。奇異值σ為:

技術分享圖片

矩陣Σ可以表示為:

技術分享圖片

2、求右奇異矩陣V

然後看右奇異矩陣V是什麽。將V寫成列向量的形式(v1, v2, ...vr,.. vm),那麽V的列向量是實對稱矩陣XTX的單位特征向量,也就是有:

技術分享圖片

3、求左奇異矩陣U

(1)第一種做法

第一種做法更多是為了與右奇異矩陣V的求法相對應,實際計算時會采用另外的方法。前面說了實對稱矩陣XTX與X的秩相等,有r個非零特征值,那麽另一個實對稱矩陣XXT與XTX的秩相等,同樣有r個非零特征值,且這兩個矩陣的非零特征值相等。將U也寫成列向量的形式(u1, u2, ...ur,.. un),那麽U的列向量是實對稱矩陣XXT的單位特征向量,也就是有:

技術分享圖片

看到這裏,雖然不知道這是怎麽推導過來的,但是感受到了一種強烈的數學之美,有沒有!

(2)第二種做法

在第二種做法中,我們會充分利用實對稱矩陣XTX與右奇異矩陣V,來求得左奇異矩陣U,而不用另外去求XXT的單位特征向量。我們首先把XTX的特征值分為兩組:特征值大於零的一組(r個),特征值等於零的一組(m-r個),相應的把右奇異矩陣的列向量分為兩組:前r個非零特征值對應的單位特征向量為V1=(v1, v2, ...vr),而零特征值對應的單位特征向量為V2=(vr+1,.. vm)。再把左奇異矩陣U的列向量也分為兩組,盡管我們還不知道具體的元素值,但是我們知道它有n個列向量:前r個列向量U1=(u1, u2, ...ur),後n-r個列向量U2=(ur+1, ur+2, ...un)。那麽我們可以用X、V1和奇異值構成的對角陣方陣S來求出U1

技術分享圖片

由第一種做法我們已知U1是XXT非零特征值的單位特征向量,那麽U2就是零特征值的單位特征向量了。我們不用去求U2,只要構造n-r個列向量,每一個列向量滿足:與其他n-1個列向量正交,且是單位向量——這通常是比較容易構造的。於是我們就得到了左奇異矩陣U=(U1, U2)。

我們還可以證明一下,由XV1S-1所得到的U1的確滿足:列向量相互正交且為單位向量。這個證明很有用,並不復雜。

技術分享圖片

二、奇異值分解的流程和案例

好,有了第一部分的內容,那盡管我們不知道怎麽推導出來的,我們也已經知道如何進行奇異值分解了。

1、奇異值分解的計算過程

如果有一個n×m的矩陣X,秩為r,那麽對X進行奇異值分解的一種做法是:

(1)求出實對稱矩陣XTX的m個特征值λi(其中非零的有r個)和m個單位特征向量vi

(2)把m個特征值λi從大到小排序,求出奇異值σi=√λi(i=1,...,r),並得到S=diag(σ12,...,σr);

(3)相應地把m個特征向量vi進行排列,就可以得到右奇異矩陣V=(v1, v2, ...vr,.. vm),同時得到非零特征值的特征向量矩陣V1=(v1, v2, ...vr);

(4)由XV1S-1求出n×r的矩陣U1,寫成U1=(u1, u2, ...ur);

(5)構造n-r個列向量ui,每個都滿足與其他n-1個列向量正交且是單位向量的條件,寫成U2=(ur+1, ur+2, ...un),於是得到左奇異矩陣U=(U1, U2)=(u1, u2, ... ur, ..., un);

(6)得到X的奇異值分解:

技術分享圖片

接下來我們就舉一個簡單的例子,按這個流程走一遍。

2、奇異值分解的小案例

問題:

對以下的矩陣X進行奇異值分解。

技術分享圖片

求解:

技術分享圖片

三、用奇異值分解做降維

用奇異值分解做降維,主要用到了線性代數裏的分塊矩陣理論。

1、簡化奇異值分解

我們可以看到矩陣Σ由奇異值和很多0元素構成,這些0看著很多余很難受對不對?尤其是對角線上的!所幸我們可以用分塊矩陣的理論,把Σ中為0的對角元素拋棄掉。

和之前一樣,X是n×m的矩陣,右奇異矩陣V中的前r個列向量為V1=(v1, v2, ...vr),左奇異矩陣U中的前r個列向量為U1=(u1, u2, ...ur),S=diag(σ12,...,σr)是奇異值構成的對角矩陣。則可以將奇異值分解的形式化簡為X=U1SV1T

技術分享圖片

2、用奇異值分解降維

我們是用分塊矩陣對原來的奇異值分解形式進行化簡的,現在讓我們分塊到底!

我們知道U1中有r個列向量,我們再將其分塊,比如我們想把維度降到d維(d<r),那麽把U1分塊為兩個子矩陣U1=[U11, U12],有U11=[u1,u2,...,ud],U12=[ud+1,ud+2,...,ur]。

同樣把V1進行分塊,得到V1=[V11, V12],V11=[v1,v2,...,vd],V12=[vd+1,vd+2,...,vr]。

技術分享圖片

於是我們可以把X=U1SV1T也分塊成:

技術分享圖片

因此如果我們想把維度降到d維,那麽就讓X≈U11S1V11T。這樣我們就舍棄了r-d維的信息U12S2V12T,那不免讓人擔心,信息是否會損失太多。那如何計算損失的信息量呢?

3、度量降維後的信息量

在主成分分析法的文章中,提到了可以用數據集的方差來衡量數據所包含的信息量,方差越大,包含的信息越多。而方差又和特征值密切相關,在某些特殊情況下方差就等於特征值。於是我們隱約感覺到可以用我們求出來的奇異值或者特征值來度量矩陣的信息量。

是的,矩陣X的信息量就定義為所有奇異值的平方和,也就是XTX的特征值之和:F=λ12+…+λr

那麽降維後的矩陣U11S1V11T的信息量為:F112+…+λd,而損失的信息為矩陣U12S2V12T的信息量:F2d+1d+2+…+λr。

於是損失的信息量占總信息量的比例為:

技術分享圖片

這樣我們就可以清晰地看到降到d維後,信息量是否損失太大,是否讓我們無法承受。不過好在S中的奇異值是從大到小進行排列的,而且一般下降得特別快,前面少數幾個奇異值的平方占總信息量的比例一般就已經很大了,剩下的舍棄了影響也不會很大。

好,到這裏我們就明白了怎麽度量降維後的矩陣所包含的信息量了。

然後,作為好奇寶寶的你也許會問,為什麽矩陣X的信息量就是所有奇異值的平方和呢?好的,鄧紫棋已經聽到你的呼喚了,返場唱最後一首歌。這裏是用矩陣X的F範數的平方來度量信息量。

什麽是矩陣的F範數呢?矩陣的F範數定義為矩陣中每個元素平方之和的平方根,那麽F範數的平方就是每個元素的平方和。

技術分享圖片

因為矩陣X每個元素的平方和(F範數的平方)是方陣XTX的對角線元素之和(跡),於是我們進行證明:

技術分享圖片

其實不證明我們也知道方陣XTX的對角線元素之和(跡)就是其特征值之和,哈哈哈,被我帶偏了。

四、特征分解、奇異值值分解與主成分分析法

1、由特征分解到奇異值分解

(1)什麽是特征分解

一個n×n的方陣A的特征分解(Eigenvalue Decomposition )定義為:

技術分享圖片

其中V是n×n的方陣,其中每一列都是A的特征向量,∧是對角陣,其中每一個元素是A的特征值。

如果A是對稱矩陣,那麽A的特征分解就變成了:

技術分享圖片

其中V是正交矩陣,即V-1=VT註意是方陣才可以進行特征分解哦。

(2)推導奇異值分解

如果有一個n×m的矩陣X,我們是沒法對X進行特征分解的,那麽怎麽由特征分解推導出奇異值分解呢?

我們註意到XTX是m×m實對稱矩陣,於是先對XTX進行特征分解:

技術分享圖片

V的列向量是單位特征向量,對角陣∧中的對角元素是特征值,且我們對特征值進行降序排列。假設X的秩為r,那麽非零的特征值有r個。

V中的列向量(v1, v2, ...vr,.. vm)可以看成是m維空間中的m個標準正交基。XTX特征分解就相當於一個線性變換,用標準正交基構成的矩陣V對對角矩陣進行線性變換,得到XTX。

那麽n×m的矩陣X應該也可以由一個n維空間中的n個標準正交基和一個m維空間中的m個標準正交基,對某個矩陣進行線性變換得到。我們想辦法來找到這些標準正交基。

我們就讓XTX的單位特征向量V=(v1, v2, ...vr,.. vm)作為m個標準正交基,再找另外n個標準正交基。瞎折騰了一陣後,突然發現Xvi與Xvj是正交的!

技術分享圖片

太好了!這意味著只要我們把(Xv1,Xv2,..., Xvm)中的非零列向量進行標準化,就可以得到另一組標準正交基了!如果X的秩為r,那麽非零列向量是(Xv1,Xv2,..., Xvr)(我不知道這怎麽來的,裝逼失敗),且滿足:

技術分享圖片

於是我們對Xvi進行標準化:

技術分享圖片

得到了r個標準正交基(u1, u2, ... ur),可是我們需要n個,還少了n-r個。沒關系,我們直接找任意n-r個列向量,填補上去,使得U=(u1, u2, ... ur, ..., un)是一組標準正交基。σi是奇異值,我們用σi作為對角元素來構造一個n×m維的矩陣Σ,那麽X就可以用U和V這兩個標準正交基組對Σ進行線性變換得到,也就是奇異值分解:X=UΣVT

2、奇異值分解與主成分分析法

奇異值分解是主成分分析法的一種常用的解決方案。如果數據集X是一個n×m的矩陣,n是變量的個數,m是樣本的數量,那麽進行主成分分析,也就是用奇異值分解的左奇異矩陣或者右奇異矩陣的裝置作為主成分分析法中的轉換矩陣,去乘以數據集X,從而得到主成分矩陣Y。

(1)為什麽用奇異值分解

可是在《降維之主成分分析法(PCA)》中,我們明白了,可以求出X的協方差矩陣技術分享圖片的單位特征向量矩陣E,用E的轉置ET作為轉換矩陣P,然後由PX=Y得到主成分矩陣,再挑出前k主成分就可以做到降維。那我們直接去求E不就好了嗎?幹嘛還要把奇異值分解拉扯進來?

這是因為求解n維矩陣XXT的特征值和特征向量的算法復雜度為O(n3),因此如果X是高維的數據,也就是n非常大時,進行主成分分析就要計算超大矩陣的特征值。這就出現了算法復雜度過高,計算效率太低的問題。

可是奇異值分解也要對矩陣XTX進行特征分解來求右奇異矩陣V啊,算法復雜度不也是O(n3)?是這樣的,不過對高維矩陣進行奇異值分解時,有一些更高效的算法,不用采取暴力特征分解的方式。

(2)奇異值分解與主成分分析法等價

我們先按照主成分分析法的步驟,對XXT進行特征分解,得到:

技術分享圖片

然後對X進行奇異值分解,沿用前面的符號體系,得到X=UΣVT,把X的奇異值分解代入到上面的特征分解式中:

技術分享圖片

由於在主成分分析法中我們用ET作為轉換矩陣P,那麽從上面的推導可知,可以用X的左奇異矩陣U的轉置UT作為轉換矩陣P,來求出主成分矩陣Y,UTX=Y。

(3)用奇異值分解做主成分降維

X的奇異值分解還可以簡化地寫成X=U1SV1T,同樣代入XXT的特征分解中,得到:XXT=U1SSTU1T。U1=(u1, u2, ...ur)是n×r的矩陣,那麽U1T是一個r×n的矩陣,U1TX就把X的特征從n維降至了r維。

進一步,我們在前面用分塊矩陣的思想,把U1分塊為U1=[U11, U12],U11T是一個d×n維的矩陣,那麽用U11T作為轉換矩陣,就可以把X的特征進一步壓縮至d維。

(4)其他補充

如果你看了其他博主寫的博客,會發現有些是用右奇異矩陣V的轉置VT來作為特征壓縮的轉換矩陣,和本文不一樣。這是因為那些博客把有m個樣本,n維特征的數據集寫成了m×n的矩陣X,而本文把數據集寫成n×m的矩陣,所以那些博客是用右奇異矩陣V,而本文是用左奇異矩陣U。

五、奇異值分解與詞向量降維

我們來看怎麽把奇異值分解用在詞向量降維上。如果我們手頭有一份文本數據集,裏頭有m篇文檔,總共有n個不重復的詞,那麽我們可以通過統計文檔中所有詞出現的次數,整理成一個矩陣X,來構造詞向量。

一般有兩種方法來構造詞向量矩陣:一是TF-IDF,詞向量矩陣是n×m維的,行向量是每個詞的詞向量;二是基於窗口的共現矩陣,如果窗口是1,那麽詞向量矩陣是n×n維的,行向量是每個詞的詞向量。這兩種詞向量的表示方法存在很大的問題,那就是數據稀疏和詞表維度過高。想象一下,如果文檔有10萬篇,詞有5萬個,那會是多麽恐怖的一個場景。

因此我們非常有必要運用奇異值分解,對詞向量矩陣進行降維。

1、對TF-IDF詞向量矩陣進行降維

TF-IDF不用多解釋了,由每個詞的詞頻和逆文檔頻率兩部分計算得到每個詞的TF-IDF,然後所有詞的TF-IDF構成詞向量矩陣Xn×m。這個矩陣太大了,我們對這個矩陣X進行奇異值分解得到U1SV1T,U1是n×r的矩陣,我們用U1的行向量作為n個詞的詞向量,就實現了對文檔數量維度的壓縮。

如果還嫌詞表維度太高,那麽我們可以繼續降維,從U1中拿出前d個列向量,組成新的n×d維的詞向量矩陣U11,行向量作為降到d維後每個詞的詞向量。

d取多少合適呢?我們可以用奇異值的平方和計算降到d維後的剩余的信息量。如果我們希望保留85%的信息,那麽就取以下公式大於或等於85%時的d值,作為降維後的維度。

技術分享圖片

2、對基於窗口的共現矩陣進行降維

這種方法是用一個相關性矩陣來構造詞向量矩陣,叫做共現矩陣。 假設有3個句子(看成三篇文檔也沒毛病),一共8個不重復的詞(把標點也算上),窗口設定為1,也就是把句子拆成一個個的詞。

  • I enjoy flying.
  • I like NLP.
  • I like deep learning

那麽共現矩陣就是一個8維的方陣X:

技術分享圖片

同樣用奇異值分解,把X分解為X=U1SV1T,然後用U1的行向量作為每次詞的詞向量,就把詞向量的維度從n維降到了r維。如果覺得還太高了,那麽可以按照TF-IDF中的做法,繼續進行降維。

參考資料:

1、《A Tutorial on Principal Component Analysis. Derivation, Discussion and Singular Value Decomposition》

2、《A Singularly Valuable Decomposition: The SVD of a Matrix

降維之奇異值分解(SVD)