Logo
pyAgrum 1.8.1 on Jupyter

Tutorials

  • ▶ Tutorial
    • ▷ Tutorial
    • ▷ Tutorial2
  • ▶ Examples
    • ▷ Asthma
    • ▷ Kaggle Titanic
    • ▷ Naive Credit Default Modeling
    • ▷ Causality And Learning
    • ▷ Sensitivity Analysis Using Credal Networks
    • ▷ Quasi Continuous
    • ▷ Parameters Learning With Pandas
    • ▷ Bayesian Beta Coin
  • ▶ Models
    • ▷ Influence Diagram
    • ▷ Dynamic Bn
    • ▷ Markov Random Field
    • ▷ Credal Networks
    • ▷ O3PRM
  • ▶ Learning
    • ▷ Structural Learning
    • ▷ Learning Classifier
    • ▷ Learning And Essential Graphs
    • ▷ Dirichlet Prior And Weigthed Database
    • ▷ Parametric Em
    • ▷ Chi2 And Scores From Bn Learner
  • ▶ Inference
    • ▷ Graphical Inference
    • ▷ Relevance Reasoning
    • ▷ Lazy Propagation Advanced Features
    • ▷ Approximate Inference
    • ▷ Sampling Inference
  • ▶ Classifier
    • ▷ Learning
    • ▷ Discretizer
    • ▷ Compare Classifiers With Sklearn
    • ▷ Cross Validation
    • ▷ Binary And Nary Classifier From Bn
  • ▶ Causality
    • ▷ Tobacco
    • ▷ Simpson Paradox
    • ▷ Multinomial Simpson Paradox
    • ▷ Do Calculus Examples
    • ▷ Counterfactual
  • ▶ Applications
    • ▷ Ipywidgets
  • ▶ Tools
    • ▷ Potentials
    • ▷ Aggregators
    • ▷ Explain
    • ▷ Kl For BNs
    • ▷ Comparing Bn
    • ▷ Colouring And Exporting BNs
    • ▷ Config For PyAgrum
pyAgrum

Credal Networks¶

Creative Commons License aGrUM interactive online version
In [1]:
import os

%matplotlib inline
from pylab import *
import matplotlib.pyplot as plt
In [2]:
import pyAgrum as gum
import pyAgrum.lib.notebook as gnb
gnb.configuration()
LibraryVersion
OSposix [linux]
Python3.10.10 (main, Mar 5 2023, 22:26:53) [GCC 12.2.1 20230201]
IPython8.13.2
Matplotlib3.7.1
Numpy1.24.3
pyDot1.4.2
pyAgrum1.8.1
Wed May 24 14:52:21 2023 CEST

Credal Net from BN¶

In [3]:
bn=gum.fastBN("A->B[3]->C<-D<-A->E->F")
bn_min=gum.BayesNet(bn)
bn_max=gum.BayesNet(bn)
for n in bn.nodes():
  x=0.4*min(bn.cpt(n).min(),1-bn.cpt(n).max())
  bn_min.cpt(n).translate(-x)
  bn_max.cpt(n).translate(x)
    
cn=gum.CredalNet(bn_min,bn_max)
cn.intervalToCredal()

gnb.flow.row(bn,bn.cpt("B"),cn,bn_min.cpt("B"),bn_max.cpt("B"),captions=["Bayes Net","CPT","Credal Net","CPTmin","CPTmax"])
pyAgrum▶Models▷Credal NetworksG pyAgrum▶Models▷Credal NetworksE E pyAgrum▶Models▷Credal NetworksF F pyAgrum▶Models▷Credal NetworksE->F pyAgrum▶Models▷Credal NetworksD D pyAgrum▶Models▷Credal NetworksC C pyAgrum▶Models▷Credal NetworksD->C pyAgrum▶Models▷Credal NetworksA A pyAgrum▶Models▷Credal NetworksA->E pyAgrum▶Models▷Credal NetworksA->D pyAgrum▶Models▷Credal NetworksB B pyAgrum▶Models▷Credal NetworksA->B pyAgrum▶Models▷Credal NetworksB->C
Bayes Net
B
A
0
1
2
0
0.62120.05180.3270
1
0.47000.28080.2492

CPT
pyAgrum▶Models▷Credal NetworksG pyAgrum▶Models▷Credal NetworksE E pyAgrum▶Models▷Credal NetworksF F pyAgrum▶Models▷Credal NetworksE->F pyAgrum▶Models▷Credal NetworksD D pyAgrum▶Models▷Credal NetworksC C pyAgrum▶Models▷Credal NetworksD->C pyAgrum▶Models▷Credal NetworksA A pyAgrum▶Models▷Credal NetworksA->E pyAgrum▶Models▷Credal NetworksA->D pyAgrum▶Models▷Credal NetworksB B pyAgrum▶Models▷Credal NetworksA->B pyAgrum▶Models▷Credal NetworksB->C
Credal Net
B
A
0
1
2
0
0.60040.03110.3062
1
0.44930.26000.2284

CPTmin
B
A
0
1
2
0
0.64190.07260.3477
1
0.49080.30150.2699

CPTmax

We can use LBP on CN (L2U) only for binary credal networks (here B is not binary). We then propose the classical binarization (but warn the user that this leads to approximation in the inference)¶

In [4]:
cn2=gum.CredalNet(bn_min,bn_max)
cn2.intervalToCredal()
cn2.approximatedBinarization()
cn2.computeBinaryCPTMinMax()

gnb.flow.row(cn,cn2,captions=["Credal net","Binarized credal net"])
pyAgrum▶Models▷Credal NetworksG pyAgrum▶Models▷Credal NetworksE E pyAgrum▶Models▷Credal NetworksF F pyAgrum▶Models▷Credal NetworksE->F pyAgrum▶Models▷Credal NetworksD D pyAgrum▶Models▷Credal NetworksC C pyAgrum▶Models▷Credal NetworksD->C pyAgrum▶Models▷Credal NetworksA A pyAgrum▶Models▷Credal NetworksA->E pyAgrum▶Models▷Credal NetworksA->D pyAgrum▶Models▷Credal NetworksB B pyAgrum▶Models▷Credal NetworksA->B pyAgrum▶Models▷Credal NetworksB->C
Credal net
pyAgrum▶Models▷Credal NetworksG pyAgrum▶Models▷Credal NetworksB-b1 B-b1 pyAgrum▶Models▷Credal NetworksB-v0 B-v0 pyAgrum▶Models▷Credal NetworksB-b1->B-v0 pyAgrum▶Models▷Credal NetworksB-v1 B-v1 pyAgrum▶Models▷Credal NetworksB-b1->B-v1 pyAgrum▶Models▷Credal NetworksC C pyAgrum▶Models▷Credal NetworksB-b1->C pyAgrum▶Models▷Credal NetworksB-v2 B-v2 pyAgrum▶Models▷Credal NetworksB-b1->B-v2 pyAgrum▶Models▷Credal NetworksE E pyAgrum▶Models▷Credal NetworksF F pyAgrum▶Models▷Credal NetworksE->F pyAgrum▶Models▷Credal NetworksD D pyAgrum▶Models▷Credal NetworksD->C pyAgrum▶Models▷Credal NetworksB-b0 B-b0 pyAgrum▶Models▷Credal NetworksB-b0->B-b1 pyAgrum▶Models▷Credal NetworksB-b0->B-v0 pyAgrum▶Models▷Credal NetworksB-b0->B-v1 pyAgrum▶Models▷Credal NetworksB-b0->C pyAgrum▶Models▷Credal NetworksB-b0->B-v2 pyAgrum▶Models▷Credal NetworksA A pyAgrum▶Models▷Credal NetworksA->B-b1 pyAgrum▶Models▷Credal NetworksA->E pyAgrum▶Models▷Credal NetworksA->D pyAgrum▶Models▷Credal NetworksA->B-b0
Binarized credal net

Here, $B$ becomes

  • $B$-b$i$ : the $i$-th bit of B
  • instrumental $B$-v$k$ : the indicator variable for each modality $k$ of $B$
In [5]:
ie_mc=gum.CNMonteCarloSampling(cn)
ie2_lbp=gum.CNLoopyPropagation(cn2)
ie2_mc=gum.CNMonteCarloSampling(cn2)
In [6]:
gnb.sideBySide(gnb.getInference(cn,engine=ie_mc),
               gnb.getInference(cn2,engine=ie2_mc),
               gnb.getInference(cn2,engine=ie2_lbp))
pyAgrum▶Models▷Credal Networksstructs Inference in  29.05ms pyAgrum▶Models▷Credal NetworksA 2023-05-24T14:52:22.323849 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB 2023-05-24T14:52:22.384295 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksA->B pyAgrum▶Models▷Credal NetworksD 2023-05-24T14:52:22.492406 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksA->D pyAgrum▶Models▷Credal NetworksE 2023-05-24T14:52:22.546250 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksA->E pyAgrum▶Models▷Credal NetworksC 2023-05-24T14:52:22.439848 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB->C pyAgrum▶Models▷Credal NetworksD->C pyAgrum▶Models▷Credal NetworksF 2023-05-24T14:52:22.600973 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksE->F
pyAgrum▶Models▷Credal Networksstructs Inference in  30.65ms pyAgrum▶Models▷Credal NetworksA 2023-05-24T14:52:22.793924 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB-b0 2023-05-24T14:52:22.847487 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksA->B-b0 pyAgrum▶Models▷Credal NetworksB-b1 2023-05-24T14:52:22.900844 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksA->B-b1 pyAgrum▶Models▷Credal NetworksD 2023-05-24T14:52:23.007600 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksA->D pyAgrum▶Models▷Credal NetworksE 2023-05-24T14:52:23.060831 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksA->E pyAgrum▶Models▷Credal NetworksB-b0->B-b1 pyAgrum▶Models▷Credal NetworksC 2023-05-24T14:52:22.953238 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB-b0->C pyAgrum▶Models▷Credal NetworksB-v0 2023-05-24T14:52:23.234351 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB-b0->B-v0 pyAgrum▶Models▷Credal NetworksB-v1 2023-05-24T14:52:23.288293 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB-b0->B-v1 pyAgrum▶Models▷Credal NetworksB-v2 2023-05-24T14:52:23.342974 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB-b0->B-v2 pyAgrum▶Models▷Credal NetworksB-b1->C pyAgrum▶Models▷Credal NetworksB-b1->B-v0 pyAgrum▶Models▷Credal NetworksB-b1->B-v1 pyAgrum▶Models▷Credal NetworksB-b1->B-v2 pyAgrum▶Models▷Credal NetworksD->C pyAgrum▶Models▷Credal NetworksF 2023-05-24T14:52:23.115542 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksE->F
pyAgrum▶Models▷Credal Networksstructs Inference in   0.27ms pyAgrum▶Models▷Credal NetworksA 2023-05-24T14:52:23.601372 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB-b0 2023-05-24T14:52:23.653305 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksA->B-b0 pyAgrum▶Models▷Credal NetworksB-b1 2023-05-24T14:52:23.705893 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksA->B-b1 pyAgrum▶Models▷Credal NetworksD 2023-05-24T14:52:23.877139 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksA->D pyAgrum▶Models▷Credal NetworksE 2023-05-24T14:52:23.927719 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksA->E pyAgrum▶Models▷Credal NetworksB-b0->B-b1 pyAgrum▶Models▷Credal NetworksC 2023-05-24T14:52:23.826209 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB-b0->C pyAgrum▶Models▷Credal NetworksB-v0 2023-05-24T14:52:24.029066 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB-b0->B-v0 pyAgrum▶Models▷Credal NetworksB-v1 2023-05-24T14:52:24.081280 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB-b0->B-v1 pyAgrum▶Models▷Credal NetworksB-v2 2023-05-24T14:52:24.132431 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksB-b0->B-v2 pyAgrum▶Models▷Credal NetworksB-b1->C pyAgrum▶Models▷Credal NetworksB-b1->B-v0 pyAgrum▶Models▷Credal NetworksB-b1->B-v1 pyAgrum▶Models▷Credal NetworksB-b1->B-v2 pyAgrum▶Models▷Credal NetworksD->C pyAgrum▶Models▷Credal NetworksF 2023-05-24T14:52:23.978586 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Credal NetworksE->F
In [7]:
gnb.sideBySide(ie_mc.CN(),ie_mc.marginalMin("F"),ie_mc.marginalMax("F"),
               ie_mc.CN(),ie2_lbp.marginalMin("F"),ie2_lbp.marginalMax("F"),
              ncols=3)
print(cn)
pyAgrum▶Models▷Credal NetworksG pyAgrum▶Models▷Credal NetworksE E pyAgrum▶Models▷Credal NetworksF F pyAgrum▶Models▷Credal NetworksE->F pyAgrum▶Models▷Credal NetworksD D pyAgrum▶Models▷Credal NetworksC C pyAgrum▶Models▷Credal NetworksD->C pyAgrum▶Models▷Credal NetworksA A pyAgrum▶Models▷Credal NetworksA->E pyAgrum▶Models▷Credal NetworksA->D pyAgrum▶Models▷Credal NetworksB B pyAgrum▶Models▷Credal NetworksA->B pyAgrum▶Models▷Credal NetworksB->C
F
0
1
0.15140.6467
F
0
1
0.35330.8486
pyAgrum▶Models▷Credal NetworksG pyAgrum▶Models▷Credal NetworksE E pyAgrum▶Models▷Credal NetworksF F pyAgrum▶Models▷Credal NetworksE->F pyAgrum▶Models▷Credal NetworksD D pyAgrum▶Models▷Credal NetworksC C pyAgrum▶Models▷Credal NetworksD->C pyAgrum▶Models▷Credal NetworksA A pyAgrum▶Models▷Credal NetworksA->E pyAgrum▶Models▷Credal NetworksA->D pyAgrum▶Models▷Credal NetworksB B pyAgrum▶Models▷Credal NetworksA->B pyAgrum▶Models▷Credal NetworksB->C
F
0
1
0.15140.6467
F
0
1
0.35330.8486
A:Range([0,1])
<> : [[0.510773 , 0.489227] , [0.790333 , 0.209667]]

B:Range([0,2])
<A:0> : [[0.600444 , 0.0518454 , 0.347711] , [0.600444 , 0.0725846 , 0.326971] , [0.621182 , 0.0725846 , 0.306233] , [0.641921 , 0.0518455 , 0.306233] , [0.621182 , 0.031107 , 0.347711] , [0.641921 , 0.031107 , 0.326972]]
<A:1> : [[0.449309 , 0.280784 , 0.269907] , [0.449309 , 0.301523 , 0.249168] , [0.470046 , 0.301523 , 0.228431] , [0.490786 , 0.280783 , 0.228431] , [0.470046 , 0.260047 , 0.269907] , [0.490786 , 0.260047 , 0.249167]]

C:Range([0,1])
<B:0|D:0> : [[0.43335 , 0.56665] , [0.579348 , 0.420652]]
<B:1|D:0> : [[0.744503 , 0.255497] , [0.890501 , 0.109499]]
<B:2|D:0> : [[0.687504 , 0.312496] , [0.833503 , 0.166497]]
<B:0|D:1> : [[0.453807 , 0.546193] , [0.599804 , 0.400196]]
<B:1|D:1> : [[0.603533 , 0.396467] , [0.749531 , 0.250469]]
<B:2|D:1> : [[0.202389 , 0.797611] , [0.348387 , 0.651613]]

D:Range([0,1])
<A:0> : [[0.720952 , 0.279048] , [0.792616 , 0.207384]]
<A:1> : [[0.0537482 , 0.946252] , [0.125413 , 0.874587]]

E:Range([0,1])
<A:0> : [[0.0782698 , 0.92173] , [0.18263 , 0.81737]]
<A:1> : [[0.648741 , 0.351259] , [0.7531 , 0.2469]]

F:Range([0,1])
<E:0> : [[0.647705 , 0.352295] , [0.686324 , 0.313676]]
<E:1> : [[0.0289655 , 0.971034] , [0.0675862 , 0.932414]]


Credal Net from bif files¶

In [8]:
cn=gum.CredalNet("res/cn/2Umin.bif","res/cn/2Umax.bif")
cn.intervalToCredal()
In [9]:
gnb.showCN(cn,"2")
pyAgrum▶Models▷Credal NetworksG pyAgrum▶Models▷Credal NetworksH H pyAgrum▶Models▷Credal NetworksL L pyAgrum▶Models▷Credal NetworksH->L pyAgrum▶Models▷Credal NetworksE E pyAgrum▶Models▷Credal NetworksE->H pyAgrum▶Models▷Credal NetworksD D pyAgrum▶Models▷Credal NetworksG G pyAgrum▶Models▷Credal NetworksD->G pyAgrum▶Models▷Credal NetworksF F pyAgrum▶Models▷Credal NetworksD->F pyAgrum▶Models▷Credal NetworksA A pyAgrum▶Models▷Credal NetworksA->E pyAgrum▶Models▷Credal NetworksC C pyAgrum▶Models▷Credal NetworksC->F pyAgrum▶Models▷Credal NetworksF->H pyAgrum▶Models▷Credal NetworksB B pyAgrum▶Models▷Credal NetworksB->E
In [10]:
ie=gum.CNMonteCarloSampling(cn)
ie.insertEvidenceFile("res/cn/L2U.evi")
In [11]:
ie.setRepetitiveInd(False)
ie.setMaxTime(1)
ie.setMaxIter