clc;
clear;
load ocldata.mat;
% calc xmean,sigma and its eigen decomposition
allsamples=[];%所有训练图像,形成训练集
n=1;
for i=1:400
if rem(i,10)>0 & rem(i,10)<6
allsamples(:,n)=faces(:,i);
n=n+1;
end
end
allsamples=allsamples';
samplemean=mean(allsamples); % 平均图片,1 × N
for i=1:200
xmean(i,:)=allsamples(i,:)-samplemean; % xmean是一个M × N矩阵,xmean每一行保存的数据是“每个图片数据-平均图片”
end;
sigma=xmean*xmean'; % M * M 阶矩阵
[v d]=eig(sigma);
d1=diag(d);
[d2 index]=sort(d1); %以升序排序
cols=size(v,2);% 特征向量矩阵的列数
for i=1:cols
vsort(:,i) = v(:, index(cols-i+1) ); % vsort 是一个M*col(注:col一般等于M)阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量
dsort(i) = d1( index(cols-i+1) ); % dsort 保存的是按降序排列的特征值,是一维行向量
end %完成降序排列
%以下选择90%的能量
dsum = sum(dsort);
dsum_extract = 0;
p = 0;
gg=0.90;
while( dsum_extract/dsum < gg)
p = p + 1;
dsum_extract = sum(dsort(1:p));
end
i=1;
% (训练阶段)计算特征脸形成的坐标系
while (i<=p && dsort(i)>0)
base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); % base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化,详见《基于PCA的人脸识别算法研究》p31
i = i + 1;
end
% add by wolfsky 就是下面两行代码,将训练样本对坐标系上进行投影,得到一个 M*p 阶矩阵allcoor
allcoor = allsamples * base;
correctcount = 0;
% 测试过程
%形成测试集
m=1;
for i=6:400
if rem(i,10)>5 | rem(i,10)==0
C(:,m)=faces(:,i);
m=m+1;
end
end
for i=1:40
for j=1:5 %读入40 x 5 副测试图像
j=(i-1)*5+j;
b=C(:,j);
b=b';
tcoor= b * base; %计算坐标,是1×p阶矩阵
for k=1:200
mdist(k)=norm(tcoor-allcoor(k,:));
end;
%三阶近邻
[dist,index2]=sort(mdist);
class=floor((index2(1)-1)/5)+1;
if class==i
correctcount=correctcount+1;
end;
end;
end;
correctcount
correctrate=correctcount/200
%------------------------------------MDA
correctcount2 = 0;
text=C'*base;%200*170
train_DR=allcoor;
SW = zeros(p,p);
M = zeros(40,p);
for i = 1:40
M(i,:) = mean(train_DR(i*5-4:i*5,:));
for j = 1:5
SW = SW+(train_DR((i-1)*5+j,:)-M(i))'*(train_DR((i-1)*5+j,:)-M(i));
end;
end;
m = mean(M);
SB = zeros(p,p);
for i = 1:40
SB = SB+5*(M(i)-m)'*(M(i)-m);
end;
[W,D] = eig(SB,SW);
w=W(1);
allcoor=train_DR*w;
text=text';
for i=1:40
for j=1:5 %读入40 x 5 副测试图像
j=(i-1)*5+j;
b=text(:,j);%10304*5
b=b';%5*10304
tcoor= b * w; %计算坐标,是1×p阶矩阵
for k=1:200
mdist(k)=norm(tcoor-allcoor(k,:));
end;
%三阶近邻
[dist,index2]=sort(mdist);
class=floor((index2(1)-1)/5)+1;
if class==i
correctcount2=correctcount2+1;
end;
end;
end;
correctcount2
correctrate2=correctcount2/200
PCA和MDA进行人脸识别_PCA_MDA_matlab
版权申诉



阿里matlab建模师
- 粉丝: 2814
- 资源: 2783
最新资源
- node-v18.19.0-x64.msi
- tensorflow-2.8.0-cp39-cp39-manylinux2010-x86-64.whl.zip
- C++医院管理系统实例.zip
- tensorflow-2.8.0-cp38-cp38-win-amd64.whl.zip
- tensorflow-2.8.0-cp38-cp38-manylinux2010-x86-64.whl.zip
- 产教融合平台解决方案(最新)
- c++最大子矩阵代码及分析
- 2_NISP模拟卷答案版本(10月17日更新).xls
- tensorflow-2.8.0-cp38-cp38-macosx-10-14-x86-64.whl.zip
- tensorflow-2.8.0-cp37-cp37m-win-amd64.whl.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


