⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pca_program.txt

📁 完全按照论文Face Recogniton Using Eigenfaces设计的PCA源码
💻 TXT
字号:
%---------------------------------------------------------------------------------------------------
%S1,S2,...........Sm是M*N的图像矩阵存于M文件中
%m是样本数存于M文件中
%设共有h类(即h人的照片),每人l张不同的照片,m=h*l
%---------------------------------------------------------------

%将图像矩阵转化成数组
TSamples=[];  %training samples
for i=1:h
   for j=1:l
      t=strcat('s',num2str(l*i+j))(1:M*N);  %先列后行,从上到下,从左到右组成一维数组
      t=double(t);
      TSamples=[TSamples;b];
   end
end

TSmean=mean(TSamples);  %计算平均脸
for i=1:m
  xmean(i,:)=TSamples(i,:)-TSmean;  %对所有训练样本中心化后
end

%SVD求解协方差矩阵的特征向量
A_T_A=xmean*xmean';    
[V,D]=eig(A_T_A);
d_temp=diag(D);   %d_temp是所有A_T_A的特征值组成的一维数组
[d_sort,index]=sort(d_temp);  %对d_temp中的数升序排列
col_num=size(V,2);   %col_num是特征向量的个数
for i=1:col_num      
   V_dec(:,i)=V(:,index(col_num-i+1));   %降序排列的特征向量
   d_dec(i)=d_sort(index(col_num-i+1));  %降序排列的特征值
end

d_sum=sum(d_dec);      %特征值之和
d_extract=0;           %我们要提取的特征值和
d_num=0;                   %我们要取的特征向量的前d_num个
while(d_extract/d_sum<0.9)         %提取的特征值之和即能量为总和的90%
   d_num=d_num+1;
   d_extract=sum(d_dec(1:d_num));
end

%计算特征脸
i=1;
while(i<=d_num && d_dec(i)>0)
    U(:,i)=d_dec(i)^(-1)*xmean'*V_dec(:,i);
    i=i+1;
end

ALLWeights=xmean*U;  %所有训练样本的权的组合
b=Test(1:M*N);
TWeights=(b-TSmean)*U;
for k=1:m
   t_diff(k)=norm(TWeights-ALLWeights(k,:));  %测试样本与所有训练样本的权值的欧氏距离的组合
end

[min,t_index]=min(t_diff);  %最小值min,以及最小值对应的序数

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -