PCA (主成分分析)詳解 (寫給初學者) 結合matlab

(轉載請註明出處)

1、簡介 數據庫

       PCA(Principal Components Analysis)即主成分分析,是圖像處理中常常用到的降維方法,你們知道,咱們在處理有關數字圖像處理方面的問題時,好比常常用的圖像的查詢問題,在一個幾萬或者幾百萬甚至更大的數據庫中查詢一幅相近的圖像。這時,咱們一般的方法是對圖像庫中的圖片提取響應的特徵,如顏色,紋理,sift,surf,vlad等等特徵,而後將其保存,創建響應的數據索引,而後對要查詢的圖像提取相應的特徵,與數據庫中的圖像特徵對比,找出與之最近的圖片。這裏,若是咱們爲了提升查詢的準確率,一般會提取一些較爲複雜的特徵,如sift,surf等,一幅圖像有不少個這種特徵點,每一個特徵點又有一個相應的描述該特徵點的128維的向量,設想若是一幅圖像有300個這種特徵點,那麼該幅圖像就有300*vector(128維)個,若是咱們數據庫中有一百萬張圖片,這個存儲量是至關大的,創建索引也很耗時,若是咱們對每一個向量進行PCA處理,將其降維爲64維,是否是很節約存儲空間啊?對於學習圖像處理的人來講,都知道PCA是降維的,可是,不少人不知道具體的原理,爲此,我寫這篇文章,來詳細闡述一下PCA及其具體計算過程:網絡

2、PCA詳解函數

一、原始數據:學習

爲了方便,咱們假定數據是二維的,藉助網絡上的一組數據,以下:
spa

x=[2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2, 1, 1.5, 1.1]T
y=[2.4, 0.7, 2.9, 2.2, 3.0, 2.7, 1.6, 1.1, 1.6, 0.9]T索引

二、計算協方差矩陣圖片

什麼是協方差矩陣?相信看這篇文章的人都學過數理統計,一些基本的常識都知道,可是,也許你很長時間不看了,都忘差很少了,爲了方便你們更好的理解,這裏先簡單的回顧一下數理統計的相關知識,固然若是你知道協方差矩陣的求法你能夠跳過這裏。ip

(1)協方差矩陣:ci

首先咱們給你一個含有n個樣本的集合,依次給出數理統計中的一些相關概念:get

均值:
標準差:
方差:

既然咱們都有這麼多描述數據之間關係的統計量,爲何咱們還要用協方差呢?咱們應該注意到,標準差和方差通常是用來描述一維數據的,但現實生活咱們經常遇到含有多維數據的數據集,最簡單的你們上學時免不了要統計多個學科的考試成績。面對這樣的數據集,咱們固然能夠按照每一維獨立的計算其方差,可是一般咱們還想了解這幾科成績之間的關係,這時,咱們就要用協方差,協方差就是一種用來度量兩個隨機變量關係的統計量,其定義爲:

從協方差的定義上咱們也能夠看出一些顯而易見的性質,如:

(X的方差)

須要注意的是,協方差也只能處理二維問題,那維數多了天然就須要計算多個協方差,好比n維的數據集就須要計算個協方差,那天然而然的咱們會想到使用矩陣來組織這些數據。給出協方差矩陣的定義:

這個定義仍是很容易理解的,咱們能夠舉一個簡單的三維的例子,假設數據集有三個維度,則協方差矩陣爲

可見,協方差矩陣是一個對稱的矩陣,並且對角線是各個維度上的方差。

(2)協方差矩陣的求法:

協方差矩陣計算的是不一樣維度之間的協方差,而不是不一樣樣本之間的。下面咱們將在matlab中用一個例子進行詳細說明:

首先,隨機產生一個10*3維的整數矩陣做爲樣本集,10爲樣本的個數,3爲樣本的維數。
MySample = fix(rand(10,3)*50)

根據公式,計算協方差須要計算均值,那是按行計算均值仍是按列呢,我一開始就總是困擾這個問題。前面咱們也特別強調了,協方差矩陣是計算不一樣維度間的協方差,要時刻牢記這一點。樣本矩陣的每行是一個樣本,每列爲一個維度,因此咱們要按列計算均值。爲了描述方便,咱們先將三個維度的數據分別賦值:

dim1 = MySample(:,1);
dim2 = MySample(:,2);
dim3 = MySample(:,3);

計算dim1與dim2,dim1與dim3,dim2與dim3的協方差:

sum( (dim1-mean(dim1)) .* (dim2-mean(dim2)) ) / ( size(MySample,1)-1 ) % 獲得  74.5333
sum( (dim1-mean(dim1)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 ) % 獲得  -10.0889
sum( (dim2-mean(dim2)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 ) % 獲得  -10***000

搞清楚了這個後面就容易多了,協方差矩陣的對角線就是各個維度上的方差,下面咱們依次計算:

std(dim1)^2 % 獲得   108.3222
std(dim2)^2 % 獲得   260.6222
std(dim3)^2 % 獲得  94.1778

這樣,咱們就獲得了計算協方差矩陣所須要的全部數據,調用Matlab自帶的cov函數進行驗證:

cov(MySample)

能夠看到跟咱們計算的結果是同樣的,說明咱們的計算是正確的。可是一般咱們不用這種方法,而是用下面簡化的方法進行計算:

先讓樣本矩陣中心化,即每一維度減去該維度的均值,而後直接用新的到的樣本矩陣乘上它的轉置,而後除以(N-1)便可。其實這種方法也是由前面的公式通道而來,只不過理解起來不是很直觀而已。你們能夠本身寫個小的矩陣看一下就明白了。其Matlab代碼實現以下:

X = MySample – repmat(mean(MySample),10,1);    % 中心化樣本矩陣
C = (X’*X)./(size(X,1)-1)

(爲方便對matlab不太明白的人,小小說明一下各個函數,一樣,對matlab有必定基礎的人直接跳過:

B = repmat(A,m,n ) %%將矩陣 A 複製 m×n 塊,即把 A 做爲 B 的元素,B 由 m×n 個 A 平鋪而成。B 的維數是 [size(A,1)*m, (size(A,2)*n] 

B = mean(A)的說明:

若是你有這樣一個矩陣:A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];
用mean(A)(默認dim=1)就會求每一列的均值
ans =
    3.0000    4.5000    6.0000
用mean(A,2)就會求每一行的均值 
ans =
    2.0000
    4.0000
    6.0000

   6.0000

size(A,n)%% 若是在size函數的輸入參數中再添加一項n,並用1或2爲n賦值,則 size將返回矩陣的行數或列數。其中r=size(A,1)該語句返回的是矩陣A的行數, c=size(A,2) 該語句返回的是矩陣A的列數)

上面咱們簡單說了一下協方差矩陣及其求法,言歸正傳,咱們用上面簡化求法,求出樣本的協方差矩陣爲:

                      

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

由於協方差矩陣爲方陣,咱們能夠計算它的特徵向量和特徵值,以下:

[eigenvectors,eigenvalues] = eig(cov)

咱們能夠看到這些矢量都是單位矢量,也就是它們的長度爲1,這對PCA來講是很重要的。

四、選擇成分組成模式矢量

求出協方差矩陣的特徵值及特徵向量以後,按照特徵值由大到小進行排列,這將給出成分的重要性級別。如今,若是你喜歡,能夠忽略那些重要性很小的成分,固然這會丟失一些信息,可是若是對應的特徵值很小,你不會丟失不少信息。若是你已經忽略了一些成分,那麼最後的數據集將有更少的維數,精確地說,若是你的原始數據是n維的,你選擇了前p個主要成分,那麼你如今的數據將僅有p維。如今咱們要作的是組成一個模式矢量,這只是幾個矢量組成的矩陣的一個有意思的名字而已,它由你保持的全部特徵矢量構成,每個特徵矢量是這個矩陣的一列。

對於咱們的數據集,由於有兩個特徵矢量,所以咱們有兩個選擇。咱們能夠用兩個特徵矢量組成模式矢量:

                                     

咱們也能夠忽略其中較小特徵值的一個特徵矢量,從而獲得以下模式矢量:

                                                    

五、獲得降維後的數據

  

其中rowFeatureVector是由模式矢量做爲列組成的矩陣的轉置,所以它的行就是原來的模式矢量,並且對應最大特徵值的特徵矢量在該矩陣的最上一行。rowdataAdjust是每一維數據減去均值後,所組成矩陣的轉置,即數據項目在每一列中,每一行是一維,對咱們的樣原本說便是,第一行爲x維上數據,第二行爲y維上的數據。FinalData是最後獲得的數據,數據項目在它的列中,維數沿着行。

這將給咱們什麼結果呢?這將僅僅給出咱們選擇的數據。咱們的原始數據有兩個軸(x和y),因此咱們的原始數據按這兩個軸分佈。咱們能夠按任何兩個咱們喜歡的軸表示咱們的數據。若是這些軸是正交的,這種表達將是最有效的,這就是特徵矢量老是正交的重要性。咱們已經將咱們的數據從原來的xy軸表達變換爲如今的單個特徵矢量表達。

(說明:若是要恢復原始數據,只需逆過程計算便可,即:

到此爲止,相信你已經掌握了PCA及其原理了

相關文章
相關標籤/搜索