最近在研究信息论的时候,需要计算两个变量之间的互信息和条件互信息,计算公式如下。
在python的api里只找到了互信息的函数:
from sklearn.metrics import mutual_info_score
X = [1,1,2]
Y = [2,3,1]
# 计算X和Y之间的互信息
print(mutual_info_score(X, Y))
但是没有找到条件互信息的代码,于是自己动手实现了一下互信息和条件互信息的代码,以免需要用到的朋友再重复造轮子了。
注意在计算中所用到的对数均是以自然对数e为底。互信息的代码没有用dataframe,有点繁琐。
互信息:
# 互信息计算公式 I(X;Y) = sigma(p_xy * ln(p_xy/(p_x * p_y)))
# 输入为一个dataframe,有两列数据,计算并返回的是这两列之间的互信息值
def mutualInfo(data):
X = np.asarray(data.iloc[:, 0])
Y = np.asarray(data.iloc[:, 1])
# 使用字典统计每一个x元素出现的次数
d_x = dict() # x的字典
for x in X:
if x in d_x:
d_x[x] += 1
else:
d_x[x