特徵選擇(1):特徵相關性度量之互資訊量(matlab程式碼實現)
阿新 • • 發佈:2018-11-06
互資訊的概念
互資訊量定義基於資訊熵的概念。在資訊理論中,資訊熵可度量變數的不確定性。設在隨機空間中,某一離散變數X 的概率分佈為p(x),則X 的資訊熵定義為:
其中,log 以2 為底。若兩個離散隨機變數X 和Y 的聯合概率分佈為p(x, y),則X 和Y 的條件資訊熵為:
X 和Y 的互資訊量I(X; Y)的定義如下:
互資訊與特徵選擇
互資訊主要是一個特徵選擇相關性的度量單位,設X為資料,Y為標籤,互資訊則表示資料與標籤的相關性。一般大小為[0,inf).越高則表示這個特徵越重要,簡單的特徵選擇如FR,就是根據相關性來排序,選擇最高的幾個。
除了資料與類標之間的相關性,還有資料之間的冗餘性。如果資料之間相關性越高,則冗餘性越強,如mRMR特徵選擇,則是根據最大類標相關性最小資料冗餘性的準則來進行特徵選擇。
程式碼
該程式碼主要參考於https://blog.csdn.net/xyisv/article/details/81504764,博主Reacubeth。並最其進行了修改和註釋,刪除了一些不必要的內容。
下面的程式碼主要用於資料列標籤和類標的互資訊計算。類標為2類資料。
function mi=Mutual_information(X,Y)
num=size(X,1);%例項數量
label=unique(Y);
Z=[X,Y];%所有例項的維度值及標籤
if(num/10>20)
nbins=20;
else
nbins=max(floor(num/10),10);%設定區間的個數
end;
PX=hist(X,nbins);%min(X)到max(X)劃分出nbins個區間出來,求每個區間的概率
PX=PX./num;%除以例項數量
i=find(PX==0);
PX(i)=0.00001;%不能使某一區間的概率為0
od=size(Y,2);%標籤的列數,一般為1,多列Y暫時不考慮
cl=od;
if length(unique(Y))==2 %二類分類問題 label(1)
if(od==1)
PY=[length(find(Y==label(1))) length(find(Y==(label(2))))]/num;
cl=2;
else%多列Y 暫時不考慮
end
p=zeros(cl,nbins);
rx=abs(max(X)-min(X))/nbins;%每個區間長度
for i=1:cl
xl=min(X);%變數的下界
for j=1:nbins
if(i==2)&&(od==1)
interval=(xl<=Z(:,1))&(Z(:,2)==label(2));
else
interval=(xl<=Z(:,1))&(Z(:,i+1)==label(1));
end;
if(j<nbins)
interval=interval&(Z(:,1)<xl+rx);
end;
p(i,j)=length(find(interval));
if p(i,j)==0;
p(i,j)=0.00001;
end
xl=xl+rx;
end;
end;
end
HA=-sum(PX.*log(PX));%計算當前維度的資訊熵
HY=-sum(PY.*log(PY));%計算標籤的資訊熵
PX=repmat(PX,cl,1);
PY = repmat(PY',1,nbins);
p=p./num;
mi=sum(sum(p.*log(p./(PX.*PY))));
%info = 2 * mi ./ (HA + HY);%計算互資訊
end
後記
暫時只是列向量資料與標籤向量的計算,隨後會陸續用於列向量資料之間的計算,多類資料,聚類資料。
資料來源:https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html