Halcom 发表于 2017-9-21 22:25:47

PCA(Principal Component Analysis)主成分分析---降维处理

PCA主成分分析---降维处理
(1)设图像有100张,每张图像为16*16大小的灰度图,转化为一维向量就是 256 x 100矩阵 A,每一列为一个图像向量;
(2)计算256x100矩阵A的平均值,得到256x1的一维向量B;
(3)256 x 100矩阵A 每一列减去 B,得到256 x 100矩阵C;
(4)求解256 x 100矩阵 C 的协方差矩阵D, D = C'*C;得到 100 x 100 矩阵D;
(5)求解矩阵D的特征值和特征向量,取前K个最大的特征值,以及 前K个最大的特征值对应的特征向量,组合得到 100 x K 的特征矩阵E;
(6)采用 A * 特征矩阵E 得到降维的特征向量矩阵256 x K,即特征向量空间F。
(7)求解矩阵C的转置C',采用 C' * 特征向量空间 F 得到降维的特征矩阵G = 100xK,则100个人,每个人256个特征降维到 每个人K个特征。
function = EigenfaceCore(T)
% 使用PCA分析人脸图像之间的差异特征
% 该函数将得到一个包含所有的训练样本图像向量的2D矩阵,将返回由训练样本中提取得到的三个输出。
% 输入:    T--- 一个包含1D图像向量的2D矩阵,假设所有的P张标准图像尺寸大小相同MxN. 因此
%                   1D列向量的长度均是是MxN,因此T是M*NxP 2D矩阵。
% 输出:   m               - (M*Nx1) 训练样本数据库的平均值
%         Eigenfaces      - (M*Nx(P-1)) 训练样本数据库本征向量(Eigen vectors)的协方差矩阵
%         A               - (M*NxP) 所有的图像向量矩阵Matrix of centered image vectors   

% 求样本图像的平均向量
m = mean(T,2); % 计算图像平均值,m = (1/P)*sum(Tj's)    (j = 1 : P)--列平均,
               % T中一列是一幅图像1D数据,对每一行求平均
Train_Number = size(T,2);

% 计算每个样本与平均向量的差向量
A = [];
for i = 1 : Train_Number
    temp = double(T(:,i)) - m; % 由Ai = Ti - m计算每幅图像的差值,列向量相减
    A = ; % 汇总所有的样本图像数据
end

% 本征图像识别方法
% 根据线性代数理论,一个PxQ矩阵,非零特征值的最大个数是矩阵的(P-1,Q-1)的较小值。
% 因为(P)训练样本数量通常小于(M*N),大多数非零特征值数量等于P-1,因此我们可以通过
% 计算A'*A (一个PxP矩阵) 代替计算A*A' (一个M*NxM*N矩阵)。可看出A*A'的维数明显
% 大于A'*A的维数,以此达到降维的目的。

L = A'*A; % 计算协方差矩阵
= eig(L); % 求特征向量V 和 特征值 D

% 矩阵L的所有的特征值被分类,去掉小于具体的阈值的特征值,因此非零特征值的数量也许低于P-1
% 按照特征值 > 1来取特征向量
L_eig_vec = [];
for i = 1 : size(V,2)
    if( D(i,i)>1 ) % 特征值大于1
      L_eig_vec = ;
    end
end

% 协方差C的特征向量(所谓的"Eigenfaces")
% 降维
Eigenfaces = A * L_eig_vec;测试图像函数:
function Recognized_index = Face_Recognition(TestImage, m, A, Eigenfaces)
% 识别步骤....
% 计算两脸欧氏距离匹配人脸
% 输入:      TestImage         - 测试样本路径中的测试样本
%                m               - (M*Nx1) 训练样本的行平均值,EigenfaceCore' 函数的输出变量 .
%                Eigenfaces      - (M*Nx(P-1)) 训练样本数据库的协方差矩阵的特征向量, EigenfaceCore' 函数的输出变量
%                A               - (M*NxP) 所有均值差后的图像数据集合, EigenfaceCore' 函数的输出变量.
% 输出:       OutputName         - 输出训练样本库中的识别出的图像名字.

% 投影A到人脸空间中,利用Eigenface的转置矩阵Eigenface'*A得到相应的特征向量
ProjectedImages = [];
Train_Number = size(Eigenfaces,2);
for i = 1 : Train_Number
    temp = Eigenfaces'*A(:,i); % 将每个样本投影到特征空间
    ProjectedImages = ;
end

% 从测试图像中提取PCA特征
if size(TestImage,3)>1
    temp = rgb2gray(TestImage);
else
    temp = TestImage;
end

= size(temp);
InImage = reshape(temp',irow*icol,1);
Difference = double(InImage)-m; % 测试样本与训练样本均值差
ProjectedTestImage = Eigenfaces'*Difference; % 将待测样本投影到特征空间

% 按照欧式距离取最小的原则得出匹配的人脸
Euc_dist = []; temp=[];
for i = 1 : Train_Number
    q = ProjectedImages(:,i);
    temp = ( norm( ProjectedTestImage - q ) )^2;
    Euc_dist = ;
end

= min(Euc_dist);百度网盘完整代码分享:http://pan.baidu.com/s/1nuAZbU5

PS:
简洁干练的代码:function = PCA(features)
% feature_cell:输入的特征
% feature_down:降维后的特征
mean_image = mean( features );
features_center = features - ones(size(features,1), 1) * mean_image;
feature_cov = features_center * features_center';% 协方差矩阵feature_cov = 样本x样本的方阵
= eig(feature_cov);    % 求特征向量V 和 特征值 D
K = 19;                      % K个最大的特征值
E = V( :, end-K+1:end );      % 特征矩阵
E_vector = features_center'*E;            % 特征向量空间
feature_down = features_center * E_vector;% 降维%% PCA降维
= PCA(train_ims_HoG);
test_ims_HoG_center = test_ims_HoG - ones(size(test_ims_HoG,1), 1) * mean_image;
feature_test = test_ims_HoG_center * E_vector;% 降维








Halcom 发表于 2018-7-16 23:02:04

function Recognized_index = Face_Recognition(TestImage, m, A, Eigenfaces)修改如下:
function Recognized_index = Face_Recognition(TestImage, meanFace, WhiteFace, Eigenfaces)
% 识别步骤....
% 计算两脸欧氏距离匹配人脸
% 输入:      TestImage       - 测试样本路径中的测试样本
%            meanFace      - (M*Nx1) 训练样本的行平均值,EigenfaceCore' 函数的输出变量 .
%            Eigenfaces      - (M*Nx(P-1)) 训练样本数据库的协方差矩阵的特征向量, EigenfaceCore' 函数的输出变量
%            WhiteFace       - (M*NxP) 所有均值差后的图像数据集合, EigenfaceCore' 函数的输出变量.
% 输出:      OutputName      - 输出训练样本库中的识别出的图像名字.

% 投影WhiteFace到人脸空间中,利用Eigenface的转置矩阵Eigenface'*A得到相应的特征向量
ProjectedImages = [];
% temp=[];
% Train_Number = size(Eigenfaces,2);
% for i = 1 : Train_Number
%   temp = Eigenfaces'*WhiteFace(:,i);   % 将每个样本投影到特征空间
%   ProjectedImages = ;
% end
ProjectedImages = WhiteFace'*Eigenfaces;
Train_Number = size(ProjectedImages,1);

% 从测试图像中提取PCA特征
temp=[];
if size(TestImage,3)>1
    temp = rgb2gray(TestImage);
else
    temp = TestImage;
end
InImage = temp(:);
Difference = double(InImage)-meanFace; % 测试样本与训练样本均值差
% ProjectedTestImage = Eigenfaces'*Difference; % 将待测样本投影到特征空间
ProjectedTestImage = Difference'*Eigenfaces; % 将待测样本投影到特征空间

% 按照欧式距离取最小的原则得出匹配的人脸
Euc_dist = [];
temp=[];
for i = 1 : Train_Number
    temp = ( norm( ProjectedTestImage - ProjectedImages(i,:) ) )^2;
    Euc_dist = ;
end

= min(Euc_dist);




页: [1]
查看完整版本: PCA(Principal Component Analysis)主成分分析---降维处理