互信息 java_如何计算N个变量的shannon熵和互信息

该博客讨论了如何在Java中计算互信息和多个变量的Shannon熵。作者遇到的问题是,计算结果受到bin数量的影响,导致不一致的结果。为了解决这个问题,作者提供了使用numpy库的示例代码,包括一个用于计算单变量Shannon熵的函数和一个用于计算多变量Shannon熵的函数。同时,作者寻求一个独立于bin数量的解决方案来准确计算这些统计量。
摘要由CSDN通过智能技术生成

我需要计算互信息,以及N个变量的shannon熵 .

我写了一个代码来计算某种分布的shannon熵 . 假设我有一个变量x,数组 . 在definition of shannon entropy之后我需要计算归一化的概率密度函数,因此使用numpy.histogram很容易得到它 .

import scipy.integrate as scint

from numpy import*

from scipy import*

def shannon_entropy(a, bins):

p,binedg= histogram(a,bins,normed=True)

p=p/len(p)

x=binedg[:-1]

g=-p*log2(p)

g[isnan(g)]=0.

return scint.simps(g,x=x)

选择插入x,并仔细检查此功能的bin编号 .

但是这个函数非常依赖于bin编号:选择这个参数的不同值我得到了不同的值 .

特别是如果我的输入是一个值数组常量:

x=[0,0,0,....,0,0,0]

这个变量的熵显然必须是0,但是如果我选择等于1的bin数,我得到了正确的答案,如果我选择不同的值,我会得到奇怪的非感觉(否定)答案 . 我感觉是numpy .histogram有参数normed = True或density = True(如_2550625中所述)他们应该回归直方图归一化,并且可能在我从概率密度函数(numpy的输出)开始的那一刻做了一些错误 . 直方图)到概率质量函数(shannon熵的输入),我这样做:

p,binedg= histogram(a,bins,normed=True)

p=p/len(p)

我想找到一种方法来解决这些问题,我想有一种有效的方法来计算独立于bin数的shannon熵 .

我写了一个函数来计算更多变量分布的shannon熵,但是我得到了同样的错误 . 代码是这样的,其中函数shannon_entropydd的输入是数组,其中每个位置都有必须参与统计计算的每个变量

def intNd(c,axes):

assert len(c.shape) == len(axes)

assert all([c.shape[i] == axes[i].shape[0] for i in range(len(axes))])

if len(axes) == 1:

return scint.simps(c,axes[0])

else:

return intNd(scint.simps(c,axes[-1]),axes[:-1])

def shannon_entropydd(c,bins=30):

hist,ax=histogramdd(c,bins,normed=True)

for i in range(len(ax)):

ax[i]=ax[i][:-1]

p=-hist*log2(hist)

p[isnan(p)]=0

return intNd(p,ax)

我需要这些数量才能计算某些变量集之间的mutual information:

M_info(x,y,z)= H(x)H(z)H(y) - H(x,y,z)

其中H(x)是变量x的shannon熵

我必须找到一种方法来计算这些数量,所以如果某个人有完全不同类型的代码可以工作,我可以打开它,我不需要修复这个代码,但找到一种正确的方法来计算这个统计函数!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值