Esercizio - Diagnosi COVID con la regola di Bayes (laboratorio 5)
In questa pagina 3
Testo (laboratorio 5, Probability and Bayesian networks, part A, corso di Intelligenza Artificiale, Ing. dell'Informazione UniPD). Si vuole calcolare la probabilità di avere il COVID-19 in base a tre possibili sintomi: febbre alta, tosse continua, perdita di gusto e olfatto. La probabilità di essere infetti è e, in tal caso, le probabilità di sviluppare i sintomi sono:
- febbre alta: con COVID, solo senza;
- tosse continua: con COVID, solo senza;
- perdita di gusto e olfatto: con COVID, solo senza.
Domanda: qual è la probabilità di avere il COVID data la presenza di tutti e tre i sintomi?
Formalizzazione
Quattro variabili booleane: malattia , febbre , tosse , perdita di gusto/olfatto . Lettera minuscola = valore vero ( significa , significa ). Si cerca .
Dati del problema, scritti come distribuzioni:
Soluzione
Passo 2: numeratore. Dato i tre sintomi sono condizionalmente indipendenti (se so di avere il COVID, la febbre non cambia la probabilità della tosse): la rete è un naive Bayes , , . Quindi
Passo 3: denominatore. Legge delle probabilità totali sui due valori di :
Passo 4: risultato. Quasi , anche se il prior è : la perdita di gusto e olfatto ( volte più probabile con il COVID) pesa moltissimo.
Come cresce la credenza. Aggiungendo un sintomo alla volta (stessa formula con meno fattori): nessun sintomo ; solo febbre ; febbre e tosse ; tutti e tre . I rapporti di verosimiglianza () sono , e , con prodotto ; moltiplicato per l'odds a priori dà l'odds a posteriori , cioè probabilità .
Codice
import numpy as np
p_d = np.array([0.01, 0.99]) # P(D) = <P(d), P(non d)>
# riga 0: malato, riga 1: non malato; colonna 0: sintomo presente, colonna 1: assente
p_f = np.array([[0.10, 0.90], [0.02, 0.98]]) # P(F | D)
p_c = np.array([[0.20, 0.80], [0.05, 0.95]]) # P(C | D)
p_l = np.array([[0.15, 0.85], [0.001, 0.999]]) # P(L | D)
num = p_f[0, 0] * p_c[0, 0] * p_l[0, 0] * p_d[0] # P(f|d)P(c|d)P(l|d)P(d)
alt = p_f[1, 0] * p_c[1, 0] * p_l[1, 0] * p_d[1] # P(f|~d)P(c|~d)P(l|~d)P(~d)
print(num, alt)
print(num / (num + alt))Output: 3.0000000000000004e-05 9.9e-07 e 0.9680542110358179. Verificato anche per enumerazione sulle righe della congiunta: e .
Versione ripasso
- Dati: ; , ; , ; , . Cerco .
- Bayes (regola di BayesIncertezza - probabilità, regola di Bayes e indipendenza condizionata →) e indipendenza condizionatadato i sintomi non si influenzano: .
- Numeratore: . Denominatore: .
- Risultato: . Un sintomo alla volta: .
- Errori tipici: dimenticare di sommare anche il caso al denominatore; usare invece di ; scambiare con .