之前自己用R写的互信息和条件互信息代码,虽然结果是正确的,但是时间复杂度太高。
最近看了信息熵的相关知识,考虑用信息熵来计算互信息和条件互信息。
MI(X,Y)=H(X)-H(X|Y)
H(X):熵,一种不确定性的度量 H(X,Y):联合熵,两个元素同时发生的不确定度
MI(X,Y)即是信息增益,信息增益相关知识可以参考前一篇博客。
H(X,Y)=H(X)+H(Y|X)->H(X|Y)=H(X,Y)-H(Y)
则MI(X,Y)=H(X)+H(Y)-H(X,Y)
MI(X1,X2|Y)=H(X1|Y)-H(X1|X2,Y)=H(X1,Y)-H(Y)-(H(X1,X2,Y)-H(X2,Y))
=H(X1,Y)+H(X2,Y)-H(Y)-H(X1,X2,Y)
正好在R语言当中有直接计算信息熵的包,代码如下:
1 library(infotheo) 2 data<-read.csv("E:\\qq\\alarm_data\\Alarm1_s500_v1.csv",header = F) 3 4 #互信息 5 mi<-function(mylist1,mylist2){ 6 return(entropy(mylist1)+entropy(mylist2)-entropy(cbind(mylist1,mylist2))) 7 } 8 pvalue<-mi(data[,1],data[,2])#测试 9 10 11 #条件互信息 12 cmi<-function(mylist1,mylist2,mylist3){ 13 return(entropy(cbind(mylist1,mylist3))+entropy(cbind(mylist2,mylist3))-entropy(mylist3)-entropy(cbind(mylist1,mylist2,mylist3))) 14 } 15 pvalue1<-cmi(data[,5],data[,13],data[,c(7,8)])
前面计算的是原始的互信息和条件互信息,接下来打算下载infotheo包,并将里面信息熵部分更改为论文中改进的p(x)计算公式,来处理(-3,3)的连续数据