我试图通过
计算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。这里有什么问题?
答案 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()