如何计算N个变量的香农熵和互信息(How to compute the shannon entrop

2019-10-20 06:31发布

我需要计算相互信息,因此N个变量的信息熵。

我写的计算某种分布的香农熵的代码。 比方说,我有一个变量x,数字阵列。 继香农熵的定义,我需要计算概率密度函数归一化,所以使用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,并仔细仓室号此功能工作。

但是,这个功能是非常依赖于仓室号:选择此参数我得到不同的值不同的值。

特别地,如果我的输入值是恒定的数组:

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

这个变量的熵显然必须是0,但如果我选择等于1仓室号我答对了,如果让我选择我不怪感不同的值(负)的答案..什么,我的感觉是,numpy的.histogram有范= True或密度= True时(如说,在参数官方文档 ),他们应该还给直方图标准化,而且可能我做的那一刻一些错误,我从概率密度函数SWICH(numpy的输出.histogram)到概率质量函数(香农熵的输入),我做的:

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

我想找到一种方法来解决这些问题,我想有一个有效的方法来计算信息熵独立的仓室号的。

我写了一个函数来计算多个变量的分布的信息熵,但我得到了同样的错误。 该代码是这样的,其中,函数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)

我需要这些量,以便能够计算的互信息组特定的变量之间:

M_info(X,Y,Z)= H(X)+ H(Z)+ H(Y) - H(X,Y,Z)

其中H(x)是变量x的香农熵

我必须找到一种方法来计算这些量,所以如果一些人有一种完全不同的代码工作,我可以在上面进行切换,我并不需要修复这些代码,但发现来计算这个统计功能的正道!

Answer 1:

其结果将非常强烈地依赖于估算的浓度。 你能承担的密度的具体形式? 如果你避开直方图或其他通用估计如内核密度估计可以减少对估计结果的相关性。 如果你可以给所涉及的变量的更多细节,我可以让更多的具体意见。

我用的互信息估计工作作为我的论文[1]的部分工作。 有一个关于MI 8.1节和附录F.一些东西

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



Answer 2:

我认为,如果你选择bins = 1 ,你总能找到的熵0 ,因为不存在“不确定性”在可能的bin中的值在(“不确定性”是什么熵度量)。 你应该选择的仓“足够大”的数目占你的变量的值可以取的多样性。 如果你有离散值:二进制值,你应该采取这样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)


文章来源: How to compute the shannon entropy and mutual information of N variables