1. 程式人生 > >特徵選擇(2):mRMR特徵選擇演算法(matlab程式碼實現)

特徵選擇(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