奇异值分解SVD与PCA
首先:奇異值分解是一個有著很明顯的物理意義的一種方法,它可以將一個比較復雜的矩陣用更小更簡單的幾個子矩陣的相乘來表示,這些小矩陣描述的是矩陣的重要的特性。
1. 奇異值與特征值基礎知識
特征值分解和奇異值分解的目的都是一樣,就是提取出一個矩陣最重要的特征。
1.1 特征值
如果說一個向量v是方陣A的特征向量,將一定可以表示成下面的形式:
這時候λ就被稱為特征向量v對應的特征值,一個矩陣的一組特征向量是一組正交向量。特征值分解是將一個矩陣分解成下面的形式:
A=QΣQ?1
其中Q是這個矩陣A的特征向量組成的矩陣,Σ是一個對角陣,每一個對角線上的元素就是一個特征值。其實一個矩陣其實就是一個線性變換,因為一個矩陣乘以一個向量后得到的向量,其實就相當于將這個向量進行了線性變換。
- 比如說下面的一個對稱矩陣:
M=[3001]
矩陣M乘以一個向量(x,y)的結果是:
[3001][xy]=[3xy]
上面的矩陣是對稱的,所以這個變換是一個對x,y軸的方向一個拉伸變換(每一個對角線上的元素將會對一個維度進行拉伸變換,當值>1時,是拉長,當值<1時時縮短)。 - 當矩陣不是對稱的時候,假如說矩陣是下面的樣子:
M=[1011]
這其實是在平面上的一個主要方向進行的拉伸變換(變化方向可能有不止一個),想要描述好一個變換,那就描述好這個變換主要的變化方向。反過頭來看看之前特征值分解的式子,分解得到的Σ矩陣是一個對角陣,里面的特征值是由大到小排列的,這些特征值所對應的特征向量就是描述這個矩陣變化方向(從主要的變化到次要的變化排列),但此處要注意的是特征值分解時變換的矩陣必須是方陣。
1.2 奇異值
特征值分解是一個提取矩陣特征很不錯的方法,但是它只是對方陣而言的,在現實的世界中,我們看到的大部分矩陣都不是方陣,奇異值分解可以用來干這個事情,奇異值分解是一個能適用于任意的矩陣的一種分解的方法:
A=UΣVT
- 假設A是一個N?M的矩陣,那么得到的U是一個N?N的方陣(里面的向量是正交的,U里面的向量稱為左奇異向量),Σ是一個N?M的矩陣(除了對角線的元素都是0,對角線上的元素稱為奇異值),VT(V的轉置)是一個N?N的矩陣,里面的向量也是正交的,V里面的向量稱為右奇異向量)。
- 矩陣Σ中也是從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就占了全部的奇異值之和的99%以上了。也就是說,我們也可以用前r大的奇異值來近似描述矩陣。
從下圖可以反映幾個相乘的矩陣:
最下面右邊的三個矩陣相乘的結果將會是一個接近于A的矩陣,在這兒,r越接近于n,則相乘的結果越接近于A。而這三個矩陣的占用存儲遠小于原始的矩陣A,比如:原始矩陣10?8=80,而奇異值分解后:10?2+2?2+2?8=40,可以看出壓縮了一半。
2. PCA的數學原理
這里我想把PCA 的理論精要的做個筆記:
PCA(Principal Component Analysis)是一種常用的數據分析方法。PCA通過線性變換將原始數據變換為一組各維度線性無關的表示,可用于提取數據的主要特征分量,常用于高維數據的降維。
2.1 數據的向量表示及降維問題
一般情況下,在數據挖掘和機器學習中,數據被表示為向量。注意這里用的是轉置,因為習慣上使用列向量表示一條記錄。
降維的樸素思想很容易理解,但并不具有操作指導意義。例如,我們到底刪除哪一列損失的信息才最小?亦或根本不是單純刪除幾列,而是通過某些變換將原始數據變為更少的列但又使得丟失的信息最小?到底如何度量丟失信息的多少?如何根據原始數據決定具體的降維操作步驟?
要回答上面的問題,就要對降維問題進行數學化和形式化的討論。而PCA是一種具有嚴格數學基礎并且已被廣泛采用的降維方法。下面我不會直接描述PCA,而是通過逐步分析問題。
2.2 向量的表示及基變換
既然我們面對的數據被抽象為一組向量,那么下面有必要研究一些向量的數學性質。
- 內積
兩個維數相同的向量的內積被定義為:
(a1,a2,?,an)T?(b1,b2,?,bn)T=a1b1+a2b2+?+anbn
內積運算將兩個向量映射為一個實數。其計算方式非常容易理解,下面我們分析內積的幾何意義。假設A和B是兩個n維向量,我們知道n維向量可以等價表示為n維空間中的一條從原點發射的有向線段,為了簡單起見我們假設A和B均為二維向量,則A=(x1,y1),B=(x2,y2)。
現在我們從A點向B所在直線引一條垂線。我們知道垂線與B的交點叫做A在B上的投影,再設A與B的夾角是a,如果我們將內積表示為另一種我們熟悉的形式:
A?B=|A||B|cos(α)
A與B的內積等于A到B的投影長度乘以B的模。再進一步,如果我們假設B的模為1,即讓|B|=1,那么就變成了:
A?B=|A|cos(a)
也就是說,設向量B的模為1,則A與B的內積值等于A向B所在直線投影的矢量長度!這就是內積的一種幾何解釋。
2.3 基
在代數表示方面,我們經常用線段終點的點坐標表示向量,例如上面的向量可以表示為(3,2),這是我們再熟悉不過的向量表示。
不過我們常常忽略,只有一個(3,2)本身是不能夠精確表示一個向量的。我們仔細看一下,這里的3實際表示的是向量在x軸上的投影值是3,在y軸上的投影值是2。也就是說我們其實隱式引入了一個定義:以x軸和y軸上正方向長度為1的向量為標準。那么一個向量(3,2)實際是說在x軸投影為3而y軸的投影為2。注意投影是一個矢量,所以可以為負。
更正式的說,向量(x,y)實際上表示線性組合:
不難證明所有二維向量都可以表示為這樣的線性組合。此處(1,0)和(0,1)叫做二維空間中的一組基。
所以,要準確描述向量,首先要確定一組基,然后給出在基所在的各個直線上的投影值,就可以了。只不過我們經常省略第一步,而默認以(1,0)和(0,1)為基。
這里之所以默認選擇(1,0)和(0,1)為基,當然是比較方便,因為它們分別是x和y軸正方向上的單位向量,因此就使得二維平面上點坐標和向量一一對應,非常方便。但實際上任何兩個線性無關的二維向量都可以成為一組基,所謂線性無關在二維平面內可以直觀認為是兩個不在一條直線上的向量。
(1,1)和(?1,1)也可以成為一組基。一般來說,我們希望基的模是1,因為從內積的意義可以看到,如果基的模是1,那么就可以方便的用向量點乘基而直接獲得其在新基上的坐標了!實際上,對應任何一個向量我們總可以找到其同方向上模為1的向量,只要讓兩個分量分別除以模就好了。例如,上面的基可以變為(12√,12√)和
(?12√,12√)
現在,我們想獲得(3,2)在新基上的坐標,即在兩個方向上的投影矢量值,那么根據內積的幾何意義,我們只要分別計算(3,2)和兩個基的內積,不難得到新的坐標為(52√,?12√)。
另外這里要注意的是,我們列舉的例子中基是正交的(即內積為0,或直觀說相互垂直),但可以成為一組基的唯一要求就是線性無關,非正交的基也是可以的。不過因為正交基有較好的性質,所以一般使用的基都是正交的。
2.4 基變換的矩陣表示
下面我們找一種簡便的方式來表示基變換。還是拿上面的例子,想一下,將(3,2)變換為新基上的坐標,就是用(3,2)與第一個基做內積運算,作為第一個新的坐標分量,然后用(3,2)與第二個基做內積運算,作為第二個新坐標的分量。實際上,我們可以用矩陣相乘的形式簡潔的表示這個變換:
其中矩陣的兩行分別為兩個基,乘以原向量,其結果剛好為新基的坐標,可以以此推廣下去。
一般的,如果我們有M個N維向量,想將其變換為由R個N維向量表示的新空間中,那么首先將R個基按行組成矩陣A,然后將向量按列組成矩陣B,那么兩矩陣的乘積AB就是變換結果,其中AB的第m列為A中第m列變換后的結果。
數學表示為:
其中pi是一個行向量,表示第i個基,aj是一個列向量,表示第j個原始數據記錄。
特別要注意的是,這里R可以小于N,而R決定了變換后數據的維數。也就是說,我們可以將一N維數據變換到更低維度的空間中去,變換后的維度取決于基的數量。因此這種矩陣相乘的表示也可以表示降維變換。
最后,上述分析同時給矩陣相乘找到了一種物理解釋:兩個矩陣相乘的意義是將右邊矩陣中的每一列列向量變換到左邊矩陣中每一行行向量為基所表示的空間中去。更抽象的說,一個矩陣可以表示一種線性變換。在學線性代數時對矩陣相乘的方法感到奇怪,但是如果明白了矩陣相乘的物理意義,其合理性就一目了然了。
2.5 協方差矩陣及優化目標
上面我們討論了選擇不同的基可以對同樣一組數據給出不同的表示,而且如果基的數量少于向量本身的維數,則可以達到降維的效果。但是我們還沒有回答一個最最關鍵的問題:如何選擇基才是最優的。或者說,如果我們有一組N維向量,現在要將其降到K維(K小于N),那么我們應該如何選擇K個基才能最大程度保留原有的信息?
這里我們用一種非形式化的直觀方法來看這個問題:
為了避免過于抽象的討論,我們仍以一個具體的例子展開。假設我們的數據由五條記錄組成,將它們表示成矩陣形式:
其中每一列為一條數據記錄,而一行為一個字段。為了后續處理方便,我們首先將每個字段內所有值都減去字段均值,其結果是將每個字段都變為均值為0。
得到:
(?1?2?10002101)
如果我們必須使用一維來表示這些數據,又希望盡量保留原始的信息,你要如何選擇?
通過上一節對基變換的討論我們知道,這個問題實際上是要在二維平面中選擇一個方向,將所有數據都投影到這個方向所在直線上,用投影值表示原始記錄。這是一個實際的二維降到一維的問題。
那么如何選擇這個方向(或者說基)才能盡量保留最多的原始信息呢?一種直觀的看法是:希望投影后的投影值盡可能分散。
2.6 方差
我們希望投影后投影值盡可能分散,而這種分散程度,可以用數學上的方差來表述。此處,一個字段的方差可以看做是每個元素與字段均值的差的平方和的均值,即:
由于上面我們已經將每個字段的均值都化為0了,因此方差可以直接用每個元素的平方和除以元素個數表示:
Var(a)=1m∑i=1ma2i
于是上面的問題被形式化表述為:尋找一個一維基,使得所有數據變換為這個基上的坐標表示后,方差值最大。
2.7 協方差
最終要達到的目的與字段內方差及字段間協方差有密切關系。因此我們希望能將兩者統一表示,仔細觀察發現,兩者均可以表示為內積的形式,而內積又與矩陣相乘密切相關。于是假設我們只有a和b兩個字段,那么我們將它們按行組成矩陣X:
然后我們用X乘以X的轉置,并乘上系數1m:
1mXXT=???????1m∑i=1ma2i1m∑i=1maibi1m∑i=1maibi1m∑i=1mb2i???????
這個矩陣對角線上的兩個元素分別是兩個字段的方差,而其它元素是a和b的協方差。兩者被統一到了一個矩陣的。
根據矩陣相乘的運算法則,這個結論很容易被推廣到一般情況:
設我們有m個n維數據記錄,將其按列排成n乘m的矩陣X,設C=1mXXTC,則C是一個對稱矩陣,其對角線分別個各個字段的方差,而第i行j列和j行i列元素相同,表示i和j兩個字段的協方差。
2.8 協方差矩陣對角化
根據上述推導,我們發現要達到優化目前,等價于將協方差矩陣對角化:即除對角線外的其它元素化為0,并且在對角線上將元素按大小從上到下排列,這樣我們就達到了優化目的。進一步看下原矩陣與基變換后矩陣協方差矩陣的關系:
設原始數據矩陣X對應的協方差矩陣為C,而P是一組基按行組成的矩陣,設Y=PX,則Y為X對P做基變換后的數據。設Y的協方差矩陣為D,我們推導一下D與C的關系:
此時可以看出:
我們要找的P不是別的,而是能讓原始協方差矩陣對角化的P。換句話說,優化目標變成了尋找一個矩陣P,滿足PCPT是一個對角矩陣,并且對角元素按從大到小依次排列,那么P的前K行就是要尋找的基,用P的前K行組成的矩陣乘以X就使得X從N維降到了K維并滿足上述優化條件。
現在所有焦點都聚焦在了協方差矩陣對角化問題上,這在數學上根本不是問題。由上文知道,協方差矩陣C是一個是對稱矩陣,在線性代數上,實對稱矩陣有一系列非常好的性質:
- 實對稱矩陣不同特征值對應的特征向量必然正交。
- 設特征向量λ重數為r,則必然存在r個線性無關的特征向量對應于λλ,因此可以將這r個特征向量單位正交化。
由上面兩條可知,一個n行n列的實對稱矩陣一定可以找到n個單位正交特征向量,設這n個特征向量為e1,e2,?,en,我們將其按列組成矩陣:
則對協方差矩陣C有如下結論:
到這里,我們發現我們已經找到了需要的矩陣P:
P是協方差矩陣的特征向量單位化后按行排列出的矩陣,其中每一行都是C的一個特征向量。如果設P按照Λ中特征值的從大到小,將特征向量從上到下排列,則用P的前K行組成的矩陣乘以原始數據矩陣X,就得到了我們需要的降維后的數據矩陣Y。
3. 奇異值與主成分分析(PCA)
這里主要談談如何用SVD去解PCA的問題:
3.1 PCA
PCA的問題其實是一個基的變換,使得變換后的數據有著最大的方差。方差的大小描述的是一個變量的信息量,我們在講一個東西的穩定性的時候,往往說要減小方差,如果一個模型的方差很大,那就說明模型不穩定了。但是對于用于機器學習的數據(主要是訓練數據),方差大才有意義,不然輸入的數據都是同一個點,那方差就為0了,這樣輸入的多個數據就等同于一個數據了。以下面這張圖為例子:
假如我們想要用一條直線去擬合這些點,那我們會選擇什么方向的線呢?當然是圖上標有signal的那條線。如果我們把這些點單純的投影到x軸或者y軸上,最后在x軸與y軸上得到的方差是相似的(因為這些點的趨勢是在45度左右的方向,所以投影到x軸或者y軸上都是類似的),如果我們使用原來的xy坐標系去看這些點,容易看不出來這些點真正的方向是什么。但是如果我們進行坐標系的變化,橫軸變成了signal的方向,縱軸變成了noise的方向,則就很容易發現什么方向的方差大,什么方向的方差小了。
一般來說,方差大的方向是信號的方向,方差小的方向是噪聲的方向,我們在數據挖掘中或者數字信號處理中,往往要提高信號與噪聲的比例,也就是信噪比。對上圖來說,如果我們只保留signal方向的數據,也可以對原數據進行不錯的近似了。
PCA的全部工作簡單點說,就是對原始的空間中順序地找一組相互正交的坐標軸,第一個軸是使得方差最大的,第二個軸是在與第一個軸正交的平面中使得方差最大的,第三個軸是在與第1、2個軸正交的平面中方差最大的,這樣假設在N維空間中,我們可以找到N個這樣的坐標軸,我們取前r個去近似這個空間,這樣就從一個N維的空間壓縮到r維的空間了,但是我們選擇的r個坐標軸能夠使得空間的壓縮使得數據的損失最小。
這就是機器學習實戰中PCA的移動坐標軸的原理。
3.2 SVD
假設我們矩陣每一行表示一個樣本,每一列表示一個feature,將一個m * n的矩陣A變換成一個m * r的矩陣,這樣就會使得本來有n個feature的,變成了有r個feature了(r < n),這r個其實就是對n個feature的一種提煉,我們就把這個稱為feature的壓縮。用數學語言表示就是:
Am×nPn×r=A^m×r
SVD得出的奇異向量也是從奇異值由大到小排列的,按PCA的觀點來看,就是方差最大的坐標軸就是第一個奇異向量,方差次大的坐標軸就是第二個奇異向量…
和之前得到的SVD式子對比:
Am×n≈Um×rΣr×rVTr×n
在矩陣的兩邊同時乘上一個矩陣V,由于V是一個正交的矩陣,所以VTV=I,所以可以化成后面的式子:
Am×nVn×rAm×nVn×r≈≈Um×rΣr×rVTr×nVr×nUm×rΣr×r
這里是將一個m?n 的矩陣壓縮到一個m?r的矩陣,也就是對列進行壓縮,如果我們想對行進行壓縮,類似于列壓縮的形式,只需在Am×n≈Um×rΣr×rVTr×n兩邊左乘UT, 這樣就得到了對行進行壓縮的式子。可以看出,其實PCA幾乎可以說是對SVD的一個包裝,如果我們實現了SVD,那也就實現了PCA了,而且更好的地方是,有了SVD,我們就可以得到兩個方向的PCA,如果我們對ATA進行特征值的分解,只能得到一個方向的PCA。
參考:
https://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
http://blog.codinglabs.org/articles/pca-tutorial.html
總結
以上是生活随笔為你收集整理的奇异值分解SVD与PCA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 空调开多少度蚊子才会冻死?
- 下一篇: SVD简化数据