PCA原理及特征脸

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

1. PCA 推导

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

cov=XXT

为协方差矩阵。

目标函数为:


max uTXXTus.t. uTu=1

用拉格朗日法,原问题变为:


max F=uTXXTu+λ(1uTu)


Fu=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

脸的数据集在 这里
效果如下:
《PCA原理及特征脸》
《PCA原理及特征脸》

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

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

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

的特征向量?万众瞩目时刻,数学以完美舞姿登上舞台。证明如下:
《PCA原理及特征脸》

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

点赞