Anzahl der Fächer bei der Berechnung der gegenseitigen Information

10

Ich möchte die Beziehung zwischen zwei Variablen, A und B, unter Verwendung gegenseitiger Informationen quantifizieren. Die Berechnung erfolgt durch Gruppieren der Beobachtungen (siehe Beispiel-Python-Code unten). Welche Faktoren bestimmen jedoch, welche Anzahl von Behältern angemessen ist? Ich brauche eine schnelle Berechnung, damit ich nicht einfach viele Behälter verwenden kann, um auf der sicheren Seite zu sein.

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
quelle

Antworten:

15

Es gibt keine beste Anzahl von Behältern, um die gegenseitige Information (MI) mit Histogrammen zu schätzen. Der beste Weg ist, es durch Kreuzvalidierung auszuwählen, wenn Sie können, oder sich auf eine Faustregel zu verlassen. Dies ist der Grund, warum viele andere Schätzer des MI vorgeschlagen wurden, die nicht auf Histogrammen basieren.

Die Anzahl der Fächer hängt von der Gesamtzahl der Datenpunkte . Sie sollten versuchen, zu viele Bins zu vermeiden, um Schätzfehler für die gemeinsame Verteilung zwischen den beiden Variablen zu vermeiden. Sie sollten auch zu wenige Bins vermeiden, um die Beziehung zwischen den beiden Variablen erfassen zu können. Da ein 2D - Histogramm mit erzeugt gleicher Breite Bins für beide und ich persönlich würde wählen: D = Mehr ⌊ Sonstiges nnp.histogram2d(x, y, D)Dxy In diesem Fall haben Sie im Durchschnitt für zwei gleichmäßig verteilte Zufallsvariablen mindestensPunkte für jede Zelle des Histogramms: Dies ist eine mögliche Wahl, die den in(Cellucci, 2005)vorgeschlagenen Ansatz der adaptiven Partitionierung simuliert. Der letztere Ansatz wird häufig verwendet, um den MI zu schätzen, um auf genetische Netzwerke zu schließen: z.B. inMIDER.

D=n/5
n5
nDXDY5nD25D2n/5D=n/5

Wenn Sie viele Datenpunkte und keine fehlenden Werte haben, sollten Sie sich nicht zu viele Sorgen machen, um die beste Anzahl von Fächern zu finden. zB wenn . Wenn dies nicht der Fall ist, können Sie den MI für endliche Stichproben korrigieren. (Steuer et al., 2002) diskutiert eine Korrektur für MI für die Aufgabe der genetischen Netzwerkinferenz.n = 100 , 000nn=100,000


Das Schätzen der Anzahl der Fächer für ein Histogramm ist ein altes Problem. Dieser Vortrag von Lauritz Dieckman über die Schätzung der Anzahl der Behälter für MI könnte Sie interessieren . Dieser Vortrag basiert auf einem Kapitel in Mike X Cohens Buch über neuronale Zeitreihen.

Sie können und unabhängig und die Faustregel verwenden, die zum Schätzen der Anzahl der Fächer in 1D-Histogrammen verwendet wird.D Y.DXDY

Freedman-Diaconis-Regel (keine Annahme bezüglich der Verteilung):

DX=maxXminX2IQRn1/3
wobei der Unterschied zwischen dem 75-Quantil und dem 25-Quantil ist. Schauen Sie sich diese verwandte Frage in SE an .IQR

Scotts Regel (Normalitätsannahme): wobei die Standardabweichung ist für .

DX=maxXminX3.5sXn1/3
sXX

Sturges-Regel (könnte die Anzahl der Fächer unterschätzen, ist aber gut für große ): n

DX=1+log2n

Es ist schwierig, den MI mit Histogrammen korrekt abzuschätzen. Sie können dann einen anderen Schätzer auswählen:

  • Kraskov des NN - Schätzer, der ein bisschen weniger empfindlich auf Parameterwahl: oder nächste Nachbarn wird oft als Standard verwendet. Papier: (Kraskov, 2003)kk=4k=6
  • Abschätzung des MI mit Kerneln (Moon, 1995) .

Es gibt viele Pakete zur Schätzung des MI:

  • Nichtparametrische Entropie-Schätz-Toolbox für Python. Website .
  • Information-Dynamics-Toolkit in Java, aber auch für Python verfügbar. Website .
  • ITE-Toolbox in Matlab. Website .
Simone
quelle
1

Ich bevorzuge minepyes, gegenseitige Informationen in Python zu erhalten und zu schätzen.

Sie können die Implementierungsdetails des Pakets hier und einen Beispielcode hier sehen . Zum leichteren Nachschlagen kopiere ich das Beispiel und füge es hier ein:

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)

Welches gibt dies als Ausgabe:

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

Ich habe die Erfahrung gemacht, dass die Ergebnisse empfindlich alphasind und der Standardwert .6angemessen ist. Meine realen Daten alpha=.3sind jedoch viel schneller und die geschätzten gegenseitigen Informationen korrelieren sehr stark mit dem Fall, dass alpha=.6. Wenn Sie also MI verwenden, um diejenigen mit einem hohen MI auszuwählen, können Sie einfach einen kleineren alphaund die höchsten Werte als Ersatz mit einer guten Genauigkeit verwenden.

adrin
quelle
Vielen Dank! Haben Sie Minepy mit sklearn für die MI-Schätzung verglichen?
Pir
Nein, habe ich nicht. Ich bin mir nicht sicher, warum nicht!
Adrin
Ich habe gerade einen Vergleich von sklearn und minepy durchgeführt (sowohl Alpha = 0,3 als auch Alpha = 0,6). Die Ergebnisse sind sehr unterschiedlich! Da es so einfach ist, sollten Sie wahrscheinlich auch Ihre Ergebnisse mit beiden Bibliotheken überprüfen :)
Pir
2
MIC ist nicht gleich der gegenseitigen Information (MI). Das sind zwei völlig verschiedene Dinge.
Simone
1
Ja sicher. Im Original-MIC- Artikel gibt es viele Vergleiche zwischen MI und MIC: uvm.edu/~cdanfort/csc-reading-group/… MIC zeigen, dass es als Proxy für die Menge an Rauschen für eine funktionale Beziehung verwendet werden kann - Eigenschaft, die im Originalpapier als "Gleichheit" bezeichnet wird. Trotzdem ist MI immer noch ein sehr gutes Maß für die Abhängigkeit für viele Aufgaben: z. B. Merkmalsauswahl oder genetische Netzwerkinferenz. Es ist auch schneller zu schätzen als MIC.
Simone