Files
2026-07-13 13:30:25 +08:00

29 lines
703 B
Matlab
Executable File

function U = fda(X, t, q)
% Fisher (linear) discriminant analysis
% Input:
% X: d x n data matrix
% t: 1 x n class label
% d: target dimension
% Output:
% U: projection matrix y=U'*x
% Written by Mo Chen (sth4nth@gmail.com).
n = size(X,2);
k = max(t);
E = sparse(1:n,t,true,n,k,n); % transform label into indicator matrix
nk = full(sum(E));
m = mean(X,2);
Xo = bsxfun(@minus,X,m);
St = (Xo*Xo')/n; % 4.43
mk = bsxfun(@times,X*E,1./nk);
mo = bsxfun(@minus,mk,m);
mo = bsxfun(@times,mo,sqrt(nk/n));
Sb = mo*mo'; % 4.46
% Sw = St-Sb; % 4.45
[U,A] = eig(Sb,St,'chol');
[~,idx] = sort(diag(A),'descend');
U = U(:,idx(1:q));