Probabilistički modeli

Osnovni pojmovi

  • $X$ - slučajna promenljiva (broj dobijen na gornjoj strani kockice)
  • $\{1, 2, 3, 4, 5, 6\}$ - skup vrednosti slučajne promenljive
  • $P(X=1)$ - Verovatnoća da slučajna promenljiva $X$ ima vrednost $1$
  • $P(X) = \{1: 1/6, 2: 1/6, ... , 6: 1/6 \}$ - Funkcija raspodele vrednosti slučajne promenljive $X$
  • $P(X=1, Y=2)$ - Zajednička verovatnoća da promenljive $X$ i $Y$ istovremeno imaju vrednosti $1$ i $2$
  • $P(X, Y)$ - Zajednička raspodela verovatnoća vrednosti $X$ i $Y$
  • $P(X=1|Y=2)$ - Uslovna verovatnoća, verovatnoća da promenljiva $X$ ima vrednost $1$ AKO promenljiva $Y$ ima vrednost $2$
  • $P(X|Y)$ - Uslovna raspodela verovatnoća vrednosti promenljive $X$ u odnosu na vrednosti promenljive $Y$

Osnovne jednakosti

  • $P(X,Y) = P(X|Y) \cdot P(Y) = P(Y|X) \cdot P(X)$
  • $P(X, Y, Z) = P(X|Y, Z) \cdot P(Y|Z) \cdot P(Z)$ - Lančano pravilo
  • Ako su $X$ i $Y$ NEZAVISNE promenljive: $P(X|Y) = P(X), P(Y|X) = P(Y)$
  • $P(X|Y) = \frac{P(Y|X) * P(X)}{P(Y)}$ - Bajesova teorema
In [20]:
# Bajesovski model
from pgmpy.models import BayesianModel

# Conditional Probability Table, funkcije uslovne raspodele tabelarno predstavljena
from pgmpy.factors.discrete import TabularCPD 

# Algoritam koji vrši zaključivanje 
from pgmpy.inference import VariableElimination
In [43]:
# Kasalj, Temperatura, COVID, Xray

'''
Kasalj   Temperatura
     \   /
     COVID
       |
     XRAY
'''            


'''
K    p
NE  0.7
DA  0.3
'''
k_cpd = TabularCPD(variable='Kasalj', 
                   variable_card=2,
                   values=[[0.7],
                           [0.3]],
                   state_names = { 'Kasalj': ['NE', 'DA'] }
                  )

'''
T        p
NISKA   0.8
VISOKA  0.2
'''
t_cpd = TabularCPD(variable='Temperatura', 
                   variable_card=2,
                   values=[[0.7],
                           [0.3]],
                   state_names = { 'Temperatura': ['NISKA', 'VISOKA'] }
                  )

'''   
      K=NE     K=NE      K=DA     K=DA
      T=NISKA  T=VISOKA  T=NISKA  T=VISOKA
COVID
NE    0.95     0.7       0.65     0.2
DA    0.05     0.3       0.35     0.8
'''
c_cpd = TabularCPD(variable='COVID', 
                   variable_card=2,
                   values=[[0.95, 0.7, 0.65, 0.2],
                           [0.05, 0.3, 0.35, 0.8]],
                   state_names = {
                       'COVID': ['NE', 'DA'],
                       'Kasalj': ['NE','DA'],
                       'Temperatura': ['NISKA', 'VISOKA']
                    },
                   evidence=['Kasalj', 'Temperatura'],
                   evidence_card=[2,2]
                  )

'''    COVID=NE   COVID=DA
XRAY
LOS       0.1        0.7
DOBAR     0.9        0.3
'''   
x_cpd = TabularCPD(variable='XRAY', 
                   variable_card=2,
                   values=[[0.1, 0.7],
                           [0.9, 0.3,]],
                   state_names = { 'XRAY': ['LOS', 'DOBAR'],
                                     'COVID': ['NE', 'DA']},
                   evidence=['COVID'],
                   evidence_card=[2]
                  )
In [44]:
covid_model = BayesianModel([('Kasalj', 'COVID'), ('Temperatura','COVID'), ('COVID', 'XRAY')])
covid_model.add_cpds(k_cpd, t_cpd, c_cpd, x_cpd)
In [45]:
covid_model.check_model()
Out[45]:
True
In [54]:
inference = VariableElimination(covid_model)
print(inference.query(['XRAY'], evidence={'COVID': 'DA', 'Kasalj': 'NE'}))





  0%|          | 0/1 [00:00<?, ?it/s]





Finding Elimination Order: : 100%|██████████| 1/1 [00:00<00:00, 26.08it/s]A






  0%|          | 0/1 [00:00<?, ?it/s]





Eliminating: Temperatura: 100%|██████████| 1/1 [00:00<00:00, 68.35it/s]A
+-------------+-------------+
| XRAY        |   phi(XRAY) |
+=============+=============+
| XRAY(LOS)   |      0.7000 |
+-------------+-------------+
| XRAY(DOBAR) |      0.3000 |
+-------------+-------------+

In [65]:
print(inference.map_query(['XRAY'], evidence={'COVID': 'DA', 'Kasalj': 'NE'}))





  0%|          | 0/1 [00:00<?, ?it/s]





Finding Elimination Order: : 100%|██████████| 1/1 [00:00<00:00, 144.91it/s]






  0%|          | 0/1 [00:00<?, ?it/s]





Eliminating: Temperatura: 100%|██████████| 1/1 [00:00<00:00, 319.69it/s]
{'XRAY': 'LOS'}

In [55]:
covid_model.get_independencies()
Out[55]:
(Kasalj _|_ Temperatura)
(Kasalj _|_ XRAY | COVID)
(Kasalj _|_ XRAY | Temperatura, COVID)
(Temperatura _|_ Kasalj)
(Temperatura _|_ XRAY | COVID)
(Temperatura _|_ XRAY | COVID, Kasalj)
(XRAY _|_ Temperatura, Kasalj | COVID)
(XRAY _|_ Kasalj | Temperatura, COVID)
(XRAY _|_ Temperatura | COVID, Kasalj)
In [58]:
covid_model.local_independencies('XRAY')
Out[58]:
(XRAY _|_ Temperatura, Kasalj | COVID)
In [64]:
covid_model.active_trail_nodes('Kasalj',  observed=['XRAY'])
Out[64]:
{'Kasalj': {'COVID', 'Kasalj', 'Temperatura'}}