Credal Networks¶
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()
Library | Version |
---|---|
OS | posix [linux] |
Python | 3.11.3 (main, Jun 5 2023, 09:32:32) [GCC 13.1.1 20230429] |
IPython | 8.14.0 |
Matplotlib | 3.7.2 |
Numpy | 1.25.1 |
pyDot | 1.4.2 |
pyAgrum | 1.8.3.9 |
Tue Jul 25 09:22:57 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"])
|
|
| |
---|---|---|---|
0.1917 | 0.5245 | 0.2838 | |
0.2980 | 0.6151 | 0.0869 |
|
|
| |
---|---|---|---|
0.1569 | 0.4898 | 0.2490 | |
0.2632 | 0.5803 | 0.0522 |
|
|
| |
---|---|---|---|
0.2265 | 0.5593 | 0.3185 | |
0.3328 | 0.6499 | 0.1217 |
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"])
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))
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)
A:Range([0,1]) <> : [[0.213995 , 0.786005] , [0.49932 , 0.50068]] B:Range([0,2]) <A:0> : [[0.156917 , 0.524545 , 0.318538] , [0.156917 , 0.559314 , 0.283769] , [0.191685 , 0.559314 , 0.249001] , [0.226453 , 0.524546 , 0.249001] , [0.191684 , 0.489778 , 0.318538] , [0.226453 , 0.489778 , 0.283769]] <A:1> : [[0.263229 , 0.615083 , 0.121688] , [0.263229 , 0.649852 , 0.0869191] , [0.297997 , 0.649852 , 0.0521512] , [0.332765 , 0.615084 , 0.0521512] , [0.297996 , 0.580316 , 0.121688] , [0.332765 , 0.580316 , 0.0869198]] C:Range([0,1]) <B:0|D:0> : [[0.658631 , 0.341369] , [0.810215 , 0.189785]] <B:1|D:0> : [[0.422569 , 0.577431] , [0.574153 , 0.425847]] <B:2|D:0> : [[0.522177 , 0.477823] , [0.673762 , 0.326238]] <B:0|D:1> : [[0.240798 , 0.759202] , [0.392383 , 0.607617]] <B:1|D:1> : [[0.565201 , 0.434799] , [0.716787 , 0.283213]] <B:2|D:1> : [[0.113689 , 0.886311] , [0.265273 , 0.734727]] D:Range([0,1]) <A:0> : [[0.00377644 , 0.996224] , [0.00880853 , 0.991191]] <A:1> : [[0.0898662 , 0.910134] , [0.0948992 , 0.905101]] E:Range([0,1]) <A:0> : [[0.598238 , 0.401762] , [0.827817 , 0.172183]] <A:1> : [[0.331707 , 0.668293] , [0.561286 , 0.438714]] F:Range([0,1]) <E:0> : [[0.365006 , 0.634994] , [0.68227 , 0.31773]] <E:1> : [[0.237949 , 0.762051] , [0.555212 , 0.444788]]
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")
In [10]:
ie=gum.CNMonteCarloSampling(cn)
ie.insertEvidenceFile("res/cn/L2U.evi")
In [11]:
ie.setRepetitiveInd(False)
ie.setMaxTime(1)
ie.setMaxIter(1000)
ie.makeInference()
In [12]:
cn
Out[12]:
In [13]:
gnb.showInference(cn,targets={"A","H","L","D"},engine=ie,evs={"L":[0,1],"G":[1,0]})
Comparing inference in credal networks¶
In [14]:
import pyAgrum as gum
def showDiffInference(model,mc,lbp):
for i in model.current_bn().nodes():
a,b=mc.marginalMin(i)[:]
c,d=mc.marginalMax(i)[:]
e,f=lbp.marginalMin(i)[:]
g,h=lbp.marginalMax(i)[:]
plt.scatter([a,b,c,d],[e,f,g,h])
cn=gum.CredalNet("res/cn/2Umin.bif","res/cn/2Umax.bif")
cn.intervalToCredal()
The two inference give quite the same result¶
In [15]:
ie_mc=gum.CNMonteCarloSampling(cn)
ie_mc.makeInference()
cn.computeBinaryCPTMinMax()
ie_lbp=gum.CNLoopyPropagation(cn)
ie_lbp.makeInference()
showDiffInference(cn,ie_mc,ie_lbp)
but not when evidence are inserted¶
In [16]:
ie_mc=gum.CNMonteCarloSampling(cn)
ie_mc.insertEvidenceFile("res/cn/L2U.evi")
ie_mc.makeInference()
ie_lbp=gum.CNLoopyPropagation(cn)
ie_lbp.insertEvidenceFile("res/cn/L2U.evi")
ie_lbp.makeInference()
showDiffInference(cn,ie_mc,ie_lbp)
Dynamical Credal Net¶
In [17]:
cn=gum.CredalNet("res/cn/bn_c_8.bif","res/cn/den_c_8.bif")
cn.bnToCredal(0.8,False)
In [18]:
ie=gum.CNMonteCarloSampling(cn)
ie.insertModalsFile("res/cn/modalities.modal")
ie.setRepetitiveInd(True)
ie.setMaxTime(5)
ie.setMaxIter(1000)
ie.makeInference()
In [19]:
print(ie.dynamicExpMax("temp"))
(14.203404648293022, 11.864395265918771, 12.190483075680442, 12.023367090540296, 11.975306510688327, 11.943567938674553, 11.949683596400295, 11.94586710688126, 11.946601778299542)
In [20]:
fig=figure()
ax=fig.add_subplot(111)
ax.fill_between(range(9),ie.dynamicExpMax("temp"),ie.dynamicExpMin("temp"))
plt.show()
In [21]:
ie=gum.CNMonteCarloSampling(cn)
ie.insertModalsFile("res/cn/modalities.modal")
ie.setRepetitiveInd(False)
ie.setMaxTime(5)
ie.setMaxIter(1000)
ie.makeInference()
print(ie.messageApproximationScheme())
stopped with epsilon=0
In [22]:
fig=figure()
ax=fig.add_subplot(111)
ax.fill_between(range(9),ie.dynamicExpMax("temp"),ie.dynamicExpMin("temp"))
plt.show()
In [23]:
ie=gum.CNMonteCarloSampling(cn)
ie.insertModalsFile("res/cn/modalities.modal")
ie.setRepetitiveInd(False)
ie.setMaxTime(5)
ie.setMaxIter(5000)
gnb.animApproximationScheme(ie)
ie.makeInference()
In [24]:
fig=figure()
ax=fig.add_subplot(111)
ax.fill_between(range(9),ie.dynamicExpMax("temp"),ie.dynamicExpMin("temp"));
plt.show()