PCA原理及特征脸

您所在的位置:网站首页 pca人脸识别的优缺点 PCA原理及特征脸

PCA原理及特征脸

2024-07-11 06:20| 来源: 网络整理| 查看: 265

PCA 推导PCA的matlab实现和特征脸

这是之前的文章,一直没有誊过来。

1. PCA 推导

PCA是主成分分析,推导其实很简单。 假设有N维数据M个,组成N*M的矩阵X,希望投射到另一个空间使得沿着第一主轴的维度方差最大。设投影到第一主轴的向量为u。假设X已经去中心化,有

cov=XXT 为协方差矩阵。 目标函数为: max uTXXTus.t. uTu=1 用拉格朗日法,原问题变为: max F=uTXXTu+λ(1−uTu) ∂F∂u=XXTu−λu=0 得到特征方程 XXTu=λu 那么经过 u 投影后的数据方差最大的轴就是特征方程特征值最大的轴对应的特征向量的方向。 由于特征向量的之间的正交性质,变换之后的各轴线性无关。 2. PCA的matlab实现和特征脸 clc; clear all; close all; Face=load('FERET_80_80_col.mat'); I=Face.FERET_80_80_col; X=im2double(I); %6400*1400 r*c [r,c]=size(X); num=1400; X=X(:,1:num); %中心化 clear var; r0=80;c0=80; mm=(mean(X'))'; %X' c*r mean(X') 1*r mm r*1 6400*1 M=repmat(mm,1,c); %M 6400*1400 r*c X=X-M; %计算特征值,其中牵涉但数学变换 Cov=X'*X; %Cov c*c 因为c小一点 便于计算 [V,D]=eigs(Cov,num); %V 1400*1400 c*num V=X*V; %V r*num 6400*1400 %存储矩阵 save('Vec.Mat','V'); %读入 V1=load('Vec.Mat'); V=V1.V; %显示 figure('Name','原图','NumberTitle','off'); for i=1:25 si=num2str(i); subplot(5,5,i),imshow(reshape(I(:,i),r0,c0)),title(['脸' si]); end Im=reshape(mm,r0,c0);%平均脸 %归一化 Vmax=max(V); Vmin=min(V); Vmax=repmat(Vmax,r,1); Vmin=repmat(Vmin,r,1); Iv=(V-Vmin)./(Vmax-Vmin); %显示特征脸 figure('Name','特征脸','NumberTitle','off'); subplot(5,5,1),imshow(Im),title('平均脸'); for i=1:24 si=num2str(i); subplot(5,5,i+1),imshow(reshape(Iv(:,i),80,80)),title(['特征脸PCA' si]); end

脸的数据集在 这里 效果如下: 这里写图片描述 这里写图片描述

1)把一个人脸图片看做一个特征向量,80*80的图片就是6400维的向量。

2)特征脸相当于是一个模版,以特征脸和原图做个点乘得到一个特征值。

涉及到求特征值分解。如果人脸的特征维度d很大,例如256x256的人脸图像,d就是65536了。那么协方差矩阵C的维度就是dxd=65536x65536。对这个大矩阵求解特征值分解是很费力的。那怎么办呢?如果人脸的样本不多,也就是N不大的话,我们可以通过求解C′=ΦTΦ矩阵来获得同样的特征向量。可以看到这个 C′=ΦTΦ 只有NxN的大小哦。如果N远远小于d的话,那么这个力气就省得很值了。那为什么求解 C′=ΦTΦ 矩阵的特征向量可以获得 C=ΦΦT

的特征向量?万众瞩目时刻,数学以完美舞姿登上舞台。证明如下: 这里写图片描述

​ 其中, ei 是 C′=ΦTΦ 的第i个特征向量, vi 是 C=ΦΦT 的第i个特征向量,由证明可以看到, vi=Φei 。所以通过求解 C′=ΦTΦ 的特征值分解得到 ei ,再左乘 Φ 就得到C=ΦΦT的特征向量 vi 了。也就是我们想要的特征脸。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3