0

私はMatlabが初めてです。PCA 関数 (下記の URL) を私の掌紋認識プログラムに適用して、固有の掌を生成しようとしています。私の掌紋のグレースケール画像のサイズは 450*400 です。それを使用する前に、これらのコードを調べて、固有ベクトルを .mat ファイルとして保存するコードを追加しようとしていました。自己理解のために私が追加した %comments の一部。

数日間勉強した後、私はまだ答えを得ることができません. 助けを求めることにしました。この PCA に関していくつか質問があります。

PCA.m

  1. 「オプション」の入力はどうあるべきですか? "PCA(data,details,options)" の (縮小された次元の整数ですか? "options" 値がどこに渡されているかを把握しようとしていましたが、まだ ans を取得できませんでした。"h & h2 の msgbox "、コードがどこまで実行されたかを確認することです。10 の整数を使用しようとしましたが、PCA.m の処理された次元は 400*400 です。)

  2. 「.mat」ファイルとして保存した「eigvector」は、他の固有ベクトルでユークリッド距離分類器を実行する準備ができていますか? (私は、顔認識のように、固有の顔の eigvector が eigenpalm に等しいと考えています。固有ベクトル行列を画像に変換しようとしていましたが、PCA プロセス後の画像は黒で、その上に多くのドットがあります)

mySVD.m

  1. この関数では、1600 で設定された MAX_MATRIX_SIZE と 0.1% で設定された EIGVECTOR_RATIO の 2 つの値を変更できます。これらの値が結果に影響することを知っていますか? (値をいじってみましたが、違いがわかりません。私の掌紋画像の寸法は 450*400 に設定されているため、Max_matrix_size は 180,000 に設定する必要がありますか?)

** 私が求めていることを理解していただければ幸いです。助けてください。ありがとうございます (=

元のバージョン: 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
4

1 に答える 1

0

たとえば、構造体でオプションを渡します。

options.ReducedDim = 2;

また

 options.PCARatio =0.4;

このオプションReducedDimは、元の行列の最終的な射影を表すために使用する次元数を選択します。たとえばoption.ReducedDim = 2、最大の固有値を持つ 2 つの固有ベクトル (2 つの主成分) のみを使用してデータを表すことを選択した場合 (実際には、PCA は最大の固有値を持つ 2 つの固有ベクトルを返します)。

PCARatioPCARatio代わりに、固有値の合計の一部を占める最大の固有値を持つ最初の固有ベクトルとして次元数を選択できます。

ではmySVD.m、データセットを記述するために 1600 を超える固有ベクトルが必要になると予想される場合を除き、デフォルト値を増やしません。デフォルト値のままで問題ないと思います。

于 2013-08-07T17:06:22.243 に答える