互信息和条件互信息

公式

原始互信息计算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])

 

posted on 2017-12-03 20:46  无果分飞  阅读(3665)  评论(0编辑  收藏  举报

导航