|
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=1
d - 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 |
|