Salta al contenuto
Note per Studenti Esercizio - Eliminazione di variabili nella rete burglary (slide del corso)

Esercizio - Eliminazione di variabili nella rete burglary (slide del corso)

Testo (esercizio costruito sulle slide Bayesian Networks (part 1), corso di Intelligenza Artificiale, Ing. dell'Informazione UniPD, che chiudono l'esempio dell'enumerazione proponendo di "salvare e riusare i risultati intermedi, cioè l'algoritmo di variable elimination"). Sulla rete dell'allarme (stesse CPT di Esercizio - Inferenza per enumerazione nella rete burglary (slide del corso)):

  1. Calcolare P(J∣m)\mathbf P(J\mid m) (Giovanni chiama, dato che Maria ha chiamato) con l'eliminazione di variabili, scrivendo ogni fattore intermedio.
  2. Mostrare quali prodotti dell'enumerazione di P(B∣j,m)\mathbf P(B\mid j,m) vengono riusati dall'eliminazione.

Soluzione

Fattori. Ogni CPT è una tabella (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 →): fB(B)f_B(B), fE(E)f_E(E), fA(A,B,E)=P(A∣B,E)f_A(A,B,E)=P(A\mid B,E), fJ(J,A)=P(J∣A)f_J(J,A)=P(J\mid A), fM(M,A)=P(M∣A)f_M(M,A)=P(M\mid A). L'evidenza mm fissa MM al valore vero: fMf_M diventa il fattore fm(A)=⟨P(m∣a), P(m∣¬a)⟩=⟨0,7; 0,01⟩f_m(A)=\langle P(m\mid a),\,P(m\mid\neg a)\rangle=\langle0{,}7;\ 0{,}01\rangle.

Query 1: P(J∣m)\mathbf P(J\mid m). Variabili nascoste: B,E,AB,E,A. Si sceglie l'ordine di eliminazione B,E,AB,E,A.

Passo 1: eliminare BB. I fattori che contengono BB sono fBf_B e fAf_A. Si moltiplicano e si somma su BB: g1(A,E)=∑bfB(b) fA(A,b,E)g_1(A,E)=\sum_bf_B(b)\,f_A(A,b,E).

  • g1(a,e)=0,001⋅0,95+0,999⋅0,29=0,00095+0,28971=0,29066g_1(a,e)=0{,}001\cdot0{,}95+0{,}999\cdot0{,}29=0{,}00095+0{,}28971=0{,}29066;
  • g1(a,¬e)=0,001⋅0,94+0,999⋅0,001=0,00094+0,000999=0,001939g_1(a,\neg e)=0{,}001\cdot0{,}94+0{,}999\cdot0{,}001=0{,}00094+0{,}000999=0{,}001939;
  • g1(¬a,e)=1−0,29066=0,70934g_1(\neg a,e)=1-0{,}29066=0{,}70934 e g1(¬a,¬e)=1−0,001939=0,998061g_1(\neg a,\neg e)=1-0{,}001939=0{,}998061 (le colonne sommano a 11 perché è ancora una probabilità di AA dato EE).

Passo 2: eliminare EE. Fattori con EE: fEf_E e g1g_1. g2(A)=∑efE(e) g1(A,e)g_2(A)=\sum_ef_E(e)\,g_1(A,e): g2(a)=0,002⋅0,29066+0,998⋅0,001939=0,000581+0,001935=0,0025164,g2(¬a)=0,9974836.g_2(a)=0{,}002\cdot0{,}29066+0{,}998\cdot0{,}001939=0{,}000581+0{,}001935=0{,}0025164,\qquad g_2(\neg a)=0{,}9974836. Il fattore g2g_2 è la distribuzione marginale dell'allarme: P(a)=0,0025164P(a)=0{,}0025164.

Passo 3: eliminare AA. Fattori con AA: g2g_2, fmf_m e fJf_J. Il prodotto è una tabella su JJ e AA e la somma su AA la riduce a un vettore su JJ: h(J)=∑ag2(a) fm(a) fJ(J,a)h(J)=\sum_ag_2(a)\,f_m(a)\,f_J(J,a).

  • h(j)=0,0025164⋅0,7⋅0,9+0,9974836⋅0,01⋅0,05=0,0015853+0,0004987=0,0020841h(j)=0{,}0025164\cdot0{,}7\cdot0{,}9+0{,}9974836\cdot0{,}01\cdot0{,}05=0{,}0015853+0{,}0004987=0{,}0020841;
  • h(¬j)=0,0025164⋅0,7⋅0,1+0,9974836⋅0,01⋅0,95=0,0001761+0,0094761=0,0096522h(\neg j)=0{,}0025164\cdot0{,}7\cdot0{,}1+0{,}9974836\cdot0{,}01\cdot0{,}95=0{,}0001761+0{,}0094761=0{,}0096522.

Passo 4: normalizzare. h(j)+h(¬j)=0,0117363=P(m)h(j)+h(\neg j)=0{,}0117363=P(m) e P(J∣m)=⟨0,0020841; 0,0096522⟩/0,0117363=⟨0,1776; 0,8224⟩.\mathbf P(J\mid m)=\langle0{,}0020841;\ 0{,}0096522\rangle/0{,}0117363=\langle0{,}1776;\ 0{,}8224\rangle. Interpretazione: P(j)=0,0521<P(j∣m)=0,1776P(j)=0{,}0521<P(j\mid m)=0{,}1776: se Maria chiama, è più probabile che l'allarme sia suonato e che chiami anche Giovanni (fork J←A→MJ\leftarrow A\rightarrow M: JJ e MM sono dipendenti se non si osserva AA).

Query 2: quali prodotti si riusano. Nell'enumerazione di 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) compaiono, sotto ee e sotto ¬e\neg e (e di nuovo per ¬b\neg b), gli stessi prodotti P(j∣a)P(m∣a)=0,9⋅0,7=0,63P(j\mid a)P(m\mid a)=0{,}9\cdot0{,}7=0{,}63 e P(j∣¬a)P(m∣¬a)=0,05⋅0,01=0,0005P(j\mid\neg a)P(m\mid\neg a)=0{,}05\cdot0{,}01=0{,}0005: nell'albero delle slide sono i rami cerchiati in rosa e in verde. L'eliminazione li calcola una sola volta, come fattore fJ(A)fM(A)=⟨0,63; 0,0005⟩f_J(A)f_M(A)=\langle0{,}63;\ 0{,}0005\rangle, poi forma la tabella g(B,E)=∑afA fJfMg(B,E)=\sum_af_A\,f_Jf_M (otto numeri: 0,5985250{,}598525, 0,592230{,}59223, 0,1830550{,}183055, 0,00112950{,}0011295 per (b,e),(b,¬e),(¬b,e),(¬b,¬e)(b,e),(b,\neg e),(\neg b,e),(\neg b,\neg e)) e infine h(B)=∑efE(e)g(B,e)=⟨0,5922426; 0,0014934⟩h(B)=\sum_ef_E(e)g(B,e)=\langle0{,}5922426;\ 0{,}0014934\rangle. Moltiplicando per fBf_B: ⟨0,0005922; 0,0014919⟩→⟨0,284; 0,716⟩\langle0{,}0005922;\ 0{,}0014919\rangle\to\langle0{,}284;\ 0{,}716\rangle, uguale al risultato dell'enumerazione.

Ordine di eliminazione. L'ordine E,B,AE,B,A dà lo stesso risultato: eliminando prima EE si forma g1′(A,B)=∑efE(e)fA(A,B,e)g_1'(A,B)=\sum_ef_E(e)f_A(A,B,e) con g1′(a,b)=0,002⋅0,95+0,998⋅0,94=0,94002g_1'(a,b)=0{,}002\cdot0{,}95+0{,}998\cdot0{,}94=0{,}94002 e g1′(a,¬b)=0,002⋅0,29+0,998⋅0,001=0,001578g_1'(a,\neg b)=0{,}002\cdot0{,}29+0{,}998\cdot0{,}001=0{,}001578; poi si elimina BB e infine AA, e si ottiene ancora ⟨0,1776; 0,8224⟩\langle0{,}1776;\ 0{,}8224\rangle (verificato). Cambia il costo, perché in reti più grandi alcuni ordini creano fattori più grandi: il costo dipende dalla dimensione del fattore più grande che si forma, non dal risultato.

Codice

python
import numpy as np

# fattori della rete burglary; ogni asse e' una variabile, indice 0 = vero, 1 = falso
f_B = np.array([0.001, 0.999])                              # f_B(B)
f_E = np.array([0.002, 0.998])                              # f_E(E)
f_A = np.zeros((2, 2, 2))                                   # f_A(A, B, E) = P(A | B, E)
for (b, e), p in {(0, 0): .95, (0, 1): .94, (1, 0): .29, (1, 1): .001}.items():
    f_A[0, b, e], f_A[1, b, e] = p, 1 - p
f_J = np.array([[0.90, 0.05], [0.10, 0.95]])                # f_J(J, A) = P(J | A)
f_M = np.array([[0.70, 0.01], [0.30, 0.99]])                # f_M(M, A) = P(M | A)

# Query: P(J | m).  Evidenza m: si fissa M = vero, f_M diventa un fattore su A soltanto
f_m = f_M[0, :]                                             # <P(m|a), P(m|~a)> = <0.7, 0.01>

# 1) eliminare B: g1(A, E) = sum_b f_B(b) f_A(A, b, E)
g1 = np.einsum('b,abe->ae', f_B, f_A)
# 2) eliminare E: g2(A) = sum_e f_E(e) g1(A, e)   (e' la marginale P(A))
g2 = np.einsum('e,ae->a', f_E, g1)
# 3) eliminare A: h(J) = sum_a g2(a) f_m(a) f_J(J, a)
h = np.einsum('a,a,ja->j', g2, f_m, f_J)
print("g1\n", g1); print("g2", g2); print("h", h, h / h.sum())

Output: g1 = [[0.29066 0.001939] [0.70934 0.998061]], g2 = [0.0025164 0.9974836], h = [0.0020841 0.0096522] e distribuzione [0.1775766 0.8224234]. np.einsum esegue in un colpo prodotto puntuale e somma: 'b,abe->ae' moltiplica fB(b)f_B(b) per fA(a,b,e)f_A(a,b,e) e somma sull'indice bb che non compare nel risultato. Verificato con l'enumerazione sulla congiunta completa: P(J∣m)=⟨0,1775766; 0,8224234⟩\mathbf P(J\mid m)=\langle0{,}1775766;\ 0{,}8224234\rangle.

Versione ripasso

  • Fattori: fB,fE,fA(A,B,E),fJ(J,A),fM(M,A)f_B,f_E,f_A(A,B,E),f_J(J,A),f_M(M,A); l'evidenza mm trasforma fMf_M in fm(A)=⟨0,7; 0,01⟩f_m(A)=\langle0{,}7;\ 0{,}01\rangle.
  • Passo di eliminazione di variabilimoltiplicare i fattori che contengono la variabile e sommarlaReti bayesiane - semantica, indipendenze e inferenza esatta →: per ogni nascosta, nell'ordine scelto.
  • P(J∣m)\mathbf P(J\mid m), ordine B,E,AB,E,A: g1(A,E)=∑bfBfAg_1(A,E)=\sum_bf_B f_A: 0,290660{,}29066 (a,ea,e), 0,0019390{,}001939 (a,¬ea,\neg e); g2(A)=∑efEg1=⟨0,0025164; 0,9974836⟩g_2(A)=\sum_ef_Eg_1=\langle0{,}0025164;\ 0{,}9974836\rangle (marginale di AA); h(J)=∑ag2fmfJ=⟨0,0020841; 0,0096522⟩h(J)=\sum_ag_2f_mf_J=\langle0{,}0020841;\ 0{,}0096522\rangle.
  • Risultato: P(J∣m)=⟨0,1776; 0,8224⟩\mathbf P(J\mid m)=\langle0{,}1776;\ 0{,}8224\rangle (contro P(j)=0,052P(j)=0{,}052: JJ e MM dipendenti senza AA).
  • Riuso: fJfM(A)=⟨0,63; 0,0005⟩f_Jf_M(A)=\langle0{,}63;\ 0{,}0005\rangle calcolato una volta sola; g(B,E)g(B,E) con otto numeri, h(B)=⟨0,5922426; 0,0014934⟩h(B)=\langle0{,}5922426;\ 0{,}0014934\rangle, risultato ⟨0,284; 0,716⟩\langle0{,}284;\ 0{,}716\rangle come l'enumerazione.
  • Errori tipici: sommare una variabile prima di aver moltiplicato tutti i fattori che la contengono; dimenticare che l'evidenza riduce i fattori; credere che l'ordine cambi il risultato (cambia solo il costo).
  • Fork: P(j)=0,0521<P(j∣m)=0,1776P(j)=0{,}0521<P(j\mid m)=0{,}1776: JJ e MM dipendenti se AA non è osservato. Ordine E,B,AE,B,A: g1′(a,b)=0,94002g_1'(a,b)=0{,}94002, g1′(a,¬b)=0,001578g_1'(a,\neg b)=0{,}001578, stesso risultato.
  • einsum: 'b,abe->ae' moltiplica fB(b)fA(a,b,e)f_B(b)f_A(a,b,e) e somma sull'indice bb che non compare nel risultato.

Teoria collegata