Python 我怎样才能解决这个问题?
我试图从np直方图得到的数组中计算熵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。这里有什么问题 问题是直方图中的概率为零,这在应用
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