PCA算法學習_2(PCA理論的matlab實現)


 

  前言

  在前面的博文PCA算法學習_1(OpenCV中PCA實現人臉降維)中已經初步介紹了PCA算法的大概流程及在人臉降維上面的應用。本文就進一步介紹下其理論基礎和matlab的實現(也是網上學者的代碼)。

  開發環境:Matlab2012a

 

  基礎

  假設X是一個m*n的矩陣,是由樣本數據構成的矩陣。其中m表示樣本的屬性維數,n表示樣本的個數。現在要對X進行線性變換變成另一個矩陣Y,使得Y的協方差矩陣為對角矩陣,這樣的Y就認為是對原始矩陣X提取主成分后的矩陣,實際過程中只需取Y的前面主要的行即可。

  X變換到Y的線性變換公式為:

  

  X和Y的協方差計算方法為:

  

  

  從下面的公式可以看出Cy和Cx的關系為:

  

  因為Cx是對稱矩陣,對Cx進行特征值分解就可以將其變換成對角矩陣,見下面的公式推導:

   

  公式中的P和E滿足:

   

  其中D是由Cx的特征向量構成的對角矩陣。P是線性變換矩陣,P的每一行都是Cx矩陣的特征向量,且P是正交矩陣,一般情況下把特征值大的特征向量排在矩陣前面幾行。

  由此可知,求出P后就可以求出X主成分矩陣了。

  另外,還可以求出PCA的白化矩陣,PCA的白化矩陣就是特征向量去相關的矩陣,白化矩陣的協方差陣一般為單位矩陣,在PCA中可以這么求:inv(sqrt(D))*E'。普通的PCA算法可以將輸入矩陣X變成主成分矩陣Y,盡管Y的協方差矩陣是個對角矩陣,但不一定是單位矩陣,如果對Y繼續使用白化操作,則Y的協方差矩陣就變成了單位矩陣了。

 

  源碼

  該pca函數接口形式為:

[Y,V,E,D] = pca(X)

  其中X為輸入數據,X的每一列是一個輸入樣本。返回值Y是對X進行PCA分析后的投影矩陣。V是與X有關的協方差矩陣特征向量的白化矩陣,E是對應的特征向量(列)構成的矩陣,D是對應的特征值構成的對角矩陣(特征值處於對角線上)。返回值中的白化矩陣,特征向量和特征值都是按照對應特征值大小進行排序后了的。

  其matlab源碼如下:

function [Y,V,E,D] = pca(X)

% do PCA on image patches
%
% INPUT variables:
% X                  matrix with image patches as columns
%
% OUTPUT variables:
% Y                  the project matrix of the input data X without whiting
% V                  whitening matrix
% E                  principal component transformation (orthogonal)
% D                  variances of the principal components

%去除直流成分
X = X-ones(size(X,1),1)*mean(X);

% Calculate the eigenvalues and eigenvectors of the new covariance matrix.
covarianceMatrix = X*X'/size(X,2); %求出其協方差矩陣
%E是特征向量構成,它的每一列是特征向量,D是特征值構成的對角矩陣
%這些特征值和特征向量都沒有經過排序
[E, D] = eig(covarianceMatrix); 

% Sort the eigenvalues  and recompute matrices
% 因為sort函數是升序排列,而需要的是降序排列,所以先取負號,diag(a)是取出a的對角元素構成
% 一個列向量,這里的dummy是降序排列后的向量,order是其排列順序
[dummy,order] = sort(diag(-D));
E = E(:,order);%將特征向量按照特征值大小進行降序排列,每一列是一個特征向量
Y = E'*X;
d = diag(D); %d是一個列向量
%dsqrtinv是列向量,特征值開根號后取倒,仍然是與特征值有關的列向量
%其實就是求開根號后的逆矩陣
dsqrtinv = real(d.^(-0.5)); 
Dsqrtinv = diag(dsqrtinv(order));%是一個對角矩陣,矩陣中的元素時按降序排列好了的特征值(經過取根號倒后)
D = diag(d(order));%D是一個對角矩陣,其對角元素由特征值從大到小構成
V = Dsqrtinv*E';%特征值矩陣乘以特征向量矩陣

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM