2016-09-21 4 views
1

Ich habe ein Beispiel eines Histogramm mit:wie Entropie von np Histogramm berechnen

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

und

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

Jetzt habe ich die Entropie aus der gegebenen Histogrammmatrix finden will, aber da np.histogram gibt zwei Arrays zurück, ich habe Probleme, die Entropie zu berechnen. Wie kann ich das erste Array von np.histogram aufrufen und die Entropie berechnen? Ich würde auch Mathe-Domain-Fehler für die Entropie bekommen, auch wenn mein Code oben korrekt ist. :(

** Edit: Wie finde ich Entropie, wenn Mu = 0 und log (0) ergibt Fehler math Domäne


So ist der eigentliche Code, den ich zu schreiben bin versucht?:

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

Bisher ist das erste Beispiel ent1 würde nan ergeben, und die zweite, ent2 ergibt Fehler Mathe Domain :(

+0

Offensichtlich ist das Problem "log (0)" in undefined. Aber warum benutzt du 'range = (- 20,20)'? Ich glaube nicht, dass 'np.random.normal (mu2, sigma2, 100000)' irgendeine negative Zahl erzeugt! Wie auch immer, solange es in einigen Bins keine Punkte gibt, erhalten Sie diesen Fehler! – Mahdi

+0

Hey! Vielen Dank! Ich habe es aussortiert. Ich habe alle 0 Daten ausgeschnitten! – Vinci

+0

Gern geschehen! Das ist eine gute Lösung! Wenn Sie denken, dass meine Antwort geholfen hat, akzeptieren Sie bitte die Antwort, damit die Frage markiert wird! – Mahdi

Antwort

3

Sie können die Entropie mit vektorisierten Code berechnen:

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 

Aber wenn Sie ein wie für Schleife verwenden, können Sie schreiben:

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

Danke Mahdi für die Antwort! Für mich gibt es jedoch RuntimeWarning zurück: dividieren durch Null im Protokoll gefunden ent = - (i * np.log (abs (i))). Sum() RuntimeWarning: ungültiger Wert in double_scalars gefunden ent = - (i * np.log (abs (i))). sum() nan – Vinci

+0

und für die for-Schleife, bekomme ich Math-Domain-Fehler? Was wäre das Problem? – Vinci

+0

@JinJeon: Könnten Sie eine neue Menge von 's1' Werten erzeugen und den obigen Code wiederholen? Es scheint, dass einige Zahlen zu nah an Null sind. – Mahdi

0

Verwenden np.ma.log inf und nan Fehler zu vermeiden. np.ma ist ein maskiertes numpy-Array.

Verwandte Themen