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

在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. Django模板系统
  3. c++ cin不能输入的问题
  4. 为什么python安装不了numpy库_python 安装与numpy matplotlib 等库安装
  5. 修改一个列表中的一个单词小技巧笔记
  6. Mysql@和@@符号的详细使用说明
  7. 10、mysql数据表中数据的查询(2)
  8. NHibernate自定义集合类型(上):基本实现方式
  9. win10服务器文件夹显示不全,如何让Win10文件夹始终显示功能区有哪些方法
  10. 数据状态什么是事务?
  11. 使用el-tree-transfer不显示label的坑
  12. 算法7:求用小矩形覆盖大矩形有多少种方式
  13. Docker 安装 Elasticsearch 7.12.1
  14. 从陈磊接棒后首份财报看拼多多农业版图2.0
  15. 5月第2周业务风控关注 | 央行:严禁未经授权认可的APP接入征信系统
  16. 一位沪漂 11 年的程序员老兵,回老家了!
  17. C语言——数组练习题
  18. http 404强制跳转到指定的网页地址
  19. JAVA大作业-购物车 (持续更新)
  20. 星际战甲服务器维护时间,星际战甲

热门文章

  1. 推荐 12 月 yyds 的开源项目
  2. 有限责任公司和股份有限公司有什么区别?
  3. 网络I/o编程模型4 NIo之chanel通道实现文件复制
  4. 修改QQ版本号,解决QQ版本过低
  5. YS分销商城项目(前端)总结
  6. 全能医生:“达芬奇”机器人的自述
  7. Verilog实现---时钟信号的90°相移
  8. Hold time 个人理解
  9. Angular UI框架 Ng-alain @delon的脚手架的生成开发模板
  10. 虚拟主机火云服务器区别,太一云大日如来陆压是什么来历在佛门担任什么职务...