Salta al contenuto
Note per Studenti Esercizio - Rete sprinkler per enumerazione e variable elimination (laboratorio 5)

Esercizio - Rete sprinkler per enumerazione e variable elimination (laboratorio 5)

Testo (laboratorio 5, Probability and Bayesian networks, part A, corso di Intelligenza Artificiale, Ing. dell'Informazione UniPD). Il prato bagnato (WetGrass, WW) può essere causato da uno sprinkler (SS) o dalla pioggia (RR), che dipendono entrambi dal tempo nuvoloso (Cloudy, CC). Si vuole la distribuzione di probabilità dell'erba bagnata sapendo che è nuvoloso.

valori
P(c)P(c) 0,50{,}5
P(r∣C)P(r\mid C) cc: 0,80{,}8; ¬c\neg c: 0,10{,}1
P(s∣C)P(s\mid C) cc: 0,10{,}1; ¬c\neg c: 0,50{,}5
P(w∣R,S)P(w\mid R,S) r,sr,s: 0,950{,}95; r,¬sr,\neg s: 0,900{,}90; ¬r,s\neg r,s: 0,900{,}90; ¬r,¬s\neg r,\neg s: 0,100{,}10

Quiz del laboratorio. Ripetere il calcolo con alcuni valori modificati: la tabella di P(W∣R,S)P(W\mid R,S) del codice del corso è P(w∣r,s)=0,95P(w\mid r,s)=0{,}95, P(w∣r,¬s)=0,90P(w\mid r,\neg s)=0{,}90, P(w∣¬r,s)=0,75P(w\mid\neg r,s)=0{,}75, P(w∣¬r,¬s)=0,80P(w\mid\neg r,\neg s)=0{,}80 (i valori P(¬w∣⋅)P(\neg w\mid\cdot) sono nell'array: 0,050{,}05, 0,100{,}10, 0,150{,}15, 0,200{,}20); P(r∣c)=0,8P(r\mid c)=0{,}8 e P(s∣c)=0,1P(s\mid c)=0{,}1 come prima. (La figura con le CPT modificate è fra i materiali online del corso e non è disponibile: i valori sono quelli del codice.)


Soluzione: variable elimination

Passo 1: scomporre la query con le regole delle reti bayesiane (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(W∣c)=α P(W,c)=α∑r,sP(W,c,r,s)=α∑r,sP(W∣r,s)P(r∣c)P(s∣c)P(c)=α P(c)∑rP(r∣c)∑sP(W∣r,s)P(s∣c).\mathbf P(W\mid c)=\alpha\,\mathbf P(W,c)=\alpha\sum_{r,s}\mathbf P(W,c,r,s)=\alpha\sum_{r,s}\mathbf P(W\mid r,s)P(r\mid c)P(s\mid c)P(c)=\alpha\,P(c)\sum_rP(r\mid c)\sum_s\mathbf P(W\mid r,s)P(s\mid c). Le variabili nascoste sono RR e SS, e P(c)P(c) esce dalle somme.

Passo 2: sommare SS (la somma più interna). Si ottiene la tabella ΦS(W,R)=∑sP(W∣R,s)P(s∣c)\Phi_S(W,R)=\sum_s\mathbf P(W\mid R,s)P(s\mid c):

rr ¬r\neg r
ww 0,95⋅0,1+0,90⋅0,9=0,9050{,}95\cdot0{,}1+0{,}90\cdot0{,}9=0{,}905 0,90⋅0,1+0,10⋅0,9=0,180{,}90\cdot0{,}1+0{,}10\cdot0{,}9=0{,}18
¬w\neg w 0,05⋅0,1+0,10⋅0,9=0,0950{,}05\cdot0{,}1+0{,}10\cdot0{,}9=0{,}095 0,10⋅0,1+0,90⋅0,9=0,820{,}10\cdot0{,}1+0{,}90\cdot0{,}9=0{,}82

(Le colonne sommano a 11: 0,905+0,095=10{,}905+0{,}095=1 e 0,18+0,82=10{,}18+0{,}82=1.)

Passo 3: sommare RR. ΦR(W)=P(r∣c) ΦS(W,r)+P(¬r∣c) ΦS(W,¬r)\Phi_R(W)=P(r\mid c)\,\Phi_S(W,r)+P(\neg r\mid c)\,\Phi_S(W,\neg r): ΦR(w)=0,8⋅0,905+0,2⋅0,18=0,724+0,036=0,76,ΦR(¬w)=0,8⋅0,095+0,2⋅0,82=0,076+0,164=0,24.\Phi_R(w)=0{,}8\cdot0{,}905+0{,}2\cdot0{,}18=0{,}724+0{,}036=0{,}76,\qquad\Phi_R(\neg w)=0{,}8\cdot0{,}095+0{,}2\cdot0{,}82=0{,}076+0{,}164=0{,}24.

Passo 4: moltiplicare per P(c)P(c) e normalizzare. 0,5⋅⟨0,76; 0,24⟩=⟨0,38; 0,12⟩→⟨0,76; 0,24⟩0{,}5\cdot\langle0{,}76;\ 0{,}24\rangle=\langle0{,}38;\ 0{,}12\rangle\to\langle0{,}76;\ 0{,}24\rangle. L'ultimo passo non cambia il risultato perché la somma precedente era già normalizzata e P(c)P(c) è solo una costante che si poteva includere in α\alpha.

P(W∣c)=⟨0,76; 0,24⟩.\mathbf P(W\mid c)=\langle0{,}76;\ 0{,}24\rangle.

Codice

python
import numpy as np

t, f = 0, 1                                   # indici di 'vero' e 'falso'

P_c   = np.array([0.5, 0.5])                  # P(C)
P_R_c = np.array([0.8, 0.2])                  # P(R | c)    = <P(r|c), P(non r|c)>
P_S_c = np.array([0.1, 0.9])                  # P(S | c)
# P_W_RS[w, r, s] = P(W=w | R=r, S=s)   (primo indice: w vero/falso)
P_W_RS = np.array([[[0.95, 0.90], [0.90, 0.10]],     # w vero:  r=t: (s=t, s=f); r=f: (s=t, s=f)
                   [[0.05, 0.10], [0.10, 0.90]]])    # w falso

Phi_S = P_W_RS[:, :, t] * P_S_c[t] + P_W_RS[:, :, f] * P_S_c[f]   # somma su S: tabella (W, R)
print(Phi_S)
Phi_R = P_R_c[t] * Phi_S[:, t] + P_R_c[f] * Phi_S[:, f]           # somma su R: vettore (W)
print(Phi_R)
risultato = P_c[t] * Phi_R
print(risultato / risultato.sum())

Output: [[0.905 0.18 ] [0.095 0.82 ]], [0.76 0.24], [0.76 0.24]. Verificato con l'enumerazione sulle 88 combinazioni di R,S,WR,S,W: ⟨0,76; 0,24⟩\langle0{,}76;\ 0{,}24\rangle.

Quiz: valori modificati e un errore nel materiale del corso

Con l'array del quiz il codice del corso stampa Phi_S = [[0.905 0.795] [0.095 0.195]] e Phi_R = [0.883 0.115]. Il risultato è giusto nella forma del calcolo, ma non è una distribuzione: 0,883+0,115=0,998≠10{,}883+0{,}115=0{,}998\ne1. Il motivo è nell'array: per ¬r,s\neg r,s si ha P(w∣¬r,s)=0,75P(w\mid\neg r,s)=0{,}75 e P(¬w∣¬r,s)=0,15P(\neg w\mid\neg r,s)=0{,}15, che sommano a 0,90{,}9 (le altre tre colonne sommano a 11). Una delle due cifre è un refuso:

  • se P(¬w∣¬r,s)=0,25P(\neg w\mid\neg r,s)=0{,}25: ΦR=⟨0,883; 0,117⟩\Phi_R=\langle0{,}883;\ 0{,}117\rangle;
  • se P(w∣¬r,s)=0,85P(w\mid\neg r,s)=0{,}85 (il 0,150{,}15 è giusto): ΦS(w,¬r)=0,85⋅0,1+0,80⋅0,9=0,805\Phi_S(w,\neg r)=0{,}85\cdot0{,}1+0{,}80\cdot0{,}9=0{,}805 e ΦR=⟨0,8⋅0,905+0,2⋅0,805; 0,115⟩=⟨0,885; 0,115⟩\Phi_R=\langle0{,}8\cdot0{,}905+0{,}2\cdot0{,}805;\ 0{,}115\rangle=\langle0{,}885;\ 0{,}115\rangle.

Senza la figura originale non si può dire quale delle due sia quella voluta. Se si usa l'array così com'è, si normalizza: ⟨0,883; 0,115⟩/0,998=⟨0,8848; 0,1152⟩\langle0{,}883;\ 0{,}115\rangle/0{,}998=\langle0{,}8848;\ 0{,}1152\rangle. In ogni caso il risultato è molto vicino a 0,880{,}88: il prato bagnato è più probabile rispetto al caso originale (0,760{,}76) perché P(w∣¬r,¬s)P(w\mid\neg r,\neg s) passa da 0,100{,}10 a 0,800{,}80.

Versione ripasso

  • Rete: C→RC\to R, C→SC\to S, R,S→WR,S\to W. P(c)=0,5P(c)=0{,}5; P(r∣c)=0,8P(r\mid c)=0{,}8; P(s∣c)=0,1P(s\mid c)=0{,}1; P(w∣R,S)P(w\mid R,S): r,sr,s 0,950{,}95; r,¬sr,\neg s 0,900{,}90; ¬r,s\neg r,s 0,900{,}90; ¬r,¬s\neg r,\neg s 0,100{,}10.
  • Query: P(W∣c)=αP(c)∑rP(r∣c)∑sP(W∣r,s)P(s∣c)\mathbf P(W\mid c)=\alpha P(c)\sum_rP(r\mid c)\sum_s\mathbf P(W\mid r,s)P(s\mid c) (nascoste R,SR,S; variable eliminationfattori sommati uno alla volta, riusando i risultati intermediReti bayesiane - semantica, indipendenze e inferenza esatta →).
  • Somma su SS: ΦS(W,R)\Phi_S(W,R): ww: 0,9050{,}905 (rr), 0,180{,}18 (¬r\neg r); ¬w\neg w: 0,0950{,}095, 0,820{,}82.
  • Somma su RR: ΦR(w)=0,8⋅0,905+0,2⋅0,18=0,76\Phi_R(w)=0{,}8\cdot0{,}905+0{,}2\cdot0{,}18=0{,}76; ΦR(¬w)=0,24\Phi_R(\neg w)=0{,}24. Per P(c)P(c) e normalizzazione: P(W∣c)=⟨0,76; 0,24⟩\mathbf P(W\mid c)=\langle0{,}76;\ 0{,}24\rangle.
  • Quiz: l'array del corso ha P(w∣¬r,s)+P(¬w∣¬r,s)=0,9P(w\mid\neg r,s)+P(\neg w\mid\neg r,s)=0{,}9; l'output ⟨0,883; 0,115⟩\langle0{,}883;\ 0{,}115\rangle somma 0,9980{,}998. Con 0,250{,}25: ⟨0,883; 0,117⟩\langle0{,}883;\ 0{,}117\rangle; con 0,850{,}85: ⟨0,885; 0,115⟩\langle0{,}885;\ 0{,}115\rangle.
  • Errori tipici: non controllare che ogni riga di CPT somma a 11; sommare prima su RR e poi su SS con fattori in ordine sbagliato; scordare di normalizzare.

Teoria collegata