PCA算法原理簡介

PCA ( Principal Component Analysis , PCA )是主成分分析,主要 用於數據降維,對於一系列例子的特徵組成的多維向量,多維向量裏的某些元素本身沒有區分性,比如某個元素在所有的例子中都爲1,或者與1差距不大,那麼這個元素本身就沒有區分性,用它做特徵來區分,貢獻會非常小。所以我們的目的是找那些變化大的元素,即方差大的那些維,而去除掉那些變化不大的維,從而使特徵留下的都是“精品”,而且計算量也變小了。

       對於一個k維的特徵來說,相當於它的每一維特徵與其他維都是正交的(相當於在多維座標系中,座標軸都是垂直的),那麼我們可以變化這些維的座標系,從而使這個特徵在某些維上方差大,而在某些維上方差很小。例如,一個45度傾斜的橢圓,在第一座標系,如果按照x,y座標來投影,這些點的x和y的屬性很難用於區分他們,因爲他們在x,y軸上座標變化的方差都差不多,我們無法根據這個點的某個x屬性來判斷這個點是哪個,而如果將座標軸旋轉,以橢圓長軸爲x軸,則橢圓在長軸上的分佈比較長,方差大,而在短軸上的分佈短,方差小,所以可以考慮只保留這些點的長軸屬性,來區分橢圓上的點,這樣,區分性比x,y軸的方法要好!

       所以我們的做法就是求得一個k維特徵的投影矩陣,這個投影矩陣可以將特徵從高維降到低維。投影矩陣也可以叫做變換矩陣。新的低維特徵必須每個維都正交,特徵向量都是正交的。通過求樣本矩陣的協方差矩陣,然後求出協方差矩陣的特徵向量,這些特徵向量就可以構成這個投影矩陣了。特徵向量的選擇取決於協方差矩陣的特徵值的大小。

        舉一個例子:

         對於一個訓練集,100個對象模板,特徵是10維,那麼它可以建立一個100*10的矩陣,作爲樣本。求這個樣本的協方差矩陣,得到一個10*10的協方差矩陣,然後求出這個協方差矩陣的特徵值和特徵向量,應該有10個特徵值和特徵向量,我們根據特徵值的大小,取前四個特徵值所對應的特徵向量,構成一個10*4的矩陣,這個矩陣就是我們要求的特徵矩陣,100*10的樣本矩陣乘以這個10*4的特徵矩陣,就得到了一個100*4的新的降維之後的樣本矩陣,每個特徵的維數下降了。

當給定一個測試的特徵集之後,比如1*10維的特徵,乘以上面得到的10*4的特徵矩陣,便可以得到一個1*4的特徵,用這個特徵去分類。

       所以做PCA實際上是求得這個投影矩陣,用高維的特徵乘以這個投影矩陣,便可以將高維特徵的維數下降到指定的維數。

        在opencv裏面有專門的函數,可以得到這個這個投影矩陣(特徵矩陣)。

void cvCalcPCA( const CvArr* data, CvArr* avg, CvArr* eigenvalues, CvArr* eigenvectors, int flags );


來源:http://supeng411.blog.163.com/blog/static/50661522009112292847265/



補充:

It is a way of identifying patterns indata, and expressing the data in such a way as to highlight theirsimilarities and difference.

Method:

  step1: Get some data

   輸入數據

  step2:Subtract the mean

  將輸入的數據,減去均值。這樣做使得數據集在各個維度上的均值爲零。

  step3:Calculate the covariance matrix

   計算協方差矩陣

  注意,通過這一步計算,可以查看非對角線元素的正負性,他們反映的是維度間的相關性。同時可以發現,計算出來的協方差矩陣是一個對稱矩陣。

  step4:Calculate the eigenvectors and eigenvalues of thecovariance matrix

   計算協方差矩陣的特徵向量和特徵值

  step5:Choosing components and forming a feature vector

   將計算得到的特徵值排序,選擇特徵值大的作爲主成分,構造一個特徵矩陣

   In fact, it turns out that the eigenvector with thehighest eigenvalue is the principle component of the data set.

  step6:Deriving the new data set

  計算得到新 的數據集(即源數據集的投影數據集)

    將計算得到的主成分特徵向量左乘以原始數據集向量,得到新的(投影后的)數據集。

  FinalData = RowFeatureVector*RowDataAdjust

數據恢復:

  從上面,最後的數據降維運算等式可知,如果想要恢復數據,那麼需要進行如下的操作:

  RowDataAdjust = RowFeatureVector^(-1)*FinalData

 由於特徵向量間是相互正交的一組正交基,因此,對於特徵向量的求逆運算,正好等於求轉置運算。(可以理解,只有自己與自己相互乘的位置,纔不爲零。即只有對角線位置的元素乘,不爲零)

  RowDataAdjust = RowFeatureVector^(T)*FinalData

  由於在最初計算的時候,對數據是進行了減去均值操作,因此,想要恢復原始數據,需要在計算出上面的結果後,加上均值矩陣。

   RowDataAdjust = RowFeatureVector^(T)*FinalData+ OriginalMean



重要的參考文獻;

  "Face Recognition:Eigenface, Elastic Matching, andNeural Nets"   Digital Image Processing . RafaelC.Gonzalez and Paul Wintz.

PCA的應用

 1、模式識別

   在模式識別的時候,比如在人臉的識別的時候,可以先將人圖像圖像的元素構造成一個N^2維的一個行向量,這樣可以將獲取到的M幅圖像,組合成爲一個M*N^2的原始圖像數據矩陣。這樣可以求解得到N^2個特徵向量,選取這些特徵向量構造成一個特徵向量矩陣,然後將這個特徵矩陣左乘以原始圖像數據矩陣,可以降維得到投影后的圖形數據矩陣。然後,在這個投影后的空間中,計算新輸入的人臉圖像與空間中哪個圖像最近,這樣實現模式匹配。

  因此,在這裏,進行PCA降維的目的是爲了將獲取到的不同人臉數據整體投影到一個新的低維空間中。在新的空間中,比較距離。

2、數據壓縮

  在進行圖像數據壓縮的時候,構造的數據矩陣與模式識別時不一樣的。因爲在這個,需要對不同圖像同一位置的像素點所在空間進行投影,因此,如果有M幅圖像,那麼構造的數據向量每一行的維度爲M,表示的是在每個樣本圖像中的對應於同一點的數據值。那麼總共就可以得到N^2個這樣的向量,表示出圖像中對於任何一點的數據分佈。

 進行PCA降維的時候,是將每一點的可能分佈,從原來的M維降低到新的維度,減少每一個像素點的可能分佈空間,從而實現數據的壓縮操作。



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