前言
PCA是一種無參數(shù)的數(shù)據(jù)降維方法,在機器學(xué)習(xí)中很常用,這篇文章主要從三個角度來說明PCA是怎么降維的分別是方差角度,特征值和特征向量以及SVD奇異值分解。
PCA的推導(dǎo)過程
推導(dǎo)主要來源于下面網(wǎng)址的這篇文章,是通過方差和協(xié)方差矩陣來說明:
http://blog.codinglabs.org/articles/pca-tutorial.html
PCA通過線性變換將原始數(shù)據(jù)變換為一組各維度線性無關(guān)的表示,可用于提取數(shù)據(jù)的主要特征分量,常用于高維數(shù)據(jù)的降維。
在上面網(wǎng)址的文章中,從頭到尾發(fā)明了一遍PCA我覺得很有借鑒意義。我們知道PCA是一種數(shù)據(jù)降維的方法,在降低維度的過程中,我們當(dāng)然想要保留更多的特征,PCA就是經(jīng)過數(shù)學(xué)推導(dǎo),保留最多特征同時降維的方法。
在推導(dǎo)之前要先知道幾個基礎(chǔ)知識:
內(nèi)積與投影
兩個維數(shù)相同的向量的內(nèi)積被定義為:
內(nèi)積的幾何意義
假設(shè)A和B是兩個n維向量,我們知道n維向量可以等價表示為n維空間中的一條從原點發(fā)射的有向線段,為了簡單起見我們假設(shè)A和B均為二維向量,則A=(x1,y1),B=(x2,y2)。則在二維平面上A和B可以用兩條發(fā)自原點的有向線段表示,見下圖:
現(xiàn)在我們從A點向B所在直線引一條垂線。我們知道垂線與B的交點叫做A在B上的投影,再設(shè)A與B的夾角是a,則投影的矢量長度為|A|cos(a),其中|A|是向量A的模,也就是A線段的標(biāo)量長度。
到這里還是看不出內(nèi)積和這東西有什么關(guān)系,不過如果我們將內(nèi)積表示為另一種我們熟悉的形式:
現(xiàn)在事情似乎是有點眉目了:A與B的內(nèi)積等于A到B的投影長度乘以B的模。再進一步,如果我們假設(shè)B的模為1,即讓|B|=1,那么就變成了:
也就是說,設(shè)向量B的模為1,則A與B的內(nèi)積值等于A向B所在直線投影的矢量長度!這就是內(nèi)積的一種幾何解釋,也是我們得到的第一個重要結(jié)論。在后面的推導(dǎo)中,將反復(fù)使用這個結(jié)論。
基
下面我們繼續(xù)在二維空間內(nèi)討論向量。上文說過,一個二維向量可以對應(yīng)二維笛卡爾直角坐標(biāo)系中從原點出發(fā)的一個有向線段。例如下面這個向量:
在代數(shù)表示方面,我們經(jīng)常用線段終點的點坐標(biāo)表示向量,例如上面的向量可以表示為(3,2),這是我們再熟悉不過的向量表示。
不過我們常常忽略,只有一個(3,2)本身是不能夠精確表示一個向量的。我們仔細(xì)看一下,這里的3實際表示的是向量在x軸上的投影值是3,在y軸上的投影值是2。也就是說我們其實隱式引入了一個定義:以x軸和y軸上正方向長度為1的向量為標(biāo)準(zhǔn)。那么一個向量(3,2)實際是說在x軸投影為3而y軸的投影為2。注意投影是一個矢量,所以可以為負(fù)。
更正式的說,向量(x,y)實際上表示線性組合:
不難證明所有二維向量都可以表示為這樣的線性組合。此處(1,0)和(0,1)叫做二維空間中的一組基。
我們之所以默認(rèn)選擇(1,0)和(0,1)為基,當(dāng)然是比較方便,因為它們分別是x和y軸正方向上的單位向量,因此就使得二維平面上點坐標(biāo)和向量一一對應(yīng),非常方便。但實際上任何兩個線性無關(guān)的二維向量都可以成為一組基,所謂線性無關(guān)在二維平面內(nèi)可以直觀認(rèn)為是兩個不在一條直線上的向量。
例如,(1,1)和(-1,1)也可以成為一組基。一般來說,我們希望基的模是1,因為從內(nèi)積的意義可以看到,如果基的模是1,那么就可以方便的用向量點乘基而直接獲得其在新基上的坐標(biāo)了!實際上,對應(yīng)任何一個向量我們總可以找到其同方向上模為1的向量,只要讓兩個分量分別除以模就好了。例如,上面的基可以變?yōu)?1/√2,1/√2)和(-1/√2,1/√2)
現(xiàn)在,我們想獲得(3,2)在新基上的坐標(biāo),即在兩個方向上的投影矢量值,那么根據(jù)內(nèi)積的幾何意義,我們只要分別計算(3,2)和兩個基的內(nèi)積,不難得到新的坐標(biāo)為(5/√2,-1/√2)。下圖給出了新的基以及(3,2)在新基上坐標(biāo)值的示意圖:
另外這里要注意的是,我們列舉的例子中基是正交的(即內(nèi)積為0,或直觀說相互垂直),但可以成為一組基的唯一要求就是線性無關(guān),非正交的基也是可以的。不過因為正交基有較好的性質(zhì),所以一般使用的基都是正交的。
基變換的矩陣表示
一般的,如果我們有M個N維向量,想將其變換為由R個N維向量表示的新空間中,那么首先將R個基按行組成矩陣A,然后將向量按列組成矩陣B,那么兩矩陣的乘積AB就是變換結(jié)果,其中AB的第m列為A中第m列變換后的結(jié)果。(新基按行,向量按列)
特別要注意的是,這里R可以小于N,而R決定了變換后數(shù)據(jù)的維數(shù)。也就是說,我們可以將一N維數(shù)據(jù)變換到更低維度的空間中去,變換后的維度取決于基的數(shù)量。因此這種矩陣相乘的表示也可以表示降維變換。
最后,上述分析同時給矩陣相乘找到了一種物理解釋:兩個矩陣相乘的意義是將右邊矩陣中的每一列列向量變換到左邊矩陣中每一行行向量為基所表示的空間中去。更抽象的說,一個矩陣可以表示一種線性變換。很多同學(xué)在學(xué)線性代數(shù)時對矩陣相乘的方法感到奇怪,但是如果明白了矩陣相乘的物理意義,其合理性就一目了然了。
協(xié)方差矩陣與優(yōu)化目標(biāo)
我們從上面的矩陣乘法與基變換可以看出,當(dāng)新基的維數(shù)小于原來的維數(shù)時可以做到數(shù)據(jù)的降維,但是究竟如何選擇新基就是我們現(xiàn)在面臨的問題,我們想要選擇一個維數(shù)更小的新基,同時新基保留有更多的信息。我們知道矩陣向新基投影的形式,也就是PCA是將一組N維的特征投影到K維(K<N)同時保留更多的特征。
那么怎么衡量更多的特征,也就是投影后盡量少的重疊,投影值盡可能分散。
方差
這種投影值的分散數(shù)學(xué)上可以用方差表示。方差公式這里不表,所以PCA現(xiàn)在的問題就變成了,尋找K維的新基,使得數(shù)據(jù)變換到這組基上后方差值最大。
協(xié)方差
從二維到一維的降維,只需要找到一個一維基使得方差最大,但是三維降到二維呢?我們需要找到兩個基讓這個三維數(shù)據(jù)投影到兩個基上,如果我們找方差最大的兩個基,會發(fā)現(xiàn)他們完全一樣或者線性相關(guān),這和一個基沒什么區(qū)別,不能表達(dá)更多的信息,所以我們需要添加限制條件,我們希望這兩個基彼此線性無關(guān),擴展到K個基也是一樣。
在數(shù)學(xué)上使用協(xié)方差表示兩個向量的相關(guān)性,在我們將均值歸一化為0后,協(xié)方差可以表示為:
=\frac{1}{m}\sum_{i=1}^{m}a_ib_i)
m為向量的元素數(shù)。可以看到,在字段均值為0的情況下,兩個字段的協(xié)方差簡潔的表示為其內(nèi)積除以元素數(shù)m。
當(dāng)協(xié)方差為0時,表示兩個字段完全獨立。為了讓協(xié)方差為0,我們選擇第二個基時只能在與第一個基正交的方向上選擇。因此最終選擇的兩個方向一定是正交的。
至此,我們得到了降維問題的優(yōu)化目標(biāo):將一組N維向量降為K維(K大于0,小于N),其目標(biāo)是選擇K個單位(模為1)正交基,使得原始數(shù)據(jù)變換到這組基上后,各字段兩兩間協(xié)方差為0,而字段的方差則盡可能大(在正交的約束下,取最大的K個方差)。
協(xié)方差矩陣
上面我們導(dǎo)出了優(yōu)化目標(biāo),但是這個目標(biāo)似乎不能直接作為操作指南(或者說算法),因為它只說要什么,但根本沒有說怎么做。所以我們要繼續(xù)在數(shù)學(xué)上研究計算方案。
我們看到,最終要達(dá)到的目的與字段內(nèi)方差及字段間協(xié)方差有密切關(guān)系。因此我們希望能將兩者統(tǒng)一表示,仔細(xì)觀察發(fā)現(xiàn),兩者均可以表示為內(nèi)積的形式,而內(nèi)積又與矩陣相乘密切相關(guān)。于是我們來了靈感:
假設(shè)我們只有a和b兩個特征,那么我們將它們按行組成矩陣X:
然后我們用X乘以X的轉(zhuǎn)置,并乘上系數(shù)1/m:
這個矩陣對角線上的兩個元素分別是兩個字段的方差,而其它元素是a和b的協(xié)方差。兩者被統(tǒng)一到了一個矩陣的。
根據(jù)矩陣相乘的運算法則,這個結(jié)論很容易被推廣到一般情況:
設(shè)我們有m個n維數(shù)據(jù)記錄,將其按列排成n乘m的矩陣X,設(shè)C=1/mXXT,則C是一個對稱矩陣,其對角線分別個各個字段的方差,而第i行j列和j行i列元素相同,表示i和j兩個字段的協(xié)方差。
協(xié)方差矩陣對角化
根據(jù)上述推導(dǎo),我們發(fā)現(xiàn)要達(dá)到優(yōu)化目前,等價于將協(xié)方差矩陣對角化:即除對角線外的其它元素化為0,并且在對角線上將元素按大小從上到下排列,這樣我們就達(dá)到了優(yōu)化目的。這樣說可能還不是很明晰,我們進一步看下原矩陣與基變換后矩陣協(xié)方差矩陣的關(guān)系:
設(shè)原始數(shù)據(jù)矩陣X對應(yīng)的協(xié)方差矩陣為C,而P是一組基按行組成的矩陣,設(shè)Y=PX,則Y為X對P做基變換后的數(shù)據(jù)。設(shè)Y的協(xié)方差矩陣為D,我們推導(dǎo)一下D與C的關(guān)系:
現(xiàn)在事情很明白了!我們要找的P不是別的,而是能讓原始協(xié)方差矩陣對角化的P。換句話說,優(yōu)化目標(biāo)變成了尋找一個矩陣P,滿足PCPT是一個對角矩陣,并且對角元素按從大到小依次排列,那么P的前K行就是要尋找的基,用P的前K行組成的矩陣乘以X就使得X從N維降到了K維并滿足上述優(yōu)化條件。
由上文知道,協(xié)方差矩陣C是一個是對稱矩陣,在線性代數(shù)上,實對稱矩陣有一系列非常好的性質(zhì):
1)實對稱矩陣不同特征值對應(yīng)的特征向量必然正交。
2)設(shè)特征向量λ重數(shù)為r,則必然存在r個線性無關(guān)的特征向量對應(yīng)于λ,因此可以將這r個特征向量單位正交化。
由上面兩條可知,一個n行n列的實對稱矩陣一定可以找到n個單位正交特征向量,設(shè)這n個特征向量為e1,e2,...,en,我們將其按列組成矩陣:
則對協(xié)方差矩陣C有如下結(jié)論:
其中Λ為對角矩陣,其對角元素為各特征向量對應(yīng)的特征值(可能有重復(fù))。以上結(jié)論不再給出嚴(yán)格的數(shù)學(xué)證明,對證明感興趣的朋友可以參考線性代數(shù)書籍關(guān)于“實對稱矩陣對角化”的內(nèi)容。
到這里,我們發(fā)現(xiàn)我們已經(jīng)找到了需要的矩陣P:
P是協(xié)方差矩陣的特征向量單位化后按行排列出的矩陣,其中每一行都是C的一個特征向量。如果設(shè)P按照Λ中特征值的從大到小,將特征向量從上到下排列,則用P的前K行組成的矩陣乘以原始數(shù)據(jù)矩陣X,就得到了我們需要的降維后的數(shù)據(jù)矩陣Y。
至此我們完成了整個PCA的數(shù)學(xué)原理討論。
關(guān)于PCA的貢獻率與K的選擇
在我的文章特征值和特征向量中說過,特征值反映了矩陣對于特征向量的拉伸程度,只有拉伸而沒有旋轉(zhuǎn),也就是在特征向量方向上的作用程度,所以在PCA中我們選取前K個特征向量組成新基進行投影,就是因為原特征在前K個特征向量有最大的作用程度,投影過后可以保留更多的信息,作用程度是用特征值表示的,所以我們可以使用下面的式子表示貢獻率,貢獻率是表示投影后信息的保留程度的變量,可以用下面的式子表示:
也就是特征值的總和比上前K個特征值,一般來說貢獻率要大于85%。
關(guān)于SVD
上面的推導(dǎo)中我們看到
其實就是對于D的奇異值分解。但是其實兩者還有一些區(qū)別:
1) SVD可以獲取另一個方向上的主成分,而PCA只能獲得單個方向上的主成分:
LSI
隱語義索引(Latent semantic indexing,簡稱LSI)通常建立在SVD的基礎(chǔ)上,通過低秩逼近達(dá)到降維的目的。
注意到PCA也能達(dá)到降秩的目的,但是PCA需要進行零均值化,且丟失了矩陣的稀疏性。
數(shù)值穩(wěn)定性
通過SVD可以得到PCA相同的結(jié)果,但是SVD通常比直接使用PCA更穩(wěn)定。因為PCA需要計算XTX的值,對于某些矩陣,求協(xié)方差時很可能會丟失一些精度。例如Lauchli矩陣:
在Lauchli矩陣?yán)铮琫是很小的數(shù),e2無法用計算機精確表示,從而計算XTX會丟失e這部分信息。
PCA的步驟
1)將原始數(shù)據(jù)按列組成n行m列矩陣X
2)將X的每一行(代表一個屬性字段)進行零均值化,即減去這一行的均值
3)求出協(xié)方差矩陣
4)求出協(xié)方差矩陣的特征值及對應(yīng)的特征向量
5)將特征向量按對應(yīng)特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P
6)Y=PX即為降維到k維后的數(shù)據(jù)
至于練習(xí)
courser里吳恩達(dá)的PCA的習(xí)題就不錯。