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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-5-18 11:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
本帖最后由 baqiao 于 2020-5-18 13:24 编辑
" v) v7 f9 ~1 I7 X9 [2 J, u% `- ^, B* H7 c$ T
在概率论和信息论中,两个随机变量的互信息(Mutual Information,简称MI)或转移信息(transinformation)是变量间相互依赖性的量度。不同于相关系数,互信息并不局限于实值随机变量,它更加一般且决定着联合分布 p(X,Y) 和分解的边缘分布的乘积 p(X)p(Y) 的相似程度。互信息(Mutual Information)是度量两个事件集合之间的相关性(mutual dependence)。互信息最常用的单位是bit。
+ F* h* a0 n: Y9 l! C2 L# i) M5 D" B6 F" A4 h
互信息的定义 & C" R. N+ E7 v8 f3 n
正式地,两个离散随机变量 X 和 Y 的互信息可以定义为:, h2 P4 q' ]" H1 I+ m
- Y0 m* p1 F  `
其中 p(x,y) 是 X 和 Y 的联合概率分布函数,而p(x)和p(y)分别是 X 和 Y 的边缘概率分布函数。
" g" I( }: ?  y) Y" Y9 o
6 ^0 r; W3 ~1 B1 p$ i" F- s, a在连续随机变量的情形下,求和被替换成了二重定积分: . b/ \4 F1 R; s
' b# n1 ?4 ?6 S% ]
其中 p(x,y) 当前是 X 和 Y 的联合概率密度函数,而p(x)和p(y)分别是 X 和 Y 的边缘概率密度函数。* v0 U+ w) T( X$ m9 c

8 g- r6 _( F& F# ~. [互信息量I(xi;yj)在联合概率空间P(XY)中的统计平均值。 平均互信息I(X;Y)克服了互信息量I(xi;yj)的随机性,成为一个确定的量。如果对数以 2 为基底,互信息的单位是bit。
% C+ O  w6 N( v/ P# Z7 @: M9 C- d( p% W2 n7 t9 m
直观上,互信息度量 X 和 Y 共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。例如,如果 X 和 Y 相互独立,则知道 X 不对 Y 提供任何信息,反之亦然,所以它们的互信息为零。在另一个极端,如果 X 是 Y 的一个确定性函数,且 Y 也是 X 的一个确定性函数,那么传递的所有信息被 X 和 Y 共享:知道 X 决定 Y 的值,反之亦然。因此,在此情形互信息与 Y(或 X)单独包含的不确定度相同,称作 Y(或 X)的熵。而且,这个互信息与 X 的熵和 Y 的熵相同。(这种情形的一个非常特殊的情况是当 X 和 Y 为相同随机变量时。)2 {" ]( ^3 I$ y) k  o+ {! {/ D

! o* _  \- E5 K互信息是 X 和 Y 联合分布相对于假定 X 和 Y 独立情况下的联合分布之间的内在依赖性。于是互信息以下面方式度量依赖性:I(X; Y) = 0 当且仅当 X 和 Y 为独立随机变量。从一个方向很容易看出:当 X 和 Y 独立时,p(x,y) = p(x) p(y),因此:
6 z3 s# W, x2 N4 U9 M  ` 9 n# U- Z* V1 P1 t8 L, G
此外,互信息是非负的(即 I(X;Y) ≥ 0; 见下文),而且是对称的(即 I(X;Y) = I(Y;X))。. k5 z8 \9 k9 h) d' ]7 T! A

0 h' Y2 l- H% R
0 Z+ J/ w& D0 j( `6 c& G+ R1 T互信息特征选择算法的步骤 , T0 z, V: k0 A$ o9 X+ y
①划分数据集
3 I* t" ^& Q0 e/ i7 g0 d% ]2 {, F②利用互信息对特征进行排序 1 n1 M1 \& A6 o% C2 ^0 w% ^8 q( j
③选择前n个特征利用SVM进行训练 ! m0 d' c  a+ l" z. L) U& ]
④在测试集上评价特征子集计算错误率
- M5 p; ^& \6 ]8 t$ U" v8 c代码 . z7 H' q1 X- u3 X+ [
注意使用的数据集是dlbcl,大概五千多维,可以从UCI上下载,最终选择前100特征进行训练。
/ p6 C$ Q0 _) ?$ S% q" O3 W. r/ W3 O/ W  H* w
主函数代码:
5 y! e0 h, V1 s0 q5 ^: J
8 {  X, _) Z- Z& {2 Q; B( k- hclear all
) H7 D: L5 c" Zclose all: o& B3 Z$ }  p! R2 |; g
clc;7 {$ H! |+ y' Q1 M  ^1 ]
[X_train,Y_train,X_test,Y_test] = divide_dlbcl();
: v: `/ R1 A" p- P8 m- HY_train(Y_train==0)=-1;$ j8 A. S& f! S$ D
Y_test(Y_test==0)=-1;& F* w. f/ k% F% r2 f7 I& {' Z
% number of features
# O; j& V" i6 ^/ ?( }numF = size(X_train,2);
: `( j5 b, E4 Z4 _5 H( J* W
6 B7 O6 O, Y' B& \, ~
: B. {; K: C# B# r. ]8 r7 h
; d; G& [6 C7 m. c4 A[ ranking , w] = mutInfFS( X_train, Y_train, numF );9 b# g% }( c+ Q7 u) n8 e
k = 100; % select the Top 2 features" _3 {; l. v1 ]4 ~8 U
svmStruct = svmtrain(X_train(:,ranking(1:k)),Y_train,'showplot',true);
/ N  ?- P; B: Z+ C# R, gC = svmclassify(svmStruct,X_test(:,ranking(1:k)),'showplot',true);/ E- u! o; h0 {" {
err_rate = sum(Y_test~= C)/size(X_test,1); % mis-classification rate
" S' q7 i, t  V, xconMat = confusionmat(Y_test,C); % the confusion matrix
  {2 s' j% b( Y! m6 P2 Wfprintf('\nAccuracy: %.2f%%, Error-Rate: %.2f \n',100*(1-err_rate),err_rate);
. e: Q8 j% ]1 S5 F" q
& }9 J4 V8 E* v  M3 [. [3 i+ K3 i1 u$ Y" k6 G/ W
mutInfFS.m
5 I: o+ H, ^' F
$ P- m* t1 _: D! x$ ofunction [ rank , w] = mutInfFS( X,Y,numF )
. D& E5 h1 }* m$ C4 d# A9 T4 nrank = [];
  i/ A. q4 J1 o- i0 i. ]for i = 1:size(X,2)% X/ f8 }3 l5 ]- h' n
    rank = [rank; -muteinf(X(:,i),Y) i];; T" ^+ |. J9 W
end;% T2 N+ l0 U8 `9 [# @+ A
rank = sortrows(rank,1);    3 n' Y. f" ?- W# r+ s- x, w- ^2 u
w = rank(1:numF, 1);2 y' ?: Y, ]$ s/ {$ F8 v0 d
rank = rank(1:numF, 2);6 z& R, V5 M& I2 H, R! S* S
# P" H" g% D$ s; A& a  l7 }
end
5 X0 u9 c, p7 X8 Q& w2 V) F' K; p

" @5 S0 ]1 q& x7 S$ Imuteinf.m
; p3 \9 ?$ Y- }$ S8 }# E) b2 S! B1 g; h
function info = muteinf(A, Y)
) W4 P9 \/ f5 o% l* [# yn = size(A,1);%实例数量4 ]6 g2 B& C9 |5 _
Z = [A Y];%所有实例的维度值及标签
1 G9 t* o( M$ s* xif(n/10 > 20); N6 V: p4 Z  i) L7 o
    nbins = 20;0 `3 _3 p' e" A: Q- ?+ m( A
else
( `; ~$ l7 K8 L2 c1 G" E    nbins = max(floor(n/10),10);%设置区间的个数
! q0 s" X. u* s5 }% g; Jend;
. h3 [* \% M" ~/ ?pA = hist(A, nbins);%min(A)到max(A)划分出nbins个区间出来,求每个区间的概率  e- @; |9 S6 W# H8 `, o
pA = pA ./ n;%除以实例数量
# T1 g5 d: J* e; d. x4 w& ]
5 m6 A3 t. A# i: P. a6 e  X3 Qi = find(pA == 0);# `/ p' y4 x- ^0 n! ~
pA(i) = 0.00001;%不能使某一区间的概率为0. T' @* s4 I0 F
+ t: V( ]( j& k" ^8 h0 t& J
od = size(Y,2);%一个维度
9 M/ ?; J$ v1 W) V4 r; Ocl = od;
. u; V: R+ C; s1 h%下面是求实例不同标签的的概率值,也就是频率
& Z8 L1 u1 o2 v- s( |6 Gif(od == 1)
6 j+ C  |: {" Q4 O8 @    pY = [length(find(Y==+1)) length(find(Y==-1))] / n;# h) `1 P8 E/ J7 _8 U
    cl = 2;/ W/ R: e2 V$ T8 K7 H$ t
else
7 C  U/ O9 C' q: R, q6 f    pY = zeros(1,od);
  y, }$ |, e/ G, B+ Y9 }' _    for i=1: od0 Z# d9 b, {5 V7 F
        pY(i) = length(find(Y==+1));1 a8 r) R) x1 @7 u. D+ i7 O0 n. t
    end;
8 W( t# g# v% v) A% w. Y+ a    pY = pY / n;
: U6 ~. L3 m% R* i0 hend;% @- f! a, e7 Q7 [0 r
p = zeros(cl,nbins);; z9 H" K" k/ L0 \5 X
rx = abs(max(A) - min(A)) / nbins;%每个区间长度
  g+ S$ Q9 t( p3 pfor i = 1:cl8 U7 c1 I; P! T+ Q
    xl = min(A);%变量的下界
4 R) D; S* D2 M/ X    for j = 1:nbins
. T/ v$ E" e0 w3 c$ T        if(i == 2) && (od == 1)
* U1 {5 w8 m& h5 u% |9 E            interval = (xl <= Z(:,1)) & (Z(:,2) == -1);+ N8 v! A! l: B! r3 V/ \0 l. O
        else0 K  _% M0 H4 X: V
            interval = (xl <= Z(:,1)) & (Z(:,i+1) == +1);& P: W7 o( e  Z0 i
        end;
& L7 p  g8 P6 {        if(j < nbins)1 w5 h% i, t1 v9 `1 B
            interval = interval & (Z(:,1) < xl + rx);# r" a7 m. n: P
        end;
. M# t. x& T/ C' h        %find(interval)
5 |" j; {, }5 x6 _& l        p(i,j) = length(find(interval));( N+ C7 Q. p" y% V
2 l/ R* S0 f7 j0 A- z. k! R
        if p(i,j) == 0 % hack!
5 o) o, I& e% w2 f& J            p(i,j) = 0.00001;, l1 n2 z7 d! Z& {
        end
! |+ \1 `" z0 g$ B; p$ E
" q/ L( }+ t4 f2 J& s5 r        xl = xl + rx;" W" ?( i/ v/ o9 ~5 @5 u4 I
    end;# c1 l8 K" i8 k5 y1 [
end;
4 w5 z3 D: h* ]HA = -sum(pA .* log(pA));%计算当前维度的信息熵
3 d9 E. `+ P1 n. b7 l! |( p1 {HY = -sum(pY .* log(pY));%计算标签的信息熵) Z" M) M: w1 r+ D! D0 [8 P
pA = repmat(pA,cl,1);5 C9 R& D& l# f( w1 I9 O  {
pY = repmat(pY',1,nbins);2 i1 E: \' u2 s; A
p = p ./ n;
$ ~4 {: j) T1 ]  K. [. Vinfo = sum(sum(p .* log(p ./ (pA .* pY))));; m: E2 n/ Z1 D& |$ G" v" X) p
info = 2 * info ./ (HA + HY);%计算互信息
9 V% e9 B0 q4 v4 _8 g/ U. f% {( u8 n- o2 ~
, M5 T2 \0 R. v4 t$ C( f  i2 \
前100个特征的效果:
0 z, O  K* \* K! x: J( f" O9 u; G8 Q0 h5 P$ N3 ~9 K7 W% F) g
Accuracy: 86.36%, Error-Rate: 0.14" V& M' U* q- O" H: t# B8 V. x! a

+ }- h$ L/ E; M; P; u选择前两个特征进行训练(压缩率接近100%,把上述代码中的K设为2即可)的二维图:
" x- F# v8 V  s- c4 E
4 Y/ q+ N: s8 j9 mAccuracy: 75.00%, Error-Rate: 0.25
* p! P; e$ R% C  T
" a6 p% b! i; @, R4 H1 w/ B: G! F1 i0 @' k5 c- s

- m% Q0 p; e8 }7 S

该用户从未签到

2#
发表于 2020-5-18 13:23 | 只看该作者
基于互信息的特征选择算法MATLAB实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-5 21:24 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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