pyAgrum Code samples
Create a Bayesian Network
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | """ How to create a BN with pyAgrum """ import pyAgrum as gum bn = gum.BayesNet() for nom in ["x","y","z"]: bn.add(gum.LabelizedVariable(nom, "", 2)) bn.addArc("x", "y") bn.addArc("y", "z") #this should create an impossible arc (since a bn is a DAG) #bn.addArc("z", "x") |
Details of a Bayesian Network
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | def showBN(bn):
print('---------------------------------')
print(bn.property("name"))
print('---------------------------------')
print(bn)
print('---------------------------------')
l = [len(bn.variable(i)) for i in bn.nodes()]
print('variables domainSize : min={0} max={1}'.format(min(l), max(l)))
print('parents : max={0}'.format(max([len(bn.parents(i)) for i in bn.nodes()])))
print('---------------------------------')
for i in bn.nodes():
print('{0} : {1}'.format(i, str(bn.variable(i))))
print('---------------------------------')
for (i,j) in bn.arcs():
print('{0}->{1}'.format(bn.variable(i).name(), bn.variable(j).name()))
print('---------------------------------')
#Load the file alarm.dsl
bn = gum.loadBN("alarm.dsl")
showBN(bn)
|
Access a Bayesian Network parameters
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import pyAgrum as gum
bn = gum.BayesNet()
bn.loadBIF("bn.bif")
print(bn.variable(0).name())
# a
print(bn.cpt(0))
#[[[ 0.48319 0.51681 ]
# [ 0.108427 0.89157301]
# [ 0.43582699 0.56417298]]
#
# [[ 0.0250064 0.974994 ]
# [ 0.677037 0.322963 ]
# [ 0.78677201 0.213228 ]]]
print(bn.cpt(0)[{'e':0,'f':1}])
# [ 0.0250064 0.974994 ]
|
Instantiation loop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import pyAgrum as gum
bn = gum.BayesNet()
bn.loadBIF("bn.bif")
p_a = bn.cpt(0)
i = gum.Instantiation(p_a)
i.setFirst()
s = 0.0;
while (not i.end()):
print(i)
s += p_a.get(i)
i.inc()
print(s)
|
loadBN with listener
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import os import pyAgrum as gum from pyAgrum.lib.utils.progress_bar import ProgressBar def doLoadBN(s): # you could simply do that # bn = gum.loadBN(s) # but listeners are fun !! title = os.path.basename(s) + " (" + '{0:,d}'.format(os.path.getsize(s)/1024).replace(',',' ') + " Ko)" progressbar = ProgressBar(title, 0, 100, mode='dynamic', char='-') def local_update(percent): progressbar.update_amount(percent) progressbar.display() if percent == 100: print() return gum.loadBN(s,local_update) bn=doLoadBN("asia.bif") |
Save a Bayesian Network
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | bn = gum.BayesNet('exo1')
#sexe = 0(H)/1(F)
#daltonisme = 0(D) / 1 (nonD)
sexe, daltonisme = [bn.add(gum.LabelizedVar(nom,'',2)) for nom in 'sexe daltonisme'.split()]
bn.addArc(sexe, daltonisme)
bn.cpt(sexe)[:] = [0.5, 0.5]
bn.cpt(daltonisme)[0,:] = [0.08, 0.92]
bn.cpt(daltonisme)[1,:] = [0.005,0.995]
bn.saveBIF("exo1.bif")
for line in open("exo1.bif"):
print line,
print("for gum.loadBN or gum.saveBN, possible files ext are ="+gum.availableBNExts())
gum.saveBN(bn,"exo1.dsl")
for line in open("exo1.dsl"):
print line,
|
Noisy OR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | The real QMR-DT model is copyright, but we can create a random QMR-like model as follows.
"""
import pyAgrum as gum
import random
def create_qmr(nD,nF,density):
"""
create qmr BN using
nD = number of disease
nF = number of findings
density = proba for disease i to be linked to finding j
"""
name = "qmr%d-%d-%f"%(nD, nF, density)
bn = gum.BayesNet(name)
lDis = [bn.add(gum.LabelizedVariable("D%4d"%i,"D%4d"%i,2)) for i in range(nD)]
# create noiyOR nodes with random leaks
lFind = [bn.addNoisyOR(gum.LabelizedVariable("F%d"%i,"F%d"%i,2),random.uniform(0.1,0.9)) for i in range(nF)]
for node in lDis:
prior = random.uniform(0.01, 0.99)
bn.cpt(node)[:] = [prior, 1 - prior]
for i in lDis:
for j in lFind:
if random.random() < density:
# add new cause i to noisyOR node j with random weight
bn.addWeightedArc(i, j, random.uniform(0.1, 0.9))
return bn
if __name__ == "__main__":
from gumLib.bn2graph import pdfize
print("building qmr")
bn1 = create_qmr(60, 60, 0.1)
print("generating pdf")
pdfize(bn, bn.property('name'))
|