mRMR是什么
是基于最大相关最小冗余的特征选择方法。
要点:1.相关是特征列与类标的相关性,也可以值特征之间的相关性,通常来说,特征与类标相关性越高,说明这个特征越重要。则选择这个特征,这就是最大相关。
2.最小冗余:特征选择的目的就是减少分类器的负担,减少不需要的特征。而两个特征之间如果相关性很高,这表示这两个特征对分类有着相同的作业。也可以说是冗余度比较高,这去掉其中一个特征。
相关性度量方法
相关性度量一般有三种:互信息(MI),皮尔森相关系数,最大信息系数
本文算法用的是互信息。
mRMR具体实现
function [fea, score] = mRMR(X_train, Y_train, K)
bdisp=0;
nd = size(X_train,2);
nc = size(X_train,1);
t1=cputime;
for i=1:nd,
t(i) = mutualinfo(X_train(:,i), Y_train);
end;
[tmp, idxs]=sort(-t);
fea_base = idxs(1:K);
fea(1) = idxs(1);
KMAX = min(1000,nd); %500
idxleft = idxs(2:KMAX);
k=1;
% if bdisp==1,
% % fprintf('k=1 cost_time=(N/A) cur_fea=%X_train #left_cand=%X_train\n', ...
% % fea(k), length(idxleft));
% end;
for k=2:K,
t1=cputime;
ncand = length(idxleft);
curlastfea = length(fea);
for i=1:ncand,
t_mi(i) = mutualinfo(X_train(:,idxleft(i)), Y_train);
mi_array(idxleft(i),curlastfea) = getmultimi(X_train(:,fea(curlastfea)), X_train(:,idxleft(i)));
c_mi(i) = mean(mi_array(idxleft(i), :));
end;
[score(k), fea(k)] = max(t_mi(1:ncand) - c_mi(1:ncand));
tmpidx = fea(k); fea(k) = idxleft(tmpidx); idxleft(tmpidx) = [];
% if bdisp==1,
% % fprintf('k=%X_train cost_time=%5.4f cur_fea=%X_train #left_cand=%X_train\n', ...
% k, cputime-t1, fea(k), length(idxleft));
% end;
end;
return;
%=====================================
function c = getmultimi(da, dt)
for i=1:size(da,2),
c(i) = mutualinfo(da(:,i), dt);;
end;
代码中互信息的测量函数为文中的mutualinfo