找回密码
 注册
关于网站域名变更的通知
查看: 1371|回复: 2
打印 上一主题 下一主题

用MATLAB实现基于互信息的特征选择算法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-8-8 09:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
在概率论和信息论中,两个随机变量的互信息(Mutual Information,简称MI)或转移信息(transinformation)是变量间相互依赖性的量度。不同于相关系数,互信息并不局限于实值随机变量,它更加一般且决定着联合分布 p(X,Y) 和分解的边缘分布的乘积 p(X)p(Y) 的相似程度。互信息(Mutual Information)是度量两个事件集合之间的相关性(mutual dependence)。互信息最常用的单位是bit。( R2 c3 ^  t% Q8 `* J$ F
& D- U2 q/ }( @7 i

) G# I8 T  o' \- P互信息的定义
' s% ^  z- C5 u1 |0 v1 l7 B正式地,两个离散随机变量 X 和 Y 的互信息可以定义为:- C8 c$ s- U6 c9 a
" h% d4 B/ y9 u8 t' G, t% O
其中 p(x,y) 是 X 和 Y 的联合概率分布函数,而p(x)和p(y)分别是 X 和 Y 的边缘概率分布函数。
6 C5 a9 a" g5 X# x5 t; l+ r: [
. b, ~# V. j( \, [6 P

3 i0 ?6 }. o$ `
" e' ~; `# d  e0 L : `% a1 f; B5 }! A. T* P5 m
在连续随机变量的情形下,求和被替换成了二重定积分:
6 K' r: O. I6 Z# s8 [$ W/ f& w
8 k% N# h8 k5 y# ~# s* Q" B
& I0 u- U7 j7 h/ E1 @# K- b3 S

2 g" b" z0 G$ z( D2 A* u% Q% Q 8 T  [5 d8 N3 Q
其中 p(x,y) 当前是 X 和 Y 的联合概率密度函数,而p(x)和p(y)分别是 X 和 Y 的边缘概率密度函数。8 Q% }6 L; h- s' e" A6 U
0 h6 l4 l7 ]" y  R% L
1 L3 _9 k& N* j, ?+ e2 e# q: C
互信息量I(xi;yj)在联合概率空间P(XY)中的统计平均值。 平均互信息I(X;Y)克服了互信息量I(xi;yj)的随机性,成为一个确定的量。如果对数以 2 为基底,互信息的单位是bit。6 Y- n# b# M) k, ]
7 t, N# Y# f/ q) W
( E: d% a$ A1 f* v0 y0 y
直观上,互信息度量 X 和 Y 共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。例如,如果 X 和 Y 相互独立,则知道 X 不对 Y 提供任何信息,反之亦然,所以它们的互信息为零。在另一个极端,如果 X 是 Y 的一个确定性函数,且 Y 也是 X 的一个确定性函数,那么传递的所有信息被 X 和 Y 共享:知道 X 决定 Y 的值,反之亦然。因此,在此情形互信息与 Y(或 X)单独包含的不确定度相同,称作 Y(或 X)的熵。而且,这个互信息与 X 的熵和 Y 的熵相同。(这种情形的一个非常特殊的情况是当 X 和 Y 为相同随机变量时。)) Y! R+ y5 l# R- K* b
& l5 m3 n# w1 ]/ r$ y

2 z. _1 ?* C% q5 i7 c互信息是 X 和 Y 联合分布相对于假定 X 和 Y 独立情况下的联合分布之间的内在依赖性。于是互信息以下面方式度量依赖性:I(X; Y) = 0 当且仅当 X 和 Y 为独立随机变量。从一个方向很容易看出:当 X 和 Y 独立时,p(x,y) = p(x) p(y),因此: * n# k/ O- w0 q# X" e

$ k* B- J8 X* f! x
+ Z7 R" V% ~1 s/ E! t
" P+ z9 |! w  [7 v/ `
5 Q6 A7 n0 A, k( Z) _
此外,互信息是非负的(即 I(X;Y) ≥ 0; 见下文),而且是对称的(即 I(X;Y) = I(Y;X))。
0 o$ O! C/ f+ Y; P% i' I; q  Z+ B" P1 X
* p% S0 `0 I# Q0 ~
互信息特征选择算法的步骤 7 t$ ]4 ^  w9 G2 X9 G5 o
①划分数据集 2 r3 }( w! S3 T2 {$ v& j
②利用互信息对特征进行排序 1 r# A4 U( g; p& m0 l
③选择前n个特征利用SVM进行训练
6 l# p: j! _& e/ s④在测试集上评价特征子集计算错误率
" F" t- W  D1 E% a. N
1 W( k5 ^( O* t+ D- t
* v/ U, v% R' B- u8 a3 h0 g# N4 F
代码 , D/ O, v( l8 I- v
注意使用的数据集是dlbcl,大概五千多维,可以从UCI上下载,最终选择前100特征进行训练。
( J" o; z5 o7 h0 \
* Y. Y& C! L0 z. q/ C3 D; ^

( ~% |, L2 l* G: S! v% R: I主函数代码:$ I, U( e% f8 N8 `, `
/ [! B$ a6 v0 A: m; H- r1 `7 g1 ^

8 A8 a% F0 m# j* ?, n1 n  v: K
  • clear all
  • close all
  • clc;
  • [X_train,Y_train,X_test,Y_test] = divide_dlbcl();
  • Y_train(Y_train==0)=-1;
  • Y_test(Y_test==0)=-1;
  • % number of features
  • numF = size(X_train,2);
  • - Q  @6 G( ^* `3 u5 x2 H7 E
  •   _) u2 L( w9 R8 e. t

  • 2 k2 Y' ~" p9 E$ Q. [- y
  • [ ranking , w] = mutInfFS( X_train, Y_train, numF );
  • k = 100; % select the Top 2 features
  • svmStruct = svmtrain(X_train(:,ranking(1:k)),Y_train,'showplot',true);
  • C = svmclassify(svmStruct,X_test(:,ranking(1:k)),'showplot',true);
  • err_rate = sum(Y_test~= C)/size(X_test,1); % mis-classification rate
  • conMat = confusionmat(Y_test,C); % the confusion matrix
  • fprintf('\nAccuracy: %.2f%%, Error-Rate: %.2f \n',100*(1-err_rate),err_rate);
    - h" U" @7 d! A+ G" A- k, U* s

) e; D$ ~& _0 D' }3 z0 J& F) N( D3 Y3 E7 Z% W
" W5 \/ E9 T% c  r" Q( Y
mutInfFS.m. p/ R  x' O# u+ V

" F3 |# K7 X. B% ~4 x. w( x
) F- w$ G3 L8 o7 Q2 e
  • function [ rank , w] = mutInfFS( X,Y,numF )
  • rank = [];
  • for i = 1:size(X,2)
  •     rank = [rank; -muteinf(X(:,i),Y) i];
  • end;
  • rank = sortrows(rank,1);
  • w = rank(1:numF, 1);
  • rank = rank(1:numF, 2);
  • # {, Z2 W9 x* ?# I- x
  • end( y; w7 d/ W/ X0 |7 @8 p

" ^7 R* a" j6 U1 U
  Z9 Z8 [- P0 P7 I+ Y- Q7 d: L( c/ i$ [/ f
muteinf.m
" L9 l8 Y/ Q7 b6 m0 V: [; s" w) d0 B& W6 s" x
6 W2 `0 e" O5 f0 ]
  • function info = muteinf(A, Y)
  • n = size(A,1);%实例数量
  • Z = [A Y];%所有实例的维度值及标签
  • if(n/10 > 20)
  •     nbins = 20;
  • else
  •     nbins = max(floor(n/10),10);%设置区间的个数
  • end;
  • pA = hist(A, nbins);%min(A)到max(A)划分出nbins个区间出来,求每个区间的概率
  • pA = pA ./ n;%除以实例数量

  • 1 G6 u+ {: }% V& r- g# c- G
  • i = find(pA == 0);
  • pA(i) = 0.00001;%不能使某一区间的概率为0

  • 4 O" @1 ^' ]# t* N4 c2 f
  • od = size(Y,2);%一个维度
  • cl = od;
  • %下面是求实例不同标签的的概率值,也就是频率
  • if(od == 1)
  •     pY = [length(find(Y==+1)) length(find(Y==-1))] / n;
  •     cl = 2;
  • else
  •     pY = zeros(1,od);
  •     for i=1d
  •         pY(i) = length(find(Y==+1));
  •     end;
  •     pY = pY / n;
  • end;
  • p = zeros(cl,nbins);
  • rx = abs(max(A) - min(A)) / nbins;%每个区间长度
  • for i = 1:cl
  •     xl = min(A);%变量的下界
  •     for j = 1:nbins
  •         if(i == 2) && (od == 1)
  •             interval = (xl <= Z(:,1)) & (Z(:,2) == -1);
  •         else
  •             interval = (xl <= Z(:,1)) & (Z(:,i+1) == +1);
  •         end;
  •         if(j < nbins)
  •             interval = interval & (Z(:,1) < xl + rx);
  •         end;
  •         %find(interval)
  •         p(i,j) = length(find(interval));
  • 6 r/ M+ x3 ?$ Q" L2 W
  •         if p(i,j) == 0 % hack!
  •             p(i,j) = 0.00001;
  •         end
  • 0 a: W: M4 t3 ^7 r1 P
  •         xl = xl + rx;
  •     end;
  • end;
  • HA = -sum(pA .* log(pA));%计算当前维度的信息熵
  • HY = -sum(pY .* log(pY));%计算标签的信息熵
  • pA = repmat(pA,cl,1);
  • pY = repmat(pY',1,nbins);
  • p = p ./ n;
  • info = sum(sum(p .* log(p ./ (pA .* pY))));
  • info = 2 * info ./ (HA + HY);%计算互信息
    0 b; _+ A3 l3 E; i2 I- y8 ?6 A. J
6 p$ }+ }5 P5 @4 y: B; h8 q+ c
- c* v; }% S; Q$ @( p* {

% H, k6 }5 G7 |3 ]前100个特征的效果:; ^4 H# s% U- M6 W; ?: {2 C
2 V8 O) Z$ R; |  N3 T& g
" k4 y$ w* J+ j: H- k( o* P
Accuracy: 86.36%, Error-Rate: 0.142 q& l$ j; a" w. o' C6 U
+ z8 ^8 J7 `0 U& o
6 @  @! G- P2 c. o6 e4 d0 u
选择前两个特征进行训练(压缩率接近100%,把上述代码中的K设为2即可)的二维图:
& L5 o* E( X5 u9 t; m; \! g
( m, D8 ~# ?6 Z 1 M' Y: R7 j! L) F% K
% }; Z9 }, t$ S

9 y3 |- t. F6 U  H; Y7 gAccuracy: 75.00%, Error-Rate: 0.25
. N5 D% U1 x' o: W2 m& M
, r: p1 @2 y/ A1 \: h
; N8 s( ^( b6 s, O% P6 ^; M
( h' K* }! w7 e* e

' [8 m$ f. j9 E9 d4 X
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-12 23:33 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表