最近在研究信息论的时候,需要计算两个变量之间的互信息和条件互信息,计算公式如下。

在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] += 1else:d_x[x] = 1# 计算每个元素出现的概率p_x = dict()for x in d_x.keys():p_x[x] = d_x[x] / X.size# 使用字典统计每一个y元素出现的次数d_y = dict()  # y的字典for y in Y:if y in d_y:d_y[y] += 1else:d_y[y] = 1# 计算每个元素出现的概率p_y = dict()for y in d_y.keys():p_y[y] = d_y[y] / Y.size# 使用字典统计每一个(x,y)元素出现的次数d_xy = dict()  # x的字典for i in range(X.size):if (X[i], Y[i]) in d_xy:d_xy[X[i], Y[i]] += 1else:d_xy[X[i], Y[i]] = 1# 计算每个元素出现的概率p_xy = dict()for xy in d_xy.keys():p_xy[xy] = d_xy[xy] / X.size# print(d_x, d_y, d_xy)# print(p_x, p_y, p_xy)# 初始化互信息值为0mi = 0for xy in p_xy.keys():mi += p_xy[xy] * np.log(p_xy[xy] / (p_x[xy[0]] * p_y[xy[1]]))# print(mi)return mi

条件互信息:

'''
功能:计算条件互信息。条件互信息计算公式 I(X;Y|Z) = sigma(p_xyz * ln(p_xy|z / (p_x|z * p_y|z)))
输入:data : 列数为3的dataframe
输出:计算并返回条件互信息值,已知第三列变量的条件下前两列变量之间相互依赖的程度
'''def ConMutualInfo(data):# 重新设置输入数据data的列名为'x','y','z'data.columns = ['x','y','z']# 获取不重复的(x,y,z)data_xyz = data.drop_duplicates(subset=None, keep='first', inplace=False)# 初始化条件互信息mimi = 0# 遍历每一个不同的(x,y,z)for i in range(data_xyz.shape[0]):x = data_xyz.iloc[i]['x']y = data_xyz.iloc[i]['y']z = data_xyz.iloc[i]['z']# 统计(x,y,z)出现的次数count_xyz# count_xyz = (data[data['x']==2].index & data[data['y']==1].index).shape[0]count_xyz = data.query("x=="+str(x) + " & y==" + str(y) + " & z==" + str(z)).shape[0]# 计算(x,y,z)出现的概率p_xyzp_xyz = count_xyz/data.shape[0]# 统计z出现的次数count_zdata_z = data[data['z']==z]count_z = data_z.shape[0]# 计算条件概率:在当前的z下(x,y)出现的概率p_xy|zp_xy_z = count_xyz/count_z# 计算条件概率:在当前的z下x出现的概率p_x|zcount_xz = data.query("x=="+str(x) + " & z==" + str(z)).shape[0]p_x_z = count_xz/count_z# 计算条件概率:在当前的z下y出现的概率p_y|zcount_yz = data.query("y=="+str(y) + " & z==" + str(z)).shape[0]p_y_z = count_yz/count_z# print(p_xyz*np.log(p_xy_z/(p_x_z*p_y_z)))mi += p_xyz*np.log(p_xy_z/(p_x_z*p_y_z))# print(mi)return mi

python实现互信息和条件互信息的计算相关推荐

  1. R语言互信息和条件互信息

    互信息和条件互信息 最近看了信息熵的相关知识,考虑用信息熵来计算互信息和条件互信息. MI(X,Y)=H(X)-H(X|Y) H(X):熵,一种不确定性的度量 H(X,Y):联合熵,两个元素同时发生的 ...

  2. 信息熵、条件熵、联合熵、互信息和条件互信息

    目录 1. 信息熵 2. 联合熵 3. 条件熵 4. 互信息 5. 条件互信息 6. 参考文章 1. 信息熵 信息熵是用于度量信息量大小的指标. 设 XXX 是一个随机变量,则 XXX 的信息熵定义为 ...

  3. 直观理解信息论概念(条件熵,联合熵,互信息,条件互信息)

    1.概括图 其中:A=I(x;y|z),B=I(x;z|y),C=I(y;z|x),D=I(x;y;z) 这里不难看出以下几点结论. 一.在某个条件下,意味着已知这部分条件的信息,在计算条件熵(熵即不 ...

  4. python计算互信息_邻域互信息的python实现

    互信息中,涉及到熵的概念,首先我们看一下熵如何用python实现. 首先,我们知道,世界的确定性越大,所获取到的信息就会越少,所以对应的信息熵也会越小.所以我们的信息度量是随着概率增加而单调递减的函数 ...

  5. python计算互信息_标准化互信息NMI计算步骤及其Python实现

    Excellence is a continuous process and not an accident. 卓越是一个持续的过程而不是一个偶然事件. 标准化互信息NMI计算步骤及其Python实现 ...

  6. 条件互信息(conditional mutual information,CMI)

    文章目录 定义 see also 定义 条件互信息 I ( X , Y ∣ Z ) I(X, Y|Z) I(X,Y∣Z)定义如下: I ( X , Y ∣ Z ) = ∑ z ∈ Z p Z ( z ...

  7. 聚类效果评价指标:MI, NMI, AMI(互信息,标准化互信息,调整互信息)

    聚类效果评价指标:MI, NMI, AMI(互信息,标准化互信息,调整互信息) 简介 在无监督学习中,常见的两种任务为聚类与降维.这里给出三个聚类效果评价指标:互信息,标准化互信息,调整互信息(MI, ...

  8. Python有证书吗?python证书是什么级别的呢?怎么才能达到python证书的考试条件呢?

    导语 人生苦短,我用Python!! 学好Python:兼职接单一条龙服务,还能大学毕业之后直接就业赚技术工资. 关于python证书的问题 现在Python越来越流行,很多大学和高中都已经开始将Py ...

  9. 跟着王进老师学Python:通过案例学条件选择-王进-专题视频课程

    跟着王进老师学Python:通过案例学条件选择-55人已学习 课程介绍         未来2年,拥有这种技能的人抢手 2017年是人工智能(AI)的元年,AI已经成为当前火热的前沿技术:而Pytho ...

最新文章

  1. 菲律宾政府网站被黑!
  2. python 函数的*args,**kwargs
  3. 提升Web用户体验的71个设计要点
  4. 软件工程---18.面向服务的软件工程
  5. 洛谷 P4012 深海机器人问题【费用流】
  6. mybatis新增返回主键值
  7. 电工学习笔记————稳压二极管伏安特性
  8. 对象存储介绍(腾讯云cos)
  9. 【机器学习】特征工程的最佳实践
  10. 后台网站二级页面制作步骤
  11. 牛客真题编程——day16
  12. 计算机 小学数学应用题教学设计,小学数学教案相遇问题应用题
  13. java基于springboot的高速公路收费管理系统设计与实现
  14. 汇编 bne 1b和bne 1f浅析
  15. java权限控制是什么_Java访问权限控制的重要性深入讲解
  16. 2020 中国移动的流量套餐
  17. 项目管理办公室——PMO
  18. 英语学习APP—百词斩
  19. UVa 11549 Calculator Conundrum (训练指南,Floyd 判圈算法)
  20. 调用阿里云短信服务接口实现短信验证码

热门文章

  1. 12-4 日期时间类
  2. 扇贝编程python学习笔记-基础篇10
  3. Bootstrap Table使用整理(一)
  4. 魔点G2一台小巧高颜值的智能人脸考勤门禁机
  5. SSRF学习-gopher协议学习
  6. android制作圆角button
  7. Java数字金额转化成汉字大写金额
  8. 城市路网中心线及面积计算等
  9. EXCEL使用技巧-数据统计——统计指定sheet非空内容行数、指定内容在指定列出现次数
  10. 第七章数组实验实验报告(第一部分)