Wie berechnet man die Kullback-Leibler-Divergenz, wenn die PMF Nullen enthält?

9

Ich habe die folgenden Zeitreihen

Geben Sie hier die Bildbeschreibung ein

erhalten mit den unten angegebenen Daten.

Für eine Schiebefenstergröße von 10 versuche ich, die KL-Divergenz zwischen der PMF von Werten innerhalb des aktuellen Schiebefensters und der PMF der Historie zu berechnen, mit dem Endziel, den Wert der KL-Divergenz über die Zeit so zu zeichnen, dass ich kann zwei Zeitreihen vergleichen.

Ab sofort gibt es ein konzeptionelles Problem, mit dem ich konfrontiert bin (das ich mit Python erläutern werde):

In [228]: samples = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]

# In reality this 10 should be 20 because that is the max value I have seen in the timeseries
In [229]: bins = scipy.linspace(0, 10, 21) 
In [230]: bins
Out[230]:
array([  0. ,   0.5,   1. ,   1.5,   2. ,   2.5,   3. ,   3.5,   4. ,
         4.5,   5. ,   5.5,   6. ,   6.5,   7. ,   7.5,   8. ,   8.5,
         9. ,   9.5,  10. ])
In [231]: scipy.histogram(samples, bins=bins, density=True)
Out[231]:
(array([ 1.63636364,  0.        ,  0.36363636,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ]),
 array([  0. ,   0.5,   1. ,   1.5,   2. ,   2.5,   3. ,   3.5,   4. ,
         4.5,   5. ,   5.5,   6. ,   6.5,   7. ,   7.5,   8. ,   8.5,
         9. ,   9.5,  10. ]))

Das Problem ist, dass das Ergebnis s PMFenthält, 0so dass ich nicht wirklich zwei PMFs multiplizieren kann , um die KL-Divergenz zu erhalten. Kann mir jemand sagen, wie ich dieses Problem lösen kann?

Daten

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 2 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Legende
quelle

Antworten:

11

Ein Standardtrick, um dieses Problem zu lösen, ist die Verwendung einer sogenannten Laplace-Korrektur. Tatsächlich fügen Sie allen Behältern eine "Anzahl" hinzu und normalisieren sie neu. Es gibt auch gute Gründe, stattdessen eine Zählung von 0,5 hinzuzufügen: Dieser spezielle Schätzer wird als Krichevsky-Trofimov- Schätzer bezeichnet.

Suresh Venkatasubramanian
quelle
4

Eine Möglichkeit, über Ihr Problem nachzudenken, besteht darin, dass Sie dem aus dem Histogramm berechneten PMF nicht wirklich vertrauen. Möglicherweise benötigen Sie einen geringfügigen Vorgänger in Ihrem Modell. Wenn Sie sich auf die PMF verlassen haben, sollte die KL-Divergenz unendlich sein, da Sie in einer PMF Werte erhalten haben, die in der anderen PMF unmöglich sind. Wenn Sie andererseits einen leichten, nicht informativen Vorgänger hatten, besteht immer eine geringe Wahrscheinlichkeit, ein bestimmtes Ergebnis zu sehen. Eine Möglichkeit, dies einzuführen, besteht darin, dem Histogramm einen Vektor von einem mal Skalar hinzuzufügen. Die theoretische vorherige Verteilung, die Sie verwenden würden, ist die Dirichlet-Verteilung , die das konjugierte Prior der kategorialen Verteilung ist . Aber für praktische Zwecke können Sie so etwas tun

pmf_unnorm = scipy.histogram(samples, bins=bins, density=True)[0] +  w * scipy.ones(len(bins)-1)
pmf = pmf_unnor / sum(pmf_unnorm)

Wo wist ein positives Gewicht, abhängig davon, wie stark ein Prior sein möchte.

grosse Bandbreite
quelle
1
+1 für Ihre Zeit und Antwort. Vielen Dank. Ich habe in den letzten 8 Stunden darüber gelesen und es sieht so aus, als müsste ich vor dem Umgehen eine hinzufügen. Ich kann jedoch keine geeignete Referenz finden, die diese Tatsache erklärt. Ist dies in der Statistik-Community offensichtlich oder kennen Sie zufällig eine Referenz, die auf diese Anforderung für KL-Divergenz hinweist?
Legende
3

P^Q^DKL(P^Q^)iP^(i)logP^(i)Q^(i)i

Entschuldigung, ich kenne R. nicht.

Emre
quelle
1
+1 für deine Zeit. Ich habe meine Frage mit dem Problem aktualisiert, mit dem ich bei dieser Formel konfrontiert bin. Ich kann nicht verstehen, wie ich dieses Problem angehen kann, wenn die PMFs 0s enthalten . Würden Sie zufällig Kommentare dazu haben, wie Sie dieses Problem lösen können?
Legende
Zeigt Null das Fehlen von Daten an oder ist es ein gültiger Wert? Wenn erstere, würden Sie es einfach ignorieren. In letzterem Fall können Sie einen der Fächer dem Wert Null zuordnen.
Emre
Da es sich um eine Zeitreihe handelt, gab es in einigen Fällen keine Ereignisse und in einigen fehlten Daten. Daher habe ich eine Null hinzugefügt, um den fehlenden Wert zu ersetzen. Sie bringen einen interessanten Punkt: Kann ich Werte in einer Zeitreihe ignorieren, falls sie fehlen? Wäre das nicht tödlich?
Legende
Ich würde die Nullen beibehalten und die Elemente im sich bewegenden Fenster auswählen, sie jedoch für die Berechnung der KLD ignorieren.
Emre
Verstanden. Vielen Dank! Als Antwort akzeptiert. Meine letzte Frage würde sich auf eine verwandte Metrik namens "Jensen-Shannon" -Divergenz beziehen. Ich bin zufällig auf diese Metrik gestoßen, aber diese Metrik scheint keine absolute Kontinuität zu erfordern. Irgendwelche Vorschläge?
Legende