PCA与最近邻分析

数据:ORL人脸识别的400张图片

40个人每人10张图片

训练集存在D:\py3.5\orl\tu1

测试集存在D:\py3.5\orl\tu2

工具:maltab2015a

程序1:pca_of_wchy_main.m
function pca_of_wchy_main()
%%%%%%%%%构造训练集%%%%%%%%%%%%%%%%
path='D:\py3.5\orl\tu1\';
File=dir([path,'*.bmp']);%将该路径下的文件夹名字完全返回
dsize=length(File);
%读取数据库图片数量
pic=zeros(dsize,15*15);
% 加载样本图像到X*(15*15)的矩阵中
for i=1:dsize
 Image1=imread(strcat(path,File(i).name));
 Image2=imresize(Image1,[15,15]);
 pic(i,:)=double(reshape(Image2,1,[]));
end;
TrainSamples=pic';
smalle = 10.^(-5); 
% 一个小数字阈值
trsize =size(TrainSamples,2);
% 训练样本总数N
x = TrainSamples;
xm = mean(x,2);
x = x - repmat(xm,1,trsize);
% 训练样本及中心化
%%%%%%%%%      PCA       %%%%%%%%%%%%%%%%

[w e explain] = pca_of_wchy(x'*x);
r = length(find(e>smalle));
w = w(:,1:r);
e = e(1:r);
w = x*w*diag(1./sqrt(e));
% SVD方法求解PCA
x0 = w'*x;   
% 将训练样本投影到PCA子空间, 这里,w 即为W_pca
%%%%%%%%%%%%%%% 测试 %%%%%%%%%%%%%%%%%%%%%
error_recognition=0;
right_recognition=0;
path_test='D:\py3.5\orl\tu2\';
File_test=dir([path_test,'*.bmp']);
dsize_test=length(File_test);
%读取数据库图片数量
for i=1:dsize_test
 Image=imread(strcat(path_test,File_test(i).name));
 ImageI=double(imresize(Image,[15,15]));
phi_test=zeros(1,15*15);
phi_test(1,:)=double(reshape(ImageI,1,[]));
TestSamples=phi_test';
tesize = size(TestSamples,2);
% 测试样本总数
xt0 = w'*(TestSamples - repmat(xm,1,tesize)); 
% 同样地,将测试样本投影到PCA子空间
%%%%%%%%%%%% 用自己写的最近邻分类器进行分类,并计算识别正确和错误的数量%%%%%%%%%%%%%%%%%%
wchy=Min(x0,xt0);
%%最近邻分类器函数
Imagess=imread(strcat(path,File(wchy).name));
wchy_classifer_tr_name=File(wchy).name;
wchy_classifer_te_name=File_test(i).name;
%%%%%%%%%%%%因图片名前两位一致的分为同一类,故比较前两位的差异判断识别是否正确%%%%%%%%%%%%%
if strcmpi(wchy_classifer_tr_name(1,1:2),wchy_classifer_te_name(1,1:2))==0
 error_recognition=error_recognition+1;
else
    right_recognition=right_recognition+1;
end
end
%%%%%%%%%%%计算识别率%%%%%%%%%%%%%%%%%
recognition_ratio=right_recognition/(right_recognition+error_recognition);
fprintf('测试样本总数:%d,识别 率:%2.2f%%',dsize_test,recognition_ratio*100)
%显示测试图片最后一张,发现识别成功了,可以写到测试循环里,显示每一张测试图片的识别情况
subplot(1,2,1);imshow(Image),title(['测试图片:',File_test(i).name]);subplot(1,2,2);imshow(Imagess),title(['识别出的片:',File(wchy).name])
程序2:Min.m
function [I]=Min(ProjectedTrainSamples,ProjectedTestSamples)
%==============u代表多少行,v代表多少列===========%
[u,v]=size(ProjectedTrainSamples);
Mindest(v)=0;
for xm=1:v
    for ym=1:u
    diff1(ym)=ProjectedTrainSamples(ym,xm)-ProjectedTestSamples(ym,1);
    end
    for ym=1:u
    Mindest(xm)=Mindest(xm)+(diff1(ym).*diff1(ym));
    end
end
Distance=sqrt(Mindest);
% 对距离进行排序%=====dis是排序后的序列,ind是打乱后的下标======%
[dis,ind]=sort(Distance);       
%从小到大排序
qx=ind(1);
I=qx;
end
程序3:pca_of_wchy.m
function [coeff,latent,explained] = pca_of_wchy(v)
[~,latent,coeff] = svd(v);
latent = diag(latent);%提取对角元素
totalvar = sum(latent);
explained = 100*latent/totalvar;
[p,d] = size(coeff);
[~,maxind] = max(abs(coeff),[],1);
colsign = sign(coeff(maxind + (0:p:(d-1)*p)));
coeff = bsxfun(@times,coeff,colsign);
end
处理结果
>> pca_of_wchy_main
测试样本总数:120,识别 率:98.33%

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值