Wstęp do stucznej inteligencji - laboratoria

Wnioskowanie na podstawie wiedzy niepewnej i niepełnej: Wnioskowanie Bayesowskie

Przykład z wykładu (Arabas, Cichosz): Diagnostyka grypy.

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.

Symulacja powyższego przykładu w języku python z wykorzystaniem modułu pymc

Imoport modułu pymc (https://pymc-devs.github.io/pymc/)

In [1]:
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.

In [2]:
import numpy as np
import pandas as pd

Model

In [3]:
# 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])

Symulacje Monte Carlo

In [4]:
mcmc = pymc.MCMC(model)
mcmc.sample(10000,2000) #im więcej iteracji tym lepsze oszacowania ale dłuższy czas wykonania
 [-----------------100%-----------------] 10000 of 10000 complete in 3.4 sec

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

In [5]:
# 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')[:]
In [6]:
# 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()
Out[6]:
Goraczka Grypa Kaszel Katar
0 0 0 1 0
1 0 0 0 0
2 1 0 1 0
3 1 1 0 1
4 0 0 0 1

Obliczamy interesujące nas prawdopodobieństwa i porównujemy z przykładem, proste zliczanie

In [7]:
# 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)
p_grypa: 0.101625
p_katar 0.331
p_kaszel 0.303625
p_goraczka 0.44975
p_grypa_katar: 0.1714501510574018
p_grypa_kaszel: 0.10992177850967476
p_grypa_goraczka: 0.18260144524735963
p_grypa_katar_goraczka: 0.29930394431554525

Inny przykład, klasyczny przykład sieci bayesowskiej, sekwencja zależności

źródło: (https://bugra.github.io/work/notes/2014-05-23/simple-bayesian-network-via-monte-carlo-markov-chain-mcmc-pymc/)

Zadania do wykonania (zapożyczone z ćwiczeń do wykładu Arabas, Cichosz)

źródło: (http://wazniak.mimuw.edu.pl/index.php?title=Sztuczna_inteligencja/SI_%C4%86wiczenia_4)

Zadanie 1: zamodelować i odpowiedzieć na pytania

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:

  1. gdyby znaleziono na miejscu zbrodni jego odciski palców,
  2. gdyby stwierdzono, że nie miał alibi i miał motyw,
  3. gdyby znaleziono na miejscu zbrodni jego odciski palców oraz stwierdzono, że był widziany w sąsiedztwie miejsca, w którym mieszka nielegalny handlarz bronią, ale świadek zbrodni podał rysopis zabójcy nie pasujący do głównego podejrzanego.

Zadanie 2: zamodelować i odpowiedzieć na pytania

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:

  1. podejrzani A i B nie mają alibi,
  2. podejrzany C miał oczywisty motyw,
  3. rysopis zabójcy podany przez świadka nie pasuje do podejrzanych B i C,
  4. podejrzany A jest szanowanym obywatelem nie budzącym u nikogo żadnych podejrzeń.

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.