如何从NP直方图计算熵

问题描述:

我有一个直方图的例子:如何从NP直方图计算熵

mu1 = 10, sigma1 = 10 
s1 = np.random.normal(mu1, sigma1, 100000) 

和计算

hist1 = np.histogram(s1, bins=50, range=(-10,10), density=True) 
for i in hist1[0]: 
    ent = -sum(i * log(abs(i))) 
print (ent) 

现在我想找到从给定的直方图阵列熵,但由于np.histogram返回两个数组,我在计算熵时遇到了麻烦。我怎样才能调用np.histogram的第一个数组并计算熵?即使我上面的代码是正确的,我也会得到熵的数学域错误。 :(

**编辑: 如何找到熵当穆= 0和log(0)产生数学域误差


所以我尝试写实际的代码是什么??

mu1, sigma1 = 0, 1 
mu2, sigma2 = 10, 1 
s1 = np.random.normal(mu1, sigma1, 100000) 
s2 = np.random.normal(mu2, sigma2, 100000) 

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

hist2 = np.histogram(s2, bins=100, range=(-20,20), density=True) 
data2 = hist2[0] 
ent2 = -(data2*np.log(np.abs(data2))).sum() 

到目前为止,第一个例子ENT1将产生男,第二,ENT2,产生数学域误差:(

+0

显然,问题是未定义的“log(0)”。但为什么你使用'range =( - 20,20)'?我不认为'np.random.normal(mu2,sigma2,100000)'会产生任何负数!无论如何,只要有些垃圾箱里没有点数,你会得到这个错误! – Mahdi

+0

嘿!谢谢!我把它整理出来了。我曾经修剪掉所有的0数据! – Vinci

+0

不客气!这是一个很好的解决方案!如果您认为我的答案有帮助,请接受答案,以便问题将被标记! – Mahdi

可以使用量化代码计算熵:

import numpy as np 

mu1 = 10 
sigma1 = 10 

s1 = np.random.normal(mu1, sigma1, 100000) 
hist1 = np.histogram(s1, bins=50, range=(-10,10), density=True) 
data = hist1[0] 
ent = -(data*np.log(np.abs(data))).sum() 
# output: 7.1802159512213191 

但是,如果你喜欢用一个for循环,你可能会写:

import numpy as np 
import math 

mu1 = 10 
sigma1 = 10 

s1 = np.random.normal(mu1, sigma1, 100000) 
hist1 = np.histogram(s1, bins=50, range=(-10,10), density=True) 
ent = 0 
for i in hist1[0]: 
    ent -= i * math.log(abs(i)) 
print (ent) 
# output: 7.1802159512213191 
+0

谢谢Mahdi的回答!然而,对我来说,它返回RuntimeWarning:在日志中遇到的零除以 ent = - (i * np.log(abs(i)))sum() RuntimeWarning:在double_scalars中遇到的无效值 ent = - (i * np.log(abs(i)))。sum() nan – Vinci

+0

for for循环,我得到数学域错误?会有什么问题? – Vinci

+0

@JinJeon:你可以产生一组新的's1'值并重复上面的代码吗?看起来有些数字太接近零。 – Mahdi

使用np.ma.log避免INF和楠错误。 np.ma是一个蒙面的数组。