2016-09-21 113 views
1

我有一個直方圖的例子:如何從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

回答

3

可以使用量化代碼計算熵:

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

0

使用np.ma.log避免INF和楠錯誤。 np.ma是一個蒙面的數組。