A list,

When applying statistical method to pattern recognition problem, one of the problems encountered repeatedly is dimension problem. What works analytically or computationally in lower dimensions often doesn’t work in higher dimensions. Therefore, reducing dimension can sometimes be the key to dealing with real problems.

1. Problem Description: How to find the best and most easily classified projection line according to the actual situation is the basic problem to be solved by Fisher discriminant method.

Consider projecting a sample of d-dimensional space onto a straight line to form a one-dimensional space, that is, squeezing the dimensions into one dimension. However, even if the samples form several compact discrete clusters in d – dimensional space, when they are projected onto a straight line, several classes of samples may be mixed together and become unrecognizable. But, in general, you can always find some direction along which the projection of the sample is separated. The picture below might be a little more intuitive:





Class effect. Therefore, the above problem of finding the best projection direction is mathematically the problem of finding the best transformation vector W *.

2. Definition of Fisher criterion function

A few basic parameters are necessary:

2.1 in d dimensional X space

(1) The mean vector mi of various samples



(2) The dispersion matrix Si and Sw within the sample class



Where Sw is a symmetric semidefinite matrix and is usually nonsingular when N>d. (Semipositive definite matrix: a real symmetric matrix whose eigenvalues are not less than zero; Nonsingular matrix: the determinant of a matrix is not zero.

(3) The dispersion matrix Sb between sample classes



Sb is a symmetric semidefinite matrix.

3.2 In one dimension Y space

(1) Mean values of various samples



(2) The intra-class dispersion of samples and the intra-class dispersion of total samples



We hope that all kinds of samples can be separated as much as possible in the one-dimensional Y-space after projection, that is, the larger the difference between the mean values of the two kinds is, the better; meanwhile, the internal density of all kinds of samples is as dense as possible, that is, the smaller the dispersion within the class is.

Fisher criterion function definition





As a result,



Substituting the above types into JF(W), we can get:



Where Sb is the dispersion matrix between sample classes, Sw is the dispersion matrix within the total sample class.

4. The optimal transformation vector W *



Ii. Source code

function varargout = faceCore(varargin)
% FACECORE M-file for faceCore.fig
%      FACECORE, by itself, creates a new FACECORE or raises the existing
%      singleton*.
%
%      H = FACECORE returns the handle to a new FACECORE or the handle to
%      the existing singleton*.
%
%      FACECORE('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in FACECORE.M with the given input arguments.
%
%      FACECORE('Property','Value',...) creates a new FACECORE or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before faceCore_OpeningFunction gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to faceCore_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
 
% Copyright 2002-2003 The MathWorks, Inc.
 
% Edit the above text to modify the response to help faceCore
 
% Last Modified by GUIDE v2.5 28-May-2009 10:21:26
 
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @faceCore_OpeningFcn, ...
                   'gui_OutputFcn',  @faceCore_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end
 
if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
 
 
% --- Executes just before faceCore is made visible.
function faceCore_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to faceCore (see VARARGIN)
 
% Choose default command line output for faceCore
handles.output = hObject;
 
% Update handles structure
guidata(hObject, handles);
 
% UIWAIT makes faceCore wait for user response (see UIRESUME)
% uiwait(handles.figure1);
 
 
% --- Outputs from this function are returned to the command line.
function varargout = faceCore_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
 
% Get default command line output from handles structure
varargout{1} = handles.output;
 
 
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global TrainDatabasePath ;
TrainDatabasePath = uigetdir(strcat(matlabroot,'\work'), '训练库路径选择...' );
 
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global TestDatabasePath;
TestDatabasePath = uigetdir(strcat(matlabroot,'\work'), '测试库路径选择...');
 
% --- Executes on button press in pushbutton3.
%function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%[filename,pathname]=uigetfile({'*.jpg';'*.bmp'},'');
%str=[pathname  filename];
%im=imread(str);
%axes(handles.axes1);
%imshow(im);
 
 
 
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global TrainDatabasePath ;
global TestDatabasePath;
global T;
T = CreateDatabase(TrainDatabasePath);
%[m V_PCA V_Fisher ProjectedImages_Fisher] = FisherfaceCore(T);
 
% --- Executes on button press in pushbutton5.
function pushbutton9_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global im;
[filename,pathname]=uigetfile({'*.jpg';'*.bmp'},'选择测试图片...');
str=[pathname  filename];
im=imread(str);
axes(handles.axes1);
imshow(im);
function OutputName = Recognition(TestImage, m_database, V_PCA, V_Fisher, ProjectedImages_Fisher)
% Recognizing step....
%
% Description: This function compares two faces by projecting the images into facespace and 
% measuring the Euclidean distance between them.
%
% Argument:      TestImage              - Path of the input test image
%
%                m_database             - (M*Nx1) Mean of the training database
%                                         database, which is output of 'EigenfaceCore' function.
%
%                V_PCA                  - (M*Nx(P-1)) Eigen vectors of the covariance matrix of 
%                                         the training database
 
%                V_Fisher               - ((P-1)x(C-1)) Largest (C-1) eigen vectors of matrix J = inv(Sw) * Sb
 
%                ProjectedImages_Fisher - ((C-1)xP) Training images, which
%                                         are projected onto Fisher linear space
% 
% Returns:       OutputName             - Name of the recognized image in the training database.
%
% See also: RESHAPE, STRCAT
 
% Original version by Amir Hossein Omidvarnia, October 2007
%                     Email: [email protected]                  
 
Train_Number = size(ProjectedImages_Fisher,2);
%%%%%%%%%%%%%%%%%%%%%%%% Extracting the FLD features from test image
%InputImage = imread(TestImage);
temp=TestImage(:,:,1);
%temp = InputImage(:,:,1);
 
[irow icol] = size(temp);
InImage = reshape(temp',irow*icol,1);
Difference = double(InImage)-m_database; % Centered test image
ProjectedTestImage = V_Fisher' * V_PCA' * Difference; % Test image feature vector
 
Copy the code

3. Operation results