Ich habe die folgende Funktion implementiert, um die Entropie zu berechnen:
from math import log
def calc_entropy(probs):
my_sum = 0
for p in probs:
if p > 0:
my_sum += p * log(p, 2)
return - my_sum
Ergebnis:
>>> calc_entropy([1/7.0, 1/7.0, 5/7.0])
1.1488348542809168
>>> from scipy.stats import entropy # using a built-in package
# give the same answer
>>> entropy([1/7.0, 1/7.0, 5/7.0], base=2)
1.1488348542809166
Mein Verständnis war, dass die Entropie zwischen 0 und 1 liegt, wobei 0 sehr sicher und 1 sehr unsicher bedeutet. Warum bekomme ich ein Entropiemaß größer als 1?
Ich weiß, dass das Entropiemaß kleiner ist, wenn ich die Log-Basis vergrößere, aber ich dachte, Basis 2 sei Standard, also denke ich nicht, dass das das Problem ist.
Mir muss etwas Offensichtliches fehlen, aber was?
mathematical-statistics
python
entropy
Akavall
quelle
quelle
Antworten:
Entropie ist nicht dasselbe wie Wahrscheinlichkeit .
Die Entropie misst die "Information" oder "Unsicherheit" einer Zufallsvariablen. Wenn Sie Basis 2 verwenden, wird diese in Bits gemessen. und es kann mehr als ein Informationsbit in einer Variablen geben.
In diesem Beispiel "enthält" ein Beispiel ungefähr 1,15 Informationsbits. Mit anderen Worten, wenn Sie eine Reihe von Samples perfekt komprimieren könnten, würden Sie durchschnittlich so viele Bits pro Sample benötigen.
quelle
Der Maximalwert der Entropie ist , wobei k die Anzahl der von Ihnen verwendeten Kategorien ist. Der numerische Wert hängt natürlich von der Basis der verwendeten Logarithmen ab.Logk k
Verwenden Sie als Beispiel Logarithmen zur Basis 2, wie in der Frage: ist 0 und log 2 2 ist 1 , daher ist ein Ergebnis größer als 1 definitiv falsch, wenn die Anzahl der Kategorien 1 oder 2 beträgt . Ein Wert größer als 1 ist falsch, wenn er log 2 k überschreitet .Log21 0 Log22 1 1 1 2 1 Log2k
In Anbetracht dessen ist es ziemlich üblich, die Entropie nach zu skalieren , so dass die Ergebnisse dann zwischen 0 und 1 liegen .Logk 0 1
quelle
Geben:
quelle