一.算法介紹
PCA(Princiapal Component Analysis),主成分分析,是統計數據分析、特徵提取和數據壓縮的經典方法,起源於Pearson的早期工作。實際上,PCA主要作用就是將一個存在信息冗餘的多維空間變成一個無信息冗餘的較低維空間,是一種通用的降維方法。
舉個例子,從一幅數字圖像中取出一個8x8的像素窗口,首先通過逐行掃描,變換到向量
二.算法原理
假設向量
我們想要求得這樣的一個m*n的
這裏,我們需要考慮的是怎樣的映射纔是符合優化要求的,我們知道向量
那麼y的協方差矩陣D爲,
我們可以發現,除了對角線上的元素,其餘元素皆爲兩兩維度的協方差,這裏我們考慮的是,
實際上就是將y的協方差矩陣進行對角化,就可以求出我們想要的w了。
其中,C是X的協方差矩陣,我們將矩陣D對角化,這裏使用了線性代數的特徵向量的知識,我們知道滿足矩陣D對角化的w需滿足,
基於矩陣的基礎知識,我們知道矩陣
這裏我們取前m個特徵值所對應的特徵向量,構成矩陣w
最後,我們通過
三、算法描述以及代碼實現
算法的僞代碼如下:
- 去除平均值
- 計算協方差矩陣
- 計算協方差矩陣的特徵值和特徵向量
- 將特徵值從大到小排序
- 保留特徵值較大的M個向量
- 將數據轉映射到上述的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.Aapo Hyvarinen等,獨立成分分析》,周宗潭 翻譯,電子工業出版社
2.Peter Harrington,《機器學習實戰》,李銳 等翻譯 ,人民郵電出版社
3.張賢達,《矩陣分析與應用》,清華大學出版社