当前位置:文档之家› 基于PCA和欧几里得距离判据的模板匹配分类器

基于PCA和欧几里得距离判据的模板匹配分类器

数。精确地说,如果你的原始数据是n维的,你选择了前p个主要成分,那么你现在的 数据将仅有p维。 对应大特征值的特征矢量就是那条穿过数据中间的矢量,它是数据 维数之间最大的关联。
一般地,从协方差矩阵找到特征矢量以后,下一步就是按照特征值由大到小进行排 列,这将给出成分的重要性级别。很多实际问题中,数据中的大部分信息都集中在较 少的几个主成分上,如图右所示,可以忽略那些重要性很小(特征值很小)的成分,种 种迹象表明,选择较少的主成分,不但可以实现降维,而且可以降噪,因为那些排列 比较靠后的主成分通常反映了数据中的随机噪声,所以如果想要实现数据的降噪往往 可以这么做:把主成分中较小特征值对应的分量置为0,再逆变换回去,就实现了对 原始数据的降噪。 现在要做的是你需要组成一个模式矢量,它由你保留的所有特征 矢量构成,每一个特征矢量是这个矩阵的一列。
% Eigenfaces --- (M*Nx(P-1))训练样本协方差矩阵的特征向量
%A
--- (M*NxP) 中心向量的矩阵
%%%%%%%%%计算均值%%%%%%%%%%% m = mean(T,2); %计算样本平均值 m = (1/P)*sum(Tj's)
Train_Number = size(T,2);
令R=XXT 则RCT=CTꓥ经过上面式子的变换,我们得到以下n个方程
| R I | 0
实现方法 SECTION
基于PCA方法的人脸识别流程
基于特征脸的人脸识别过程由两个阶段组成: 训练阶段和识别阶段。在训练阶段,每个已知人脸ΓK 映射到由特征脸组成 的子空间上,得到n维向量y: M为已知人数在识别阶段,首先把待识别的图像映射到特征脸空间得Ω:Ω=UT(Γ- Ψ)Ω与每 个人脸集的距离———欧几里得距离 (Euclidean distance)
黑色线就是第一主成分的方向。只有中心化数据之后,计算得到的方向才能比较好的 “概括”原来的数据。 3、计算协方差矩阵; 4、计算协方差矩阵的特征矢量和特征值。因为协方差矩阵为方阵,我们可以计算它 的特征矢量和特征值,经变换后的各个基相互正交,变换后每一维的信息将互不相关,
基本流程
5、选择成分组成模式矢量 根据按累计方差贡献率依次排列得到的协方差矩阵多项式,对数据压缩以降低维
end %%%%%%%计算协方差矩阵的特征矢量和特征值%%%%%%%% L = A'*A; %L代表协方差矩阵 C = A*A'. [V D] = eig(L);%计算矩阵A的特征值D(eigenvalues)和特征矩阵V(eigenvectors) %%%%%%选择成分组成模式矢量%%%%%%%%%%%
面构造出二维向量T,即每个单元的信息量是一幅图片
%参数: TrainDatabasePath --- 训练数据库的路径
%返回值:T
---
%一个二维矩阵,包含了所有一维向量。假设所有在训练样本的P幅图像拥有相同的大小(M*N)。因此,这些一
维向量的长度是M*N而且T将是一个MN*P的二维
%矩阵
%%%%%%%%%%%%%%文件处理%%%%%%%%%%%%%%%%%
function OutputName = Recognition(TestImage, m, A, Eigenfaces)
%函数描述:这个函数将源图像提取成特征脸,然后比较它们之间的欧几里得距离
%输入量: TestImage ---测试样本的路径
%m
---(M*Nx1)训练样本的均值
% Eigenfaces --- (M*Nx(P-1))训练样本协方差矩阵的特征向量
img = imread(str);
[irow icol] = size(img);
temp = reshape(img',irow*icol,1);%将二维数组变成一维数组 T = [T temp]; end
第二部分:EigenfaceCore.m
function [m,A,Eigenfaces] = EigenfaceCore(T) %利用主成分分析(PCA)的方法在各张人脸中决定最明显的特征(对样本按贡献度排序)
TrainFiles = dir(TrainDatabasePath);
Train_Number = 0;
for i = 1:size(TrainFiles,1) t = size(TrainFiles,1); if not(strcmp(TrainFiles(i).name,'.')|strcmp(TrainFiles(i).name,'..')|strcmp(TrainFiles(i).name,'Thumbs.db')) Train_Number = Train_Number + 1; end
1.1 问题的提出-特征提取和图像重构
y1 c11x1 c12 x2

y2

c21x1
c22 x2


yn cn1x1 cn2 x2
c1n xn c2n xn
cnn xn
1.2 主成分的导出
我们观察上述方程组,用矩阵表示,X=[x1,x2,…,xn]T 是一个n维随机向量,Y=[y1,y2,…,yn]T 是满足 上式的新变量所构成的向量。于是我们可以写成Y=CX,C是一个正交矩阵,满足CC’=I(单位矩
L_eig_vec = [];
for i = 1:size(V,2)
if(D(i,i)>1)
L_eig_vec = [L_eig_vec V(:,1)];
end
end %%%%%%计算协方差矩阵的特征向量%%%%%%%%%%
Eigenfaces = A * L_eig_vec;
第三部分:Recognition.m(识别)
明显的,解 是协方差矩∑的特征向量, 是对应的特征值
1.3 主成分分析的结果
1

2



(r11 1)c11 r12c12 r1nc1n 0

r21c11 (r22 1)c12 r2nc1n 0

n

rn1c11 rn2c12 (rnn 1)c1n 0
分析,
空间。从而达到简化的目的。主成分的表示相当于把原来的特征进行坐标变换(乘以一个变 换矩阵),得到相关性较小(严格来说是零)的综合因子。
PCA 人脸识别方法的基本步骤:它是把一幅人脸图像按列(或行)连接形成一个图像向量, 所有的训练图像向量形成一个训练矩阵,对该训练矩阵求得它的协方差矩阵的特征值和特征 向量(特征脸),利用相对较小的特征脸集合来描述人脸,这样每幅人脸图像就对应于一个 维数较低的投影特征,也就是把高维的人脸图像映射到了一个低维的特征空间,在这个低维 的特征空间上进行匹配识别。
FinalData = rowFeatureVector (保留)* rowdataAdjust(中心化后数据) 这将仅仅给出我们选择的数据。我们的原始数据有两个轴(x和y),所以我们的 原始数据按这两个轴分布。我们可以按任何两个我们喜欢的轴表示我们的数据。如果 这些轴是正交的,这种表达将是最有效的,这就是特征矢量总是正交的重要性。我们 已经将我们的数据从原来的xy轴表达变换为现在的单个特征矢量表达。如果我们已经 忽略了一些特征矢量,则新数据将会用我们保留的矢量表达。
[irow icol] = size(temp); InImage = reshape(temp',irow*icol,1); Difference = double(InImage) - m; ProjectedTestImage = Eigenfaces'*Difference;
阵)。正交变换保证了新特征之间的不相关性,并且变换前后特征尺度保持不变;另外新 特征的方差越大,样本在该维特征上的差异就越大,表明这一特征就越重要。我们的目 的就是要求取最优的正交变换矩阵C,使得新特征的方差达到最大。
Var(y1)=E[y12] –E[y1]2=E[c1Tx(c1Tx)T]-E[c1Tx] E[(c1Tx)T]=c1TΣc1
%A
--- (M*NxP) 中心向量的矩阵
%返回值: OutputName ---在训练样本中的被识别的图像的名字
%%%%%%%%%%从中心向量中提取特s = []; Train_Number = size(Eigenfaces,2); for i = 1:Train_Number
%%%%%%%%%计算每个图像与均值的差%%%%%%%%% %%%要使PCA正常工作,必须减去数据的均值。减去的均值为每一维的平均,所有的x值都要减去,同样所有的y值都要减去%%%
%%%这样处理后的数据都具有0均值%%%
A = [];
for i = 1 : Train_Number
temp = double(T(:,i)) - m; A = [A temp]; %再次合并矩阵
%描述:这个方程首先得到二维数组,包括所有的训练样本向量并且从训练样本中返回3个输出量
%参数:T --- 一个二维矩阵,包含了所有一维向量。假设所有在训练样本的P幅图像拥有相同的大小 (M*N)。因此,这些一维向量的长度是M*N而且T将是一个MN*P的二维
%矩阵
%返回值: m
---(M*Nx1)训练样本的均值
基本流程
1、获取数据。在编程时具体是把一幅二维的图像转换成一维,达到降维的目的; 2、减去均值。要使PCA正常工作,必须减去数据的均值。减去的均值为每一维的平 均,所有的x值都要减去,同样所有的y值都要减去,这样处理后的数据都具有0均值; 如果没有对数据做中心化,那算出来的第一主成分的方向可能就不是一个可以“描述” 数据的方向了。例如右图。
end
%%%%%%%%%从一维数组构造成二维数组%%%%%%%%%%%% T = []; for i = 1: Train_Number
相关主题