Ich bin ziemlich neu in diesem Bereich und kann nicht sagen, dass ich die theoretischen Konzepte dahinter vollständig verstanden habe. Ich versuche, die KL-Divergenz zwischen mehreren Punktelisten in Python zu berechnen. Ich benutze http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mutual_info_score.html , um dies zu versuchen. Das Problem, auf das ich stoße, ist, dass der zurückgegebene Wert für 2 beliebige Zahlenlisten gleich ist (sein 1.3862943611198906). Ich habe das Gefühl, dass ich hier einen theoretischen Fehler mache, kann ihn aber nicht erkennen.
values1 = [1.346112,1.337432,1.246655]
values2 = [1.033836,1.082015,1.117323]
metrics.mutual_info_score(values1,values2)
Das ist ein Beispiel für das, was ich laufe - nur, dass ich für 2 Eingänge die gleiche Ausgabe erhalte. Jeder Rat / Hilfe wäre dankbar!
python
clustering
scikit-learn
Nanda
quelle
quelle
sklearn.metrics.mutual_info_score([1.346112,1.337432,1.246655], [1.033836,1.082015,1.117323])
bekomme ich den Wert1.0986122886681096
.Antworten:
Vor allem
sklearn.metrics.mutual_info_score
Geräte zur gegenseitigen Information für Clustering Bewertung der Ergebnisse, nicht rein Kullback-Leibler - Divergenz!KL-Divergenz (und jedes andere derartige Maß) erwartet, dass die Eingabedaten eine Summe von 1 haben . Andernfalls handelt es sich nicht um richtige Wahrscheinlichkeitsverteilungen . Wenn Ihre Daten keine Summe von 1 haben, ist es höchstwahrscheinlich nicht richtig, KL-Divergenz zu verwenden! (In einigen Fällen kann es zulässig sein, eine Summe von weniger als 1 zu haben, z. B. bei fehlenden Daten.)
Beachten Sie auch, dass es üblich ist, Logarithmen zur Basis 2 zu verwenden. Dies ergibt nur einen konstanten Skalierungsfaktor für die Differenz, aber Logarithmen zur Basis 2 sind einfacher zu interpretieren und haben eine intuitivere Skalierung (0 zu 1 anstelle von 0 zu log2 = 0,69314 ..., wobei die Informationen in Bits anstelle von Nats gemessen werden).
Wie wir deutlich sehen können, wird das MI-Ergebnis von sklearn unter Verwendung natürlicher Logarithmen anstelle von log2 skaliert. Dies ist eine unglückliche Entscheidung, wie oben erläutert.
Die Kullback-Leibler-Divergenz ist leider zerbrechlich. In dem obigen Beispiel ist es nicht genau definiert: Es
KL([0,1],[1,0])
bewirkt eine Division durch Null und tendiert zur Unendlichkeit. Es ist auch asymmetrisch .quelle
scipy.stats.entropy
Verwendung die Wahrscheinlichkeiten auf eins normalisiert werden. Aus den Dokumenten ( scipy.github.io/devdocs/generated/scipy.stats.entropy.html ): "Diese Routine normalisiert pk und qk, wenn sie nicht 1 ergeben."Die Entropiefunktion von Scipy berechnet die KL-Divergenz, wenn zwei Vektoren p und q zugeführt werden, die jeweils eine Wahrscheinlichkeitsverteilung darstellen. Wenn die beiden Vektoren keine pdfs sind, wird sie zuerst normalisiert.
Gegenseitige Informationen beziehen sich auf KL Divergence , sind jedoch nicht mit diesen identisch .
"Diese gewichtete gegenseitige Information ist eine Form der gewichteten KL-Divergenz, von der bekannt ist, dass sie für einige Eingaben negative Werte annimmt, und es gibt Beispiele, bei denen die gewichtete gegenseitige Information auch negative Werte annimmt."
quelle
Ich bin mir bei der Implementierung von ScikitLearn nicht sicher, aber hier ist eine kurze Implementierung der KL-Divergenz in Python:
Ausgabe:
0.775279624079
Es könnte sein , Konflikt der Umsetzung in einigen Bibliotheken, so stellen Sie sicher , dass Sie ihre Dokumente zu lesen , bevor Sie.
quelle
0.775279624079
für Ihre Eingaben und die sklearn-Metriken kehren zurück1.3862943611198906
. Immer noch verwirrt! Aber es scheint so, als würde das Einbeziehen dieserDieser Trick vermeidet bedingten Code und bietet möglicherweise eine bessere Leistung.
quelle
Betrachten Sie die drei folgenden Beispiele aus einer Distribution.
Es ist klar, dass Werte1 und Werte2 näher beieinander liegen, sodass wir davon ausgehen, dass das Maß für
surprise
oder die Entropie im Vergleich zu Werten3 niedriger ist.Wir sehen die folgende Ausgabe:
Wir sehen, dass dies sinnvoll ist, weil die Werte zwischen Werten1 und Werten3 und den Werten 2 und 3 sich drastischer ändern als die Werte1 bis 2. Dies ist meine Bestätigung für das Verständnis von KL-D und den Paketen, die dafür eingesetzt werden können.
quelle