Salta al contenuto
Note per Studenti Esercizio - Epidemia di colera di Broad Street (laboratorio 5)

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:

  • XX: la presa dell'acqua della compagnia idrica era a valle delle fognature di Londra;
  • WW: l'acqua era contaminata;
  • ZZ: presenza di altri fattori esterni (povertà, miasmi, ecc.);
  • YY: scoppio del colera.

Le probabilità del diagramma sono finte. Si chiede di:

  1. 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?);
  2. scrivere un programma Python che calcola le probabilità effettive di questa distribuzione dalle CPT date.

Rete e CPT. Archi X→WX\to W, Z→WZ\to W, W→YW\to Y, Z→YZ\to Y (la scomposizione della soluzione del corso è P(Y∣W,Z)P(W∣X,Z)P(X)P(Z)P(Y\mid W,Z)P(W\mid X,Z)P(X)P(Z)). La figura non è fra i materiali: le CPT sono ricostruite dal codice e dai calcoli della soluzione.

CPT valori
P(x)P(x) 0,50{,}5
P(z)P(z) 0,250{,}25
P(w∣X,Z)P(w\mid X,Z) x,zx,z: 0,900{,}90; x,¬zx,\neg z: 0,850{,}85; ¬x,z\neg x,z: 0,100{,}10; ¬x,¬z\neg x,\neg z: 0,020{,}02
P(y∣W,Z)P(y\mid W,Z) w,zw,z: 0,800{,}80; w,¬zw,\neg z: 0,750{,}75; ¬w,z\neg w,z: 0,150{,}15; ¬w,¬z\neg w,\neg z: 0,050{,}05

Soluzione

Query: P(Y∣¬x)\mathbf P(Y\mid\neg x) (presa a monte: ¬x\neg x). Le variabili nascoste sono ZZ e WW. 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 →): P(Y∣¬x)=α P(Y,¬x)=α∑z,wP(Y,w,¬x,z)=α∑z∑wP(Y∣w,z)P(w∣¬x,z)P(¬x)P(z)=α P(¬x)∑zP(z)∑wP(Y∣w,z)P(w∣¬x,z).\mathbf P(Y\mid\neg x)=\alpha\,\mathbf P(Y,\neg x)=\alpha\sum_{z,w}\mathbf P(Y,w,\neg x,z)=\alpha\sum_z\sum_w\mathbf P(Y\mid w,z)P(w\mid\neg x,z)P(\neg x)P(z)=\alpha\,P(\neg x)\sum_zP(z)\sum_w\mathbf P(Y\mid w,z)P(w\mid\neg x,z). P(¬x)P(\neg x) esce dalle due somme e P(z)P(z) dalla somma su ww.

Passo 1: somma su WW, per ciascun valore di ZZ. Il vettore ha le componenti ⟨y,¬y⟩\langle y,\neg y\rangle.

  • zz: P(w∣¬x,z)=0,10P(w\mid\neg x,z)=0{,}10, P(¬w∣¬x,z)=0,90P(\neg w\mid\neg x,z)=0{,}90: ⟨0,80; 0,20⟩⋅0,10+⟨0,15; 0,85⟩⋅0,90=⟨0,08; 0,02⟩+⟨0,135; 0,765⟩=⟨0,215; 0,785⟩.\langle0{,}80;\,0{,}20\rangle\cdot0{,}10+\langle0{,}15;\,0{,}85\rangle\cdot0{,}90=\langle0{,}08;\,0{,}02\rangle+\langle0{,}135;\,0{,}765\rangle=\langle0{,}215;\ 0{,}785\rangle.
  • ¬z\neg z: P(w∣¬x,¬z)=0,02P(w\mid\neg x,\neg z)=0{,}02, P(¬w∣¬x,¬z)=0,98P(\neg w\mid\neg x,\neg z)=0{,}98: ⟨0,75; 0,25⟩⋅0,02+⟨0,05; 0,95⟩⋅0,98=⟨0,015; 0,005⟩+⟨0,049; 0,931⟩=⟨0,064; 0,936⟩.\langle0{,}75;\,0{,}25\rangle\cdot0{,}02+\langle0{,}05;\,0{,}95\rangle\cdot0{,}98=\langle0{,}015;\,0{,}005\rangle+\langle0{,}049;\,0{,}931\rangle=\langle0{,}064;\ 0{,}936\rangle.

Passo 2: somma su ZZ, pesando con P(z)=0,25P(z)=0{,}25 e P(¬z)=0,75P(\neg z)=0{,}75: 0,25⋅⟨0,215; 0,785⟩+0,75⋅⟨0,064; 0,936⟩=⟨0,05375; 0,19625⟩+⟨0,048; 0,702⟩=⟨0,10175; 0,89825⟩.0{,}25\cdot\langle0{,}215;\,0{,}785\rangle+0{,}75\cdot\langle0{,}064;\,0{,}936\rangle=\langle0{,}05375;\,0{,}19625\rangle+\langle0{,}048;\,0{,}702\rangle=\langle0{,}10175;\ 0{,}89825\rangle.

Passo 3: moltiplicare per P(¬x)=0,5P(\neg x)=0{,}5 e normalizzare. 0,5⋅⟨0,10175; 0,89825⟩=⟨0,050875; 0,449125⟩0{,}5\cdot\langle0{,}10175;\,0{,}89825\rangle=\langle0{,}050875;\,0{,}449125\rangle, somma 0,50{,}5 (è già P(¬x)P(\neg x)): dividendo si ottiene P(Y∣¬x)=⟨0,10175; 0,89825⟩.\mathbf P(Y\mid\neg x)=\langle0{,}10175;\ 0{,}89825\rangle. Con presa a monte la probabilità di colera è circa 10,2%10{,}2\%. Per confronto, con presa a valle (xx) lo stesso calcolo dà P(Y∣x)=⟨0,6675; 0,3325⟩\mathbf P(Y\mid x)=\langle0{,}6675;\ 0{,}3325\rangle: il 66,8%66{,}8\% (con probabilità finte, ma il confronto mostra l'effetto della posizione della presa attraverso l'acqua contaminata).

Codice

python
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 1616 combinazioni di X,Z,W,YX,Z,W,Y (somma totale 11). I valori intermedi [0.215 0.785] (zz) e [0.064 0.936] (¬z\neg z) 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: X→W←ZX\to W\leftarrow Z, W→Y←ZW\to Y\leftarrow Z; congiunta P(Y∣W,Z)P(W∣X,Z)P(X)P(Z)P(Y\mid W,Z)P(W\mid X,Z)P(X)P(Z). P(x)=0,5P(x)=0{,}5, P(z)=0,25P(z)=0{,}25.
  • Query: P(Y∣¬x)=αP(¬x)∑zP(z)∑wP(Y∣w,z)P(w∣¬x,z)\mathbf P(Y\mid\neg x)=\alpha P(\neg x)\sum_zP(z)\sum_w\mathbf P(Y\mid w,z)P(w\mid\neg x,z) (enumerazionesomma sulle nascoste di prodotti di CPTReti bayesiane - semantica, indipendenze e inferenza esatta →).
  • Somma su WW: zz: 0,1⟨0,8; 0,2⟩+0,9⟨0,15; 0,85⟩=⟨0,215; 0,785⟩0{,}1\langle0{,}8;\,0{,}2\rangle+0{,}9\langle0{,}15;\,0{,}85\rangle=\langle0{,}215;\,0{,}785\rangle; ¬z\neg z: 0,02⟨0,75; 0,25⟩+0,98⟨0,05; 0,95⟩=⟨0,064; 0,936⟩0{,}02\langle0{,}75;\,0{,}25\rangle+0{,}98\langle0{,}05;\,0{,}95\rangle=\langle0{,}064;\,0{,}936\rangle.
  • Somma su ZZ: 0,25⟨0,215; 0,785⟩+0,75⟨0,064; 0,936⟩=⟨0,10175; 0,89825⟩0{,}25\langle0{,}215;\,0{,}785\rangle+0{,}75\langle0{,}064;\,0{,}936\rangle=\langle0{,}10175;\,0{,}89825\rangle; ×0,5\times0{,}5 e normalizzato: ⟨0,10175; 0,89825⟩\langle0{,}10175;\ 0{,}89825\rangle. Con presa a valle: ⟨0,6675; 0,3325⟩\langle0{,}6675;\ 0{,}3325\rangle.
  • Errori tipici: usare P(w∣x,z)P(w\mid x,z) invece di P(w∣¬x,z)P(w\mid\neg x,z); scambiare i valori di zz e ¬z\neg z nelle CPT; dimenticare P(¬x)P(\neg x) (con la normalizzazione non cambia il risultato, ma va tenuto nel calcolo non normalizzato).
  • CPT ricostruite: P(w∣X,Z)=0,90; 0,85; 0,10; 0,02P(w\mid X,Z)=0{,}90;\,0{,}85;\,0{,}10;\,0{,}02 per (x,z),(x,¬z),(¬x,z),(¬x,¬z)(x,z),(x,\neg z),(\neg x,z),(\neg x,\neg z); P(y∣W,Z)=0,80; 0,75; 0,15; 0,05P(y\mid W,Z)=0{,}80;\,0{,}75;\,0{,}15;\,0{,}05 per (w,z),(w,¬z),(¬w,z),(¬w,¬z)(w,z),(w,\neg z),(\neg w,z),(\neg w,\neg z). Verifica sulla congiunta di 1616 combinazioni: somma 11.

Teoria collegata