之前自己用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)的連續數據