Inferenza approssimata nelle reti bayesiane - campionamento
In questa pagina 9
L'inferenza esatta (Reti bayesiane - semantica, indipendenze e inferenza esattaUna rete bayesiana è un grafo diretto aciclico (DAG) con una variabile per nodo e una tabella delle probabilità condizionate (CPT) $P(X_i\mid\text{Parents}(X_i))$ per nodo; rappresenta la congiunta come prodotto $P(x_1,\dots,x_n)=\prod_i P(x_i\mid\text{parents}(X_i))$, con molti meno numeri della tabella completa (rete dell'allarme: 10 contro 31). Tre strutture elementari: catena $X\to Y\to Z$ e fork $Y\leftarrow X\to Z$ (estremi indipendenti dato il centro), collider $X\to Z\leftarrow Y$ (indipendenti, ma dipendenti se si osserva $Z$ o un suo discendente). Modelli causali (genitori = cause) danno reti più piccole. Inferenza esatta per enumerazione: $\mathbf P(X\mid\mathbf e)=\alpha\sum_{\mathbf y}\mathbf P(X,\mathbf e,\mathbf y)$ calcolata come somma di prodotti, in profondità e da sinistra a destra; per l'allarme $\mathbf P(B\mid j,m)=\langle0{,}284;\ 0{,}716\rangle$. Molti prodotti si ripetono: l'eliminazione di variabili li salva come fattori e li riusa.Reti bayesiane - semantica, indipendenze e inferenza esatta →) ha costo esponenziale nel caso peggiore. Con reti grandi si accetta una risposta approssimata: si estraggono campioni dalla distribuzione descritta dalla rete e si stima la probabilità cercata dalle frequenze. Per la stima converge al valore vero (Legge dei grandi numeri e metodo Monte CarloSe X₁, X₂, ... sono i.i.d. con media μ, la media campionaria X̄ₙ = (X₁ + ... + Xₙ)/n converge a μ: in probabilità (legge debole, dimostrata con Chebyshev se la varianza è finita: P(|X̄ₙ − μ| > ε) ≤ σ²/(nε²)) e quasi certamente (legge forte). Metodo Monte Carlo: ∫ g = E[g(U)] si stima con la media di g(U₁), ..., g(Uₙ) per uniformi indipendenti.Legge dei grandi numeri e metodo Monte Carlo →): i metodi basati su campionamento casuale si chiamano algoritmi Monte Carlo. Due famiglie:
- campionamento diretto: prior sampling, rejection sampling, likelihood weighting;
- Markov chain Monte Carlo (MCMC): ogni campione deriva dal precedente con una piccola modifica casuale (Gibbs sampling).
Tutte richiedono di saper campionare da una distribuzione nota.
Campionare da una distribuzione discreta
Per una variabile booleana con : si estrae uniforme in (in Python random.random()) e si risponde "vero" se , "falso" altrimenti; la probabilità di "vero" è esattamente . Per più valori si ordinano le probabilità, si costruisce la funzione di distribuzione cumulata e si prende il primo valore la cui cumulata supera (inversione della cumulata). Con campioni da non si ottengono esattamente quelle frequenze, ma ci si avvicina al crescere di .
La rete di esempio: sprinkler
Il prato è bagnato (GrassWet, ) se piove (Rain, ) o se è acceso lo sprinkler (Sprinkler, ); entrambi dipendono dal cielo nuvoloso (Cloudy, ). Archi , , , .
| valori | |
|---|---|
| : ; : | |
| : ; : | |
| : ; : ; : ; : |
Ordine topologico: . Valori esatti che serviranno per il confronto: , , , , , , .
Prior sampling
Algoritmo (prior-sample). Per ogni variabile nell'ordine topologico, campionare un valore da con i valori già estratti dei genitori. Restituire l'evento completo.
Un campione. Da esce ; da , esce ; da () esce ; da () esce : evento . La probabilità che un campione sia proprio questo è quella della congiunta, : in campioni ci si aspetta il di eventi .
Stima. Con campioni, , dove conta i campioni in cui l'evento è vero.
Esempio (slide). Su campioni, hanno e : , uguale al valore esatto . Ricampionando volte e contando si ottiene un numero vicino a (nel laboratorio ).
Precisione. Una frequenza su prove ha scarto tipico , che per eventi rari è grande in valore relativo: per (evento della rete dell'allarme) lo scarto relativo è per () e per . Ripetendo con (seme ) si trovano contro : servono molti campioni, come nell'esercizio Esercizio - Prior sampling sulla rete burglary (laboratorio 6).
Rejection sampling
Per una probabilità condizionata si conta solo nei campioni coerenti con l'evidenza.
Algoritmo (rejection sampling). Per volte: eseguire prior-sample; se il campione è coerente con , incrementare il contatore del valore di nel campione. Alla fine normalizzare il vettore dei contatori.
Esempio (slide). : campioni, con vengono scartati; dei con , hanno e hanno . Stima (valore esatto : con soli campioni utili l'errore è grande). Con campioni, circa il () è accettato e la stima è .
Difetto. La frazione accettata è : se l'evidenza è rara, quasi tutti i campioni si buttano. Nell'allarme, per solo campioni su sono coerenti () e la stima di è contro il valore esatto .
Likelihood weighting
Idea: non generare campioni da scartare. Si fissano le variabili di evidenza ai valori osservati e si campionano solo le altre. Un campione che "contiene" l'evidenza non è però un campione della distribuzione condizionata: va pesato con la verosimiglianza dell'evidenza.
Algoritmo (likelihood weighting). Per ogni campione: ; per ogni variabile nell'ordine topologico: se è di evidenza con valore , (non si campiona); altrimenti si campiona da . Si somma nel contatore del valore di . Alla fine si normalizza.
Esempio: . Evidenza , ; si campionano e .
- ; è evidenza: .
- : campiono da , sia (probabilità ).
- : campiono da , sia ().
- è evidenza: .
Evento con peso . Se invece fosse uscito , il peso sarebbe ; con , . Dieci campioni (tabella delle slide): sei con (peso ), due con (), due con (). Somme dei pesi: Esatto: (enumerazione: ). Con si ottiene .
Vantaggi e limiti. Nessun campione scartato, quindi più efficiente del rejection. Ma con molte variabili di evidenza i pesi diventano piccoli e pochi campioni dominano la somma; inoltre l'evidenza posta "a valle" non influenza il campionamento delle variabili a monte, che sono estratte senza guardarla.
Markov blanket
Definizione (Markov blanket). Il Markov blanket di un nodo è l'insieme dei suoi genitori, dei suoi figli e degli altri genitori dei suoi figli. Dato il suo blanket, è condizionalmente indipendente da tutti gli altri nodi della rete.
Per lo sprinkler il blanket di è (genitore , figlio , altro genitore del figlio ); quello di è ; quello di è . Dalle indipendenze: Sono i soli fattori della congiunta in cui compare .
Gibbs sampling
Algoritmo (Gibbs sampling). Si parte da uno stato arbitrario coerente con l'evidenza (variabili di evidenza fissate). A ogni passo si sceglie a caso una variabile non di evidenza e si estrae un nuovo valore da , tenendo fissate tutte le altre. Ogni stato visitato è un campione; la frequenza dei valori di negli stati stima .
Esempio: . Libere: e . Stato iniziale .
- Scelgo (blanket ): e , quindi . Estraggo, sia : stato .
- Scelgo (blanket ): e : . Estraggo, sia : stato .
- Si continua scegliendo a caso o .
Se in passi vale volte, la stima è (esatto ). Con passi (dopo di scarto) si ottiene .
Particolarità rispetto al campionamento diretto: i campioni sono correlati (ognuno differisce poco dal precedente); i primi stati dipendono dal punto di partenza e si scartano (burn-in); l'evidenza è sempre rispettata, e anche quella a valle influenza le variabili a monte. Per questo con pochi passi la stima è molto instabile (con passi e seme si è ottenuto ).
Confronto e codice
| metodo | evidenza | campioni | difetto principale |
|---|---|---|---|
| prior sampling | nessuna | tutti utili | eventi rari |
| rejection | scartano gli incoerenti | frazione | spreca con evidenza rara |
| likelihood weighting | fissata, con pesi | tutti | pesi piccoli con molta evidenza |
| Gibbs | fissata | correlati | burn-in, correlazione |
import random
# rete sprinkler: (genitori, CPT = P(X=vero | genitori))
bn = {
'C': ([], {(): 0.5}),
'S': (['C'], {(True,): 0.1, (False,): 0.5}),
'R': (['C'], {(True,): 0.8, (False,): 0.1}),
'G': (['S', 'R'], {(True, True): 0.95, (True, False): 0.90,
(False, True): 0.90, (False, False): 0.10}),
}
ordine = ['C', 'S', 'R', 'G'] # ordine topologico
def p_vero(var, val):
genitori, cpt = bn[var]
return cpt[tuple(val[g] for g in genitori)]
def prior_sample(rng):
val = {}
for x in ordine: # dai genitori ai figli
val[x] = rng.random() < p_vero(x, val)
return val
def rejection(X, ev, N, rng):
c = {True: 0, False: 0}
for _ in range(N):
s = prior_sample(rng)
if all(s[k] == v for k, v in ev.items()): # scarta se contraddice l'evidenza
c[s[X]] += 1
tot = c[True] + c[False]
return c[True] / tot, tot
def likelihood_weighting(X, ev, N, rng):
W = {True: 0.0, False: 0.0}
for _ in range(N):
val, w = dict(ev), 1.0
for x in ordine:
p = p_vero(x, val)
if x in ev:
w *= p if ev[x] else 1 - p # evidenza: si pesa, non si campiona
else:
val[x] = rng.random() < p # altrimenti si campiona
W[val[X]] += w
return W[True] / (W[True] + W[False])
def gibbs(X, ev, N, rng, burn=1000):
val = {x: rng.random() < 0.5 for x in ordine}
val.update(ev)
libere = [x for x in ordine if x not in ev]
figli = {x: [y for y in ordine if x in bn[y][0]] for x in ordine}
def p_cond(x): # P(x=vero | Markov blanket)
pesi = []
for v in (True, False):
val[x] = v
p = p_vero(x, val) if v else 1 - p_vero(x, val)
for y in figli[x]:
py = p_vero(y, val)
p *= py if val[y] else 1 - py
pesi.append(p)
return pesi[0] / (pesi[0] + pesi[1])
cont = 0
for i in range(N + burn):
x = rng.choice(libere) # una variabile libera alla volta
val[x] = rng.random() < p_cond(x)
if i >= burn:
cont += val[X]
return cont / N
rng = random.Random(1)
print(rejection('R', {'S': True}, 100000, rng))
print(likelihood_weighting('R', {'C': True, 'G': True}, 100000, rng))
print(gibbs('R', {'S': True, 'G': True}, 100000, rng))Output (seme ): (0.2127..., 30204), 0.9532..., 0.22344, da confrontare con i valori esatti , , . Esempi svolti in Esercizio - Campionamento - rejection sampling e likelihood weighting sulla rete sprinkler (slide del corso).
Domande d'esame
- Perché il rejection sampling può essere inefficiente? La frazione di campioni accettati è : con evidenza rara quasi tutti i campioni vengono scartati.
- Calcolare il peso di un campione di likelihood weighting per con , . .
- Qual è il Markov blanket di nello sprinkler? : genitore , figlio , altro genitore del figlio .
- Su campioni di prior sampling, hanno ; dei restanti, hanno . Stima di con rejection sampling? .
Versione ripasso
- Idea: l'inferenza esatta (Reti bayesiane - semantica, indipendenze e inferenza esattaUna rete bayesiana è un grafo diretto aciclico (DAG) con una variabile per nodo e una tabella delle probabilità condizionate (CPT) $P(X_i\mid\text{Parents}(X_i))$ per nodo; rappresenta la congiunta come prodotto $P(x_1,\dots,x_n)=\prod_i P(x_i\mid\text{parents}(X_i))$, con molti meno numeri della tabella completa (rete dell'allarme: 10 contro 31). Tre strutture elementari: catena $X\to Y\to Z$ e fork $Y\leftarrow X\to Z$ (estremi indipendenti dato il centro), collider $X\to Z\leftarrow Y$ (indipendenti, ma dipendenti se si osserva $Z$ o un suo discendente). Modelli causali (genitori = cause) danno reti più piccole. Inferenza esatta per enumerazione: $\mathbf P(X\mid\mathbf e)=\alpha\sum_{\mathbf y}\mathbf P(X,\mathbf e,\mathbf y)$ calcolata come somma di prodotti, in profondità e da sinistra a destra; per l'allarme $\mathbf P(B\mid j,m)=\langle0{,}284;\ 0{,}716\rangle$. Molti prodotti si ripetono: l'eliminazione di variabili li salva come fattori e li riusa.Reti bayesiane - semantica, indipendenze e inferenza esatta →) è esponenziale nel caso peggiore; i metodi Monte Carlo estraggono campioni dalla rete e stimano con frequenze; per la stima converge (Legge dei grandi numeri e metodo Monte CarloSe X₁, X₂, ... sono i.i.d. con media μ, la media campionaria X̄ₙ = (X₁ + ... + Xₙ)/n converge a μ: in probabilità (legge debole, dimostrata con Chebyshev se la varianza è finita: P(|X̄ₙ − μ| > ε) ≤ σ²/(nε²)) e quasi certamente (legge forte). Metodo Monte Carlo: ∫ g = E[g(U)] si stima con la media di g(U₁), ..., g(Uₙ) per uniformi indipendenti.Legge dei grandi numeri e metodo Monte Carlo →), con errore . Famiglie: campionamento diretto (prior, rejection, likelihood weighting) e MCMC (Gibbs).
- Campionare una booleana:
random.random(), vero se . Più valori: inversione della cumulata. - Sprinkler: ; ; ; . Esatti: , , , , , , .
- Prior sampling: ogni variabile estratta da dopo i genitori, in ordine topologico; . Slide: campioni con : . Eventi rari ( nell'allarme) richiedono : scarto relativo ( a , a ).
- Rejection: si scartano i campioni incoerenti con e si normalizzano i conteggi; accettati . Slide: con su con : (esatto ). Allarme: accettati su , contro . Spreca con evidenza rara.
- Likelihood weighting: evidenza fissata, , altre variabili campionate; somma dei pesi, poi normalizzare. : : (), (), (); dieci campioni: , , stima (esatto ). Nessun campione scartato; con molta evidenza i pesi diventano piccoli e le variabili a monte sono estratte senza vedere l'evidenza a valle.
- Markov blanket: genitori, figli e altri genitori dei figlidato il blanket, il nodo è condizionalmente indipendente da tutto il resto della rete; . Sprinkler: , , .
- Gibbs (MCMC): stato iniziale arbitrario con evidenza fissa; a ogni passo si ricampiona una variabile libera da ; ogni stato è un campione. da : , poi ; stima (esatto ; passi: ). Campioni correlati, scarto iniziale (burn-in), instabile con pochi passi.
- Confronto: prior = nessuna evidenza, eventi rari; rejection = frazione utile; likelihood weighting = tutti i campioni, pesi piccoli; Gibbs = evidenza sempre rispettata, correlazione.
- Errori tipici: non normalizzare i pesi; campionare le variabili d'evidenza invece di fissarle; contare nei campioni scartati; dimenticare i figli e i loro altri genitori nel blanket; concludere da pochi campioni che l'algoritmo è sbagliato.
- Valori verificati con codice: rejection con campioni , likelihood weighting , Gibbs (esatti , , ); burglary prior sampling (seme ) per contro .
- Probabilità di accettare: nell'allarme : campioni utili su ; per Gibbs e likelihood weighting nessun campione è sprecato.