File Exchange

## Linear Discriminant Analysis (LDA) aka. Fisher Discriminant Analysis (FDA)

version 1.0.0.0 (5.7 KB) by Yarpiz

### Yarpiz (view profile)

Implemenatation of LDA in MATLAB for dimensionality reduction and linear feature extraction

Updated 22 Sep 2015

http://yarpiz.com/430/ypml114-linear-discriminant-analysis

### Cite As

Yarpiz (2020). Linear Discriminant Analysis (LDA) aka. Fisher Discriminant Analysis (FDA) (https://www.mathworks.com/matlabcentral/fileexchange/53151-linear-discriminant-analysis-lda-aka-fisher-discriminant-analysis-fda), MATLAB Central File Exchange. Retrieved .

Dengyu Wang

Matlaber

### Matlaber (view profile)

Hi (to below AC)

% X | double | nxk | data matrix: rows->observations cols->variables
% label | double | nx1 | labels
% m | double | 1x1 | dimension of reduced data

X is data matrix
label is class matrix ?

Am I correct?

AC

### AC (view profile)

Why is the result of each iteration saved in a cell mat. Taht is not necessary. I would add another input argument that specifies the dimension of the output data.

INPUT:
% X | double | nxk | data matrix: rows->observations cols->variables
% label | double | nx1 | labels
% m | double | 1x1 | dimension of reduced data
% OUTPUT:
% Y | double | nxm | reduced data
% W | double | kxm | transformationmatrix Y = X*W
function [ Y, W] = fisherLDA( X, label, m)

classes = unique(label);
k = numel(classes); % number of classes
dim = size(X,2); % Dimension of input data

SB = zeros(dim); % between-class scatter matrix
SW = zeros(dim); % within-class scatter matrix

X_ = mean(X); % mean of complete data

% loop over all classes and calculate SW and SB
for i = 1 : k
v = label == classes(i);
Xl = X(v,:); % all datapoints corresponding to label i

Xl_ = mean(Xl); % mean of all datapoints corresponding to label i

r = Xl_-X_;
SB = SB + size(Xl,1)*( r'*r );

for j = 1 : size(Xl,1)
r = Xl(j,:)-Xl_;
SW = SW + r'*r;
end

end
[W, LAMBDA]=eig(SB,SW,'qz');
lambda=diag(LAMBDA);

[~, SortOrder] = sort(lambda,'descend');

W=W(:,SortOrder);
W=W(:,1:m);
Y=X*W;
end

Jan Motl

### Jan Motl (view profile)

The header of LDA.m should really say what are the returned parameters. Something along:
Y: The new feature space.
W: Eigenvectors (sorted in the descending order of the eigenvalues).
lambda: Eigenvalues (sorted in the descending order).

Chao-Chung Peng

Angelo Carfora

### Angelo Carfora (view profile)

In the function: [Y, W, lambda] = LDA(X, L);
What is the meaning of W and lambda?

I think it's a little more efficient to write the code as follows. Because most of the time the number of features is much less than the number of samples.

function [Y, W, lambda] = LDA(X, L)

Classes=unique(L)';
k=numel(Classes);
NumFeatures = size(X,2);
n=zeros(k,1);
C=cell(k,1);
M=mean(X);
S=cell(k,1);
Sw=0;
Sb=0;
for j=1:k
Xj=X(L==Classes(j),:);
n(j)=size(Xj,1);
C{j}=mean(Xj);
C_rep = repmat(C{j},n(j),1);
XC = Xj-C_rep;
S{j}=0;
for k1=1:NumFeatures
for k2=k1:NumFeatures
S{j}(k1,k2) = XC(:,k1)'*XC(:,k2);
S{j}(k2,k1) = S{j}(k1,k2);
end
end
Sw=Sw+S{j};
Sb=Sb+n(j)*(C{j}-M)'*(C{j}-M);
end

[W, LAMBDA]=eig(Sb,Sw);

lambda=diag(LAMBDA);

[lambda, SortOrder]=sort(lambda,'descend');

W=W(:,SortOrder);

Y=X*W;

end

Arijit Dash

### Arijit Dash (view profile)

i need matlab code

##### MATLAB Release Compatibility
Created with R2009a
Compatible with any release
##### Platform Compatibility
Windows macOS Linux