本科论文作的是人脸识别,对一些算法进行复习。。。算法
概念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');