📄 pca_program.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 + -