Esercizio - Epidemia di colera di Broad Street (laboratorio 5)
Testo (laboratorio 5, Probability and Bayesian networks, part A, corso di Intelligenza Artificiale, Ing. dell'Informazione UniPD). Versione semplificata di un esempio di Judea Pearl (The Book of Why): l'epidemia di colera, causata da acqua contaminata, che uccise centinaia di persone a Londra tra il 1853 e il 1854. Il diagramma riporta alcuni fattori dell'epidemia:
- : la presa dell'acqua della compagnia idrica era a valle delle fognature di Londra;
- : l'acqua era contaminata;
- : presenza di altri fattori esterni (povertà, miasmi, ecc.);
- : scoppio del colera.
Le probabilità del diagramma sono finte. Si chiede di:
- formalizzare il problema con notazione matematica opportuna e ricavare un'espressione per la distribuzione di probabilità del colera dato che la presa è a monte (qual è la query? come si scompone?);
- scrivere un programma Python che calcola le probabilità effettive di questa distribuzione dalle CPT date.
Rete e CPT. Archi , , , (la scomposizione della soluzione del corso è ). La figura non è fra i materiali: le CPT sono ricostruite dal codice e dai calcoli della soluzione.
| CPT | valori |
|---|---|
| : ; : ; : ; : | |
| : ; : ; : ; : |
Soluzione
Query: (presa a monte: ). Le variabili nascoste sono e . Come nell'inferenza per enumerazione (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 →): esce dalle due somme e dalla somma su .
Passo 1: somma su , per ciascun valore di . Il vettore ha le componenti .
- : , :
- : , :
Passo 2: somma su , pesando con e :
Passo 3: moltiplicare per e normalizzare. , somma (è già ): dividendo si ottiene Con presa a monte la probabilità di colera è circa . Per confronto, con presa a valle () lo stesso calcolo dà : il (con probabilità finte, ma il confronto mostra l'effetto della posizione della presa attraverso l'acqua contaminata).
Codice
import numpy as np
t, f = 0, 1 # indici di 'vero' e 'falso'
P_x = np.array([0.5, 0.5]) # P(X)
P_z = np.array([0.25, 0.75]) # P(Z)
# P_w_xz[x][z] = distribuzione di W: <P(w|x,z), P(non w|x,z)>
P_w_xz = np.array([[[0.90, 0.10], [0.85, 0.15]],
[[0.10, 0.90], [0.02, 0.98]]])
# P_y_wz[w][z] = distribuzione di Y: <P(y|w,z), P(non y|w,z)>
P_y_wz = np.array([[[0.80, 0.20], [0.75, 0.25]],
[[0.15, 0.85], [0.05, 0.95]]])
def P_Y_dato_x(x):
"""P(Y | X=x) = alfa P(x) sum_z P(z) sum_w P(Y|w,z) P(w|x,z)."""
totale = np.zeros(2)
for z in (t, f):
interno = np.zeros(2)
for w in (t, f):
interno += P_y_wz[w][z] * P_w_xz[x][z][w] # somma su W
totale += P_z[z] * interno # somma su Z
totale *= P_x[x]
return totale / totale.sum() # normalizzazione
print(P_Y_dato_x(f)) # presa a monte (non x)
print(P_Y_dato_x(t)) # presa a valle (x)Output: [0.10175 0.89825] e [0.6675 0.3325]. Verificato sommando la congiunta completa di tutte le combinazioni di (somma totale ). I valori intermedi [0.215 0.785] () e [0.064 0.936] () coincidono con il calcolo a mano. Il codice del corso fa gli stessi passi, con indicizzazioni diverse (P_y_wz[t][:][f]), e ottiene lo stesso [0.10175 0.89825].
Versione ripasso
- Rete: , ; congiunta . , .
- Query: (enumerazionesomma sulle nascoste di prodotti di CPTReti bayesiane - semantica, indipendenze e inferenza esatta →).
- Somma su : : ; : .
- Somma su : ; e normalizzato: . Con presa a valle: .
- Errori tipici: usare invece di ; scambiare i valori di e nelle CPT; dimenticare (con la normalizzazione non cambia il risultato, ma va tenuto nel calcolo non normalizzato).
- CPT ricostruite: per ; per . Verifica sulla congiunta di combinazioni: somma .