用Python,实现平均互信息I(X;Y)的计算

输入X的概率分布、以及Y在X条件下的条件分布,计算平均互信息 I(X;Y)

I\left ( X;Y\right )=\sum_{i =1}^{r}\sum_{j=1}^{s}P(a_{i}b_{j}) log\frac{p\left ( a_{i} |b_{j}\right )}{P\left ( a_{i} \right )}

import numpy as np

px = eval(input("请输入X的概率分布p(x):[p1,p2,...]"))
py_x = eval(input("请输入条件概率分布p(y|x):[P1,P2,...]"))
SUM = 0

# 计算联合概率密度pxy
func = lambda x,y:x*y
result = map(func,p,pyx)
pxy=list(result)

pxy2 = [pxy[i:i+len(px)] for i in range(0,len(pxy),len(px))]#将列表按x个数拆分
py = np.sum(pxy2, axis=0)#对子列表转置后求和
px_y = pxy/py
 
if sum(px) != 1 :
    print("概率分布错误")
for i in range(0,len(px)):
    if px[i] > 1 or px[i] <= 0:
        print("概率分布错误")
    else:
        for j in range(0,len(px_y)):
            h = np.log2(px_y[j]/ px[i]) * px[i] * py_x[j]#计算单个值
            SUM = SUM + h #求和
        
print("I(X;Y)的值是:",float( "{0:.5}".format(SUM)))

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值