📄 featureextract.m
字号:
%此函数为特征提取函数
%输出变量:A为提取后的特征向量,为(112×92)×40的矩阵,每一列就代表了对应类的Fisher脸
%输入变量:MeanClass表示总体均值列向量
% MeanEachClass表示每类的均值列向量
% EachClassNum表示训练样本中每类的数目
% ClassClientNum表示Client人脸的类别数目
% TrainX表示训练样本的数据,为(112×92)×80的矩阵,每列代表一个图片的数据
function A=FeatureExtract(MeanClass,MeanEachClass,EachClassNum,ClassClientNum,TrainX)
%--------------------------------------------------------------------------
%计算类间散布矩阵Sb=phib*phib',为简化运算,求取Sb_t=phib'*phib
N=EachClassNum*ClassClientNum; %训练样本的总数量
Q=repmat(MeanClass,1,ClassClientNum);
phib=(MeanEachClass-Q)*sqrt(EachClassNum/N); %计算phib
Sb_t=phib'*phib;
clear('Q','N');
%N=EachClassNum*ClassClientNum;
%Q=repmat(MeanClass,1,N);
%phit=TrainX-Q;
%St=phit*phit'/N;
%clear('Q');
%Sw=zeros(rows*cols,rows*cols);
%for i=1:ClassClientNum
% S=MeanEachClass(:,i);
% for j=1:EachClassNum
% SS=(TrainX(:,(i-1)*EachClassNum+j)-S);
% Sw=Sw+SS*SS';
% end
%end
%Sw=Sw/(ClassClientNum*EachClassNum);
%--------------------------------------------------------------------------
%计算Sb_t的特征值和特征向量
[eigvec,eigval]=eig(Sb_t);
eigval=diag(eigval)';
[eigval,I]=sort(eigval);
eigval_Sb_t=fliplr(eigval);
eigvec_Sb_t=fliplr(eigvec(:,I));
% 提取前m_b个特征值和特征向量
m_b=ClassClientNum-1;
eigval_Sb_t=eigval_Sb_t(:,1:m_b);
eigvec_Sb_t=eigvec_Sb_t(:,1:m_b);
%--------------------------------------------------------------------------
%计算Sb的特征向量
eigvec_Sb=phib*eigvec_Sb_t;
%计算子空间U
Db=diag(eigval_Sb_t);
U=eigvec_Sb*(inv(sqrt(Db)));
%--------------------------------------------------------------------------
%将所有的样本投影到子空间U上
p=size(TrainX,2);
Q=repmat(MeanClass,1,p);
ChangeX=U'*(TrainX-Q);
%计算投影后的全局散布矩阵
Sp=1/p*(ChangeX*ChangeX');
%计算投影后的每类的均值
for i=1:ClassClientNum
MeanEachClassChange(:,i)=mean(ChangeX(:,EachClassNum*(i-1)+1:EachClassNum*i),2);
end
%计算Fisher准则下每类对应的最优向量
V=inv(Sp)*MeanEachClassChange;
%计算每类的Fisher脸
A=U*V;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -