-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlda.m
More file actions
34 lines (30 loc) · 1001 Bytes
/
Copy pathlda.m
File metadata and controls
34 lines (30 loc) · 1001 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function coeff = lda(X, Y)
% Calculate class means
classes = unique(Y);
num_classes = numel(classes);
means = zeros(num_classes, size(X, 2));
for i = 1:num_classes
means(i, :) = mean(X(Y == classes(i), :));
end
% Calculate between-class scatter matrix
overall_mean = mean(X);
Sb = zeros(size(X, 2));
for i = 1:num_classes
N = sum(Y == classes(i));
Sb = Sb + N * (means(i, :) - overall_mean).' * (means(i, :) - overall_mean);
end
% Calculate within-class scatter matrix
Sw = zeros(size(X, 2));
for i = 1:num_classes
indices = find(Y == classes(i));
class_data = X(indices, :);
class_mean = means(i, :);
class_cov = cov(class_data);
Sw = Sw + (length(indices) - 1) * class_cov;
end
% Calculate eigenvectors and eigenvalues
[V, D] = eig(Sw \ Sb);
% Sort eigenvectors based on eigenvalues
[~, indices] = sort(diag(D), 'descend');
coeff = V(:, indices);
end