entropy#
- scipy.stats.entropy(pk, qk=None, base=None, axis=0, *, nan_policy='propagate', keepdims=False)[Quelle]#
Berechnet die Shannon-Entropie/relative Entropie gegebener Verteilungen.
Wenn nur Wahrscheinlichkeiten pk angegeben sind, wird die Shannon-Entropie als
H = -sum(pk * log(pk))berechnet.Wenn qk nicht None ist, wird die relative Entropie
D = sum(pk * log(pk / qk))berechnet. Diese Größe ist auch als Kullback-Leibler-Divergenz bekannt.Diese Routine normalisiert pk und qk, falls sie nicht zu 1 aufsummieren.
- Parameter:
- pkarray_like
Definiert die (diskrete) Verteilung. Entlang jedes Achsenslices von
pkist das Elementidie (möglicherweise unnormalisierte) Wahrscheinlichkeit des Ereignissesi.- qkarray_like, optional
Sequenz, gegen die die relative Entropie berechnet wird. Sollte im gleichen Format wie pk sein.
- basefloat, optional
Die zu verwendende logarithmische Basis, Standard ist
e(natürlicher Logarithmus).- axisint oder None, Standard: 0
Wenn es sich um eine ganze Zahl handelt, ist dies die Achse des Eingabearrays, entlang der die Statistik berechnet wird. Die Statistik jedes Achsen-Slices (z. B. Zeile) der Eingabe erscheint dann in einem entsprechenden Element der Ausgabe. Wenn
None, wird die Eingabe vor der Berechnung der Statistik geglättet.- nan_policy{‘propagate’, ‘omit’, ‘raise’}
Definiert, wie Eingabe-NaNs behandelt werden.
propagate: Wenn ein NaN in der Achsen-Slice (z. B. Zeile) vorhanden ist, entlang der die Statistik berechnet wird, wird der entsprechende Eintrag der Ausgabe NaN sein.omit: NaNs werden bei der Berechnung weggelassen. Wenn im Achsen-Slice, entlang dem die Statistik berechnet wird, nicht genügend Daten verbleiben, wird der entsprechende Eintrag der Ausgabe NaN sein.raise: Wenn ein NaN vorhanden ist, wird einValueErrorausgelöst.
- keepdimsbool, Standard: False
Wenn dies auf True gesetzt ist, bleiben die reduzierten Achsen im Ergebnis als Dimensionen mit der Größe eins erhalten. Mit dieser Option wird das Ergebnis korrekt gegen das Eingabearray gestreut (broadcasted).
- Rückgabe:
- S{float, array_like}
Die berechnete Entropie.
Hinweise
Informell quantifiziert die Shannon-Entropie die erwartete Unsicherheit, die den möglichen Ergebnissen einer diskreten Zufallsvariable innewohnt. Wenn beispielsweise Nachrichten, die aus Sequenzen von Symbolen aus einer Menge bestehen, kodiert und über einen rauschfreien Kanal übertragen werden sollen, dann gibt die Shannon-Entropie
H(pk)eine enge untere Schranke für die durchschnittliche Informationsmenge an, die pro Symbol benötigt wird, wenn die Symbole mit Frequenzen auftreten, die durch die diskrete Verteilung pk bestimmt werden [1]. Die Wahl der Basis bestimmt die Wahl der Einheiten; z. B.efür Nats,2für Bits usw.Die relative Entropie,
D(pk|qk), quantifiziert die Zunahme der durchschnittlichen Informationsmenge, die pro Symbol benötigt wird, wenn die Kodierung für die Wahrscheinlichkeitsverteilung qk anstelle der wahren Verteilung pk optimiert wird. Informell quantifiziert die relative Entropie den erwarteten Überschuss an Überraschung, der erlebt wird, wenn man glaubt, dass die wahre Verteilung qk ist, während sie tatsächlich pk ist.Eine verwandte Größe, die Kreuzentropie
CE(pk, qk), erfüllt die GleichungCE(pk, qk) = H(pk) + D(pk|qk)und kann auch mit der FormelCE = -sum(pk * log(qk))berechnet werden. Sie gibt die durchschnittliche Informationsmenge an, die pro Symbol benötigt wird, wenn eine Kodierung für die Wahrscheinlichkeitsverteilung qk optimiert wird, während die wahre Verteilung pk ist. Sie wird nicht direkt vonentropyberechnet, kann aber mit zwei Aufrufen der Funktion berechnet werden (siehe Beispiele).Siehe [2] für weitere Informationen.
Seit SciPy 1.9 werden
np.matrix-Eingaben (für neuen Code nicht empfohlen) vor der Berechnung innp.ndarraykonvertiert. In diesem Fall ist die Ausgabe eine Skalar- odernp.ndarraymit geeigneter Form anstelle eines 2D-np.matrix. Ebenso werden, während maskierte Elemente von Masked Arrays ignoriert werden, die Ausgabe eine Skalar- odernp.ndarrayanstelle eines Masked Arrays mitmask=Falsesein.Referenzen
[1]Shannon, C.E. (1948), A Mathematical Theory of Communication. Bell System Technical Journal, 27: 379-423. https://doi.org/10.1002/j.1538-7305.1948.tb01338.x
[2]Thomas M. Cover und Joy A. Thomas. 2006. Elements of Information Theory (Wiley Series in Telecommunications and Signal Processing). Wiley-Interscience, USA.
Beispiele
Das Ergebnis eines fairen Münzwurfs ist am unsichersten
>>> import numpy as np >>> from scipy.stats import entropy >>> base = 2 # work in units of bits >>> pk = np.array([1/2, 1/2]) # fair coin >>> H = entropy(pk, base=base) >>> H 1.0 >>> H == -np.sum(pk * np.log(pk)) / np.log(base) True
Das Ergebnis einer voreingenommenen Münze ist weniger unsicher
>>> qk = np.array([9/10, 1/10]) # biased coin >>> entropy(qk, base=base) 0.46899559358928117
Die relative Entropie zwischen der fairen Münze und der voreingenommenen Münze wird berechnet als
>>> D = entropy(pk, qk, base=base) >>> D 0.7369655941662062 >>> np.isclose(D, np.sum(pk * np.log(pk/qk)) / np.log(base), rtol=4e-16, atol=0) True
Die Kreuzentropie kann als Summe aus Entropie und relativer Entropie berechnet werden.`
>>> CE = entropy(pk, base=base) + entropy(pk, qk, base=base) >>> CE 1.736965594166206 >>> CE == -np.sum(pk * np.log(qk)) / np.log(base) True