PCA(主成分分析)的簡單理解

轉載自: http://www.cnblogs.com/hapjin/p/6728697.html

  PCA(Principal Components Analysis),它是一種“投影(projection)技巧”,就是把高維空間上的數據映射到低維空間。比如三維空間的一個球,往座標軸方向投影,變成了一個圓。球是3維的,圓是2維的。在球變成圓的這個投影過程中,丟失了原來物體(球)的一部分“性質”—圓不是球了,只有面積沒有體積了;也保留了原來物體的一部分性質—圓 和 球 還是很像的……
  而對於一個訓練樣本y而言,假設它有M個特徵(M維),y={y1, y2, … yM},通過PCA,進行投影,降維成D維(M>D)。爲什麼要降維?最主要的兩個原因是:
①可視化,我們只能看到一維、二維、三維空間上的物體,當某物體需要4維或以上特徵表示時,只能想象了……
②特徵選擇(feature selection),比如說採集到的某個樣本 由 20維特徵 組成,其中有一些特徵屬於“噪音(noise)”,而由於某些原因,我們不想要這些“噪音”。又比如說,存在特徵冗餘,描述一個球,可以用如下特徵:(體積、面積、直徑、半徑),其實我只需要知道半徑、直徑、面積、體積這些都可以通過公式求出來。因此,體積、面積 、直徑這些特徵,相對於半徑來說,是冗餘的特徵。

如何降維?
  PCA降維的目標就是:找到一種投影方式,將原來的M維樣本y 變成 D維樣本x,並且使得投影之後的D維樣本x,能夠儘可能多地保存原來的樣本y中的信息。由於將y投影成x,可以有不同的投影方向,那哪個投影方向比較好呢?即,能夠儘可能多地保存原來的樣本y中的信息呢?
  可以使用方差來衡量投影方向的好壞。如下圖:

這裏寫圖片描述

  上圖中有“兩團點”,在聚類算法中稱爲有兩個聚簇。將這兩個簇中的點往B方向投影,B箭頭指向的那條直線上的點,表示 投影之後得到的新樣本點,已經看不出有兩個簇了。而此時,得到的方差是σB2=8.35 .
  往A方向投影,A箭頭指向的那條直線上的點,還能夠明顯地看出有兩類,即還能夠保存“兩個簇“的結構,這說明投影方向A比B 要好,因爲原來的樣本點有兩個簇,而往A方向投影后,還能看出有兩個簇。此時得到的方差σA2=17.37 .
這表明:可以使用 投影后的所有樣本點的 方差大小,來衡量投影方向的好壞!
  假設有N個樣本點,用Y表示,每個樣本點是M維的。現在使用PCA降維,降成D維的,用X表示。X中還是有N個樣本點,只是每個樣本的維數變成D維的了。
這種投影方式,用矩陣乘法表示:XND=YNMWMD

XND=YNMWMD=[y11y12y1my21y22y2myn1yn2ynm][w11w12w1dw21w22w2dwm1wm2wmd]=[x11x12x1dx21x22x2dan1an2xnd]

對於投影之後的樣本x 的第d個特徵xnd 而言,有:

xn1=w1Tyn,xn2=w2Tyn,...,xnd=wdTynxn=(wn1,wn2,...,wnd)T

也就是說,PCA降維的本質是:找到一個M*D維的矩陣W。可以對W=(w1,w2,…wd)進行一些約束:||wi||=1 ,且wiTwj=0(j!=i)4 ,只要W滿足:X=Y*W即可。
在數學上,PCA投影是一種線性變換。因爲,根據線性變換的定義:
給定函數L:Rn>Rm ,如果:
1. 對於任意的x belongs to Rn ,a 屬於實數R,有L(a*x)=a*L(x)
2. 對於任意的x,y belongs to Rn ,有L(x+y)=L(x)+L(y)
則稱函數L是一個線性變換。線性變換對加法和數乘封閉。上面的條件1,表示L對數乘封閉;條件2,表示L對加法封閉
而對於矩陣A而言, A*x=b,是滿足線性變換的定義的。比如,對於向量x和y,A(x+y)=A*x + A*y;對於實數a,A(a*x)=a*A*x
將矩陣A 作用於 向量x 上,即矩陣A與向量x相乘,就相當於 函數L 作用於x上。
因此,由xn=xn1,xn2,...xnd)T=WTyn ,可知:PCA是一個線性變換。

回到公式XND=YNMWMD ,如何選擇合適的W矩陣呢?—-使用方差最大來確定W矩陣。因爲 方差可以衡量投影方向的好壞。
而將矩陣A與向量u相乘,其實就是改變了向量u的方向和大小而已。但是,如果向量u是矩陣A的特徵向量,那麼 A*u 不會改變向量u的方向。如下圖:

這裏寫圖片描述

在求解 投影后的樣本集X 的方差之前,先假設原始樣本集Y的每一維特徵的均值爲0(m個0),即y¯=[0,0,...0]T 。爲了簡化討論,假設將原來的M維降成 D=1維。此時,W矩陣就退化爲只有一個向量。即尋找一個向量w,對於Y中任何一個樣本yn=(yn1,yn2,...ynm) ,有xn=(xn1,xn2,...xnd)=(xn1)=wTyn
根據公式:xn=wTyn 得到樣本集X的均值爲:

這裏寫圖片描述
再根據方差的定義,和 X的均值爲0,故X的方差爲:
這裏寫圖片描述
對於樣本集Y而言,根據樣本協方差矩陣的定義 和 y的均值y¯=0 ,可知:C與樣本協方差矩陣密切相關。
因此,要想最大化X的方差,就是最大化wTCw ,而C是一個確定的值—由Y的協方差矩陣決定了。因此,我們的目標是儘可能地使w大,而根據我們前面的約束:||w||=1。故最大化wTCw 可以使用拉格朗日乘子,轉化成如下的約束優化問題:
這裏寫圖片描述

通過求偏導數,求得:使L最大化 的w的公式:Cw=λw。而這剛好是特徵向量的定義,λ是矩陣C的特徵值,w則是對應的特徵向量。
由於 ||w||=wTw=1σ2=wTCw ,左邊乘上wTw ,得到:σ2wTw=wTCw ,也即:σ2w=Cw ,因此方差σ2就是特徵值λ,而最大化方差,其實就是選擇矩陣C的最大化的特徵值而已相應的變換向量w,其實就是特徵值對應的特徵向量。
因此,更一般地,將原來的樣本集Y,M維特徵 降到 D維,其實就是計算矩陣C(與Y的協方差矩陣息息相關)的特徵值和特徵向量,由於 C 是一個M*M維的矩陣,因此一共有 m 個特徵值,及其對應的 m 個特徵向量。而我們只需要選擇前D個最大的特徵值對應的特徵向量,並將之 作爲線性變換矩陣 W 即可。

參考文獻:《a first course in machine learning》第七章
原文:http://www.cnblogs.com/hapjin/p/6728697.html

後記:
其他幫助理解的觀點:
1. 主成分分析就是把協方差矩陣做一個奇異值分解,求出最大的奇異值的特徵方向。
2. 上面說的都太抽象了,我認爲,從物理意義上說,就是計算各維度之間的相關性(前提是已經經過白化)。
由於樣本特徵均值白化後爲0,各特徵方差一樣,計算得到的協方差矩陣,其中元素的值越大,則說明對應下標的特徵之間相關性越高。PCA就是基於這種性質。

關於協方差的概念可以參考:http://www.cnblogs.com/chaosimple/p/3182157.html
1. 協方差在統計學的基本概念
  統計學裏最基本的概念就是樣本的均值、方差、標準差。首先,我們給定一個含有n個樣本的集合,下面給出這些概念的公式描述:
這裏寫圖片描述
  均值描述的是樣本集合的中間點,它告訴我們的信息是有限的,而標準差給我們描述的是樣本集合的各個樣本點到均值的距離之平均。
  以這兩個集合爲例,[0, 8, 12, 20]和[8, 9, 11, 12],兩個集合的均值都是10,但顯然兩個集合的差別是很大的,計算兩者的標準差,前者是8.3後者是1.8,顯然後者較爲集中,故其標準差小一些,標準差描述的就是這種“散佈度”。之所以除以n-1而不是n,是因爲這樣能使我們以較小的樣本集更好地逼近總體的標準差,即統計上所謂的“無偏估計”。而方差則僅僅是標準差的平方。
2. 爲什麼需要協方差
  標準差和方差一般是用來描述一維數據的,但現實生活中我們常常會遇到含有多維數據的數據集,最簡單的是大家上學時免不了要統計多個學科的考試成績。面對這樣的數據集,我們當然可以按照每一維獨立的計算其方差,但是通常我們還想了解更多,比如,一個男孩子的猥瑣程度跟他受女孩子的歡迎程度是否存在一些聯繫。協方差就是這樣一種用來度量兩個隨機變量關係的統計量,我們可以仿照方差的定義:

來度量各個維度偏離其均值的程度,協方差可以這樣來定義:
這裏寫圖片描述
協方差的結果有什麼意義呢?如果結果爲正值,則說明兩者是正相關的(從協方差可以引出“相關係數”的定義),也就是說一個人越猥瑣越受女孩歡迎。如果結果爲負值, 就說明兩者是負相關,越猥瑣女孩子越討厭。如果爲0,則兩者之間沒有關係,猥瑣不猥瑣和女孩子喜不喜歡之間沒有關聯,就是統計上說的“相互獨立”。

從協方差的定義上我們也可以看出一些顯而易見的性質,如:

3. 協方差矩陣
前面提到的猥瑣和受歡迎的問題是典型的二維問題,而協方差也只能處理二維問題,那維數多了自然就需要計算多個協方差,比如n維的數據集就需要計算n!/[(n2)!2] 個協方差,那自然而然我們會想到使用矩陣來組織這些數據。給出協方差矩陣的定義
這裏寫圖片描述
這個定義還是很容易理解的,我們可以舉一個三維的例子,假設數據集有三個維度,則協方差矩陣爲:
這裏寫圖片描述
可見,協方差矩陣是一個對稱的矩陣,而且對角線是各個維度的方差
4. Matlab協方差實戰
必須要明確一點,協方差矩陣計算的是不同維度之間的協方差,而不是不同樣本之間的。以下的演示將使用Matlab,爲了說明計算原理,不直接調用Matlab的cov函數:
首先,隨機生成一個10*3維的整數矩陣作爲樣本集,10爲樣本的個數,3爲樣本的維數。
圖 1 使用Matlab生成樣本集
圖 1 使用Matlab生成樣本集
根據公式,計算協方差需要計算均值,前面特別強調了,協方差矩陣是計算不同維度之間的協方差,要時刻牢記這一點。樣本矩陣的每行是一個樣本,每列是一個維度,因此我們要按列計算均值。爲了描述方便,我們先將三個維度的數據分別賦值:
這裏寫圖片描述
圖 2 將三個維度的數據分別賦值

計算dim1與dim2,dim1與dim3,dim2與dim3的協方差:
這裏寫圖片描述
圖 3 計算三個協方差

協方差矩陣的對角線上的元素就是各個維度的方差,下面我們依次計算這些方差:
這裏寫圖片描述
圖 4 計算對角線上的方差

這樣,我們就得到了計算協方差矩陣所需要的所有數據,可以調用Matlab的cov函數直接得到協方差矩陣:
這裏寫圖片描述
圖 5 使用Matlab的cov函數直接計算樣本的協方差矩陣

計算的結果,和之前的數據填入矩陣後的結果完全相同。

  1. 總結
      理解協方差矩陣的關鍵就在於牢記它的計算是不同維度之間的協方差,而不是不同樣本之間。拿到一個樣本矩陣,最先要明確的就是一行是一個樣本還是一個維度,心中明確整個計算過程就會順流而下,這麼一來就不會迷茫了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章