LDA算法,最后面为什么特征值最大就是所求的情形。 这个严格的证明还没想通。
找到了, 其实证明的问题就是推广的 Rayleigh_quotient
维基里有介绍:点击打开链接
第一个链接里的是看到的最通俗易懂的入门。
http://blog.csdn.net/ffeng271/article/details/7353834
http://blog.csdn.net/v_july_v/article/details/41209515
http://www.cnblogs.com/zhangchaoyang/articles/2644095.html
Matlab里面的函数fitcdiscr里似乎有LDA的实现,但是具体的使用上实在学不会,所以自己写了。
Matlab
LDA算法代码:
function [V, D, changed_X] = LDA(X, label) %X 行数代表样本数,列数代表维数
%UNTITLED 此处显示有关此函数的摘要
% 此处显示详细说明
sample_size = size(label, 2);
feature_size = size(X, 2);
[sorted_label, order] = sort(label)
label(order)
[unique_label, ia, ic] = unique(sorted_label, 'first');
sorted_X = X(order,:);
sorted_X = zscore(sorted_X);
hmo1 = HeatMap(sorted_X')
hmo2 = HeatMap(zscore(sorted_X,0,1)')
hmo = HeatMap(zscore(sorted_X)')
unique_label_size = size(unique_label, 2);
ia(unique_label_size+1) = sample_size + 1
sum_class_in_matrix = zeros(feature_size, feature_size);
% sum_class_between_matrix.resize(feature_size, feature_size);
ave_class_X = zeros(sample_size, feature_size);
samples_class = zeros(unique_label_size, 1);
% for i=1:unique_label_size
% target_X = sorted_X(ia(i):ia(i+1)-1,:);
% samples_class(i,1) = ia(i+1) - ia(i);
%
%
% ave_class_X(ia(i):ia(i+1)-1,:) = repmat(mean(target_X), samples_class(i,1), 1);
% sum_class_in_matrix = sum_class_in_matrix + cov(target_X, 1) * samples_class(i,1) ;% /sample_size
% end
%
% size(mean(sorted_X))
% sum_class_in_matrix
% sum_class_between_matrix = cov(ave_class_X, 1) * sample_size%
%
% size(mean(ave_class_X))
%
%
% [V, D, W] = eig(sum_class_between_matrix, sum_class_in_matrix);%, 1, 'sm'
% V
% changed_X = X * V
% end
% i=1:unique_label_size;
% % for i=1:unique_label_size
% ave_class_X(:,i) = mean(sorted_X(ia(i), ia(i+1)-1), 2);
%
% new_X(ia(i), ia(i+1)-1) = bsxfun(@minus, sorted_X(ia(i), ia(i+1)-1), ave_class_X(:,i));
% % end
% i = 1:
end