再談協方差矩陣之主成分分析

再談協方差矩陣之主成分分析

自從上次談了協方差矩陣之後,感覺寫這種科普性文章還不錯,那我就再談一把協方差矩陣吧。上次那篇文章在理論層次介紹了下協方差矩陣,沒準很多人覺得這東西用處不大,其實協方差矩陣在好多學科裏都有很重要的作用,比如多維的正態分佈,再比如今天我們今天的主角——主成分分析(Principal Component Analysis,簡稱PCA)。結合PCA相信能對協方差矩陣有個更深入的認識~

PCA的緣起

PCA大概是198x年提出來的吧,簡單的說,它是一種通用的降維工具。在我們處理高維數據的時候,爲了能降低後續計算的複雜度,在“預處理”階段通常要先對原始數據進行降維,而PCA就是幹這個事的。本質上講,PCA就是將高維的數據通過線性變換投影到低維空間上去,但這個投影可不是隨便投投,要遵循一個指導思想,那就是:找出最能夠代表原始數據的投影方法。這裏怎麼理解這個思想呢?“最能代表原始數據”希望降維後的數據不能失真,也就是說,被PCA降掉的那些維度只能是那些噪聲或是冗餘的數據。這裏的噪聲和冗餘我認爲可以這樣認識:

  • 噪聲:我們常說“噪音污染”,意思就是“噪聲”干擾我們想聽到的真正聲音。同樣,假設樣本中某個主要的維度A,它能代表原始數據,是“我們真正想聽到的東西”,它本身含有的“能量”(即該維度的方差,爲啥?別急,後文該解釋的時候就有啦~)本來應該是很大的,但由於它與其他維度有那麼一些千絲萬縷的相關性,受到這些個相關維度的干擾,它的能量被削弱了,我們就希望通過PCA處理後,使維度A與其他維度的相關性儘可能減弱,進而恢復維度A應有的能量,讓我們“聽的更清楚”!
  • 冗餘:冗餘也就是多餘的意思,就是有它沒它都一樣,放着就是佔地方。同樣,假如樣本中有些個維度,在所有的樣本上變化不明顯(極端情況:在所有的樣本中該維度都等於同一個數),也就是說該維度上的方差接近於零,那麼顯然它對區分不同的樣本絲毫起不到任何作用,這個維度即是冗餘的,有它沒它一個樣,所以PCA應該去掉這些維度。

這麼一分析,那麼PCA的最終目的就是“降噪”和消滅這些“冗餘”的維度,以使降低維度的同時保存數據原有的特徵不失真。後面我們將結合例子繼續討論。

協方差矩陣——PCA實現的關鍵

前面我們說了,PCA的目的就是“降噪”和“去冗餘”。“降噪”的目的就是使保留下來的維度間的相關性儘可能小,而“去冗餘”的目的就是使保留下來的維度含有的“能量”即方差儘可能大。那首先的首先,我們得需要知道各維度間的相關性以及個維度上的方差啊!那有什麼數據結構能同時表現不同維度間的相關性以及各個維度上的方差呢?自然是非協方差矩陣莫屬。回憶下 淺談協方差矩陣的內容,協方差矩陣度量的是維度與維度之間的關係,而非樣本與樣本之間。協方差矩陣的主對角線上的元素是各個維度上的方差(即能量),其他元素是兩兩維度間的協方差(即相關性)。我們要的東西協方差矩陣都有了,先來看“降噪”,讓保留下的不同維度間的相關性儘可能小,也就是說讓協方差矩陣中非對角線元素都基本爲零。達到這個目的的方式自然不用說,線代中講的很明確——矩陣對角化。而對角化後得到的矩陣,其對角線上是協方差矩陣的特徵值,它還有兩個身份:首先,它還是各個維度上的新方差;其次,它是各個維度本身應該擁有的能量(能量的概念伴隨特徵值而來)。這也就是我們爲何在前面稱“方差”爲“能量”的原因。也許第二點可能存在疑問,但我們應該注意到這個事實,通過對角化後,剩餘維度間的相關性已經減到最弱,已經不會再受“噪聲”的影響了,故此時擁有的能量應該比先前大了。看完了“降噪”,我們的“去冗餘”還沒完呢。對角化後的協方差矩陣,對角線上較小的新方差對應的就是那些該去掉的維度。所以我們只取那些含有較大能量(特徵值)的維度,其餘的就舍掉即可。PCA的本質其實就是對角化協方差矩陣。

下面就讓我們跟着上面的感覺來推推公式吧。假設我們有一個樣本集X,裏面有N個樣本,每個樣本的維度爲d。即:

X={X1,,XN}Xi=(xi1,,xid)Rd,i=1,,N

將這些樣本組織成樣本矩陣的形式,即每行爲一個樣本,每一列爲一個維度,得到樣本矩陣S:。我們先將樣本進行中心化,即保證每個維度的均值爲零,只需讓矩陣的每一列除以減去對應的均值即可。很多算法都會先將樣本中心化,以保證所有維度上的偏移都是以零爲基點的。然後,對樣本矩陣計算其協方差矩陣,按照《淺談協方差矩陣》裏末尾的update,我們知道,協方差矩陣可以簡單的按下式計算得到:

下面,根據我們上文的推理,將協方差矩陣C對角化。注意到,這裏的矩陣C是是對稱矩陣,對稱矩陣對角化就是找到一個正交矩陣P,滿足:。具體操作是:先對C進行特徵值分解,得到特徵值矩陣(對角陣)即爲Λ,得到特徵向量矩陣並正交化即爲P。顯然,P,。假如我們取最大的前p(p<d)個特徵值對應的維度,那麼這個p個特徵值組成了新的對角陣,對應的p個特徵向量組成了新的特徵向量矩陣

實際上,這個新的特徵向量矩陣P1就是投影矩陣,爲什麼這麼說呢?假設PCA降維後的樣本矩陣爲S1,顯然,根據PCA的目的,S1中的各個維度間的協方差基本爲零,也就是說,S1的協方差矩陣應該爲Λ1。即滿足:

而我們又有公式:

代入可得:

由於樣本矩陣SN×d的每一行是一個樣本,特徵向量矩陣P1(d×p)的每一列是一個特徵向量。右乘P1相當於每個樣本以P1的特徵向量爲基進行線性變換,得到的新樣本矩陣中每個樣本的維數變爲了p,完成了降維操作。實際上,P1中的特徵向量就是低維空間新的座標系,稱之爲“主成分”。這就是“主成分分析”的名稱由來。同時,S1的協方差矩陣Λ1爲近對角陣,說明不同維度間已經基本獨立,噪聲和冗餘的數據已經不見了。至此,整個PCA的過程已經結束,小小總結一下:

  1. 形成樣本矩陣,樣本中心化
  1. 計算樣本矩陣的協方差矩陣
  1. 對協方差矩陣進行特徵值分解,選取最大的p個特徵值對應的特徵向量組成投影矩陣
  1. 對原始樣本矩陣進行投影,得到降維後的新樣本矩陣

Matlab中PCA實戰

首先,隨機產生一個10*3維的整數矩陣作爲樣本集,10爲樣本的個數,3爲樣本的維數。

1
S = fix(rand(10,3)*50);

計算協方差矩陣:

1
2
3
4
S = S - repmat(mean(S),10,1);
C = (S'*S)./(size(S,1)-1);
or
C = cov(S);

對協方差矩陣進行特徵值分解:

1
[P,Lambda] = eig(C);

這裏由於三個方差沒有明顯特別小的,所以我們都保留下來,雖然維度沒有降,但觀察Lambda(即PCA後的樣本協方差矩陣)和C(即原始的協方差矩陣),可以發現,3個維度上的方差都有增大,也就是能量都比原來增大了,3個維度上的方差有所變化,但對角線之和沒有變,能量重新得到了分配,這就是“降噪”的功勞。最後我們得到降維後的樣本矩陣:

1
S1 = S*P;

爲了驗證,我們調用matlab自帶的主成分分析函數princomp

1
[COEFF,SCORE] = princomp(S) % COEFF表示投影矩陣,SCORE表示投影后新樣本矩陣

對比,可以發現,SCORE和S1在不考慮維度順序和正負的情況下是完全吻合的,之所以我們計算的S1的維度順序不同,是因爲通常都是將投影矩陣P按能量(特徵值)的降序排列的,而剛纔我們用eig函數得到的結果是升序。另外,在通常的應用中,我們一般是不使用matlab的princomp函數的,因爲它不能真正的降維(不提供相關參數,還是我沒發現?)。一般情況下,我們都是按照協方差矩陣分解後特徵值所包含的能量來算的,比如取90%的能量,那就從最大的特徵值開始加,一直到部分和佔特徵值總和的90%爲止,此時部分和含有的特徵值個數即爲p。

經過了一番推公式加敲代碼的過程,相信大家對主成分分析應該不陌生了吧,同時對協方差矩陣也有了更深層次的認識了吧,它可不只是花花槍啊。我個人覺得PCA在數學上的理論還是很完備的,想必這也是它能在多種應用中博得鰲頭的原因吧。

發佈了21 篇原創文章 · 獲贊 55 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章