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 è e di essere ancora sporco (probabilità di transizione). Inoltre, quando il pannolino è pulito, "mama" e "papa" hanno probabilità ciascuna, "poo-poo" e "pee-pee" ciascuna; quando è sporco, "mama" e "papa" hanno ciascuna e "poo-poo" e "pee-pee" (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 , evidenza = parola detta al cambio (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 . Transizione (, riga = stato di partenza, colonne pulito/sporco) ed emissione ( diagonale):
Si vuole (la probabilità della sequenza è la somma, sullo stato finale, della probabilità congiunta con quello stato).
Soluzione
Ricorsione. Sia . Per le due ipotesi di Markov: È il filtraggio senza la normalizzazione : così la somma finale conserva .
Passo 1, "mama". (probabilità di essere pulito/sporco al primo cambio: ). Moltiplicando per : .
Passo 2, "mama". , poi .
Passo 3, "pee-pee". , poi .
Passo 4, "pee-pee". , poi .
Somma. Le slide arrotondano ogni vettore a tre decimali (, , , ) e scrivono : l'arrotondamento a ogni passo fa perdere circa l' del valore (le componenti di hanno una sola cifra significativa). Il valore calcolato senza arrotondare è .
Controlli.
- Forza bruta: sommando il prodotto su tutte le sequenze di stati si ottiene .
- Prodotto dei fattori di normalizzazione del filtraggio: , perché .
Cosa si ricava ancora.
- Filtraggio dopo le quattro parole: (pulito , sporco : le ultime due parole, "pee-pee", sono più probabili con il pannolino sporco).
- Smoothing con forward-backward (): , , , . Dopo la sola prima parola il pannolino è pulito con probabilità ; le due "pee-pee" finali, più probabili con il pannolino sporco, abbassano a la probabilità di pulito al terzo cambio.
Codice
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, ; ; , .
- Domanda: .
- Ricorsione (filtraggio senza normalizzare, la somma finale è Ragionamento probabilistico nel tempo - catene di Markov, HMM, filtraggio e smoothing →).
- Passi: ; ; ; .
- Risultato: (le slide, arrotondando, ). Verificato con la forza bruta su sequenze. Filtrato finale .
- Errori tipici: normalizzare a ogni passo e poi sommare (si ottiene ); usare al posto di ; scambiare le righe di per "mama" e "pee-pee".
- Passi a mano: ; ; ; , ognuno moltiplicato per la diagonale della parola.
- Controlli: forza bruta sulle sequenze: ; prodotto dei fattori di normalizzazione . Le slide arrotondano a tre decimali a ogni passo e trovano (circa in meno).
- Smoothing (forward-backward): pulito al cambio con , , , ; filtraggio dopo la prima parola .