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, ) può essere causato da uno sprinkler () o dalla pioggia (), che dipendono entrambi dal tempo nuvoloso (Cloudy, ). Si vuole la distribuzione di probabilità dell'erba bagnata sapendo che è nuvoloso.
| valori | |
|---|---|
| : ; : | |
| : ; : | |
| : ; : ; : ; : |
Quiz del laboratorio. Ripetere il calcolo con alcuni valori modificati: la tabella di del codice del corso è , , , (i valori sono nell'array: , , , ); e 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 2: sommare (la somma più interna). Si ottiene la tabella :
(Le colonne sommano a : e .)
Passo 3: sommare . :
Passo 4: moltiplicare per e normalizzare. . L'ultimo passo non cambia il risultato perché la somma precedente era già normalizzata e è solo una costante che si poteva includere in .
Codice
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 combinazioni di : .
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: . Il motivo è nell'array: per si ha e , che sommano a (le altre tre colonne sommano a ). Una delle due cifre è un refuso:
- se : ;
- se (il è giusto): e .
Senza la figura originale non si può dire quale delle due sia quella voluta. Se si usa l'array così com'è, si normalizza: . In ogni caso il risultato è molto vicino a : il prato bagnato è più probabile rispetto al caso originale () perché passa da a .
Versione ripasso
- Rete: , , . ; ; ; : ; ; ; .
- Query: (nascoste ; variable eliminationfattori sommati uno alla volta, riusando i risultati intermediReti bayesiane - semantica, indipendenze e inferenza esatta →).
- Somma su : : : (), (); : , .
- Somma su : ; . Per e normalizzazione: .
- Quiz: l'array del corso ha ; l'output somma . Con : ; con : .
- Errori tipici: non controllare che ogni riga di CPT somma a ; sommare prima su e poi su con fattori in ordine sbagliato; scordare di normalizzare.