Rozważmy następującą prostą ilustrację przedstawionego mechanizmu wnioskowania, traktując rozważane w niej przykładowe fakty i hipotezy z należnym dystansem. Weźmiemy pod uwagę sytuację, w której diagnozując dolegliwości pacjenta ograniczono zbiór możliwych diagnoz do następujących dwóch wykluczających się hipotez:
$h \,$: pacjent jest chory na grypę,
$\neg h \,$: pacjent nie jest chory na grypę.
Podstawą do wnioskowania mogą być następujące pojedyncze fakty:
$f_1 \,$: pacjent ma katar,
$f_2 \,$: pacjent ma kaszel,
$f_3 \,$: pacjent ma gorączkę.
Przyjmijmy, że dostarczający wiedzę do systemu diagnostycznego ekspert ustalił następujące wartości prawdopodobieństw:
$\mathrm{Pr}(h) = \; 0.1\ \; \mathrm{Pr}(\neg h) = \; 0.9 \,$
$\mathrm{Pr}(f_1|h) = \; 0.5\ \; \mathrm{Pr}(f_1|\neg h) = \; 0.3 \,$
$\mathrm{Pr}(f_2|h) = \; 0.3\ \; \mathrm{Pr}(f_2|\neg h) = \; 0.3 \,$
$\mathrm{Pr}(f_3|h) = \; 0.8\ \; \mathrm{Pr}(f_3|\neg h) = \; 0.4 \,$
Na tej podstawie możemy obliczyć prawdopodobieństwa faktów:
$\mathrm{Pr}(f_1) = \, \mathrm{Pr}(h)\mathrm{Pr}(f_1|h) + \mathrm{Pr}(\neg h)\mathrm{Pr}(f_1|\neg h) = 0.1\cdot 0.5+0.9\cdot 0.3 = 0.32 \,$
$\mathrm{Pr}(f_2) = \, \mathrm{Pr}(h)\mathrm{Pr}(f_2|h) + \mathrm{Pr}(\neg h)\mathrm{Pr}(f_2|\neg h) = 0.1\cdot 0.3+0.9\cdot 0.3 = 0.3 \,$
$\mathrm{Pr}(f_3) = \, \mathrm{Pr}(h)\mathrm{Pr}(f_3|h) + \mathrm{Pr}(\neg h)\mathrm{Pr}(f_3|\neg h) = 0.1\cdot 0.8+0.9\cdot 0.4 = 0.44 \,$
Aby wyznaczyć prawdopodobieństwa a posteriori rozważanych hipotez na podstawie każdego z pojedynczych objawów stosujemy bezpośrednio wzór Bayesa:
$\mathrm{Pr}(h|f_1) = \, \frac{\mathrm{Pr}(h)\mathrm{Pr}(f_1|h)}{\mathrm{Pr}(f_1)} = \frac{0.1\cdot 0.5}{0.32} = 0.15625 \,$
$\mathrm{Pr}(h|f_2) = \, \frac{\mathrm{Pr}(h)\mathrm{Pr}(f_2|h)}{\mathrm{Pr}(f_2)} = \frac{0.1\cdot 0.3}{0.33} = 0.1 \,$
$\mathrm{Pr}(h|f_3) = \, \frac{\mathrm{Pr}(h)\mathrm{Pr}(f_3|h)}{\mathrm{Pr}(f_3)} = \frac{0.1\cdot 0.8}{0.44} = 0.18182 \,$
Można również obliczyć prawdopodobieństw a posteriori rozważanych hipotez na podstawie dowolnych dwóch objawów oraz wszystkich trzech objawów.
Uwaga: W bardziej praktycznych zadadnieniach, rozważane modele są dużo bardziej skomplikowane, a modelowane fakty mogą przyjmować wartości z dowolnymi rozkładami prawdopodobieństwa zarówno dyskretnymi jaki i ciągłymi, ponadto mogą między nimi występować przeróżne zależności. Wówczas obliczenie odpowiednich prawdopodobieństw nie jest już takie proste, a czasami nawet nie do obliczenia analitycznie.
W takich przypadkach odpowiednie prawdopodobieństwa obliczamy za użyciu symulacji.
import pymc
Uwaga: Z różnych przyczyn technicznych, na komputerach w sali zainstalowany został Python 3.6 z dystrybucją Anaconda (https://www.continuum.io/downloads), a następnie zainstalowany został moduł pymc. Dlatego należy używać interpretera z tej właśnie dystrybucji.
Wykorzystywane będą też moduły: numpy (http://www.numpy.org/) oraz pandas (http://pandas.pydata.org/), do zapoznania się w materiałach z kursu (https://github.com/amarszalek/PythonKurs). Spotkanie 4 i 6.
import numpy as np
import pandas as pd
# zmienna grypa o rozkładzie Bernoulliego z prawd. 0.1,
# z prawd. 0.1 True (grypa), z prawd. 0.9 False (nie grypa)
grypa = pymc.Bernoulli('grypa', .1, value=np.ones(1))
# prawd. kataru pod warunkiem grypy
# jeżeli grypa to p_katar=0.5, jeżeli nie grypa to p_katar=0.3
p_katar = pymc.Lambda('p_katar', lambda grypa=grypa: np.where(grypa, .5, .3))
# zmienna katar o rozkładie Bernoulliego
katar = pymc.Bernoulli('katar', p_katar, value=np.ones(1))
# prawd. kaszlu pod warunkiem grypy
# jeżeli grypa to p_kaszel=0.3, jeżeli nie grypa to p_kaszel=0.3
p_kaszel = pymc.Lambda('p_kaszel', lambda grypa=grypa: np.where(grypa, .3, .3))
# zmienna kaszel o rozkładie Bernoulliego
kaszel = pymc.Bernoulli('kaszel', p_kaszel, value=np.ones(1))
# prawd. goraczki pod warunkiem grypy
# jeżeli grypa to p_goraczka=0.8, jeżeli nie grypa to p_goraczka=0.4
p_goraczka = pymc.Lambda('p_goraczka', lambda grypa=grypa: np.where(grypa, .8, .4))
goraczka = pymc.Bernoulli('goraczka', p_goraczka, value=np.ones(1))
# model
model = pymc.Model([katar, p_katar, kaszel, p_kaszel, goraczka, p_goraczka, grypa])
mcmc = pymc.MCMC(model)
mcmc.sample(10000,2000) #im więcej iteracji tym lepsze oszacowania ale dłuższy czas wykonania
Wszystkie wyniki symulacji przechowywane są w obiekcie mcmc
, dla ułatwienia obliczeń odpowiednie wartości zmiennych zapiszemy w nowym obiekcie DataFrame
z modułu pandas
# wyciągnięcie scieżek dla każdej ze zmiennych
t_grypa = mcmc.trace('grypa')[:]
t_katar = mcmc.trace('katar')[:]
t_kaszel = mcmc.trace('kaszel')[:]
t_goraczka = mcmc.trace('goraczka')[:]
# stworzenie słownika, zamieniamy wartości logiczne True/False na 1/0
dictionary = {
'Grypa': [1 if ii[0] else 0 for ii in t_grypa.tolist() ],
'Katar': [1 if ii[0] else 0 for ii in t_katar.tolist() ],
'Kaszel': [1 if ii[0] else 0 for ii in t_kaszel.tolist()],
'Goraczka': [1 if ii[0] else 0 for ii in t_goraczka.tolist()],
}
# stworzenie obiektu DataFrame
df = pd.DataFrame(dictionary)
# podgląd tabeli (pierwsze 5 wierszy)
df.head()
# bezwarunkowe prawd. grypy (z założenia powinno być 0.1)
p_grypa = float(df[df['Grypa'] == 1].shape[0])/len(df)
print('p_grypa:', p_grypa)
# bezwarunkowe prawd. kataru (0.32)
p_katar = float(df[df['Katar'] == 1].shape[0])/len(df)
print('p_katar', p_katar)
# bezwarunkowe prawd. kaszlu (0.3)
p_kaszel = float(df[df['Kaszel'] == 1].shape[0])/len(df)
print('p_kaszel', p_kaszel)
# bezwarunkowe prawd. goraczki (0.44)
p_goraczka = float(df[df['Goraczka'] == 1].shape[0])/len(df)
print('p_goraczka', p_goraczka)
# prawd. grypy pod warunkiem wystąpienia kataru (0.15625)
p_grypa_katar = float(df[(df['Grypa'] == 1) & (df['Katar'] == 1)].shape[0]) / df[df['Katar'] == 1].shape[0]
print('p_grypa_katar:', p_grypa_katar)
# prawd. grypy pod warunkiem wystąpienia kaszlu (0.1)
p_grypa_kaszel = float(df[(df['Grypa'] == 1) & (df['Kaszel'] == 1)].shape[0]) / df[df['Kaszel'] == 1].shape[0]
print('p_grypa_kaszel:', p_grypa_kaszel)
# prawd. grypy pod warunkiem wystąpienia goraczki (0.18182)
p_grypa_goraczka = float(df[(df['Grypa'] == 1) & (df['Goraczka'] == 1)].shape[0]) / df[df['Goraczka'] == 1].shape[0]
print('p_grypa_goraczka:', p_grypa_goraczka)
# prawd. grypy pod warunkiem wystąpienia kataru i goraczki (0.284(09))
p_grypa_katar_goraczka = float(df[(df['Grypa'] == 1) & (df['Katar'] == 1) & (df['Goraczka'] == 1)].shape[0]) / df[(df['Katar'] == 1) & (df['Goraczka'] == 1)].shape[0]
print('p_grypa_katar_goraczka:', p_grypa_katar_goraczka)
źródło: (http://wazniak.mimuw.edu.pl/index.php?title=Sztuczna_inteligencja/SI_%C4%86wiczenia_4)
W śledztwie dotyczącym zabójstwa inspektor Bayes rozważa dwie hipotezy:
$h \,$ – że główny podejrzany zabił,
$\neg h \,$ – że główny podejrzany nie zabił
oraz następujące możliwe fakty:
$f_1 \,$ – że na miejscu zbrodni znaleziono odciski palców głównego podejrzanego,
$f_2 \,$ – że główny podejrzany nie ma alibi na czas popełnienia zabójstwa,
$f_3 \,$ – że główny podejrzany miał motyw zabicia ofiary,
$f_4 \,$ – że główny podejrzany był widziany w sądziedztwie miejsca, w którym mieszka nielegalny handlarz bronią,
$f_5 \,$ – że świadek zbrodni podał rysopis zabójcy nie pasujący do głównego podejrzanego.
Zależności między takimi faktami a hipotezami opisują następujące prawdopodobieństwa:
$\mathrm{Pr}(f_1|h)=0,7\ \ \mathrm{Pr}f_1|\neg h)=0,3$
$\mathrm{Pr}(f_2|h)=0,8\ \ \mathrm{Pr}(f_2|\neg h)=0,4$
$\mathrm{Pr}(f_3|h)=0,9\ \ \mathrm{Pr}(f_3|\neg h)=0,5$
$\mathrm{Pr}(f_4|h)=0,4\ \ \mathrm{Pr}(f_4|\neg h)=0,2$
$\mathrm{Pr}(f_5|h)=0,2\ \ \mathrm{Pr}(f_5|\neg h)=0,4$
W którym przypadku prawdopodobieństwo popełnienia zabójstwa byłoby największe:
W śledztwie dotyczącym zabójstwa inspektor Bayes wyłonił trzech podejrzanych A, B i C, w konsekwencji czego rozważa trzy możliwe hipotezy, wzajemnie wykluczające się i wyczerpujące wszystkie możliwości:
$h_A \,$ – zabił A,
$h_B \,$ – zabił B,
$h_C \,$ – zabił C
oraz następujące możliwe fakty:
$f_{1A} \,, f_{1B} \,, f_{1C} \,$ – że na miejscu zbrodni znaleziono odciski palców podejrzanego A, B, C,
$f_{2A} \,, f_{2B} \,, f_{2C} \,$ – że podejrzany A, B, C nie ma alibi na czas popełnienia zabójstwa,
$f_{3A} \,, f_{3B} \,, f_{3C} \,$ – że podejrzany A, B, C miał oczywisty motyw zabicia ofiary,
$f_{4A} \,, f_{4B} \,, f_{4C} \,$ – że świadek zbrodni podał rysopis zabójcy nie pasujący do podejrzanego A. B, C,
$f_{5A} \,, f_{5B} \,, f_{5C} \,$ – że podejrzany A, B, C jest szanowanym obywatelem nie budzącym u nikogo żadnych podejrzeń.
Zależności między takimi faktami a hipotezami opisują następujące prawdopodobieństwa:
$\mathrm{Pr}(f_{1x}|h_x)=0,7$
$\mathrm{Pr}(f_{2x}|h_x)=0,9$
$\mathrm{Pr}(f_{3x}|h_x)=0,6$
$\mathrm{Pr}(f_{4x}|h_x)=0,2$
$\mathrm{Pr}(f_{5x}|h_x)=0,3$
dla $x$=A, B, C. Wstępnie inspektor założył, że prawdopodobieństwo popełnienia zbrodni przez każdego z podejrzanych jest jednakowe. W wyniku śledztwa ustalono, że:
Którego z podejrzanych powinien aresztować inspektor Bayes jako najbardziej prawdopodobnego zabójcę?
W obu zadaniach zainteresowani mogą policzyć zadane prawdopodobieństwa również analitycznie
Sprawozdanie z wykonanych zadań (.py, lub. ipynb) należy wysłać na maila prowadzącego w terminie do kolejnych zajęć. Wszelkie opisy i wyjaśnienia proszę zapisywać w plikach jako komentarze.