机器学习-模式识别(3)基于PCA变换的特征提取

1. 主成分分析
主成分分析(PCA)的原理就是将一个高维向量 x,通过一个特殊的特征向量矩阵 U,从 一组特征中计算出一组按重要性从大到小排列的新特征,他们是原有特征的线性组合,并且相互之间是不相关的。 选取投影到一个低维的向量空间中,表征为一个低维向量 y,并且仅仅损失了一些次要信息。也就是说,通过低维表征的向量和特征向量矩阵,可以基本重构出所对应的原始高维向量。
2. 主成分分析方法
在这里插入图片描述
3. KL 变换在人脸识别中的引用
在这里插入图片描述

获取包含 400 张人脸图像的集合 faces。在我们的例子里有 40 张人脸图像,每张图像 可以转换成一个 10304 维的向量,然后把这 400 个向量放到一个集合 faces 里。
在获取到人脸向量集合 faces 后,选取其中 200 张作为训练集 X_raw,剩下的作为测试集,计算得到平均图像 ave。实现方法就是把集合 faces 里面的向量遍历一遍进行累加,然后取平均值。再把它还原回图像的形式的话,可以得到如下的“平均脸”。
计算训练集在新的特征空间下的投影,计算测试集在新的特征空间下的投影,采用最近邻,计算出与测试集差别最小的人脸。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以看出,选择的特征脸数量较少能够重建出来的人脸是模糊的,是因为在少数的特征脸所携带的“信息”十分少,那么我们可以增加特征脸的数量来更好地重建出人脸当我们选取70个以上的特征脸时,大概的人脸就比较清晰了;

实验分析:

**

  • 求PCA的基本流程为:有N个n维的样本数据,求出均值向量m和协方差矩阵Cx,求Cx由大到小排列的特征值和特征向量,选取前m个特征值对应的特征向量组成变换矩阵A,最终将样本向量投影到以选取的特征向量为基的特征空间上去,实现降维
  • 两个随机变量越线性相关,协方差越大,两个变量完全线性无关,协方差为零,协方差矩阵的特征向量描述矩阵的变化方向,也就是方差变化的方向,如第一特征向量是数据方差最大的方向,第二特征向量是垂直与第一特征向量方差最大的方向。
  • 协方差矩阵中的对角元素是各分量的方差,非对角元素是各分量之间的协方差。**
%测试数据:40人,每人10张照片。每人取前N张照片作为训练集,后(10N)张照片作为测试集。
clear;
clc;
N=5;
 
%计算特征脸并创建特征空间
imdata=zeros(112*92,40*N);
for i=1:40    
    for j=1:N  
        addr=strcat('E:\桌面\模式识别实验\实验三 PCA实验\bmp\s',num2str(i),'/',num2str(j),'.BMP');
        a=imread(addr);%从地址中读入图像
        b=a(1:112*92); %把图像a矩阵按列顺序转为行向量b
        imdata(:,N*(i-1)+j)=b'; %把b的转置矩阵存放到imdata矩阵的第ph*(i-1)+j列
    end
end
 
%计算平均脸并显示
average_face=mean(imdata,2); %按行求平均mean(a,2)  按列mean(a)
Average_face=reshape(average_face,112,92);%[112*92,1]的脸灰度数据转成[112,92]
figure;
subplot(1,1,1);
imshow(Average_face,[]);%imshow(I,[]) 显示灰度图像 I,根据 I 中的像素值范围对显示进行转换。
title(strcat('40*5张训练样本的平均脸'));
clear i j a b addr 
 
%图像预处理:减去平均均值
immin=zeros(112*92,40*N);
for i=1:40*N  
    immin(:,i) = imdata(:,i)-average_face;
end
clear i 
%计算协方差矩阵
%W=immin*immin';%dxn*nxd =dxd,由N*N降为d*d 
W=immin'*immin; %n*d x d*n= n*n 较小
%计算特征向量与特征值(向量)
[V,D]=eig(W);
 
%对特征向量进行排序
[D_sort,index] = sort(diag(D),'descend');
SumAllFaceEigenValue=sum(D_sort);
NowFaceEigenValue=0;
    %选取累计贡献大于90%的前neednum个特征脸
for i=1:size(D_sort,1)
NowFaceEigenValue=NowFaceEigenValue+D_sort(i);
neednum=i;
if(NowFaceEigenValue>SumAllFaceEigenValue*0.90)%累计贡献率达到90%以上即可
    break;
end
end
V_sort = V(:,index);
VT=immin*V_sort; %dxn*nxk=d*k
for i=1:40*N
    VT(:,i)=VT(:,i)/norm(VT(:,i));%归一化处理
end
newVT=VT(:,1:neednum);%取前neednum个特征值
 
%显示前32个(32是为了显示方便选取的)特征脸,并保存所有的特征脸(200个)到image中(已按从大到小排序)
 figure;
 mkdir image         % 如果文件夹已存在,会有警告,但不影响运行
for i=1:200
    v=VT(:,i);
    %向量矩阵化
    out=reshape(v,112,92); %(112*92)x1的列向量转成112x92的矩阵
    if i<=32
    subplot(4,8,i);
    imshow(out,[]);
    end
    imwrite(mat2gray(out),strcat( 'E:\桌面\模式识别实验\实验三 PCA实验\test\',num2str(i),'.png'));
    title(strcat('Face',num2str(i)));
end
clear i v out
 
newVT=VT(:,1:neednum);%取前neednum个特征值
 
%训练样本集在特征空间的投影及人脸图像的重建
face_train_projection=zeros(neednum,40*N);
for i=1:40*N
    %映射训练集图像
    Coefficient=newVT'*immin(:,i);  %k*d x d*1=k*1;
    face_train_projection(:,i)=Coefficient;
end
clear i Coefficient
 
figure;
 er=zeros(20,1); 
 for inum=1:200
 people=inum;
for step=10:10:200
 x=average_face;
 for ii = 1:step
    x=x+VT(:,ii)'*(imdata(:,people)-average_face)* VT(:,ii);
 end
 er(step/10)=sqrt(sum(sum((x-imdata(:,people)).^2)));
 newX=reshape(x,112,92);
 subplot(4,5,step/10);
 set(gcf,'outerposition',get(0,'screensize'));
 imshow(newX,[]);
 title(strcat('选取',num2str(step),'个特征脸的重建图像'));
end
 
saveas(gcf,['E:\桌面\模式识别实验\实验三 PCA实验\生成的特征脸/s',num2str(ceil(inum/5)),'/','重建图',num2str(mod(inum,5)),'.tiff']);
 end
 
 %绘制误差曲线图
 people=3;
for step=10:10:200
 x=average_face;
 for ii = 1:step
    x=x+VT(:,ii)'*(imdata(:,people)-average_face)* VT(:,ii);
 end
 er(step/10)=sqrt(sum(sum((x-imdata(:,people)).^2)));
 newX=reshape(x,112,92);
 subplot(4,5,step/10);
 set(gcf,'outerposition',get(0,'screensize'));
 imshow(newX,[]);
 title(strcat('选取',num2str(step),'个特征脸的重建图像'));
end
 
ER=(er-min(er))/(max(er)-min(er));
 figure;
plot(ER,'k');
set(gca, 'XTick', [0 :20]);
set(gca,'XTickLabel',[0 :10:200]) ;
xlabel('选取的特征脸数量');
ylabel('误差');
 
%读取测试集,并将测试集投影到特征空间中
test=zeros(112*92,40*(10-N));
for i=1:40    
    for j=(N+1):10  %610,后五张作为测试样本
        addr=strcat('E:\桌面\模式识别实验\实验三 PCA实验\bmp\s',num2str(i),'/',num2str(j),'.BMP');
        a=imread(addr);
        b=a(1:112*92); 
        test(:,(10-N)*(i-1)+(j-N))=b';
    end
end
%减去平均脸
testmin=zeros(112*92,40*(10-N));
for i=1:40*(10-N)     
    testmin(:,i) = test(:,i)-average_face;
end
clear i j a b addr test
 
face_test_projection=zeros(neednum,40*(10-N));
for i=1:40*(10-N)
    %映射测试集图像
    Coefficient=newVT'*testmin(:,i);
    face_test_projection(:,i)=Coefficient;
end
clear i Coefficient
 
%识别,并计算错误率
error=0;%判错数
for num=1:40*(10-N)
class=minindex(num,face_train_projection,face_test_projection);
display(strcat('测试集中的第',num2str(num),'张图片属于类别:S',num2str(class)));
    if class~=ceil(num/5)
    error=error+1;
    end
end
display(strcat('测试中判错数为:',num2str(error),'张,正确数为:',num2str(length(face_test_projection)-error),'张,错误率为:',num2str(100*error/length(face_test_projection)),'%'));

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香草绵绵冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值