互信息和条件互信息
公式
原始互信息计算R代码:
数据类型如下:
1 data<-read.csv("E:\\qq\\alarm_data\\Alarm1_s500_v1.csv",header = F) 2 #----------------------------------------------------------------------------- 3 #函数作用:返回一个矩阵,比如mylist1有3个取值3 0 2,mylist2有2个取值0 2 4 #生成一个3*2的矩阵,其中x[1,1]记录的是mylist1=3且mylist2=0的数量 5 #x[1,2]记录的是mylist1=3且mylist2=2的数量........... 6 myfunction1<-function(mylist1,mylist2){ 7 mylist1<-data.frame(mylist1) 8 mylist2<-data.frame(mylist2) 9 10 a<-data.frame(unique(mylist1)) 11 b<-data.frame(unique(mylist2)) 12 x<-matrix(0,nrow=nrow(unique(mylist1)),ncol=nrow(unique(mylist2))) 13 14 15 for(i in 1:nrow(unique(mylist1))){ 16 for(j in 1:nrow(unique(mylist2))) 17 { 18 for(k in 1:nrow(data)){ 19 if(mylist1[k,1]==a[i,1]&mylist2[k,1]==b[j,1]) 20 x[i,j]=x[i,j]+1} 21 } 22 } 23 return(x) 24 } 25 #--------------------------------------------------------------------------------- 26 #--------------------------------------------------------------------------------- 27 #函数作用:返回一个矩阵,比如mylist有3个取值3 0 2 28 #x[1,1]为mylist=3的数目 29 myfunction2<-function(mylist){ 30 a<-data.frame(unique(mylist)) 31 x<-matrix(0,nrow=nrow(a),ncol=1) 32 for(i in 1:nrow(a)) 33 x[i,1]<-length(which(mylist==a[i,1])) 34 return(x) 35 } 36 #--------------------------------------------------------------------------------- 37 #计算互信息 38 myfunction3<-function(mylist1,mylist2){ 39 x<-myfunction1(mylist1,mylist2) 40 y<-myfunction2(mylist1) 41 z<-myfunction2(mylist2) 42 sum=0 43 for(i in 1:nrow(x)) 44 for(j in 1:ncol(x)){ 45 if(x[i,j]!=0) 46 sum=sum+x[i,j]*log(x[i,j]*nrow(data)/(y[i,1]*z[j,1])) 47 else sum=sum 48 } 49 sum=sum/nrow(data) 50 return(sum) 51 } 52 #测试 53 pvalue<-myfunction3(data[,1],data[,2])
原始条件互信息计算R代码:
1 data<-read.csv("E:\\qq\\alarm_data\\Alarm1_s500_v1.csv",header = F) 2 #----------------------------------------------------------------------------- 3 #函数作用:计算X=x,Y=y,Z=z的数目 4 #返回一个三维数组,比如mylist1有3个取值3 2 0,mylist2有2个取值0 2 1 5 #mylist3有3种取值{1,1}{1,2}{1,0} 6 #生成一个3*3*3的数组,其中x[1,1,1]记录的是mylist1=3且mylist2=0,mulist3={1,1}的数量 7 #x[1,1,2]记录的是mylist1=3且mylist2=0,mulist3={1,2}的数量........... 8 myfunction1<-function(mylist1,mylist2,mylist3){ 9 mylist1<-data.frame(mylist1) 10 mylist2<-data.frame(mylist2) 11 mylist3<-data.frame(mylist3) 12 13 a<-data.frame(unique(mylist1)) 14 b<-data.frame(unique(mylist2)) 15 c<-data.frame(unique(mylist3)) 16 17 x<-array(0,c(nrow(unique(mylist1)),nrow(unique(mylist2)),nrow(unique(mylist3)))) 18 for(r in 1:nrow(unique(mylist3))) 19 for(i in 1:nrow(unique(mylist1))) 20 for(j in 1:nrow(unique(mylist2))) 21 { 22 for(k in 1:nrow(data)){ 23 if(mylist1[k,1]==a[i,1] & mylist2[k,1]==b[j,1] &all(mylist3[k,]==c[r,])) 24 x[i,j,r]=x[i,j,r]+1} 25 } 26 return(x) 27 } 28 #----------------------------------------------------------------------------------- 29 #函数作用:计算X=x,Z=z的数目 30 myfunction2<-function(mylist1,mylist2){ 31 mylist1<-data.frame(mylist1) 32 mylist2<-data.frame(mylist2) 33 34 a<-data.frame(unique(mylist1)) 35 b<-data.frame(unique(mylist2)) 36 x<-matrix(0,nrow=nrow(unique(mylist1)),ncol=nrow(unique(mylist2))) 37 38 39 for(i in 1:nrow(unique(mylist1))){ 40 for(j in 1:nrow(unique(mylist2))) 41 { 42 for(k in 1:nrow(data)){ 43 if(mylist1[k,1]==a[i,1]&all(mylist2[k,]==b[j,])) 44 x[i,j]=x[i,j]+1} 45 } 46 } 47 return(x) 48 } 49 #---------------------------------------------------------------------------------- 50 #函数作用:计算X=x的数目 51 myfunction3<-function(mylist){ 52 a<-data.frame(unique(mylist)) 53 x<-matrix(0,nrow=nrow(a),ncol=1) 54 for(i in 1:nrow(a)) 55 for(k in 1:nrow(data)){ 56 if(all(mylist[k,]==a[i,])) 57 x[i,1]=x[i,1]+1} 58 return(x) 59 } 60 #---------------------------------------------------------------------------------- 61 #计算条件互信息 62 myfunction4<-function(mylist1,mylist2,mylist3){ 63 mylist1<-data.frame(mylist1) 64 mylist2<-data.frame(mylist2) 65 mylist3<-data.frame(mylist3) 66 67 x<-myfunction1(mylist1,mylist2,mylist3) 68 y1<-myfunction2(mylist1,mylist3) 69 y2<-myfunction2(mylist2,mylist3) 70 z<-myfunction3(mylist3) 71 sum=0 72 for(i in 1:nrow(unique(mylist1))) 73 for(j in 1:nrow(unique(mylist2))) 74 for(r in 1:nrow(unique(mylist3))){ 75 if(x[i,j,r]!=0 & y1[i,r]!=0 & y2[j,r]!=0) 76 sum=sum+x[i,j,r]*log(x[i,j,r]*z[r,1]/(y1[i,r]*y2[j,r])) 77 else sum=sum 78 } 79 sum=sum/nrow(data) 80 return(sum) 81 } 82 #测试 83 pvalue<-myfunction4(data[,1],data[,22],data[,21])