本科论文做的是人脸识别,对一些算法进行复习。。。
概念
PCA (主成分分析算法)主要用于减少数据集的维数,同时保持数据集中方差最大的贡献。(我的理解是,图像处理时,数据量太大,通常需要降低数据维数,但是又希望保留贡献大的特征数据,PCA就是保留主要成分的降维算法)。人脸识别中,利用PCA算法构建特征脸。
算法实现流程
PCA降维过程:
1、每个样本(一张人脸图像 92*112=10304)作为一个行向量,所有样本(200张人脸图像)共同构建成一个矩阵(200x10304)
2、求矩阵的协方差矩阵(协方差简单的说就是两个维度的相关性的度量,协方差矩阵是每两个维度的协方差组成的一个矩阵)
3、求协方差矩阵的特征值和特征向量
4、将特征向量按特征值大小组合成一个映射矩阵,取前k列(或k行)作为最终映射矩阵。(n就是你要保留的维度数)
5、映射矩阵乘以原始数据构成的矩阵,达到降维效果。
快速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‘);
时间: 2024-10-22 04:10:56