本科論文作的是人臉識別,對一些算法進行復習。。。算法
概念spa
PCA (主成分分析算法)主要用於減小數據集的維數,同時保持數據集中方差最大的貢獻。(個人理解是,圖像處理時,數據量太大,一般須要下降數據維數,可是又但願保留貢獻大的特徵數據,PCA就是保留主要成分的降維算法)。人臉識別中,利用PCA算法構建特徵臉。code
算法實現流程orm
PCA降維過程:blog
一、每一個樣本(一張人臉圖像 92*112=10304)做爲一個行向量,全部樣本(200張人臉圖像)共同構建成一個矩陣(200x10304)io
二、求矩陣的協方差矩陣(協方差簡單的說就是兩個維度的相關性的度量,協方差矩陣是每兩個維度的協方差組成的一個矩陣)圖像處理
三、求協方差矩陣的特徵值和特徵向量ast
四、將特徵向量按特徵值大小組合成一個映射矩陣,取前k列(或k行)做爲最終映射矩陣。(n就是你要保留的維度數)function
五、映射矩陣乘以原始數據構成的矩陣,達到降維效果。class
快速PCA:
樣本矩陣Znxd中的每一個樣本減去樣本平均值m後的矩陣,則散佈矩陣S(就是協方差矩陣)爲(ZTZ)dxd。如今考慮矩陣R=(ZZT)nxn,在本文中的人臉識別系統,n=200,d=10304,d遠遠大於n,但他們有相同的特徵值。
設n爲列向量v是R的特徵值f對應的特徵向量,則有:(ZZT)v=fv
上式兩邊同時左乘ZT,並應用矩陣乘法結合律得:(ZTZ)(ZTv)=f(ZTv)
ZTv散佈矩陣S的特徵值f對應的特徵向量e=ZTv。所以,咱們能夠計算小矩陣R=(ZZT)nxn的特徵向量v,以後左乘ZT獲得散佈矩陣S的特徵向量 ZTv。
注:這裏給出了新的協方差矩陣的計算方法。。。。。。。。
function [pcaA V] = fastPCA( A, k ) % 快速PCA % % 輸入:A --- 樣本矩陣,每行爲一個樣本 % k --- 降維至 k 維 % % 輸出:pcaA --- 降維後的 k 維樣本特徵向量組成的矩陣,每行一個樣本,列數 k 爲降維後的樣本特徵維數 % V --- 主成分向量 [r c] = size(A); % 樣本均值 meanVec = mean(A); %DASF % 計算協方差矩陣的轉置 covMatT(Z 200x10304 ,Z' 10304x200) Z = (A-repmat(meanVec, r, 1)); covMatT = Z * Z'; % 計算 covMatT 的前 k 個特徵值和特徵向量(10304xk) [V D] = eigs(covMatT, k); % 獲得協方差矩陣 (covMatT)' 的特徵向量 V = Z' * V; % 特徵向量歸一化爲單位特徵向量 for i=1:k V(:,i)=V(:,i)/norm(V(:,i)); end % 線性變換(投影)降維至 k 維(200xk) pcaA = Z * V; % 保存變換矩陣 V 和變換原點 meanVec save('Mat/PCA.mat', 'V', 'meanVec');