Python 我怎样才能解决这个问题?

Python 我怎样才能解决这个问题?,python,numpy,entropy,Python,Numpy,Entropy,我试图从np直方图得到的数组中计算熵 mu1, sigma1 = 0, 1 s1 = np.random.normal(mu1, sigma1, 100000) hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True) data1 = hist1[0] ent1 = -(data1*np.log(np.abs(data1))).sum() 但是,这个ent1将返回nan。这里有什么问题 问题是直方图中的概率为零,这在应用

我试图从np直方图得到的数组中计算熵

mu1, sigma1 = 0, 1
s1 = np.random.normal(mu1, sigma1, 100000)
hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True)
data1 = hist1[0]
ent1 = -(data1*np.log(np.abs(data1))).sum() 

但是,这个ent1将返回nan。这里有什么问题

问题是直方图中的概率为零,这在应用香农熵公式时没有数字意义。解决办法是忽略零概率

mu1, sigma1 = 0, 1
s1 = np.random.normal(mu1, sigma1, 100000)
hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True)
data1 = hist1[0]
non_zero_data = data1[data1 != 0]
ent1 = -(non_zero_data*np.log(np.abs(non_zero_data))).sum() 

要计算熵,可以使用。比如说,

In [147]: from scipy.special import entr

In [148]: x = np.array([3, 2, 1, 0, 0.5, 2.5, 5])

In [149]: entr(x).sum()
Out[149]: -14.673474028700136
为了检查该结果,我们还可以使用以下公式计算熵:

最后,我们可以验证这与您预期的结果相同:

In [152]: xnz = x[x != 0]

In [153]: -(xnz*np.log(xnz)).sum()
Out[153]: -14.673474028700136

data1
中的值为零值,且未定义日志(0),因此返回nan。非常感谢!终于开始了。:)我也尝试过使用spice.stats.entropy,但是我发现它们的值是不同的?尽管有同样的公式?不用担心。使用
spick.stats.entropy
时要小心,因为它将值标准化,对于元素熵,请使用@watten weckesser解释的
scipy.special.entr
。@MateusZitelli实际上零概率对于Shannons熵来说是有意义的,但您必须将
0*log(0)
解释为零。这是有意义的,因为
p
p*log(p)
的极限为零,这是解释
0*log(0)
的唯一合理方法。
In [152]: xnz = x[x != 0]

In [153]: -(xnz*np.log(xnz)).sum()
Out[153]: -14.673474028700136