Nombre de casiers lors du calcul des informations mutuelles

10

Je veux quantifier la relation entre deux variables, A et B, en utilisant des informations mutuelles. Le moyen de le calculer est de regrouper les observations (voir l'exemple de code Python ci-dessous). Cependant, quels facteurs déterminent quel nombre de bacs est raisonnable? J'ai besoin que le calcul soit rapide, donc je ne peux pas simplement utiliser beaucoup de bacs pour être du bon côté.

from sklearn.metrics import mutual_info_score

def calc_MI(x, y, bins):
    c_xy = np.histogram2d(x, y, bins)[0]
    mi = mutual_info_score(None, None, contingency=c_xy)
    return mi
pir
la source

Réponses:

15

Il n'y a pas de meilleur nombre de casiers pour estimer les informations mutuelles (MI) avec des histogrammes. Le meilleur moyen est de le choisir par validation croisée si vous le pouvez, ou de vous fier à une règle empirique. C'est la raison pour laquelle de nombreux autres estimateurs de l'IM qui ne sont pas basés sur des histogrammes ont été proposés.

Le nombre de cases dépendra du nombre total de points de données . Vous devez essayer d'éviter trop de casiers pour éviter les erreurs d'estimation de la distribution conjointe entre les deux variables. Vous devez également éviter trop peu de casiers pour pouvoir capturer la relation entre les deux variables. Étant donné que cela génère un histogramme 2D avec des bacs de largeur égale pour les deux et je choisirais personnellement: Dans ce cas, en moyenne pour deux variables aléatoires uniformément réparties, vous aurez au moins points pour chaque cellule de l'histogramme: nnp.histogram2d(x, y, D)Dxy

=n/5
5
nXOui5n252n/5=n/5
Il s'agit d'un choix possible qui simule l'approche de partitionnement adaptatif proposée dans (Cellucci, 2005) . Cette dernière approche est souvent utilisée pour estimer l'IM pour déduire des réseaux génétiques: par exemple dans MIDER .

Si vous avez beaucoup de points de données et aucune valeur manquante, vous ne devriez pas trop vous soucier de trouver le meilleur nombre de casiers; par exemple, si . Si ce n'est pas le cas, vous pourriez envisager de corriger l'IM pour les échantillons finis. (Steuer et al., 2002) discute d'une correction pour l'IM pour la tâche d'inférence du réseau génétique.nn=100,000


L'estimation du nombre de cases pour un histogramme est un vieux problème. Vous pourriez être intéressé par cette conférence de Lauritz Dieckman sur l'estimation du nombre de bacs pour l'IM. Cet exposé est basé sur un chapitre du livre de Mike X Cohen sur les séries chronologiques neuronales.

Vous pouvez choisir et indépendamment et utiliser la règle empirique utilisée pour estimer le nombre de casiers dans les histogrammes 1D.XOui

Règle de Freedman-Diaconis (pas d'hypothèse sur la distribution): où est la différence entre le 75-quantile et le 25-quantile. Regardez cette question connexe dans SE .

X=maxX-minX2IQRn-1/3
IQR

Règle de Scott (hypothèse de normalité): où est l'écart type pour .

X=maxX-minX3,5sXn-1/3
sXX

Règle de Sturges (peut sous-estimer le nombre de bacs mais bon pour les grands ): n

X=1+Journal2n

Il est difficile d'estimer correctement l'IM avec des histogrammes. Vous pouvez alors choisir un estimateur différent:

  • L' estimateur NN de Kraskov , qui est un peu moins sensible au choix des paramètres: ou voisins les plus proches est souvent utilisé par défaut. Papier: (Kraskov, 2003)kk=4k=6
  • Estimation de l'IM avec des noyaux (Moon, 1995) .

Il existe de nombreux packages pour estimer l'IM:

  • Boîte à outils d'estimation d'entropie non paramétrique pour Python. site .
  • Boîte à outils de dynamique de l'information en Java mais également disponible pour Python. site .
  • Boîte à outils ITE dans Matlab. site .
Simone
la source
1

Je préfère minepyobtenir et estimer des informations mutuelles en python.

Vous pouvez voir les détails d'implémentation du package ici , et un exemple de code ici . Par souci de commodité, je copie et colle l'exemple et il est affiché ici:

import numpy as np
from minepy import MINE

def print_stats(mine):
    print "MIC", mine.mic()
    print "MAS", mine.mas()
    print "MEV", mine.mev()
    print "MCN (eps=0)", mine.mcn(0)
    print "MCN (eps=1-MIC)", mine.mcn_general()

x = np.linspace(0, 1, 1000)
y = np.sin(10 * np.pi * x) + x
mine = MINE(alpha=0.6, c=15)
mine.compute_score(x, y)

print "Without noise:"
print_stats(mine)
print

np.random.seed(0)
y +=np.random.uniform(-1, 1, x.shape[0]) # add some noise
mine.compute_score(x, y)

print "With noise:"
print_stats(mine)

Ce qui donne ceci en sortie:

Without noise:
MIC 1.0
MAS 0.726071574374
MEV 1.0
MCN (eps=0) 4.58496250072
MCN (eps=1-MIC) 4.58496250072

With noise:
MIC 0.505716693417
MAS 0.365399904262
MEV 0.505716693417
MCN (eps=0) 5.95419631039
MCN (eps=1-MIC) 3.80735492206

D'après mon expérience, les résultats sont sensibles alphaet la valeur par défaut .6est raisonnable. Cependant, mes données réelles alpha=.3sont beaucoup plus rapides et les informations mutuelles estimées ont une corrélation très élevée avec le cas alpha=.6. Donc, dans le cas où vous utilisez MI pour sélectionner ceux avec un IM élevé, vous pouvez simplement utiliser un plus petit alphaet utiliser les valeurs les plus élevées en remplacement avec une bonne précision.

adrin
la source
Merci! Avez-vous comparé minepy avec sklearn pour l'estimation de l'IM?
pir
Non, je ne l'ai pas fait. Mais je ne sais pas pourquoi pas!
adrin
Je viens de faire une comparaison de sklearn et minepy (alpha = 0,3 et alpha = 0,6). Les résultats sont très différents! Comme c'est si facile, vous devriez probablement vérifier vos résultats en utilisant les deux bibliothèques :)
pir
2
MIC n'est pas égal à l'information mutuelle (MI). Ce sont deux choses complètement différentes.
Simone
1
Oui bien sûr. Dans le document MIC original, il y a beaucoup de comparaisons entre MI et MIC: uvm.edu/~cdanfort/csc-reading-group/… MIC montre qu'il peut être utilisé comme proxy de la quantité de bruit pour une relation fonctionnelle - propriété qui est appelée «équité» dans le document d'origine. Néanmoins, l'IM est toujours une très bonne mesure de la dépendance pour de nombreuses tâches: par exemple, la sélection des caractéristiques ou l'inférence du réseau génétique. Il est également plus rapide à estimer que MIC.
Simone