欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pca人脸特征降维的过程理解及matlab编程实现

程序员文章站 2024-03-22 13:21:40
...

 只提取了最基础简洁的pca实现过程,其中的具体原理和过程可以参考如下博客:

https://blog.csdn.net/guyuealian/article/details/68487833

https://www.cnblogs.com/hxjbc/p/6197986.html

PCA进行特征降维的步骤:

  • 设有m条n维数据。

  • 1)将原始数据按列组成n行m列矩阵X

  • 2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值

  • 3)求出协方差矩阵

  • 4)求出协方差矩阵的特征值及对应的特征向量r

  • 5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P

  • 6)即为降维到k维后的数据


 Matlab实现pca特征降维时涉及的主要函数功能:

  • scatter: scatter(x,y)在向量 x 和 y 指定的位置创建一个包含圆形的散点图

  • randn:randn(n)返回一个n*n的随机项的矩阵

  • mean: 求数组的平均数或者均值

  • eigs:eigs(A):求度矩阵A的全部特征值,构成向量(有别eig,返回的结果不同,处理过程也有区别)

  • cov:cov(x) 求向量x的方差

  • repmat:用于快速的产生一个大的矩阵


 简单实例:

使用n=2000; X = randn(n,2)*[0.1  1; 1 0.7] 生成2000个2维的样本,使用scatter函数画出这2000个样本;用xlim([-5 5]) 设置图中x坐标轴的范围为[-5,5],用ylim([-5 5])设置y坐标轴的范围也为[-5,5]。

n=2000;
X=randn(n,2)*[0.1 1;1 0.7];
scatter(X(:,1),X(:,2));
xlim([-5,5]);
ylim([-5,5]);

 得到如下效果:

pca人脸特征降维的过程理解及matlab编程实现

 

编程实现对X中样本进行PCA变换,保留所有的2个维度,注意此处没有使用matlab自带的pca函数直接得到结果,使用eigs函数代替pca函数的实现过程。将对X进行PCA变换后的样本用scatter函数画出;同样设置x和y轴的显示范围为[-5,5]。

n=2000;
[row,col]=size(X);
X=randn(n,2)*[0.1 1;1 0.7];
c=cov(X);
[F,V]=eigs(c);
meanx=mean(X);
tempx=repmat(meanx,row,1);
score=(X-tempx)*F;
pca=score(:,1:2);
scatter(pca(:,1),pca(:,2));
xlim([-5,5]);
ylim([-5,5]);

 进行pca变换后,给样本重新找到更能描述这组数据的正交的坐标轴

pca人脸特征降维的过程理解及matlab编程实现


 使用PCA进行人脸的特征降维和特征脸的输出。

数据集:

主要步骤:

(a) 对28张人脸图片依次进行如下处理:读取每一张图片,将图片的像素矩阵转换为一个特征向量,存储到数据data的一行,从而得到28*10304的矩阵,矩阵每一行表示一个样本。在读取过程,使用subplot函数和imshow函数将28张原始的人脸图片显示在一张图中。

(b) 计算这28个样本的均值向量,使用reshape函数将该均值向量重新调整为112*92的矩阵,使用imshow函数显示该矩阵。在人脸识别中,均值向量称为平均脸,它描述了数据集中所有人脸平均长成什么样。

(c) 对data进行PCA变换(直接使用pca函数)。在人脸识别中,每个主成分称为一个特征脸(eigenface)或主成分脸。使用subplot函数和imshow函数将所有的特征脸显示在一张图中,注意,仍需要对每个主成分重新调整为112*92的矩阵再显示。观察特征脸和原始的人脸图像的区别。

imgstr=dir(strcat('.\faces_for_pca\','*.pgm'));
data=[];
for i=1:28
    img=im2double(imread(imgstr(i).name));
    subplot(5,6,i);
    imshow(img);
    data=[data;reshape(img,1,10304)];
end
meanData=mean(data);
figure;
imshow(reshape(meanData,112,92));

[COEFF,SCORE,latent,tsquare] = pca(data);
% 1)COEFF 是主成分分量,即样本协方差矩阵的特征向量;
% 2)SCORE主成分,是样本X在低维空间的表示形式,即样本X在主成份分量COEFF上的投影 ,若需要降k维,则只需要取前k列主成分分量即可
% 3)latent:一个包含样本协方差矩阵特征值的向量;
%cumsum(latent)./sum(latent)    %计算特征值的累计贡献率,算出降维后的空间所能表示原空间的程度  
%train=SCORE(:,1:17);           %17维%90
figure;
for i=1:27              %降至27维
    zimg=COEFF(:,i);
    zimg=reshape(zimg,112,92);
    subplot(5,6,i);
    imshow(mat2gray(zimg));
end

 数据集中的所有脸

pca人脸特征降维的过程理解及matlab编程实现

 平均脸

pca人脸特征降维的过程理解及matlab编程实现

 降维后的特征脸

pca人脸特征降维的过程理解及matlab编程实现