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

 只提取了最基础简洁的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编程实现_第1张图片

 

编程实现对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编程实现_第2张图片


 使用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编程实现_第3张图片

 平均脸

pca人脸特征降维的过程理解及matlab编程实现_第4张图片

 降维后的特征脸

pca人脸特征降维的过程理解及matlab编程实现_第5张图片

 

你可能感兴趣的:(模式识别,机器学习,matlab,人脸识别,模式识别)