Salta al contenuto
Note per Studenti Esercizio - Inferenza per enumerazione nella rete burglary (slide del corso)

Esercizio - Inferenza per enumerazione nella rete burglary (slide del corso)

Testo (slide Bayesian Networks (part 1), corso di Intelligenza Artificiale, Ing. dell'Informazione UniPD). Rete dell'allarme antifurto: BB (furto), EE (terremoto), AA (allarme), JJ (Giovanni chiama), MM (Maria chiama); archi B→AB\to A, E→AE\to A, A→JA\to J, A→MA\to M. CPT: P(b)=0,001P(b)=0{,}001, P(e)=0,002P(e)=0{,}002, P(a∣b,e)=0,95P(a\mid b,e)=0{,}95, P(a∣b,¬e)=0,94P(a\mid b,\neg e)=0{,}94, P(a∣¬b,e)=0,29P(a\mid\neg b,e)=0{,}29, P(a∣¬b,¬e)=0,001P(a\mid\neg b,\neg e)=0{,}001, P(j∣a)=0,90P(j\mid a)=0{,}90, P(j∣¬a)=0,05P(j\mid\neg a)=0{,}05, P(m∣a)=0,70P(m\mid a)=0{,}70, P(m∣¬a)=0,01P(m\mid\neg a)=0{,}01.

  1. (Domanda a risposta multipla delle slide) Quanto vale P(j,¬m,a,b,¬e)P(j,\neg m,a,b,\neg e)? Opzioni: 0,000001180{,}00000118; 0,000591020{,}00059102; 0,000000510{,}00000051; 0,000253290{,}00025329; nessuna delle precedenti.
  2. Calcolare con l'inferenza per enumerazione la distribuzione P(B∣j,m)\mathbf P(B\mid j,m).
  3. (Estensione) Calcolare con lo stesso metodo P(A∣j,m)\mathbf P(A\mid j,m) e P(E∣j,m)\mathbf P(E\mid j,m).

Soluzione

1. Un termine della congiunta

La congiunta si scompone nel prodotto delle CPT (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 →); per ogni nodo si prende la riga che corrisponde ai valori dei suoi genitori: P(j,¬m,a,b,¬e)=P(j∣a) P(¬m∣a) P(a∣b,¬e) P(b) P(¬e).P(j,\neg m,a,b,\neg e)=P(j\mid a)\,P(\neg m\mid a)\,P(a\mid b,\neg e)\,P(b)\,P(\neg e). Valori: P(j∣a)=0,90P(j\mid a)=0{,}90; P(¬m∣a)=1−0,70=0,30P(\neg m\mid a)=1-0{,}70=0{,}30; P(a∣b,¬e)=0,94P(a\mid b,\neg e)=0{,}94; P(b)=0,001P(b)=0{,}001; P(¬e)=1−0,002=0,998P(\neg e)=1-0{,}002=0{,}998. 0,90⋅0,30⋅0,94⋅0,001⋅0,998=0,00025329.0{,}90\cdot0{,}30\cdot0{,}94\cdot0{,}001\cdot0{,}998=0{,}00025329. La risposta è la quarta opzione. (Le altre sono errori tipici: per esempio dimenticare P(¬m∣a)=0,3P(\neg m\mid a)=0{,}3 usando 0,70{,}7, o prendere la riga ¬b\neg b.)

2. P(B∣j,m)\mathbf P(B\mid j,m)

Impostazione. Le variabili nascoste sono EE e AA; l'evidenza è j,mj,m. Dalla marginalizzazione: P(B∣j,m)=α P(B,j,m)=α ⟨P(b,j,m), P(¬b,j,m)⟩.\mathbf P(B\mid j,m)=\alpha\,\mathbf P(B,j,m)=\alpha\,\langle P(b,j,m),\ P(\neg b,j,m)\rangle.

Passo 1: scomporre e portare fuori i fattori costanti. P(b,j,m)=∑e∑aP(b)P(e)P(a∣b,e)P(j∣a)P(m∣a)=P(b)∑eP(e)∑aP(a∣b,e)P(j∣a)P(m∣a).P(b,j,m)=\sum_e\sum_aP(b)P(e)P(a\mid b,e)P(j\mid a)P(m\mid a)=P(b)\sum_eP(e)\sum_aP(a\mid b,e)P(j\mid a)P(m\mid a). P(b)P(b) non dipende né da ee né da aa; P(e)P(e) non dipende da aa.

Passo 2: i prodotti P(j∣a)P(m∣a)P(j\mid a)P(m\mid a) (indipendenti da b,eb,e): per aa vale 0,9⋅0,7=0,630{,}9\cdot0{,}7=0{,}63; per ¬a\neg a vale 0,05⋅0,01=0,00050{,}05\cdot0{,}01=0{,}0005.

Passo 3: calcolo di P(b,j,m)P(b,j,m). Somma su aa per ciascun ee:

  • ee: 0,95⋅0,63+0,05⋅0,0005=0,5985+0,000025=0,5985250{,}95\cdot0{,}63+0{,}05\cdot0{,}0005=0{,}5985+0{,}000025=0{,}598525;
  • ¬e\neg e: 0,94⋅0,63+0,06⋅0,0005=0,5922+0,00003=0,592230{,}94\cdot0{,}63+0{,}06\cdot0{,}0005=0{,}5922+0{,}00003=0{,}59223.

Somma su ee pesata con P(e)P(e): 0,002⋅0,598525+0,998⋅0,59223=0,001197+0,591046=0,5922430{,}002\cdot0{,}598525+0{,}998\cdot0{,}59223=0{,}001197+0{,}591046=0{,}592243. Moltiplicato per P(b)P(b): P(b,j,m)=0,001⋅0,592243=0,0005922.P(b,j,m)=0{,}001\cdot0{,}592243=0{,}0005922.

Passo 4: calcolo di P(¬b,j,m)P(\neg b,j,m) (stesse operazioni con P(a∣¬b,e)P(a\mid\neg b,e)):

  • ee: 0,29⋅0,63+0,71⋅0,0005=0,1827+0,000355=0,1830550{,}29\cdot0{,}63+0{,}71\cdot0{,}0005=0{,}1827+0{,}000355=0{,}183055;
  • ¬e\neg e: 0,001⋅0,63+0,999⋅0,0005=0,00063+0,0004995=0,00112950{,}001\cdot0{,}63+0{,}999\cdot0{,}0005=0{,}00063+0{,}0004995=0{,}0011295;
  • pesata: 0,002⋅0,183055+0,998⋅0,0011295=0,000366+0,001127=0,0014930{,}002\cdot0{,}183055+0{,}998\cdot0{,}0011295=0{,}000366+0{,}001127=0{,}001493;
  • per P(¬b)=0,999P(\neg b)=0{,}999: P(¬b,j,m)=0,0014919P(\neg b,j,m)=0{,}0014919.

Passo 5: normalizzazione. α=1/(0,0005922+0,0014919)=1/0,0020841=479,82\alpha=1/(0{,}0005922+0{,}0014919)=1/0{,}0020841=479{,}82: P(B∣j,m)=479,82⋅⟨0,0005922; 0,0014919⟩=⟨0,284; 0,716⟩.\mathbf P(B\mid j,m)=479{,}82\cdot\langle0{,}0005922;\ 0{,}0014919\rangle=\langle0{,}284;\ 0{,}716\rangle. Anche con entrambe le telefonate il furto ha probabilità solo 28,4%28{,}4\%: il prior del furto è 0,0010{,}001 e l'allarme può suonare anche senza furto (terremoto, oppure falso allarme con P(a∣¬b,¬e)=0,001P(a\mid\neg b,\neg e)=0{,}001 in una situazione, ¬b,¬e\neg b,\neg e, che quasi sempre si verifica).

3. Estensione: P(A∣j,m)\mathbf P(A\mid j,m) e P(E∣j,m)\mathbf P(E\mid j,m)

Il denominatore comune è P(j,m)=0,0020841P(j,m)=0{,}0020841 (somma dei due termini sopra).

  • P(A∣j,m)\mathbf P(A\mid j,m): P(a,j,m)=P(a)P(j∣a)P(m∣a)P(a,j,m)=P(a)P(j\mid a)P(m\mid a), con P(a)=∑b,eP(b)P(e)P(a∣b,e)=0,0025164P(a)=\sum_{b,e}P(b)P(e)P(a\mid b,e)=0{,}0025164 (marginale dell'allarme): 0,0025164⋅0,63=0,00158530{,}0025164\cdot0{,}63=0{,}0015853; P(¬a,j,m)=0,9974836⋅0,0005=0,0004987P(\neg a,j,m)=0{,}9974836\cdot0{,}0005=0{,}0004987. Normalizzando: ⟨0,7607; 0,2393⟩\langle0{,}7607;\ 0{,}2393\rangle.
  • P(E∣j,m)\mathbf P(E\mid j,m): P(e,j,m)=P(e)∑bP(b)∑aP(a∣b,e)P(j∣a)P(m∣a)P(e,j,m)=P(e)\sum_bP(b)\sum_aP(a\mid b,e)P(j\mid a)P(m\mid a); per ee: 0,002⋅(0,001⋅0,598525+0,999⋅0,183055)=0,002⋅0,183471=0,0003670{,}002\cdot(0{,}001\cdot0{,}598525+0{,}999\cdot0{,}183055)=0{,}002\cdot0{,}183471=0{,}000367. Con il totale 0,00208410{,}0020841 si ottiene P(e∣j,m)=0,176P(e\mid j,m)=0{,}176, cioè ⟨0,176; 0,824⟩\langle0{,}176;\ 0{,}824\rangle (verificato anche per enumerazione completa).

Il valore di P(a∣j,m)=0,76P(a\mid j,m)=0{,}76 (>0,28>0{,}28) mostra che se entrambi chiamano l'allarme è probabilmente suonato, ma la causa più probabile resta un falso allarme o un terremoto.

Codice

python
# rete burglary: per ogni variabile (genitori, CPT) con CPT = P(X=vero | genitori)
bn = {
    'B': ([], {(): 0.001}),
    'E': ([], {(): 0.002}),
    'A': (['B', 'E'], {(True, True): 0.95, (True, False): 0.94,
                       (False, True): 0.29, (False, False): 0.001}),
    'J': (['A'], {(True,): 0.90, (False,): 0.05}),
    'M': (['A'], {(True,): 0.70, (False,): 0.01}),
}
ordine = ['B', 'E', 'A', 'J', 'M']          # ordine topologico

def prob(var, val, ev):
    """P(var=val | genitori), con i valori dei genitori presi da ev."""
    genitori, cpt = bn[var]
    p = cpt[tuple(ev[g] for g in genitori)]
    return p if val else 1 - p

def enumera_tutto(variabili, ev):
    """Somma sulle variabili non osservate, nell'ordine topologico."""
    if not variabili:
        return 1.0
    v, resto = variabili[0], variabili[1:]
    if v in ev:                              # osservata: un solo termine
        return prob(v, ev[v], ev) * enumera_tutto(resto, ev)
    return sum(prob(v, x, {**ev, v: x}) * enumera_tutto(resto, {**ev, v: x})
               for x in (True, False))       # nascosta: si somma sui due valori

def enumeration_ask(X, ev):
    q = [enumera_tutto(ordine, {**ev, X: x}) for x in (True, False)]
    alfa = 1 / sum(q)                        # normalizzazione
    return [alfa * p for p in q]

print(enumeration_ask('B', {'J': True, 'M': True}))
print(enumera_tutto(ordine, {'B': True, 'E': False, 'A': True, 'J': True, 'M': False}))

Output: [0.2841718353643929, 0.7158281646356071] e 0.00025329240000000004.

Versione ripasso

  • Rete: B,E→A→J,MB,E\to A\to J,M; P(b)=0,001P(b)=0{,}001, P(e)=0,002P(e)=0{,}002, P(a∣B,E)=0,95; 0,94; 0,29; 0,001P(a\mid B,E)=0{,}95;\,0{,}94;\,0{,}29;\,0{,}001, P(j∣A)=0,9; 0,05P(j\mid A)=0{,}9;\,0{,}05, P(m∣A)=0,7; 0,01P(m\mid A)=0{,}7;\,0{,}01.
  • Un termine: P(j,¬m,a,b,¬e)=P(j∣a)P(¬m∣a)P(a∣b,¬e)P(b)P(¬e)=0,9⋅0,3⋅0,94⋅0,001⋅0,998=0,00025329P(j,\neg m,a,b,\neg e)=P(j\mid a)P(\neg m\mid a)P(a\mid b,\neg e)P(b)P(\neg e)=0{,}9\cdot0{,}3\cdot0{,}94\cdot0{,}001\cdot0{,}998=0{,}00025329.
  • Enumerazione (inferenza per enumerazionesomma sulle nascoste dei prodotti delle CPT, poi normalizzazioneReti bayesiane - semantica, indipendenze e inferenza esatta →): P(B∣j,m)=α⟨P(b,j,m),P(¬b,j,m)⟩\mathbf P(B\mid j,m)=\alpha\langle P(b,j,m),P(\neg b,j,m)\rangle con P(b,j,m)=P(b)∑eP(e)∑aP(a∣b,e)P(j∣a)P(m∣a)P(b,j,m)=P(b)\sum_eP(e)\sum_aP(a\mid b,e)P(j\mid a)P(m\mid a).
  • Numeri: P(j∣a)P(m∣a)=0,63P(j\mid a)P(m\mid a)=0{,}63, P(j∣¬a)P(m∣¬a)=0,0005P(j\mid\neg a)P(m\mid\neg a)=0{,}0005. bb: 0,5985250{,}598525 (ee), 0,592230{,}59223 (¬e\neg e); P(b,j,m)=0,0005922P(b,j,m)=0{,}0005922. ¬b\neg b: 0,1830550{,}183055, 0,00112950{,}0011295; P(¬b,j,m)=0,0014919P(\neg b,j,m)=0{,}0014919.
  • Risultato: α=479,82\alpha=479{,}82; P(B∣j,m)=⟨0,284; 0,716⟩\mathbf P(B\mid j,m)=\langle0{,}284;\ 0{,}716\rangle. Inoltre P(a∣j,m)=0,761P(a\mid j,m)=0{,}761, P(e∣j,m)=0,176P(e\mid j,m)=0{,}176.
  • Errori tipici: usare P(m∣a)P(m\mid a) al posto di P(¬m∣a)P(\neg m\mid a); prendere la riga sbagliata di P(a∣B,E)P(a\mid B,E); sommare anche sulle variabili osservate; non normalizzare.
  • Somme interne (con 0,630{,}63 e 0,00050{,}0005): 0,95⋅0,63+0,05⋅0,00050{,}95\cdot0{,}63+0{,}05\cdot0{,}0005, 0,94⋅0,63+0,06⋅0,00050{,}94\cdot0{,}63+0{,}06\cdot0{,}0005, 0,29⋅0,63+0,71⋅0,00050{,}29\cdot0{,}63+0{,}71\cdot0{,}0005, 0,001⋅0,63+0,999⋅0,00050{,}001\cdot0{,}63+0{,}999\cdot0{,}0005; poi pesate con P(e)=0,002P(e)=0{,}002 e P(¬e)=0,998P(\neg e)=0{,}998 e moltiplicate per P(b)P(b) o P(¬b)P(\neg b).
  • Totale: P(j,m)=0,0020841P(j,m)=0{,}0020841; P(a∣j,m)=0,7607P(a\mid j,m)=0{,}7607 (P(a)=0,0025164P(a)=0{,}0025164).

Esercizi su questo argomento

Teoria collegata