Salta al contenuto
Note per Studenti Esercizio - Filtraggio in un HMM - il bambino e il pannolino (slide del corso)

Esercizio - Filtraggio in un HMM - il bambino e il pannolino (slide del corso)

In questa pagina 3

Testo (slide Probabilistic reasoning over time (part 2), corso di Intelligenza Artificiale, Ing. dell'Informazione UniPD). Un bambino porta un pannolino che può essere, con la stessa probabilità, "pulito" o "sporco" (stato nascosto). Il bambino ha un vocabolario di quattro parole: "mama", "papa", "poo-poo", "pee-pee". Al momento del cambio, se il pannolino era pulito, le probabilità di essere pulito o sporco al cambio successivo sono uguali; se era sporco, la probabilità di essere pulito al cambio successivo è 0,80{,}8 e 0,20{,}2 di essere ancora sporco (probabilità di transizione). Inoltre, quando il pannolino è pulito, "mama" e "papa" hanno probabilità 0,40{,}4 ciascuna, "poo-poo" e "pee-pee" 0,10{,}1 ciascuna; quando è sporco, "mama" e "papa" hanno 0,10{,}1 ciascuna e "poo-poo" e "pee-pee" 0,40{,}4 (probabilità di emissione).

Domanda: qual è la probabilità che il bambino dica la sequenza "mama" "mama" "pee-pee" "pee-pee" (con le usuali ipotesi di Markov)?


Formulazione

Stato nascosto Xt∈{pulito,sporco}X_t\in\{\text{pulito},\text{sporco}\}, evidenza ete_t = parola detta al cambio tt (Ragionamento probabilistico nel tempo - catene di Markov, HMM, filtraggio e smoothingPer ragionare sul tempo il mondo è una sequenza di istanti: stato nascosto $X_t$ ed evidenza osservata $E_t$. Ipotesi di Markov del primo ordine $P(X_t\mid X_{0:t-1})=P(X_t\mid X_{t-1})$ (modello di transizione) e ipotesi del sensore $P(E_t\mid X_{0:t},E_{1:t-1})=P(E_t\mid X_t)$ (modello del sensore): congiunta $P(X_0)\prod_t P(X_t\mid X_{t-1})P(E_t\mid X_t)$. Un HMM ha uno stato discreto a $S$ valori: transizione = matrice $\mathbf T$ ($T_{ij}=P(X_t=j\mid X_{t-1}=i)$), sensore = matrici diagonali $\mathbf O_t$. Compiti: filtraggio $P(X_t\mid e_{1:t})$, predizione $P(X_{t+k}\mid e_{1:t})$, smoothing $P(X_{t-k}\mid e_{1:t})$, spiegazione più probabile $\arg\max P(x_{1:t}\mid e_{1:t})$. Filtraggio ricorsivo: $\mathbf f_t=\alpha,\mathbf O_t\mathbf T^\top\mathbf f_{t-1}$ (predizione, poi aggiornamento). Mondo dell'ombrello: $\mathbf f_1=\langle0{,}818;\ 0{,}182\rangle$, $\mathbf f_2=\langle0{,}883;\ 0{,}117\rangle$. Senza normalizzare, $\mathbf s_t=\mathbf O_t\mathbf T^\top\mathbf s_{t-1}$ dà la verosimiglianza $P(e_{1:t})$.Ragionamento probabilistico nel tempo - catene di Markov, HMM, filtraggio e smoothing →). Prior P(X0)=⟨0,5; 0,5⟩\mathbf P(X_0)=\langle0{,}5;\ 0{,}5\rangle. Transizione (T\mathbf T, riga = stato di partenza, colonne pulito/sporco) ed emissione (Oe\mathbf O^{e} diagonale): T=(0,50,50,80,2),Omama=Opapa=(0,4000,1),Opoo-poo=Opee-pee=(0,1000,4).\mathbf T=\begin{pmatrix}0{,}5&0{,}5\\0{,}8&0{,}2\end{pmatrix},\quad \mathbf O^{\text{mama}}=\mathbf O^{\text{papa}}=\begin{pmatrix}0{,}4&0\\0&0{,}1\end{pmatrix},\quad \mathbf O^{\text{poo-poo}}=\mathbf O^{\text{pee-pee}}=\begin{pmatrix}0{,}1&0\\0&0{,}4\end{pmatrix}.

Si vuole P(e1,e2,e3,e4)=∑x4P(e1,…,e4,x4)P(e_1,e_2,e_3,e_4)=\sum_{x_4}P(e_1,\dots,e_4,x_4) (la probabilità della sequenza è la somma, sullo stato finale, della probabilità congiunta con quello stato).

Soluzione

Ricorsione. Sia st=P(e1:t,Xt)\mathbf s_t=\mathbf P(e_{1:t},X_t). Per le due ipotesi di Markov: st=P(et∣Xt)∑xt−1P(Xt∣xt−1) st−1(xt−1)⟺st=Ot T⊤ st−1,s0=P(X0).\mathbf s_t=\mathbf P(e_t\mid X_t)\sum_{x_{t-1}}\mathbf P(X_t\mid x_{t-1})\,s_{t-1}(x_{t-1})\quad\Longleftrightarrow\quad\mathbf s_t=\mathbf O_t\,\mathbf T^\top\,\mathbf s_{t-1},\qquad\mathbf s_0=\mathbf P(X_0). È il filtraggio senza la normalizzazione α\alpha: così la somma finale conserva P(e1:t)P(e_{1:t}).

Passo 1, "mama". T⊤s0=(0,50,80,50,2)(0,50,5)=(0,650,35)\mathbf T^\top\mathbf s_0=\begin{pmatrix}0{,}5&0{,}8\\0{,}5&0{,}2\end{pmatrix}\begin{pmatrix}0{,}5\\0{,}5\end{pmatrix}=\begin{pmatrix}0{,}65\\0{,}35\end{pmatrix} (probabilità di essere pulito/sporco al primo cambio: 0,5⋅0,5+0,5⋅0,8=0,650{,}5\cdot0{,}5+0{,}5\cdot0{,}8=0{,}65). Moltiplicando per Omama\mathbf O^{\text{mama}}: s1=⟨0,4⋅0,65; 0,1⋅0,35⟩=⟨0,260; 0,035⟩\mathbf s_1=\langle0{,}4\cdot0{,}65;\ 0{,}1\cdot0{,}35\rangle=\langle0{,}260;\ 0{,}035\rangle.

Passo 2, "mama". T⊤s1=⟨0,5⋅0,26+0,8⋅0,035; 0,5⋅0,26+0,2⋅0,035⟩=⟨0,158; 0,137⟩\mathbf T^\top\mathbf s_1=\langle0{,}5\cdot0{,}26+0{,}8\cdot0{,}035;\ 0{,}5\cdot0{,}26+0{,}2\cdot0{,}035\rangle=\langle0{,}158;\ 0{,}137\rangle, poi s2=⟨0,4⋅0,158; 0,1⋅0,137⟩=⟨0,0632; 0,0137⟩\mathbf s_2=\langle0{,}4\cdot0{,}158;\ 0{,}1\cdot0{,}137\rangle=\langle0{,}0632;\ 0{,}0137\rangle.

Passo 3, "pee-pee". T⊤s2=⟨0,5⋅0,0632+0,8⋅0,0137; 0,5⋅0,0632+0,2⋅0,0137⟩=⟨0,04256; 0,03434⟩\mathbf T^\top\mathbf s_2=\langle0{,}5\cdot0{,}0632+0{,}8\cdot0{,}0137;\ 0{,}5\cdot0{,}0632+0{,}2\cdot0{,}0137\rangle=\langle0{,}04256;\ 0{,}03434\rangle, poi s3=⟨0,1⋅0,04256; 0,4⋅0,03434⟩=⟨0,004256; 0,013736⟩\mathbf s_3=\langle0{,}1\cdot0{,}04256;\ 0{,}4\cdot0{,}03434\rangle=\langle0{,}004256;\ 0{,}013736\rangle.

Passo 4, "pee-pee". T⊤s3=⟨0,5⋅0,004256+0,8⋅0,013736; 0,5⋅0,004256+0,2⋅0,013736⟩=⟨0,0131168; 0,0048752⟩\mathbf T^\top\mathbf s_3=\langle0{,}5\cdot0{,}004256+0{,}8\cdot0{,}013736;\ 0{,}5\cdot0{,}004256+0{,}2\cdot0{,}013736\rangle=\langle0{,}0131168;\ 0{,}0048752\rangle, poi s4=⟨0,1⋅0,0131168; 0,4⋅0,0048752⟩=⟨0,00131168; 0,00195008⟩\mathbf s_4=\langle0{,}1\cdot0{,}0131168;\ 0{,}4\cdot0{,}0048752\rangle=\langle0{,}00131168;\ 0{,}00195008\rangle.

Somma. P(e1,e2,e3,e4)=0,00131168+0,00195008=0,00326176≈0,0033.P(e_1,e_2,e_3,e_4)=0{,}00131168+0{,}00195008=0{,}00326176\approx0{,}0033. Le slide arrotondano ogni vettore a tre decimali (s1=⟨0,260; 0,035⟩\mathbf s_1=\langle0{,}260;\,0{,}035\rangle, s2=⟨0,063; 0,014⟩\mathbf s_2=\langle0{,}063;\,0{,}014\rangle, s3=⟨0,004; 0,014⟩\mathbf s_3=\langle0{,}004;\,0{,}014\rangle, s4=⟨0,001; 0,002⟩\mathbf s_4=\langle0{,}001;\,0{,}002\rangle) e scrivono 0,001+0,002=0,0030{,}001+0{,}002=0{,}003: l'arrotondamento a ogni passo fa perdere circa l'8%8\% del valore (le componenti di s4\mathbf s_4 hanno una sola cifra significativa). Il valore calcolato senza arrotondare è 0,003260{,}00326.

Controlli.

  • Forza bruta: sommando il prodotto P(x0)∏tP(xt∣xt−1)P(et∣xt)P(x_0)\prod_tP(x_t\mid x_{t-1})P(e_t\mid x_t) su tutte le 25=322^5=32 sequenze di stati x0,…,x4x_0,\dots,x_4 si ottiene 0,003261760{,}00326176.
  • Prodotto dei fattori di normalizzazione del filtraggio: 0,295⋅0,2607⋅0,2340⋅0,1813=0,003260{,}295\cdot0{,}2607\cdot0{,}2340\cdot0{,}1813=0{,}00326, perché P(e1:4)=∏tP(et∣e1:t−1)P(e_{1:4})=\prod_tP(e_t\mid e_{1:t-1}).

Cosa si ricava ancora.

  • Filtraggio dopo le quattro parole: f4=s4/∑s4=⟨0,402; 0,598⟩\mathbf f_4=\mathbf s_4/\sum\mathbf s_4=\langle0{,}402;\ 0{,}598\rangle (pulito 0,4020{,}402, sporco 0,5980{,}598: le ultime due parole, "pee-pee", sono più probabili con il pannolino sporco).
  • Smoothing con forward-backward (bk+1:4=TOk+1bk+2:4\mathbf b_{k+1:4}=\mathbf T\mathbf O_{k+1}\mathbf b_{k+2:4}): P(pulito1∣e1:4)=0,840P(\text{pulito}_1\mid e_{1:4})=0{,}840, P(pulito2∣e1:4)=0,862P(\text{pulito}_2\mid e_{1:4})=0{,}862, P(pulito3∣e1:4)=0,326P(\text{pulito}_3\mid e_{1:4})=0{,}326, P(pulito4∣e1:4)=0,402P(\text{pulito}_4\mid e_{1:4})=0{,}402. Dopo la sola prima parola il pannolino è pulito con probabilità 0,8810{,}881; le due "pee-pee" finali, più probabili con il pannolino sporco, abbassano a 0,3260{,}326 la probabilità di pulito al terzo cambio.

Codice

python
import numpy as np

T = np.array([[0.5, 0.5],          # T[i, j] = P(X_t = j | X_{t-1} = i); stati: [pulito, sporco]
              [0.8, 0.2]])
O = {'mama': np.diag([0.4, 0.1]), 'papa': np.diag([0.4, 0.1]),      # P(parola | stato) sulla diagonale
     'poo-poo': np.diag([0.1, 0.4]), 'pee-pee': np.diag([0.1, 0.4])}
s = np.array([0.5, 0.5])           # P(X_0): pulito e sporco equiprobabili

for parola in ['mama', 'mama', 'pee-pee', 'pee-pee']:
    s = O[parola] @ T.T @ s        # s_t = O_t T^T s_{t-1}, SENZA normalizzare
    print(parola, s)
print("P(sequenza) =", s.sum())
print("filtraggio dopo 4 parole:", s / s.sum())

Output:

mama [0.26  0.035]
mama [0.0632 0.0137]
pee-pee [0.004256 0.013736]
pee-pee [0.00131168 0.00195008]
P(sequenza) = 0.00326176
filtraggio dopo 4 parole: [0.40213872 0.59786128]

Versione ripasso

  • Modello: stati pulito/sporco, P(X0)=⟨0,5; 0,5⟩\mathbf P(X_0)=\langle0{,}5;\,0{,}5\rangle; T=(0,50,50,80,2)\mathbf T=\begin{pmatrix}0{,}5&0{,}5\\0{,}8&0{,}2\end{pmatrix}; Omama=diag(0,4; 0,1)\mathbf O^{\text{mama}}=\text{diag}(0{,}4;\,0{,}1), Opee-pee=diag(0,1; 0,4)\mathbf O^{\text{pee-pee}}=\text{diag}(0{,}1;\,0{,}4).
  • Domanda: P(mama,mama,pee-pee,pee-pee)=∑x4P(e1:4,x4)P(\text{mama},\text{mama},\text{pee-pee},\text{pee-pee})=\sum_{x_4}P(e_{1:4},x_4).
  • Ricorsione (filtraggio senza normalizzarest=OtT⊤st−1\mathbf s_t=\mathbf O_t\mathbf T^\top\mathbf s_{t-1}, la somma finale è P(e1:t)P(e_{1:t})Ragionamento probabilistico nel tempo - catene di Markov, HMM, filtraggio e smoothing →).
  • Passi: s1=⟨0,26; 0,035⟩\mathbf s_1=\langle0{,}26;\,0{,}035\rangle; s2=⟨0,0632; 0,0137⟩\mathbf s_2=\langle0{,}0632;\,0{,}0137\rangle; s3=⟨0,004256; 0,013736⟩\mathbf s_3=\langle0{,}004256;\,0{,}013736\rangle; s4=⟨0,00131168; 0,00195008⟩\mathbf s_4=\langle0{,}00131168;\,0{,}00195008\rangle.
  • Risultato: P=0,00326P=0{,}00326 (le slide, arrotondando, 0,0030{,}003). Verificato con la forza bruta su 3232 sequenze. Filtrato finale ⟨0,402; 0,598⟩\langle0{,}402;\ 0{,}598\rangle.
  • Errori tipici: normalizzare a ogni passo e poi sommare (si ottiene 11); usare T\mathbf T al posto di T⊤\mathbf T^\top; scambiare le righe di O\mathbf O per "mama" e "pee-pee".
  • Passi a mano: T⊤s0=⟨0,65; 0,35⟩\mathbf T^\top\mathbf s_0=\langle0{,}65;\,0{,}35\rangle; T⊤s1=⟨0,158; 0,137⟩\mathbf T^\top\mathbf s_1=\langle0{,}158;\,0{,}137\rangle; T⊤s2=⟨0,04256; 0,03434⟩\mathbf T^\top\mathbf s_2=\langle0{,}04256;\,0{,}03434\rangle; T⊤s3=⟨0,0131168; 0,0048752⟩\mathbf T^\top\mathbf s_3=\langle0{,}0131168;\,0{,}0048752\rangle, ognuno moltiplicato per la diagonale della parola.
  • Controlli: forza bruta sulle 25=322^5=32 sequenze: 0,003261760{,}00326176; prodotto dei fattori di normalizzazione 0,295⋅0,2607⋅0,2340⋅0,1813=0,003260{,}295\cdot0{,}2607\cdot0{,}2340\cdot0{,}1813=0{,}00326. Le slide arrotondano a tre decimali a ogni passo e trovano 0,0030{,}003 (circa 8%8\% in meno).
  • Smoothing (forward-backward): pulito al cambio 1,2,3,41,2,3,4 con 0,8400{,}840, 0,8620{,}862, 0,3260{,}326, 0,4020{,}402; filtraggio dopo la prima parola 0,8810{,}881.

Teoria collegata