Hello Mat

 找回密码
 立即注册
查看: 7755|回复: 1

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

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2017-9-21 22:25:47 | 显示全部楼层 |阅读模式
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 的协方差矩阵DD = 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个特征。
  1. function [m, A, Eigenfaces] = EigenfaceCore(T)
  2. % 使用PCA分析人脸图像之间的差异特征
  3. % 该函数将得到一个包含所有的训练样本图像向量的2D矩阵,将返回由训练样本中提取得到的三个输出。
  4. % 输入:    T  --- 一个包含1D图像向量的2D矩阵,假设所有的P张标准图像尺寸大小相同MxN. 因此
  5. %                   1D列向量的长度均是是MxN,因此T是M*NxP 2D矩阵。
  6. % 输出:     m               - (M*Nx1) 训练样本数据库的平均值
  7. %           Eigenfaces      - (M*Nx(P-1)) 训练样本数据库本征向量(Eigen vectors)的协方差矩阵
  8. %           A               - (M*NxP) 所有的图像向量矩阵Matrix of centered image vectors     

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

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

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

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

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

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

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

  16. % 从测试图像中提取PCA特征
  17. if size(TestImage,3)>1
  18.     temp = rgb2gray(TestImage);
  19. else
  20.     temp = TestImage;
  21. end

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

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

  33. [Euc_dist_min , Recognized_index] = min(Euc_dist);
复制代码
百度网盘完整代码分享:http://pan.baidu.com/s/1nuAZbU5

PS:
简洁干练的代码:
  1. function [feature_down, mean_image, E_vector]= PCA(features)
  2. % feature_cell:输入的特征
  3. % feature_down:降维后的特征
  4. mean_image = mean( features );
  5. features_center = features - ones(size(features,1), 1) * mean_image;
  6. feature_cov = features_center * features_center';  % 协方差矩阵  feature_cov = 样本x样本的方阵
  7. [V, D] = eig(feature_cov);    % 求特征向量V 和 特征值 D
  8. K = 19;                      % K个最大的特征值
  9. E = V( :, end-K+1:end );      % 特征矩阵
  10. E_vector = features_center'*E;              % 特征向量空间
  11. feature_down = features_center * E_vector;  % 降维
复制代码
%% PCA降维
[feature_train, mean_image, E_vector]= 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;  % 降维








算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
 楼主| 发表于 2018-7-16 23:02:04 | 显示全部楼层
function Recognized_index = Face_Recognition(TestImage, m, A, Eigenfaces)修改如下:
  1. function Recognized_index = Face_Recognition(TestImage, meanFace, WhiteFace, Eigenfaces)
  2. % 识别步骤....
  3. % 计算两脸欧氏距离匹配人脸
  4. % 输入:      TestImage       - 测试样本路径中的测试样本
  5. %            meanFace        - (M*Nx1) 训练样本的行平均值,EigenfaceCore' 函数的输出变量 .
  6. %            Eigenfaces      - (M*Nx(P-1)) 训练样本数据库的协方差矩阵的特征向量, EigenfaceCore' 函数的输出变量
  7. %            WhiteFace       - (M*NxP) 所有均值差后的图像数据集合, EigenfaceCore' 函数的输出变量.
  8. % 输出:      OutputName      - 输出训练样本库中的识别出的图像名字.

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

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

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

  37. [Euc_dist_min , Recognized_index] = min(Euc_dist);
复制代码




算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-25 02:59 , Processed in 0.218349 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表