感受PCA之美(Principal components analysis overview and application)

寫在前面:

       前兩週剛好翻到自己的畢業論文,看到之前做過的關於PCA點雲法向量估計的推導.發現有些概念已經有些模糊不清了,正好遇到要進行組內分享,於是又重新查找資料對PCA再做了一次探索.

       當你去探究每一個陌生概念或者算法的時候,都會經歷從混亂,到初見門道,到茅塞頓開的一個過程.混亂是痛苦的,混亂時候的痛苦和你茅塞頓開時獲得的成就感是成正比的. 這篇文章我會從我的角度去記錄這個過程.如果你還不瞭解PCA,希望通過這篇文章也能讓你茅塞頓開,如果你已經很熟悉PCA,那希望你可以在這篇文章中再一次感受PCA之美.

前言:

        這篇文章會大體分三個部分進行敘述,第一節什麼是PCA,對PCA做一個大體的介紹,配合一個直觀的例子,帶大家感受一下整個PCA的過程。第二節,PCA原理,根據我自己的體會,跟大家做一些PCA大致的推導。第三節,PCA應用,根據一些例子,做一些PCA應用的分析。第四節,簡單的說一下PCA和Autoencoder的關係。在這裏shout out to leemeng. 這篇文章中的很多動畫出自他手,在文章最後我會貼出他的博客地址。

一.什麼是PCA

         PCA 全名 Principal components analysis。翻譯過來就是主成分分析,顯而易見,這就是一種用來分析主要成分的方法。用稍微專業一點的話來說:在機器學習領域,PCA是一種被廣泛用於數據線性降維(Dimension reduction)和特徵提取(Feature extraction)的方法(這裏的線性劃重點,會在第四節具體說到)。

        在機器學習中主要希望用PCA達到dimension reduction的目的,主要是爲了避免Hughes Phenomenon 和 curse of dimensionality。這邊先簡單的複習一下維度詛咒,預測和分類的能力通常是隨着數據維度數的增加而上升,但當模型樣本數沒有繼續增加的情況下,預測和分類能力達到一定程度之後,預測和分類能力反而會隨着數據維度的增加而減小。同時對於很多的數據進行降維還有利於加速,保證降維後各個維度之間的數據獨立性最高即方差最大。但是PCA的缺點在於,進行降維後的數據是不可解釋的,但大部分時候我們是不在意的。因爲這個特點,PCA還常常用於訓練數據集的加密。比如你想把你收集的數據集分享給大家,但是不想讓大家用你的數據集做其他用途,就可以直接放出經過降維的數據。

在繼續閱讀下面部分之前,有必要跟大家說明本文後面設計的線性代數知識。

Linear Combination(線性組合)

Linear Transformation(線性變換)

Dot Product(點積)

Change of Basis(基底變換)

Eigenvalue Eigenvalue(特徵值與特徵向量)

當然如果你不熟悉也沒關係,在這篇文章我會儘可能用通俗易懂的語言去讓你感受PCA,你可以稍後在去理解這些知識。當然,這邊更推薦你快速的觀看3Blue1Brown的線性代數的本質,幫助你快速的複習。

         現在我就用一個簡單的例子,假設你收集了一組二維數據如下。現在看看這組數據,相信根據你的幾何直覺,你能感覺到,你可能能使用一條直線去表示這組數據。

 

dataset

             果然,根據下面的視頻你可以發現,我們做了一個將這組二維數據映射到向量v的一個操作。每一個數據,我們都把他用一個值來表示,這就是最簡單的一個PCA的過程,把一個組二維的數據,變換成了一維。 

PCA

              v這個向量是如何找到的呢?爲什麼說v這個向量能保存這組數據最大的特徵呢?

二.原理推導

        我們上面已經說過,我們PCA想要得到結果是降維後的數據能夠保證數據最多的信息,並且能夠使降維後的數據之間的相關性降到最低。所以就牽扯到了我們下面要講的概念去相關(Decorrelation)。所以其實一個PCA過程也可以說分成了兩部分,去相關和線性映射。

1.Decorrelation

        說到相關性,相信大家都能在自然而然的想到一個東西,協方差(covariance),我們現在來簡單的複習一下協方差的意義。

covariance

         可能有些朋友還知道協方差的另一個名字,共變異數,簡單的解釋:當cov大於0的時候表示兩特徵的變化有相同的傾向。cov等於0的時候表示兩個特徵的變化沒有明顯的關係,cov小於0的時候表示兩特徵的變化具有相反的傾向。下面這個動圖你可以直觀的感受一下協方差的計算過程。這裏有一個要注意的是,不知道大家能不能發現這組數據其實已經經過了正規化處理,其具體的意義我在這裏就不做贅述。

computecovariance

       現在我們去相關要達到的目標是通過某種操作,讓兩個特徵的相關性爲0,即他們的協方差爲0。實現這個目的,我們需要知道基底變換這個概念,下面這個動圖表示了基底變換是如何影響數據的協方差的。

covariancerotate

              這時候我們如何找到pc1和pc2這個新的基底呢?這時候我們就需要引入下一個重要的概念,協方差矩陣。

協方差矩陣:協方差矩陣是一個n*n維的方陣,協方差矩陣的元素值代表了樣本集在對應方向上的方差,也就是說每一個值代表了某兩個特徵之間的

             

 

        我們的目的是要將樣本之間的協方差都變成0,這時候大家有沒有一點感覺,當一個矩陣除了對角線上其他位置的值都爲0的時候我們叫他對角矩陣。我們現在就要想辦法把這個協方差矩陣變成一個對角矩陣。熟悉線性的代數的朋友應該知道下面要說的方法。叫做奇異值分解,當你需要分解的矩陣是個方陣的時候,這個方法又可以叫做特徵值分解。

EVD

      對角線上的值即爲一個個特徵向量,Q即爲一組正交的基底。我們通過Q的轉置對原數據樣本進行線性變換,就是做了基底變換的操作,顯而易見,經過基底變換,我們把這組數據的協方差變成了0。

      其中特徵值越大,表示在這個方向上數據的方差越大。這一點需要使用拉格朗日乘子進行證明,在下一節的利用PCA進行點雲法向量估計中你也可以體會這個過程,在這裏不久不做詳細的證明,感興趣的可以在mathematics for machine learning這本書的chapter10中做進一步瞭解。

2.Reconstruction Error

      我們在前面提到過,我們要保證降維之後的數據能保存儘可能多的數據的價值。這時候我們就需要引入Reconstruction Error這個概念了,這個概念也是後面會說的autoencoder的關鍵。

RE

    其中的T就對應的把數據從二維投影到一維的投影矩陣。通過下面這個動圖,大家可以感受一下整個RE的變換。也可以大致理解pc1和pc2的區別。

RE

       下面分享一些更多的對於協方差矩陣的理解。

        協方差矩陣C的對角線上的元素C(i,i)代表了樣本集在第i個維度上的方差,也即代表樣本集在第i個維度上的能量。C(i,j)代表了樣本集在第i個維度和第j個維度上的樣本分量之間的協方差,可以理解爲樣本集在第i維投影方向和第j維投影方向之間的斜線方向上的方差,或者能量。所以,協方差矩陣集中表示了樣本集在原n維空間中各個方向上的能量分佈。

        通過對協方差矩陣求特徵向量,實際上找到的是在原n維空間中的一些特定的方向,樣本集的能量集中分佈在這些方向上,而特徵值的大小就反映了樣本集在該方向上的能量大小。PCA正式基於這一點,刪掉對應特徵值小的方向,只保留主要的方向,達到降維的目的。

三.一些應用

1.PCA點雲法向量估計

        我本人主要的方向是三維計算機視覺,最初接觸到PCA也是因爲做點雲法向量估計。如果對這個不熟悉的同學可以跳過這一節。

         對於點雲中每個點的法向量屬性的定義是垂直於其所在平面的向量,即採用當前點的鄰近點,擬合出一個局部平面,進行法向量求解。基於主成分分析方法的法向量估計實際上是從最小二乘法推導出來的。

         對於鄰近點的查找,採用以當前爲球心做半徑爲0.05的球,球內的點爲該點的鄰近點。找到一個平面,使得以上選出的點到這個平面的距離最小。假設這個平面的中心點爲 c , 穿過中心點的法向量爲 n, 那麼點 xi 到平面的距離 d ,可以看作是向量 xi-c 在法線方向上投影向量的長度,根據以上原理我們可以列出目標函數式:

           通常情況下,我們可以把點c看作空間中所有點的中心,這一步實際上就是在做數據中心化。

            根據上面兩個式子對我們的目標函數進行代入。

             對上面的式子進行展開化簡。

            顯而易見,大家可以自己去找一些數據在本子上畫一畫,S即是一個協方差矩陣,同樣的對其進行特徵值分解,這時由於我們的目標是最小化f(n),所以這時我們選取最小特徵值對應的特徵向量,即是我們需要的法向量。其中的原理就是簡單的矩陣運算。再多想一點,其實我們做法向量估計其實就是在做平面擬合,也就是將三維的點雲數據降到二維,而這裏爲什麼選取特徵值最小特徵向量剛好是因爲特徵值越小,那麼就越能表現這些數據的共性

2.In machine learning

           這邊有一些scikit-learn中提供的數據,上面也附有代碼和數據,大家親自去運行一下,就會對PCA的應用有着更深刻的理解。後面有機會,會挑一個例子做一些詳細的分析。

The Iris DataSet

The Olivetti Faces

Handwritten Digits

四.From PCA to Autoencoder 

          如果你讀懂了前面的文章,那麼可以知道,在上面講的PCA的所有過程中,我們所做的都是線性變換,做的線性降維。

          在進行深度學習研究,特別是計算機視覺領域的深度學習時,我們常常面對的數據是圖片,一張800*800的RGB圖片就有1920000維的特徵,對於這樣的大量特徵,PCA速度慢的缺點就會暴露的很明顯。那既然是深度學習,那我們能不能通過一個網絡來做PCA呢?答案當然是可以的。還記得我們前面說的Reconstruction Error嗎?通過這個Reconstruction Error我們便可以設計一個簡單的網絡:

autoencoder

           其中的Encoder可以理解爲我們前面提到的投影矩陣,其中的Decoder可以理解爲投影矩陣的轉置。除了速度快,Autoencoder還有一個更好的地方就是,如果我們在網絡中引入非線性層,那它就變成了一個非線性的降維方法。

          總的來說,Autoencoder就是一個更加高效,更加靈活,更加powerful的”PCA“(這就是深度學習的魅力嗎?OvO)。這邊建議大家去看Geoffrey Hinton的Neural Networks for Machine Learning中的Lecture 15 From PCA to Autoencoder。

Reference

世上最生動的PCA (動畫資源的來源)

A One-Stop Shop for Principal Component Analysis  (更多從datascience角度講解)

Mathematics for machine learning chapter 15 (正如書名 非常的mathematical)

 

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