PCA编码输入,用于PalmPrint识别

时间:2013-08-07 10:30:08

标签: matlab pca svd

我是Matlab的新手。 我正在尝试将PCA功能(下面列出的URL)应用到我的掌纹识别程序中,以生成特殊的方法。我的掌纹灰度图像尺寸为450 * 400。 在使用它之前,我试图研究这些代码并添加一些代码以将特征向量保存为.mat文件。我为自己的理解添加了一些%的评论。

经过几天的学习,我仍然无法得到答案。 我决定请求帮助。关于这个PCA.m,我有几个问题要问。

PCA.m

  1. “选项”的输入应该是什么? “PCA(数据,细节,选项)” (它是减小尺寸的整数吗?我试图找出“选项”值传递的位置,但仍然无法获得ans。“h& h2”的msgbox,是检查代码运行直到哪里我试图使用10的整数,但PCA.m处理的尺寸是400 * 400。)

  2. 我保存为“.mat”文件的“eigvector”准备好与其他特征向量执行欧几里德距离分类器? (我认为eigvector等于eigenpalm,就像在人脸识别中那样,特征面。我试图将特征向量矩阵转换回图像,但PCA处理后的图像是黑色的,上面有很多点)

  3. mySVD.m

    1. 在此函数中,有两个值可以更改,即MAX_MATRIX_SIZE设置为1600,EIGVECTOR_RATIO设置为0.1%。我可以知道这些值会影响结果吗? (我试图玩这些值,但我看不出不同。我的掌纹图像尺寸设置为450 * 400,所以Max_matrix_size应该设置为180,000?)
    2. **我希望你们能够理解我在问什么,请帮助,谢谢你们(=

      原始版本:http://www.cad.zju.edu.cn/home/dengcai/Data/code/PCA.m

      mySVD:http://www.cad.zju.edu.cn/home/dengcai/Data/code/mySVD.m

      % Edited Version by me
      function [eigvector, eigvalue] = PCA(data,details,options)
      %PCA    Principal Component Analysis
      %
      %   Usage:
      %       [eigvector, eigvalue] = PCA(data, options)
      %       [eigvector, eigvalue] = PCA(data)
      %
      %             Input:
      %               data       - Data matrix. Each row vector of fea is a data point.
      %                            fea = finite element analysis ?????
      %     options.ReducedDim   - The dimensionality of the reduced subspace. If 0,
      %                         all the dimensions will be kept.
      %                         Default is 0.
      %
      %             Output:
      %               eigvector - Each column is an embedding function, for a new
      %                           data point (row vector) x,  y = x*eigvector
      %                           will be the embedding result of x.
      %               eigvalue  - The sorted eigvalue of PCA eigen-problem.
      %
      %   Examples:
      %           fea = rand(7,10);
      %           options=[]; %store an empty matrix in options
      %           options.ReducedDim=4;
      %           [eigvector,eigvalue] = PCA(fea,4);
      %           Y = fea*eigvector;
      %
      %   version 3.0 --Dec/2011
      %   version 2.2 --Feb/2009
      %   version 2.1 --June/2007
      %   version 2.0 --May/2007
      %   version 1.1 --Feb/2006
      %   version 1.0 --April/2004
      %
      %   Written by Deng Cai (dengcai AT gmail.com)
      %
      
      if (~exist('options','var'))
      
      %A = exist('name','kind')
      % var = Checks only for variables.
      %http://www.mathworks.com/help/matlab/matlab_prog/symbol-reference.html#bsv2dx9-1
      %The tilde "~" character is used in comparing arrays for unequal values, 
      %finding the logical NOT of an array, 
      %and as a placeholder for an input or output argument you want to omit from a function call. 
      
          options = [];
      end
      
      h2 = msgbox('not yet');
      
      ReducedDim = 0;
      if isfield(options,'ReducedDim')
      %tf = isfield(S, 'fieldname')
      
      h2 = msgbox('checked');
      
          ReducedDim = options.ReducedDim;
      end
      
      [nSmp,nFea] = size(data);
      if (ReducedDim > nFea) || (ReducedDim <=0)
          ReducedDim = nFea;
      end
      
      
      if issparse(data)
          data = full(data);
      end
      sampleMean = mean(data,1);
      data = (data - repmat(sampleMean,nSmp,1));
      
      [eigvector, eigvalue] = mySVD(data',ReducedDim);
      eigvalue = full(diag(eigvalue)).^2;
      
      if isfield(options,'PCARatio')
          sumEig = sum(eigvalue);
          sumEig = sumEig*options.PCARatio;
          sumNow = 0;
          for idx = 1:length(eigvalue)
              sumNow = sumNow + eigvalue(idx);
              if sumNow >= sumEig
                  break;
              end
          end
      
          eigvector = eigvector(:,1:idx);
      
      end
      
      %dt get from C# program, user ID and name
      evFolder = 'ev\';
      userIDName = details; %get ID and Name
      userIDNameWE = strcat(userIDName,'\');%get ID and Name with extension
      filePath = fullfile('C:\Users\***\Desktop\Data Collection\');
      userIDNameFolder = strcat(filePath,userIDNameWE); %ID and Name folder
      userIDNameEVFolder = strcat(userIDNameFolder,evFolder);%EV folder in ID and Name Folder
      userIDNameEVFile = strcat(userIDNameEVFolder,userIDName); % EV file with ID and Name
      
      if ~exist(userIDNameEVFolder, 'dir')
          mkdir(userIDNameEVFolder);
      end
      
      newFile =  strcat(userIDNameEVFile,'_1');
      searchMat = strcat(newFile,'.mat');
      if exist(searchMat, 'file') 
              filePattern = strcat(userIDNameEVFile,'_');
      
              D = dir([userIDNameEVFolder, '*.mat']);
              Num = length(D(not([D.isdir])))
      
              Num=Num+1;
              fileName = [filePattern,num2str(Num)];
      
          save(fileName,'eigvector');
      
      else
           newFile =  strcat(userIDNameEVFile,'_1');
           save(newFile,'eigvector');
      end
      

1 个答案:

答案 0 :(得分:0)

您可以在结构中传递选项,例如:

options.ReducedDim = 2;

 options.PCARatio =0.4;

选项ReducedDim选择要用于表示原始矩阵的最终投影的维数。例如,如果选择option.ReducedDim = 2,则仅使用具有最大特征值的两个特征向量(两个主要分量)来表示您的数据(实际上,PCA将返回具有最大特征值的两个特征向量)。

PCARatio允许您选择维数作为具有最大特征值的第一个特征向量,这些特征值占特征值总和的PCARatio分数。

mySVD.m中,我不会增加默认值,除非您需要超过1600个特征向量来描述您的数据集。我想你可以安全地保留默认值。