1. 程式人生 > >協方差矩陣與PCA+Matlab

協方差矩陣與PCA+Matlab

協方差矩陣與特徵值及其特徵向量

最近在利用協方差矩陣計算些東西,對結果有點混亂,所以打算整理一下這方面的東西。

一 協方差矩陣

首先,關於協方差矩陣的公式都見得到這裡就不擺了。

理解協方差矩陣是:

  1. 協方差矩陣相對於協方差是能處理多維問題
  2. 輸入協方差矩陣中的資料:行表示樣本,列表示維度
  3. 協方差矩陣是一個對稱矩陣,無論輸入的資料mxn中樣本數m多大,最終得到的都是nxn的方陣
  4. 協方差矩陣度量的是維度與維度之間的關係,所以協方差計算的是不同維度之間的協方差
  5. 協方差矩陣計算時是按列進行計算均值的;協方差矩陣對角線上的元素是各個維度的方差,其他元素是兩兩維度間的協方差(相關性)

- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

二 協方差矩陣與PCA

主成分分析(Principal Component Analysis,簡稱PCA),簡單來說就是一個通用的降維工具。

      PCA是找出最能夠代表原始資料的投影方法,即降維後的資料不能失真,降掉的那些噪聲或是冗餘的維度資料,把高維的資料通過線性變換投影到低維空間上去。

    而PCA實現的關鍵就是通過協方差矩陣。參考前面描述的協方差矩陣,要降掉的是相關性很小的(噪聲)維度,協方差矩陣提供了這一資料,即把協方差矩陣非對角線上的元素趨近於零,通過矩陣對角化實現。

   對角化後得到的矩陣,其對角線上是協方差矩陣的特徵值:各個維度新方差;對角化後剩餘維度之間的相關性已經減弱,完成去噪。

   去除冗餘,對於得到的對角化後的新方差矩陣只取那些含有較大方差(特徵值)的維度,其餘的舍掉即可。

   所以,PCA的本質其實就是對角化協方差矩陣

   結合協方差矩陣進行主成分分析大致流程:

  •  得到樣本矩陣
  •  計算樣本矩陣的協方差矩陣
  •  對協方差矩陣進行特徵值分解,選取p個特徵值對應的特徵向量組成投影矩陣
  •  對原始樣本矩陣進行投影,得到降維後的新樣本矩陣

- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

三 MATLAB實現

(假設原始樣本矩陣是mxn,隨機產生m = 20,n = 3)

S = fix (rand(20,3)*20))

計算協方差矩陣:

S = S - repmat(mean(S),20,1)          or      C = cov(S)

C = (S*S)./(size(S,1)-1)

對協方差矩陣進行特徵值分解:

[V D] = eig(C)

注:這裡的維度為三維,所以全保留。且eig()函式得到的結果是升序排列的

        D 是PCA後的樣本協方差矩陣(特徵向量)

        V是降噪後的協方差矩陣的方差(特徵值),又稱為投影矩陣

PCA降維後的新樣本矩陣:

S1 = S*V

- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

注:MATLAB自帶了主成分分析函式princomp()

[coeff,score] = princomp(S) 

coeff 表示投影矩陣

score 表示投影后的新樣本矩陣

但,score得到的結果和S1的維度排序不一致,是因為此時計算的投影矩陣是降序排列的,與V相反。

間斷性更新、完善吧。

分享,多擔待。望有幫助