我如何解决熵产生纳?

时间:2016-09-21 22:43:42

标签: python numpy entropy

我试图通过

计算np.histogram产生的数组的熵
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。这里有什么问题?

2 个答案:

答案 0 :(得分:3)

要计算熵,您可以使用scipy.special.entr。例如,

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

要检查结果,我们还可以使用scipy.special.xlogy计算熵:

In [150]: from scipy.special import xlogy

In [151]: -xlogy(x, x).sum()
Out[151]: -14.673474028700136

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

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

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

答案 1 :(得分:2)

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

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()