前言
在前面的博文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';%特征值矩陣乘以特征向量矩陣