特征选择(2):mRMR特征选择算法(matlab代码实现)

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

具体代码下载地址:https://github.com/zhan81776075/feature-selection

猜你喜欢

转载自blog.csdn.net/m0_37628529/article/details/83312225