PCA原理以及算法實現

一.算法介紹

PCA(Princiapal Component Analysis),主成分分析,是統計數據分析、特徵提取和數據壓縮的經典方法,起源於Pearson的早期工作。實際上,PCA主要作用就是將一個存在信息冗餘的多維空間變成一個無信息冗餘的較低維空間,是一種通用的降維方法。

舉個例子,從一幅數字圖像中取出一個8x8的像素窗口,首先通過逐行掃描,變換到向量x ,其元素爲64個像素的灰度值,在實時的數字視頻傳輸中,由於數據量很大,所以在保證視頻質量不至於損失太多的同時,應該儘量減少數據量。使用PCA,由x 可以得到一種壓縮表示y ,這裏y可以只有10個元素,這樣就能方便的用來存儲和傳輸了。這種壓縮是可能的,因爲x 的相鄰元素,即相鄰像素的灰度值,是高度相關的。

二.算法原理

假設向量x 是一個n維的隨機變量,並且x 的均值爲0,

E(x)=0

我們想要求得這樣的一個m*n的w 權值矩陣,將n維度的特徵空間映射成m維的特徵空間,
y=wx

這裏,我們需要考慮的是怎樣的映射纔是符合優化要求的,我們知道向量x 的特徵之間存在冗餘信息,因而我們期望y的各個特徵維度之間是正交的,且每一個維度上的分佈儘可能的分散,也就是每個維度的方差儘可能的大,我們考慮到y的協方差矩陣,假設
y=(y1,y2,...ym)

那麼y的協方差矩陣D爲,
E(y21)E(y2y1)...E(ymy1)E(y1y2)E(y22)...E(ymy2)............E(y1ym)E(y2ym)...E(y2m)

我們可以發現,除了對角線上的元素,其餘元素皆爲兩兩維度的協方差,這裏我們考慮的是,
max(E(y2i)),E(yiyj)=0,i=j

實際上就是將y的協方差矩陣進行對角化,就可以求出我們想要的w了。
D=E(yyT)=E(wx(wx)T)=E(w(xxT)wT)=wE(xxT)wT=wCwT

其中,C是X的協方差矩陣,我們將矩陣D對角化,這裏使用了線性代數的特徵向量的知識,我們知道滿足矩陣D對角化的w需滿足,

Cwi=λiwi,i=1,2,...,m

基於矩陣的基礎知識,我們知道矩陣xxT 是正定的,那麼其對應的特徵向量應該有n個,且特徵值均不小於0,
λ1λ2...λn0

這裏我們取前m個特徵值所對應的特徵向量,構成矩陣w
(w1,w2,...,wm)T

最後,我們通過y=wx 將x映射到y上,實現了降維。

三、算法描述以及代碼實現

算法的僞代碼如下:

  1. 去除平均值
  2. 計算協方差矩陣
  3. 計算協方差矩陣的特徵值和特徵向量
  4. 將特徵值從大到小排序
  5. 保留特徵值較大的M個向量
  6. 將數據轉映射到上述的M個向量構建的新空間中

這裏,使用python以及numpy庫來實現,

from numpy import *
def PCA(data,N)
    #(1)去掉平均值
    meanValues=mean(data,axis=0)
    removedVals=data-meanValues
    #(2)計算協方差矩陣
    covMat=cov(removedVals,rowvar=0)
    #(3)計算協方差矩陣的特徵值和特徵向量
    speVals,speVects=linalg.eig(mat(covMat))
    #(4)將特徵值從大到小排序,取前N個
    speValsIndex=argsort(speVals)
    speValsIndex=speVals[:N+1:-1]
    #(5)保留特徵值較大的N個向量
    remainVects=specVects[:,speValsIndex]
    #(6)將數據映射到新空間上
    lowDimData=removedVals*remainVects
    return lowDimData

四.感悟與不足

這裏的原理介紹,數學上還很不嚴密,感興趣的朋友可以自己認真推導一遍,其中主要涉及到兩個問題:

  1. 怎樣的基變換才能保證數據的壓縮是可靠?
  2. 協方差矩陣對角化的意義是什麼?
    這裏僅僅是個人理解,如果有不足之處,還望指正。

五.參考資料

1.Aapo Hyvarinen等,獨立成分分析》,周宗潭 翻譯,電子工業出版社
2.Peter Harrington,《機器學習實戰》,李銳 等翻譯 ,人民郵電出版社
3.張賢達,《矩陣分析與應用》,清華大學出版社

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章