Comment calculer la divergence Kullback-Leibler lorsque le PMF contient 0s?


9

J'ai les séries temporelles suivantes

entrez la description de l'image ici

obtenus en utilisant les données affichées ci-dessous.

Pour une taille de fenêtre coulissante de 10, j'essaie de calculer la divergence KL entre la PMF des valeurs dans la fenêtre coulissante actuelle et la PMF de l'historique dans le but final de tracer la valeur de la divergence KL dans le temps afin que je peut comparer deux séries chronologiques.

À partir de maintenant, il y a un problème conceptuel auquel je suis confronté (que je vais expliquer en utilisant Python):

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. ]))

Le problème est que le résultat PMFcontient 0s de sorte que je ne peux pas vraiment multiplier deux PMFpour obtenir la divergence KL. Quelqu'un peut-il me dire comment atténuer ce problème?

Les données

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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

Réponses:


12

Une astuce standard pour résoudre ce problème consiste à utiliser ce qu'on appelle une correction de Laplace. En effet, vous ajoutez un "compte" à tous les bacs et vous renormalisez. Il y a également de bonnes raisons d'ajouter un compte de 0,5 à la place: cet estimateur particulier est appelé l' estimateur de Krichevsky-Trofimov .


4

Une façon de penser à votre problème est que vous n'avez pas vraiment confiance dans le PMF que vous avez calculé à partir de l'histogramme. Vous pourriez avoir besoin d'un léger avant dans votre modèle. Puisque si vous étiez confiant dans le PMF, alors la divergence KL devrait être infinie puisque vous avez obtenu des valeurs dans un PMF qui sont impossibles dans l'autre PMF. Si, d'autre part, vous avez eu un léger avant non informatif, il y a toujours une petite probabilité de voir un certain résultat. Une façon d'introduire cela serait d'ajouter un vecteur de quelques fois un scalaire à l'histogramme. La distribution a priori théorique que vous utiliseriez est la distribution dirichlet , qui est le conjugué a priori de la distribution catégorielle . Mais pour des raisons pratiques, vous pouvez faire quelque chose comme

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

west un poids positif, selon la force que vous souhaitez avoir avant.


1
+1 pour votre temps et votre réponse. Je vous remercie. J'ai lu à ce sujet au cours des 8 dernières heures et il semble que je doive en ajouter un avant de contourner ce problème. Cependant, je suis incapable de trouver une référence appropriée qui explique ce fait. Est-ce quelque chose d'évident dans la communauté des statistiques ou connaissez-vous une référence qui souligne cette exigence de divergence KL?
Legend

3

Je regrouperais les données afin que vous puissiez comparer les deux PMF; étant donné deux estimations PMF et , vous pouvez calculer le KLD simplement comme: , où parcourt les bacs.P^Q^DKL(P^Q^)iP^(i)logP^(i)Q^(i)i

Désolé, je ne connais pas R.


1
+1 pour votre temps. J'ai mis à jour ma question avec le problème que je rencontre avec cette formule. Je ne suis pas en mesure de comprendre comment résoudre ce problème lorsque les CMR contiennent l' 0art. Souhaitez-vous avoir des commentaires sur la façon d'atténuer ce problème?
Legend

Est-ce que zéro indique l'absence de données ou est-ce une valeur valide? Si le premier, vous l'ignoreriez simplement. Dans ce dernier cas, vous pouvez dédier l'un des casiers à la valeur zéro.
Emre

Parce qu'il s'agit d'une série chronologique, dans certains cas, il n'y avait aucun événement et dans certains il y avait des données manquantes, j'ai donc ajouté un zéro pour remplacer la valeur manquante. Vous apportez un point intéressant: puis-je ignorer les valeurs d'une série temporelle au cas où elles seraient manquantes? Cela ne serait-il pas fatal?
Legend

Je conserverais les zéros en sélectionnant les éléments dans la fenêtre mobile, mais je ne les prendrais pas en compte pour le calcul du KLD.
Emre

Compris. Merci! Accepté comme réponse. Ma dernière question concernerait une métrique connexe appelée divergence "Jensen-Shannon". J'ai rencontré cette métrique par hasard, mais cette métrique ne semble pas avoir d'exigence de continuité absolue. Aucune suggestion?
Legend
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.