1. 程式人生 > >PCA演算法及其數學原理

PCA演算法及其數學原理

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

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

資料的向量表示及降維問題

一般情況下,在資料探勘和機器學習中,資料被表示為向量。例如某個淘寶店2012年全年的流量及交易情況可以看成一組記錄的集合,其中每一天的資料是一條記錄,格式如下:

(日期, 瀏覽量, 訪客數, 下單數, 成交數, 成交金額)

其中“日期”是一個記錄標誌而非度量值,而資料探勘關心的大多是度量值,因此如果我們忽略日期這個欄位後,我們得到一組記錄,每條記錄可以被表示為一個五維向量,其中一條看起來大約是這個樣子:

(500,240,25,13,2312.15)T

注意這裡我用了轉置,因為習慣上使用列向量表示一條記錄(後面會看到原因),本文後面也會遵循這個準則。不過為了方便有時我會省略轉置符號,但我們說到向量預設都是指列向量。

我們當然可以對這一組五維向量進行分析和挖掘,不過我們知道,很多機器學習演算法的複雜度和資料的維數有著密切關係,甚至與維數呈指數級關聯。當然,這裡區區五維的資料,也許還無所謂,但是實際機器學習中處理成千上萬甚至幾十萬維的情況也並不罕見,在這種情況下,機器學習的資源消耗是不可接受的,因此我們必須對資料進行降維。

降維當然意味著資訊的丟失,不過鑑於實際資料本身常常存在的相關性,我們可以想辦法在降維的同時將資訊的損失儘量降低。

舉個例子,假如某學籍資料有兩列M和F,其中M列的取值是如何此學生為男性取值1,為女性取值0;而F列是學生為女性取值1,男性取值0。此時如果我們統計全部學籍資料,會發現對於任何一條記錄來說,當M為1時F必定為0,反之當M為0時F必定為1。在這種情況下,我們將M或F去掉實際上沒有任何資訊的損失,因為只要保留一列就可以完全還原另一列。

當然上面是一個極端的情況,在現實中也許不會出現,不過類似的情況還是很常見的。例如上面淘寶店鋪的資料,從經驗我們可以知道,“瀏覽量”和“訪客數”往往具有較強的相關關係,而“下單數”和“成交數”也具有較強的相關關係。這裡我們非正式的使用“相關關係”這個詞,可以直觀理解為“當某一天這個店鋪的瀏覽量較高(或較低)時,我們應該很大程度上認為這天的訪客數也較高(或較低)”。後面的章節中我們會給出相關性的嚴格數學定義。

這種情況表明,如果我們刪除瀏覽量或訪客數其中一個指標,我們應該期待並不會丟失太多資訊。因此我們可以刪除一個,以降低機器學習演算法的複雜度。

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

要回答上面的問題,就要對降維問題進行數學化和形式化的討論。而PCA是一種具有嚴格數學基礎並且已被廣泛採用的降維方法。下面我不會直接描述PCA,而是通過逐步分析問題,讓我們一起重新“發明”一遍PCA。

向量的表示及基變換

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

內積與投影

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

(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可以用兩條發自原點的有向線段表示,見下圖:

好,現在我們從A點向B所在直線引一條垂線。我們知道垂線與B的交點叫做A在B上的投影,再設A與B的夾角是a,則投影的向量長度為|A|cos(a),其中|A|=x21+y21是向量A的模,也就是A線段的標量長度。

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

到這裡還是看不出內積和這東西有什麼關係,不過如果我們將內積表示為另一種我們熟悉的形式:

AB=|A||B|cos(a)

現在事情似乎是有點眉目了:A與B的內積等於A到B的投影長度乘以B的模。再進一步,如果我們假設B的模為1,即讓|B|=1,那麼就變成了:

AB=|A|cos(a)

也就是說,設向量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)實際上表示線性組合:

x(1,0)T+y(0,1)T

不難證明所有二維向量都可以表示為這樣的線性組合。此處(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)。下圖給出了新的基以及(3,2)在新基上座標值的示意圖:

另外這裡要注意的是,我們列舉的例子中基是正交的(即內積為0,或直觀說相互垂直),但可以成為一組基的唯一要求就是線性無關,非正交的基也是可以的。不過因為正交基有較好的性質,所以一般使用的基都是正交的。

基變換的矩陣表示

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

(1/21/21/21/2)(32)=(5/21/2)

太漂亮了!其中矩陣的兩行分別為兩個基,乘以原向量,其結果剛好為新基的座標。可以稍微推廣一下,如果我們有m個二維向量,只要將二維向量按列排成一個兩行m列矩陣,然後用“基矩陣”乘以這個矩陣,就得到了所有這些向量在新基下的值。例如(1,1),(2,2),(3,3),想變換到剛才那組基上,則可以這樣表示:

(1/21/21/21/2)(112233)=(2/204/206/20)

於是一組向量的基變換被幹淨的表示為矩陣的相乘。

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

數學表示為:

p1p2pR(a1a2aM)=p1a1p2a1pRa1p1a2p2a2pRa2p1aMp2aMpRaM

其中pi是一個行向量,表示第i個基,aj