主成分分析法PCA原理

PCA(Principal Component Analysis)是一種經常使用的數據分析方法。PCA經過線性變換將原始數據變換爲一組各維度線性無關的表示,可用於提取數據的主要特徵份量,經常使用於高維數據的降維。網上關於PCA的文章有不少,可是大多數只描述了PCA的分析過程,而沒有講述其中的原理。這篇文章的目的是介紹PCA的基本數學原理,幫助讀者瞭解PCA的工做機制是什麼。html

  固然我並不打算把文章寫成純數學文章,而是但願用直觀和易懂的方式敘述PCA的數學原理,因此整個文章不會引入嚴格的數學推導。但願讀者在看完這篇文章後能更好的明白PCA的工做原理。算法

數據的向量表示及降維問題

  通常狀況下,在數據挖掘和機器學習中,數據被表示爲向量。例如某個淘寶店2012年整年的流量及交易狀況能夠當作一組記錄的集合,其中每一天的數據是一條記錄,格式以下:(日期, 瀏覽量, 訪客數, 下單數, 成交數, 成交金額)。機器學習

  其中「日期」是一個記錄標誌而非度量值,而數據挖掘關心的大可能是度量值,所以若是咱們忽略日期這個字段後,咱們獲得一組記錄,每條記錄能夠被表示爲一個五維向量,其中一條看起來大約是這個樣子:(500,240,25,13,2312.15)T。函數

  注意這裏我用了轉置,由於習慣上使用列向量表示一條記錄(後面會看到緣由),本文後面也會遵循這個準則。不過爲了方便有時我會省略轉置符號,但咱們說到向量默認都是指列向量。學習

  咱們固然能夠對這一組五維向量進行分析和挖掘,不過咱們知道,不少機器學習算法的複雜度和數據的維數有着密切關係,甚至與維數呈指數級關聯。固然,這裏區區五維的數據,也許還無所謂,可是實際機器學習中處理成千上萬甚至幾十萬維的狀況也並不罕見,在這種狀況下,機器學習的資源消耗是不可接受的,所以咱們必須對數據進行降維。優化

  降維固然意味着信息的丟失,不過鑑於實際數據自己經常存在的相關性,咱們能夠想辦法在降維的同時將信息的損失儘可能下降。atom

  舉個例子,假如某學籍數據有兩列M和F,其中M列的取值是如何此學生爲男性取值1,爲女性取值0;而F列是學生爲女性取值1,男性取值0。此時若是咱們統計所有學籍數據,會發現對於任何一條記錄來講,當M爲1時F一定爲0,反之當M爲0時F一定爲1。在這種狀況下,咱們將M或F去掉實際上沒有任何信息的損失,由於只要保留一列就能夠徹底還原另外一列。spa

  固然上面是一個極端的狀況,在現實中也許不會出現,不過相似的狀況仍是很常見的。例如上面淘寶店鋪的數據,從經驗咱們能夠知道,「瀏覽量」和「訪客數」每每具備較強的相關關係,而「下單數」和「成交數」也具備較強的相關關係。這裏咱們非正式的使用「相關關係」這個詞,能夠直觀理解爲「當某一天這個店鋪的瀏覽量較高(或較低)時,咱們應該很大程度上認爲這天的訪客數也較高(或較低)」。後面的章節中咱們會給出相關性的嚴格數學定義。3d

  這種狀況代表,若是咱們刪除瀏覽量或訪客數其中一個指標,咱們應該期待並不會丟失太多信息。所以咱們能夠刪除一個,以下降機器學習算法的複雜度。orm

  上面給出的是降維的樸素思想描述,能夠有助於直觀理解降維的動機和可行性,但並不具備操做指導意義。例如,咱們到底刪除哪一列損失的信息才最小?亦或根本不是單純刪除幾列,而是經過某些變換將原始數據變爲更少的列但又使得丟失的信息最小?到底如何度量丟失信息的多少?如何根據原始數據決定具體的降維操做步驟?

  要回答上面的問題,就要對降維問題進行數學化和形式化的討論。而PCA是一種具備嚴格數學基礎而且已被普遍採用的降維方法。下面我不會直接描述PCA,而是經過逐步分析問題,讓咱們一塊兒從新「發明」一遍PCA。

向量的表示及基變換

  既然咱們面對的數據被抽象爲一組向量,那麼下面有必要研究一些向量的數學性質。而這些數學性質將成爲後續導出PCA的理論基礎。

內積與投影

  下面先來看一個高中就學過的向量運算:內積。兩個維數相同的向量的內積被定義爲:

   

  內積運算將兩個向量映射爲一個實數。其計算方式很是容易理解,可是其意義並不明顯。下面咱們分析內積的幾何意義。假設A和B是兩個n維向量,咱們知道n維向量能夠等價表示爲n維空間中的一條從原點發射的有向線段,爲了簡單起見咱們假設A和B均爲二維向量,則A=(x1,y1)B=(x2,y2)。則在二維平面上A和B能夠用兩條發自原點的有向線段表示,見下圖:

  

  如今咱們從A點向B所在直線引一條垂線。咱們知道垂線與B的交點叫作A在B上的投影,再設A與B的夾角是a,則投影的矢量長度爲,其中是向量A的模,也就是A線段的標量長度。

  注意這裏咱們專門區分了矢量長度和標量長度,標量長度老是大於等於0,值就是線段的長度;而矢量長度可能爲負,其絕對值是線段長度,而符號取決於其方向與標準方向相同或相反。

  到這裏仍是看不出內積和這東西有什麼關係,不過若是咱們將內積表示爲另外一種咱們熟悉的形式:

    

  如今事情彷佛是有點眉目了:A與B的內積等於A到B的投影長度乘以B的模。再進一步,若是咱們假設B的模爲1,即讓|B|=1,那麼就變成了:

   

  也就是說,設向量B的模爲1,則A與B的內積值等於A向B所在直線投影的矢量長度。這就是內積的一種幾何解釋,也是咱們獲得的第一個重要結論。在後面的推導中,將反覆使用這個結論。

  下面咱們繼續在二維空間內討論向量。上文說過,一個二維向量能夠對應二維笛卡爾直角座標系中從原點出發的一個有向線段。例以下面這個向量:

  

  在代數表示方面,咱們常常用線段終點的點座標表示向量,例如上面的向量能夠表示爲(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的向量,只要讓兩個份量分別除以模就行了。例如,上面的基能夠變爲

  如今,咱們想得到(3,2)在新基上的座標,即在兩個方向上的投影矢量值,那麼根據內積的幾何意義,只要分別計算(3,2)和兩個基的內積,不可貴到新的座標爲。下圖給出了新的基以及(3,2)在新基上座標值的示意圖:

  另外這裏要注意的是,咱們列舉的例子中基是正交的(即內積爲0,或直觀說相互垂直),但能夠成爲一組基的惟一要求就是線性無關,非正交的基也是能夠的。不過由於正交基有較好的性質,因此通常使用的基都是正交的。

基變換的矩陣表示

  下面咱們找一種簡便的方式來表示基變換。仍是拿上面的例子,想一下,將(3,2)變換爲新基上的座標,就是用(3,2)與第一個基作內積運算,做爲第一個新的座標份量,而後用(3,2)與第二個基作內積運算,做爲第二個新座標的份量。實際上,咱們能夠用矩陣相乘的形式簡潔的表示這個變換:

   

  太漂亮了!其中矩陣的兩行分別爲兩個基,乘以原向量,其結果恰好爲新基的座標。能夠稍微推廣一下,若是咱們有m個二維向量,只要將二維向量按列排成一個兩行m列矩陣,而後用「基矩陣」乘以這個矩陣,就獲得了全部這些向量在新基下的值。例如(1,1),(2,2),(3,3),想變換到剛纔那組基上,則能夠這樣表示:

   

  因而一組向量的基變換被幹淨的表示爲矩陣的相乘。

  通常的,若是咱們有M個N維向量,想將其變換爲由R個N維向量表示的新空間中,那麼首先將R個基按行組成矩陣A,而後將向量按列組成矩陣B,那麼兩矩陣的乘積AB就是變換結果,其中AB的第m列爲A中第m列變換後的結果

  數學表示爲:

  

  其中pi是一個行向量,表示第i個基,aj是一個列向量,表示第j個原始數據記錄。

  特別要注意的是,這裏R能夠小於N,而R決定了變換後數據的維數。也就是說,咱們能夠將一N維數據變換到更低維度的空間中去,變換後的維度取決於基的數量。所以這種矩陣相乘的表示也能夠表示降維變換。

  最後,上述分析同時給矩陣相乘找到了一種物理解釋:兩個矩陣相乘的意義是將右邊矩陣中的每一列列向量變換到左邊矩陣中每一行行向量爲基所表示的空間中去更抽象的說,一個矩陣能夠表示一種線性變換。不少同窗在學線性代數時對矩陣相乘的方法感到奇怪,可是若是明白了矩陣相乘的物理意義,其合理性就一目瞭然了。

協方差矩陣及優化目標

  上面咱們討論了選擇不一樣的基能夠對一樣一組數據給出不一樣的表示,並且若是基的數量少於向量自己的維數,則能夠達到降維的效果。可是咱們尚未回答一個最最關鍵的問題:如何選擇基纔是最優的。或者說,若是咱們有一組N維向量,如今要將其降到K維(K小於N),那麼咱們應該如何選擇K個基才能最大程度保留原有的信息?

  要徹底數學化這個問題很是繁雜,這裏咱們用一種非形式化的直觀方法來看這個問題。

  爲了不過於抽象的討論,咱們仍以一個具體的例子展開。假設咱們的數據由五條記錄組成,將它們表示成矩陣形式:

    

  其中每一列爲一條數據記錄,而一行爲一個字段。爲了後續處理方便,咱們首先將每一個字段內全部值都減去字段均值,其結果是將每一個字段都變爲均值爲0(這樣作的道理和好處後面會看到)。

  咱們看上面的數據,第一個字段均值爲2,第二個字段均值爲3,因此變換後:

   

  咱們能夠看下五條數據在平面直角座標系內的樣子:

  如今問題來了:若是咱們必須使用一維來表示這些數據,又但願儘可能保留原始的信息,你要如何選擇?

  經過上一節對基變換的討論咱們知道,這個問題其實是要在二維平面中選擇一個方向,將全部數據都投影到這個方向所在直線上,用投影值表示原始記錄。這是一個實際的二維降到一維的問題。

  那麼如何選擇這個方向(或者說基)才能儘可能保留最多的原始信息呢?一種直觀的見解是:但願投影后的投影值儘量分散

  以上圖爲例,能夠看出若是向x軸投影,那麼最左邊的兩個點會重疊在一塊兒,中間的兩個點也會重疊在一塊兒,因而自己四個各不相同的二維點投影后只剩下兩個不一樣的值了,這是一種嚴重的信息丟失,同理,若是向y軸投影最上面的兩個點和分佈在x軸上的兩個點也會重疊。因此看來x和y軸都不是最好的投影選擇。咱們直觀目測,若是向經過第一象限和第三象限的斜線投影,則五個點在投影后仍是能夠區分的。

  下面,咱們用數學方法表述這個問題。

方差

  上文說到,咱們但願投影后投影值儘量分散,這種分散程度,能夠用數學上的方差來表述。此處,一個字段的方差能夠看作是每一個元素與字段均值的差的平方和的均值,即:

   

  因爲上面咱們已經將每一個字段的均值都化爲0了,所以方差能夠直接用每一個元素的平方和除以元素個數表示:

   

  因而上面的問題被形式化表述爲:尋找一個一維基,使得全部數據變換爲這個基上的座標表示後,方差值最大。

協方差

  對於上面二維降成一維的問題來講,找到那個使得方差最大的方向就能夠了。不過對於更高維,還有一個問題須要解決。考慮三維降到二維問題。與以前相同,首先咱們但願找到一個方向使得投影后方差最大,這樣就完成了第一個方向的選擇,繼而咱們選擇第二個投影方向。

  若是咱們仍是單純只選擇方差最大的方向,很明顯,這個方向與第一個方向應該是「幾乎重合在一塊兒」,顯然這樣的維度是沒有用的,所以,應該有其餘約束條件。從直觀上說,讓兩個字段儘量表示更多的原始信息,咱們是不但願它們之間存在(線性)相關性的,由於相關性意味着兩個字段不是徹底獨立,必然存在重複表示的信息。

  數學上能夠用兩個字段的協方差表示其相關性,因爲已經讓每一個字段均值爲0,則:

   

  能夠看到,在字段均值爲0的狀況下,兩個字段的協方差簡潔的表示爲其內積除以元素數m。

  當協方差爲0時,表示兩個字段徹底獨立。爲了讓協方差爲0,咱們選擇第二個基時只能在與第一個基正交的方向上選擇。所以最終選擇的兩個方向必定是正交的。

  至此,咱們獲得了降維問題的優化目標:將一組N維向量降爲K維(K大於0,小於N),其目標是選擇K個單位(模爲1)正交基,使得原始數據變換到這組基上後,各字段兩兩間協方差爲0,而字段的方差則儘量大(在正交的約束下,取最大的K個方差)

協方差矩陣

  上面咱們導出了優化目標,可是這個目標彷佛不能直接做爲操做指南(或者說算法),由於它只說要什麼,但根本沒有說怎麼作。因此咱們要繼續在數學上研究計算方案。

  咱們看到,最終要達到的目的與字段內方差及字段間協方差有密切關係。所以咱們但願能將二者統一表示,仔細觀察發現,二者都可以表示爲內積的形式,而內積又與矩陣相乘密切相關。因而咱們來了靈感:

  假設咱們只有a和b兩個字段,那麼咱們將它們按行組成矩陣X:

  

  而後咱們用X乘以X的轉置,並乘上係數1/m:

   

  奇蹟出現了!這個矩陣對角線上的兩個元素分別是兩個字段的方差,而其它元素是a和b的協方差。二者被統一到了一個矩陣的。

  根據矩陣相乘的運算法則,這個結論很容易被推廣到通常狀況:

  設咱們有m個n維數據記錄,將其按列排成n乘m的矩陣X,設,則C是一個對稱矩陣,其對角線分別個各個字段的方差,而第i行j列和j行i列元素相同,表示i和j兩個字段的協方差

協方差矩陣對角化

  根據上述推導,咱們發現要達到優化目前,等價於將協方差矩陣對角化:即除對角線外的其它元素化爲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維並知足上述優化條件

  至此,咱們離「發明」PCA還有僅一步之遙!

  如今全部焦點都聚焦在了協方差矩陣對角化問題上,有時,咱們真應該感謝數學家的先行,由於矩陣對角化在線性代數領域已經屬於被玩爛了的東西,因此這在數學上根本不是問題。

  由上文知道,協方差矩陣C是一個是對稱矩陣,在線性代數上,實對稱矩陣有一系列很是好的性質:

  1)實對稱矩陣不一樣特徵值對應的特徵向量必然正交。

  2)設特徵向量λ重數爲r,則必然存在r個線性無關的特徵向量對應於λλ,所以能夠將這r個特徵向量單位正交化。

  由上面兩條可知,一個n行n列的實對稱矩陣必定能夠找到n個單位正交特徵向量,設這n個特徵向量爲e1,e2,,en咱們將其按列組成矩陣:

   

  則對協方差矩陣C有以下結論:

   

  其中Λ爲對角矩陣,其對角元素爲各特徵向量對應的特徵值(可能有重複)。

  以上結論再也不給出嚴格的數學證實,對證實感興趣的朋友能夠參考線性代數書籍關於「實對稱矩陣對角化」的內容。

  到這裏,咱們發現咱們已經找到了須要的矩陣P:

  

  P是協方差矩陣的特徵向量單位化後按行排列出的矩陣,其中每一行都是C的一個特徵向量。若是設P按照Λ中特徵值的從大到小,將特徵向量從上到下排列,則用P的前K行組成的矩陣乘以原始數據矩陣X,就獲得了咱們須要的降維後的數據矩陣Y。

  至此咱們完成了整個PCA的數學原理討論。在下面的一節,咱們將給出PCA的一個實例。

算法及實例

  爲了鞏固上面的理論,咱們在這一節給出一個具體的PCA實例。

PCA算法

  總結一下PCA的算法步驟:

  設有m條n維數據。

  1)將原始數據按列組成n行m列矩陣X

  2)將X的每一行(表明一個屬性字段)進行零均值化,即減去這一行的均值

  3)求出協方差矩陣C=1/mXXT

  4)求出協方差矩陣的特徵值及對應的特徵向量

  5)將特徵向量按對應特徵值大小從上到下按行排列成矩陣,取前k行組成矩陣P

  6)Y=PX即爲降維到k維後的數據

實例

  這裏以上文提到的

   

  爲例,咱們用PCA方法將這組二維數據其降到一維。

  由於這個矩陣的每行已是零均值,這裏咱們直接求協方差矩陣:

   

  而後求其特徵值和特徵向量,具體求解方法再也不詳述,能夠參考相關資料。求解後特徵值爲:

   

  其對應的特徵向量分別是:

   

  其中對應的特徵向量分別是一個通解,c1c2可取任意實數。那麼標準化後的特徵向量爲:

   

  所以咱們的矩陣P是:

   

  能夠驗證協方差矩陣C的對角化:

   

  最後咱們用P的第一行乘以數據矩陣,就獲得了降維後的表示:

   

  降維投影結果以下圖:

  

進一步討論

  根據上面對PCA的數學原理的解釋,咱們能夠了解到一些PCA的能力和限制。PCA本質上是將方差最大的方向做爲主要特徵,而且在各個正交方向上將數據「離相關」,也就是讓它們在不一樣正交方向上沒有相關性。

  所以,PCA也存在一些限制,例如它能夠很好的解除線性相關,可是對於高階相關性就沒有辦法了,對於存在高階相關性的數據,能夠考慮Kernel PCA,經過Kernel函數將非線性相關轉爲線性相關,關於這點就不展開討論了。另外,PCA假設數據各主特徵是分佈在正交方向上,若是在非正交方向上存在幾個方差較大的方向,PCA的效果就大打折扣了。

  最後須要說明的是,PCA是一種無參數技術,也就是說面對一樣的數據,若是不考慮清洗,誰來作結果都同樣,沒有主觀參數的介入,因此PCA便於通用實現,可是自己沒法個性化的優化。

  但願這篇文章能幫助朋友們瞭解PCA的數學理論基礎和實現原理,藉此瞭解PCA的適用場景和限制,從而更好的使用這個算法。

  文章轉載自:http://blog.codinglabs.org/articles/pca-tutorial.html

相關文章
相關標籤/搜索