
全網(wǎng)搜集目標檢測相關(guān),人工篩選最優(yōu)價值內(nèi)容
PCA(Principal Component Analysis)是一種常用的數(shù)據(jù)分析方法。PCA通過線性變換將原始數(shù)據(jù)變換為一組各維度線性無關(guān)的表示,可用于提取數(shù)據(jù)的主要特征分量,常用于高維數(shù)據(jù)的降維。網(wǎng)上關(guān)于PCA的文章有很多,但是大多數(shù)只描述了PCA的分析過程,而沒有講述其中的原理。
轉(zhuǎn)載自 | 算法與數(shù)學(xué)之美
這篇文章的目的是介紹PCA的基本數(shù)學(xué)原理,幫助讀者了解PCA的工作機制是什么。當然我并不打算把文章寫成純數(shù)學(xué)文章,而是希望用直觀和易懂的方式敘述PCA的數(shù)學(xué)原理,所以整個文章不會引入嚴格的數(shù)學(xué)推導(dǎo)。希望讀者在看完這篇文章后能更好的明白PCA的工作原理。
一般情況下,在數(shù)據(jù)挖掘和機器學(xué)習(xí)中,數(shù)據(jù)被表示為向量。例如某個淘寶店2012年全年的流量及交易情況可以看成一組記錄的集合,其中每一天的數(shù)據(jù)是一條記錄,格式如下:
(日期, 瀏覽量, 訪客數(shù), 下單數(shù), 成交數(shù), 成交金額)其中“日期”是一個記錄標志而非度量值,而數(shù)據(jù)挖掘關(guān)心的大多是度量值,因此如果我們忽略日期這個字段后,我們得到一組記錄,每條記錄可以被表示為一個五維向量,其中一條看起來大約是這個樣子:注意這里我用了轉(zhuǎn)置,因為習(xí)慣上使用列向量表示一條記錄(后面會看到原因),本文后面也會遵循這個準則。不過為了方便有時我會省略轉(zhuǎn)置符號,但我們說到向量默認都是指列向量。我們當然可以對這一組五維向量進行分析和挖掘,不過我們知道,很多機器學(xué)習(xí)算法的復(fù)雜度和數(shù)據(jù)的維數(shù)有著密切關(guān)系,甚至與維數(shù)呈指數(shù)級關(guān)聯(lián)。當然,這里區(qū)區(qū)五維的數(shù)據(jù),也許還無所謂,但是實際機器學(xué)習(xí)中處理成千上萬甚至幾十萬維的情況也并不罕見,在這種情況下,機器學(xué)習(xí)的資源消耗是不可接受的,因此我們必須對數(shù)據(jù)進行降維。降維當然意味著信息的丟失,不過鑒于實際數(shù)據(jù)本身常常存在的相關(guān)性,我們可以想辦法在降維的同時將信息的損失盡量降低。舉個例子,假如某學(xué)籍數(shù)據(jù)有兩列M和F,其中M列的取值是如何此學(xué)生為男性取值1,為女性取值0;而F列是學(xué)生為女性取值1,男性取值0。此時如果我們統(tǒng)計全部學(xué)籍數(shù)據(jù),會發(fā)現(xiàn)對于任何一條記錄來說,當M為1時F必定為0,反之當M為0時F必定為1。在這種情況下,我們將M或F去掉實際上沒有任何信息的損失,因為只要保留一列就可以完全還原另一列。當然上面是一個極端的情況,在現(xiàn)實中也許不會出現(xiàn),不過類似的情況還是很常見的。例如上面淘寶店鋪的數(shù)據(jù),從經(jīng)驗我們可以知道,“瀏覽量”和“訪客數(shù)”往往具有較強的相關(guān)關(guān)系,而“下單數(shù)”和“成交數(shù)”也具有較強的相關(guān)關(guān)系。這里我們非正式的使用“相關(guān)關(guān)系”這個詞,可以直觀理解為“當某一天這個店鋪的瀏覽量較高(或較低)時,我們應(yīng)該很大程度上認為這天的訪客數(shù)也較高(或較低)”。后面的章節(jié)中我們會給出相關(guān)性的嚴格數(shù)學(xué)定義。這種情況表明,如果我們刪除瀏覽量或訪客數(shù)其中一個指標,我們應(yīng)該期待并不會丟失太多信息。因此我們可以刪除一個,以降低機器學(xué)習(xí)算法的復(fù)雜度。上面給出的是降維的樸素思想描述,可以有助于直觀理解降維的動機和可行性,但并不具有操作指導(dǎo)意義。例如,我們到底刪除哪一列損失的信息才最???亦或根本不是單純刪除幾列,而是通過某些變換將原始數(shù)據(jù)變?yōu)楦俚牧械质沟脕G失的信息最???到底如何度量丟失信息的多少?如何根據(jù)原始數(shù)據(jù)決定具體的降維操作步驟?要回答上面的問題,就要對降維問題進行數(shù)學(xué)化和形式化的討論。而PCA是一種具有嚴格數(shù)學(xué)基礎(chǔ)并且已被廣泛采用的降維方法。下面我不會直接描述PCA,而是通過逐步分析問題,讓我們一起重新“發(fā)明”一遍PCA。既然我們面對的數(shù)據(jù)被抽象為一組向量,那么下面有必要研究一些向量的數(shù)學(xué)性質(zhì)。而這些數(shù)學(xué)性質(zhì)將成為后續(xù)導(dǎo)出PCA的理論基礎(chǔ)。下面先來看一個高中就學(xué)過的向量運算:內(nèi)積。兩個維數(shù)相同的向量的內(nèi)積被定義為:內(nèi)積運算將兩個向量映射為一個實數(shù)。其計算方式非常容易理解,但是其意義并不明顯。下面我們分析內(nèi)積的幾何意義。假設(shè)A和B是兩個n維向量,我們知道n維向量可以等價表示為n維空間中的一條從原點發(fā)射的有向線段,為了簡單起見我們假設(shè)A和B均為二維向量,則A=(x1,y1)A=(x1,y1),B=(x2,y2)B=(x2,y2)。則在二維平面上A和B可以用兩條發(fā)自原點的有向線段表示,見下圖:好,現(xiàn)在我們從A點向B所在直線引一條垂線。我們知道垂線與B的交點叫做A在B上的投影,再設(shè)A與B的夾角是a,則投影的矢量長度為
其中
是向量A的模,也就是A線段的標量長度。注意這里我們專門區(qū)分了矢量長度和標量長度,標量長度總是大于等于0,值就是線段的長度;而矢量長度可能為負,其絕對值是線段長度,而符號取決于其方向與標準方向相同或相反。到這里還是看不出內(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)二維笛卡爾直角坐標系中從原點出發(fā)的一個有向線段。例如下面這個向量:在代數(shù)表示方面,我們經(jīng)常用線段終點的點坐標表示向量,例如上面的向量可以表示為(3,2),這是我們再熟悉不過的向量表示。
不過我們常常忽略,只有一個(3,2)本身是不能夠精確表示一個向量的。我們仔細看一下,這里的3實際表示的是向量在x軸上的投影值是3,在y軸上的投影值是2。也就是說我們其實隱式引入了一個定義:以x軸和y軸上正方向長度為1的向量為標準。那么一個向量(3,2)實際是說在x軸投影為3而y軸的投影為2。注意投影是一個矢量,所以可以為負。不難證明所有二維向量都可以表示為這樣的線性組合。此處(1,0)和(0,1)叫做二維空間中的一組基。所以,要準確描述向量,首先要確定一組基,然后給出在基所在的各個直線上的投影值,就可以了。只不過我們經(jīng)常省略第一步,而默認以(1,0)和(0,1)為基。
我們之所以默認選擇(1,0)和(0,1)為基,當然是比較方便,因為它們分別是x和y軸正方向上的單位向量,因此就使得二維平面上點坐標和向量一一對應(yīng),非常方便。但實際上任何兩個線性無關(guān)的二維向量都可以成為一組基,所謂線性無關(guān)在二維平面內(nèi)可以直觀認為是兩個不在一條直線上的向量。例如,(1,1)和(-1,1)也可以成為一組基。一般來說,我們希望基的模是1,因為從內(nèi)積的意義可以看到,如果基的模是1,那么就可以方便的用向量點乘基而直接獲得其在新基上的坐標了!實際上,對應(yīng)任何一個向量我們總可以找到其同方向上模為1的向量,只要讓兩個分量分別除以模就好了。例如,上面的基可以變?yōu)?/span>
現(xiàn)在,我們想獲得(3,2)在新基上的坐標,即在兩個方向上的投影矢量值,那么根據(jù)內(nèi)積的幾何意義,我們只要分別計算(3,2)和兩個基的內(nèi)積,不難得到新的坐標為
下圖給出了新的基以及(3,2)在新基上坐標值的示意圖:另外這里要注意的是,我們列舉的例子中基是正交的(即內(nèi)積為0,或直觀說相互垂直),但可以成為一組基的唯一要求就是線性無關(guān),非正交的基也是可以的。不過因為正交基有較好的性質(zhì),所以一般使用的基都是正交的。
下面我們找一種簡便的方式來表示基變換。還是拿上面的例子,想一下,將(3,2)變換為新基上的坐標,就是用(3,2)與第一個基做內(nèi)積運算,作為第一個新的坐標分量,然后用(3,2)與第二個基做內(nèi)積運算,作為第二個新坐標的分量。實際上,我們可以用矩陣相乘的形式簡潔的表示這個變換:太漂亮了!其中矩陣的兩行分別為兩個基,乘以原向量,其結(jié)果剛好為新基的坐標。可以稍微推廣一下,如果我們有m個二維向量,只要將二維向量按列排成一個兩行m列矩陣,然后用“基矩陣”乘以這個矩陣,就得到了所有這些向量在新基下的值。例如(1,1),(2,2),(3,3),想變換到剛才那組基上,則可以這樣表示:一般的,如果我們有M個N維向量,想將其變換為由R個N維向量表示的新空間中,那么首先將R個基按行組成矩陣A,然后將向量按列組成矩陣B,那么兩矩陣的乘積AB就是變換結(jié)果,其中AB的第m列為A中第m列變換后的結(jié)果。其中pi是一個行向量,表示第i個基,aj是一個列向量,表示第j個原始數(shù)據(jù)記錄特別要注意的是,這里R可以小于N,而R決定了變換后數(shù)據(jù)的維數(shù)。也就是說,我們可以將一N維數(shù)據(jù)變換到更低維度的空間中去,變換后的維度取決于基的數(shù)量。因此這種矩陣相乘的表示也可以表示降維變換。最后,上述分析同時給矩陣相乘找到了一種物理解釋:兩個矩陣相乘的意義是將右邊矩陣中的每一列列向量變換到左邊矩陣中每一行行向量為基所表示的空間中去。更抽象的說,一個矩陣可以表示一種線性變換。很多同學(xué)在學(xué)線性代數(shù)時對矩陣相乘的方法感到奇怪,但是如果明白了矩陣相乘的物理意義,其合理性就一目了然了。上面我們討論了選擇不同的基可以對同樣一組數(shù)據(jù)給出不同的表示,而且如果基的數(shù)量少于向量本身的維數(shù),則可以達到降維的效果。但是我們還沒有回答一個最最關(guān)鍵的問題:如何選擇基才是最優(yōu)的。或者說,如果我們有一組N維向量,現(xiàn)在要將其降到K維(K小于N),那么我們應(yīng)該如何選擇K個基才能最大程度保留原有的信息?要完全數(shù)學(xué)化這個問題非常繁雜,這里我們用一種非形式化的直觀方法來看這個問題。為了避免過于抽象的討論,我們?nèi)砸砸粋€具體的例子展開。假設(shè)我們的數(shù)據(jù)由五條記錄組成,將它們表示成矩陣形式:其中每一列為一條數(shù)據(jù)記錄,而一行為一個字段。為了后續(xù)處理方便,我們首先將每個字段內(nèi)所有值都減去字段均值,其結(jié)果是將每個字段都變?yōu)榫禐?(這樣做的道理和好處后面會看到)。我們看上面的數(shù)據(jù),第一個字段均值為2,第二個字段均值為3,所以變換后: