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

时间:2014-06-10 15:20:39

标签: python statistics information-theory

我需要计算互信息,以及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(如official documentation中所述)他们应该回归直方图归一化,并且可能我在从概率开始的那一刻做了一些错误密度函数(numpy.histogram的输出)到概率质量函数(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熵

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

2 个答案:

答案 0 :(得分:1)

我认为,如果您选择bins = 1,您将始终找到0的熵,因为值不存在可能区间的“不确定性”(“不确定性”是熵措施)。您应该选择“足够大”的多个容器来说明变量可以采用的值的多样性。如果您有离散值:对于二进制值,您应该采用bins >= 2。如果您的变量可以使用的值在{0,1,2}中,那么您应该有bins >= 3,依此类推......

我必须说我没有阅读你的代码,但这对我有用:

import numpy as np

x = [0,1,1,1,0,0,0,1,1,0,1,1]
bins = 10
cx = np.histogram(x, bins)[0]

def entropy(c):
    c_normalized = c/float(np.sum(c))
    c_normalized = c_normalized[np.nonzero(c_normalized)]
    h = -sum(c_normalized * np.log(c_normalized))  
    return h

hx = entropy(cx)

答案 1 :(得分:0)

结果将取决于估计的密度。你能假设密度的特定形式吗?如果避免直方图或其他通用估计(如核密度估计),则可以减少结果对估计的依赖性。如果您可以提供有关变量的更多详细信息,我可以提出更具体的评论。

我将相互信息的估计作为我论文工作的一部分[1]。第8.1节和附录F中有关于MI的一些内容。

[1] http://riso.sourceforge.net/docs/dodier-dissertation.pdf