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語言當中有直接計算信息熵的包,代碼如下:

library(infotheo)
data<-read.csv("test.csv",header = F)

#互信息
mi<-function(mylist1,mylist2){
  return(entropy(mylist1)+entropy(mylist2)-entropy(cbind(mylist1,mylist2)))
}
pvalue<-mi(data[,1],data[,2])#測試


#條件互信息
cmi<-function(mylist1,mylist2,mylist3){
  return(entropy(cbind(mylist1,mylist3))+entropy(cbind(mylist2,mylist3))-entropy(mylist3)-entropy(cbind(mylist1,mylist2,mylist3)))
}
pvalue1<-cmi(data[,5],data[,13],data[,c(7,8)])

案例結果

在這裏插入圖片描述

setwd("C:\\Users\\Administrator\\Desktop\\MI_cntry 3")
par(mfrow = c(2, 2), mar = c(4, 4, 1, 1))  ###圖形分欄佈局
#---------------------------------------------------------GDP
data1 <- read.csv("GDP.csv")
str(data1)
zdata1<- t(data1)
mdata1 <- zdata1[-c(1,2),]
m=seq(from = 2001, to = 2015, by=1)  ## 先生成等差數列的刻度,間距爲2.5
x1=seq(from =1, to = 15, by=3)
x2=seq(from = 2001, to = 2015, by=3)
plot(mdata1[,1],type='l',main="CHN",xlab="",ylab="GDP",xaxt="n")
axis(side=1,at=x1,labels=x2)
#mtext("*10^13",adj=0,font=0.0001,font.axis=6)

#----------------------------------------------------------NP
data2 <- read.csv("NP.csv")
str(data2)
zdata2<- t(data2)
mdata2 <- zdata2[-c(1,2),]
m=seq(from = 2001, to = 2015, by=1)  ## 先生成等差數列的刻度,間距爲2.5
x1=seq(from =1, to = 15, by=3)
x2=seq(from = 2001, to = 2015, by=3)
plot(mdata2[,1],type='l',main="CHN",xlab="",ylab="NP",xaxt="n")
axis(side=1,at=x1,labels=x2)
#mtext("*10^13",adj=0,font=0.0001,font.axis=6)

#----------------------------------------------------------U

data3 <- read.csv("U.csv")
str(data3)
zdata3<- t(data3)
mdata3 <- zdata3[-c(1,2),]
m=seq(from = 2001, to = 2015, by=1)  ## 先生成等差數列的刻度,間距爲2.5
x1=seq(from =1, to = 15, by=3)
x2=seq(from = 2001, to = 2015, by=3)
plot(mdata3[,1],type='l',main="CHN",xlab="",ylab="U",xaxt="n")
axis(side=1,at=x1,labels=x2)
#mtext("*10^13",adj=0,font=0.0001,font.axis=6)



#----------------------------------------------------------
############互信息值計算
#install.packages("infotheo")
library(infotheo)
#條件互信息
cmi<-function(mylist1,mylist2,mylist3){
return(entropy(cbind(mylist1,mylist3))+entropy(cbind(mylist2,mylist3))-entropy(mylist3)-entropy(cbind(mylist1,mylist2,mylist3)))
 }

#pvalue1<-cmi(mdata1[,1],mdata2[,1],mdata3[,1])

#plot(pvalue1)

#互信息參考網站:https://www.cnblogs.com/jiangyaling/p/8040024.html

mi<-function(mylist1,mylist2){
return(entropy(mylist1)+entropy(mylist2)-entropy(cbind(mylist1,mylist2)))
}
pvalue01<-mi(mdata1[,2],mdata2[,2])#測試
pvalue02<-mi(mdata2[,2],mdata3[,2])#測試

plot(pvalue01,ylin=c(2,3),yaxt="n",ylab="",pch=3)
par(new=TRUE)
plot(pvalue02,ylim=c(2,3),pch=6)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章