Numero di bin per il calcolo delle informazioni reciproche


10

Voglio quantificare la relazione tra due variabili, A e B, usando le informazioni reciproche. Il modo per calcolarlo è binning delle osservazioni (vedi esempio codice Python di seguito). Tuttavia, quali fattori determinano quale numero di bin è ragionevole? Ho bisogno che il calcolo sia veloce, quindi non posso semplicemente usare molti bin per essere al sicuro.

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

Risposte:


15

Non esiste un numero migliore di bin per stimare le informazioni reciproche (MI) con istogrammi. Il modo migliore è sceglierlo tramite la validazione incrociata, se possibile, o fare affidamento su una regola empirica. Questo è il motivo per cui sono stati proposti molti altri stimatori di IM che non sono basati su istogrammi.

nnp.histogram2d(x, y, D)Dxy

D=⌊n/5⌋
5
nDXDY≥5⇒nD2≥5⇒D2≤n/5⇒D=⌊n/5⌋

nn=100,000


Stimare il numero di bin per un istogramma è un vecchio problema. Potresti essere interessato a questo discorso di Lauritz Dieckman sulla stima del numero di bin per MI. Questo discorso si basa su un capitolo del libro di Mike X Cohen sulle serie temporali neurali.

DXDY

DX=⌈maxX−minX2⋅IQR⋅n−1/3⌉
IQR

Regola di Scott (ipotesi di normalità): dove è la deviazione standard per .

DX=⌈maxX−minX3.5⋅sX⋅n−1/3⌉
sXX

Regola di Sturges (potrebbe sottostimare il numero di bin ma buono per grande ): n

DX=⌈1+log2⁡n⌉

È difficile stimare correttamente l'IM con istogrammi. È quindi possibile scegliere un altro stimatore:

  • Lo stimatore NN di Kraskov , che è un po 'meno sensibile alla scelta dei parametri: o vicini più vicini è spesso usato come predefinito. Articolo: (Kraskov, 2003)kk=4k=6
  • Stima dell'MI con kernel (Moon, 1995) .

Esistono molti pacchetti per la stima dell'MI:

  • Toolbox di stima entropica non parametrica per Python. sito .
  • Toolkit di informazioni dinamiche in Java ma disponibile anche per Python. sito .
  • Toolbox ITE in Matlab. sito .

1

Preferisco minepyottenere e stimare le informazioni reciproche in Python.

Puoi vedere i dettagli di implementazione del pacchetto qui e un codice di esempio qui . Per motivi di riferimento più semplice, copio incolla l'esempio e viene prodotto qui:

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)

Che dà questo come output:

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

La mia esperienza è che i risultati sono sensibili alphae il valore predefinito .6è ragionevole. Tuttavia, sui miei dati reali alpha=.3è molto più veloce e le informazioni reciproche stimate hanno una correlazione molto elevata con il caso alpha=.6. Quindi, nel caso in cui utilizzi l'MI per selezionare quelli con un IM elevato, puoi semplicemente utilizzare un valore più piccolo alphae utilizzare i valori più alti in sostituzione con una buona precisione.


Grazie! Hai confrontato miopia con sklearn per la stima dell'MI?
— pir

No non l'ho fatto. Non sono sicuro del perché no!
— adrin,

Ho appena fatto un confronto tra sklearn e minepy (sia alpha = 0,3 che alpha = 0.6). I risultati sono molto diversi! Dato che è così facile, probabilmente dovresti anche controllare i tuoi risultati usando entrambe le librerie :)
— pir

2
MIC non è uguale alle informazioni reciproche (MI). Sono due cose completamente diverse.
— Simone,

1
Si certo. Nel documento MIC originale ci sono molti confronti tra MI e MIC: uvm.edu/~cdanfort/csc-reading-group/… MIC mostra che può essere usato come proxy della quantità di rumore per una relazione funzionale - proprietà che viene chiamata "equitabilità" nel documento originale. Ciò nonostante, l'MI rappresenta ancora un'ottima misura di dipendenza per molti compiti: ad es. Selezione delle caratteristiche o inferenza della rete genetica. È anche più veloce stimare di MIC.
— Simone,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.