2016-09-21 107 views
1

我试图来计算阵列熵源于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将返回楠。这里有什么问题?

+0

'data1'里面有零值,并且Log(0)没有被定义,因此它返回nan。 –

回答

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

非常感谢!终于开始了。 :)我也尝试使用spicy.stats.entropy,但我看到值是不同的,但?尽管相同的公式? – Vinci

+0

不用担心。使用'spicy.stats.entropy'时要小心,因为它规范化了这些值,对于像@ watten-weckesser解释的元素式熵使用'scipy.special.entr'。 –

+0

@MateusZitelli实际上零概率对于Shannons熵是有意义的,但是你必须将0 * log(0)解释为零。这是有道理的,因为'p'的极限为'p * log(p)'的零为零,这是解释'0 * log(0)'唯一合理的方式。 – drevicko

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 
相关问题