看了很多主成分分析的的解釋,都太理論了,完全get不到點,我又不是搞數學的。看不懂看不懂。
打算寫一下主成分分析的步驟幫助我理解這個方法,至於里面為什么要用到方差,協方差這個東西,你需要去看看相關的文獻說明,比如要解釋為什么協方差矩陣的特征值最大的前 k 個特征向量就是k維理想特征,我看到的有三個理論:分別是最大方差理論、最小錯誤理論和坐標軸相關度理論。
這兒貼兩篇文章,這篇的內容也主要來源於這兩篇文章
https://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html
https://www.cnblogs.com/jerrylead/archive/2011/04/18/2020216.html
而且啊,用方差最大來選擇也不一定就適用於所有的數據降維,比如數據不滿足高斯分布的時候,用方差最大來衡量的話顯然是不明智的,所以有了獨立主元分解(ICA)的提出。
扯遠了,閑話不多說,將講一下步驟,假設我們有m個n維的數據,我們想降維到K維(當然 K肯定小於等於n):
1、分別求m個數據在每一維上的均值,然后每個數據的每一維都減去每一維對應的均值。舉個例子,3個2維數據(1,5),(3,4),(5,-3),我想降到1維,第一維的均值為(1+3+5)/3=3,第二維的均值為(5+4-3)/3=2,然后對應的減去均值變成了(-2,,3),(0,2),(2,-5)。
2、求特征協方差矩陣,多少維的數據,協方差矩陣就是幾乘幾大小的,比如三維的如下
主對角線是方差,其他位置是協方差。至於這個cov(x,x)、cov(x,y)怎么計算。首先說一下方差,方差說的是自己維度與自己維度的相關性。我們第一步不是把均值變成0了嗎(這就是為什么要減均值),
Var(a)就是我們求得a維的方差,他等於m個數據在這個維度上的取值平方之和除以m。協方差又是啥玩意呢?
其實就是當前維度a與另一個維度b在m個數據上各自取值的積之和再除以m,方差也就是協方差的一種特例。那么顯然cov(a,b)與cov(b,a)是完全等價的噻。我們計算的時候計算一次就好了。
3、求協方差矩陣的特征值和特征向量,剛才說了協方差矩陣是個n*n的方針,n是數據維度。而且cov(a,b)與cov(b,a)是完全等價的,這樣的矩陣叫做實對稱矩陣,實對稱矩陣有一系列非常好的性質:
A、實對稱矩陣不同特征值對應的特征向量必然正交。
B、設特征向量λ重數為r,則必然存在r個線性無關的特征向量對應於λ,因此可以將這r個特征向量單位正交化。
由上面兩條可知,一個n行n列的實對稱矩陣一定可以找到n個單位正交特征向量,設這n個特征向量為e1,e2,⋯,en。講了這么多就是為了說明協方差矩陣的特征值和特征向量是一定存在求得出來的,而且特征向量還是正交的。
4、將特征值按照從大到小的順序排序,選擇其中最大的k個,然后將其對應的k個特征向量分別作為列向量組成特征向量矩陣。沒啥技術含量,也沒啥可講的
5、將樣本點投影到選取的特征向量上。第一步假設樣例數為m,特征數為n,減去均值后的樣本矩陣為DataAdjust(m×n),則協方差矩陣是n×n,選取的k個特征向量組成的矩陣為EigenVectors(n×k)。那么投影后的數據FinalData為
FinalData(m×k) = DataAdjust(m×n) × EigenVectors(n×k)
最終得到的數據是m個k維的,原來的數據(處理過的,減掉均值的)是m個n維的,我們選的特征向量矩陣是n×k的,含義就是從n個特征值中選了最大的k個。那不就完成了從n維降到了k維嗎。
PCA技術的一個很大的優點是,它是完全無參數限制的。在PCA的計算過程中完全不需要人為的設定參數或是根據任何經驗模型對計算進行干預,最后的結果只與數據相關,與用戶是獨立的。
但是,這一點同時也可以看作是缺點。如果用戶對觀測對象有一定的先驗知識,掌握了數據的一些特征,卻無法通過參數化等方法對處理過程進行干預,可能會得不到預期的效果,效率也不高。所以有了kernel-PCA,它根據先驗知識對數據預先進行非線性轉換擴展了PCA能夠處理的問題的范圍,又可以結合一些先驗約束,是比較流行的方法。感興趣的自己去查查。
再貼一個PCA的數學原理的文章,講的也蠻好,公式顯示不出來的話,多F5刷新幾次,或者 Shift+F5 刷新,二者的區別在於:
1. F5(ctrl+r):重載當前頁面;
2. Shift+F5(ctrl+shift+F5):忽略緩存內容,重載當前頁面。
文章鏈接: http://blog.codinglabs.org/articles/pca-tutorial.html
好了,到這兒就結束了,步驟就講完了。