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

Influence diagram¶

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

%matplotlib inline
from pylab import *
import matplotlib.pyplot as plt
from IPython.display import display,HTML

import math
In [2]:
import pyAgrum as gum
import pyAgrum.lib.notebook as gnb

Build a Influence Diagram¶

fast build with string¶

In [3]:
gum.fastID("A->*B->$C<-D<-*E->*G->H->*I<-D")
Out[3]:
pyAgrum▶Models▷Influence DiagramG pyAgrum▶Models▷Influence DiagramA A pyAgrum▶Models▷Influence DiagramB B pyAgrum▶Models▷Influence DiagramA->B pyAgrum▶Models▷Influence DiagramD D pyAgrum▶Models▷Influence DiagramI I pyAgrum▶Models▷Influence DiagramD->I pyAgrum▶Models▷Influence DiagramC C pyAgrum▶Models▷Influence DiagramD->C pyAgrum▶Models▷Influence DiagramH H pyAgrum▶Models▷Influence DiagramH->I pyAgrum▶Models▷Influence DiagramB->C pyAgrum▶Models▷Influence DiagramE E pyAgrum▶Models▷Influence DiagramE->D pyAgrum▶Models▷Influence DiagramG G pyAgrum▶Models▷Influence DiagramE->G pyAgrum▶Models▷Influence DiagramG->H

bifxml format file¶

In [4]:
diag=gum.loadID("res/diag.bifxml")
gnb.showInfluenceDiagram(diag)
pyAgrum▶Models▷Influence DiagramG pyAgrum▶Models▷Influence DiagramchanceVar1 chanceVar1 pyAgrum▶Models▷Influence DiagramchanceVar2 chanceVar2 pyAgrum▶Models▷Influence DiagramchanceVar1->chanceVar2 pyAgrum▶Models▷Influence DiagramutilityVar1 utilityVar1 pyAgrum▶Models▷Influence DiagramchanceVar1->utilityVar1 pyAgrum▶Models▷Influence DiagramdecisionVar2 decisionVar2 pyAgrum▶Models▷Influence DiagramchanceVar2->decisionVar2 pyAgrum▶Models▷Influence DiagramdecisionVar3 decisionVar3 pyAgrum▶Models▷Influence DiagramchanceVar2->decisionVar3 pyAgrum▶Models▷Influence DiagramchanceVar3 chanceVar3 pyAgrum▶Models▷Influence DiagramchanceVar5 chanceVar5 pyAgrum▶Models▷Influence DiagramchanceVar3->chanceVar5 pyAgrum▶Models▷Influence DiagramchanceVar4 chanceVar4 pyAgrum▶Models▷Influence DiagramchanceVar4->chanceVar5 pyAgrum▶Models▷Influence DiagramutilityVar2 utilityVar2 pyAgrum▶Models▷Influence DiagramchanceVar5->utilityVar2 pyAgrum▶Models▷Influence DiagramdecisionVar1 decisionVar1 pyAgrum▶Models▷Influence DiagramdecisionVar1->chanceVar1 pyAgrum▶Models▷Influence DiagramdecisionVar2->chanceVar4 pyAgrum▶Models▷Influence DiagramdecisionVar2->utilityVar1 pyAgrum▶Models▷Influence DiagramdecisionVar3->chanceVar3 pyAgrum▶Models▷Influence DiagramdecisionVar4 decisionVar4 pyAgrum▶Models▷Influence DiagramdecisionVar4->utilityVar2
In [5]:
diag
Out[5]:
pyAgrum▶Models▷Influence DiagramG pyAgrum▶Models▷Influence DiagramchanceVar1 chanceVar1 pyAgrum▶Models▷Influence DiagramchanceVar2 chanceVar2 pyAgrum▶Models▷Influence DiagramchanceVar1->chanceVar2 pyAgrum▶Models▷Influence DiagramutilityVar1 utilityVar1 pyAgrum▶Models▷Influence DiagramchanceVar1->utilityVar1 pyAgrum▶Models▷Influence DiagramdecisionVar2 decisionVar2 pyAgrum▶Models▷Influence DiagramchanceVar2->decisionVar2 pyAgrum▶Models▷Influence DiagramdecisionVar3 decisionVar3 pyAgrum▶Models▷Influence DiagramchanceVar2->decisionVar3 pyAgrum▶Models▷Influence DiagramchanceVar3 chanceVar3 pyAgrum▶Models▷Influence DiagramchanceVar5 chanceVar5 pyAgrum▶Models▷Influence DiagramchanceVar3->chanceVar5 pyAgrum▶Models▷Influence DiagramchanceVar4 chanceVar4 pyAgrum▶Models▷Influence DiagramchanceVar4->chanceVar5 pyAgrum▶Models▷Influence DiagramutilityVar2 utilityVar2 pyAgrum▶Models▷Influence DiagramchanceVar5->utilityVar2 pyAgrum▶Models▷Influence DiagramdecisionVar1 decisionVar1 pyAgrum▶Models▷Influence DiagramdecisionVar1->chanceVar1 pyAgrum▶Models▷Influence DiagramdecisionVar2->chanceVar4 pyAgrum▶Models▷Influence DiagramdecisionVar2->utilityVar1 pyAgrum▶Models▷Influence DiagramdecisionVar3->chanceVar3 pyAgrum▶Models▷Influence DiagramdecisionVar4 decisionVar4 pyAgrum▶Models▷Influence DiagramdecisionVar4->utilityVar2

the hard way :-)¶

In [6]:
F=diag.addChanceNode(gum.LabelizedVariable("F","F",2))
diag.addArc(diag.idFromName("decisionVar1"),F)

U=diag.addUtilityNode(gum.LabelizedVariable("U","U",1))
diag.addArc(diag.idFromName("decisionVar3"),U)
diag.addArc(diag.idFromName("F"),U)
gnb.showInfluenceDiagram(diag)
pyAgrum▶Models▷Influence DiagramG pyAgrum▶Models▷Influence DiagramchanceVar1 chanceVar1 pyAgrum▶Models▷Influence DiagramchanceVar2 chanceVar2 pyAgrum▶Models▷Influence DiagramchanceVar1->chanceVar2 pyAgrum▶Models▷Influence DiagramutilityVar1 utilityVar1 pyAgrum▶Models▷Influence DiagramchanceVar1->utilityVar1 pyAgrum▶Models▷Influence DiagramdecisionVar2 decisionVar2 pyAgrum▶Models▷Influence DiagramchanceVar2->decisionVar2 pyAgrum▶Models▷Influence DiagramdecisionVar3 decisionVar3 pyAgrum▶Models▷Influence DiagramchanceVar2->decisionVar3 pyAgrum▶Models▷Influence DiagramchanceVar3 chanceVar3 pyAgrum▶Models▷Influence DiagramchanceVar5 chanceVar5 pyAgrum▶Models▷Influence DiagramchanceVar3->chanceVar5 pyAgrum▶Models▷Influence DiagramchanceVar4 chanceVar4 pyAgrum▶Models▷Influence DiagramchanceVar4->chanceVar5 pyAgrum▶Models▷Influence DiagramutilityVar2 utilityVar2 pyAgrum▶Models▷Influence DiagramchanceVar5->utilityVar2 pyAgrum▶Models▷Influence DiagramF F pyAgrum▶Models▷Influence DiagramU U pyAgrum▶Models▷Influence DiagramF->U pyAgrum▶Models▷Influence DiagramdecisionVar1 decisionVar1 pyAgrum▶Models▷Influence DiagramdecisionVar1->chanceVar1 pyAgrum▶Models▷Influence DiagramdecisionVar1->F pyAgrum▶Models▷Influence DiagramdecisionVar2->chanceVar4 pyAgrum▶Models▷Influence DiagramdecisionVar2->utilityVar1 pyAgrum▶Models▷Influence DiagramdecisionVar3->chanceVar3 pyAgrum▶Models▷Influence DiagramdecisionVar3->U pyAgrum▶Models▷Influence DiagramdecisionVar4 decisionVar4 pyAgrum▶Models▷Influence DiagramdecisionVar4->utilityVar2
In [7]:
diag.cpt(F)[{'decisionVar1':0}]=[0.9,0.1]
diag.cpt(F)[{'decisionVar1':1}]=[0.3,0.7]

diag.utility(U)[{'F':0,'decisionVar3':0}]=2
diag.utility(U)[{'F':0,'decisionVar3':1}]=4
diag.utility(U)[{'F':1}]=[[0],[5]]

Optimization in an influence diagram (actually LIMID)¶

In [8]:
oil=gum.loadID("res/OilWildcatter.bifxml")
gnb.flow.row(oil,gnb.getInference(oil))
pyAgrum▶Models▷Influence DiagramG pyAgrum▶Models▷Influence DiagramTestResult TestResult pyAgrum▶Models▷Influence DiagramDrilling Drilling pyAgrum▶Models▷Influence DiagramTestResult->Drilling pyAgrum▶Models▷Influence DiagramOilContents OilContents pyAgrum▶Models▷Influence DiagramOilContents->TestResult pyAgrum▶Models▷Influence DiagramReward Reward pyAgrum▶Models▷Influence DiagramOilContents->Reward pyAgrum▶Models▷Influence DiagramTesting Testing pyAgrum▶Models▷Influence DiagramTesting->TestResult pyAgrum▶Models▷Influence DiagramTesting->Drilling pyAgrum▶Models▷Influence DiagramCost Cost pyAgrum▶Models▷Influence DiagramTesting->Cost pyAgrum▶Models▷Influence DiagramDrilling->Reward
pyAgrum▶Models▷Influence Diagramstructs MEU 22.50 (stdev=87.46) Inference in   0.82ms pyAgrum▶Models▷Influence DiagramTesting 2023-05-24T14:51:09.758994 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramDrilling 2023-05-24T14:51:09.814102 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramTesting->Drilling pyAgrum▶Models▷Influence DiagramTestResult 2023-05-24T14:51:09.868377 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramTesting->TestResult pyAgrum▶Models▷Influence DiagramCost Cost : -10.00 (0.00) pyAgrum▶Models▷Influence DiagramTesting->Cost pyAgrum▶Models▷Influence DiagramReward Reward : 32.50 (87.46) pyAgrum▶Models▷Influence DiagramDrilling->Reward pyAgrum▶Models▷Influence DiagramTestResult->Drilling pyAgrum▶Models▷Influence DiagramOilContents 2023-05-24T14:51:09.925653 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramOilContents->TestResult pyAgrum▶Models▷Influence DiagramOilContents->Reward
In [9]:
# a function to show results on decision nodes T and D
def show_decisions(ie):
    gnb.flow.row(ie.optimalDecision("Testing"),
                   ie.optimalDecision("Drilling"),
                   f"$${ie.MEU()['mean']:5.3f}\\ (stdev : {math.sqrt(ie.MEU()['variance']):5.3f})$$",
                   captions=["Strategy for T",
                             "Strategy for D",
                             "MEU and its standard deviation"])
    gnb.flow.row(ie.posterior("Testing"),ie.posteriorUtility("Testing"),
                   ie.posterior("Drilling"),ie.posteriorUtility("Drilling"),
                  captions=["Final decision for Testing","Final reward for Testing",
                            "Final decision for Drilling","Final reward for Drilling"])

ie=gum.ShaferShenoyLIMIDInference(oil) 

display(HTML("<h2>Inference in the LIMID optimizing the decisions nodes</h2>"))
ie.makeInference()
show_decisions(ie)

Inference in the LIMID optimizing the decisions nodes

Testing
Yes
No
1.00000.0000

Strategy for T
Drilling
TestResult
Yes
No
closed
1.00000.0000
open
1.00000.0000
diffuse
0.00001.0000

Strategy for D
$$22.500\ (stdev : 87.457)$$
MEU and its standard deviation
Testing
Yes
No
1.00000.0000

Final decision for Testing
Testing
Yes
No
22.500020.0000

Final reward for Testing
Drilling
Yes
No
0.59000.4100

Final decision for Drilling
Drilling
Yes
No
45.0847-10.0000

Final reward for Drilling

Graphical inference with evidence and targets (developped nodes)¶

In [10]:
gnb.sideBySide(oil,
               gnb.getInference(oil,evs={'TestResult':'closed'}),
               gnb.getInference(oil,evs={'TestResult':'open'}),
               gnb.getInference(oil,evs={'TestResult':'diffuse'}),
               oil,
               gnb.getInference(oil,evs={'OilContents':'Dry'}),
               gnb.getInference(oil,evs={'OilContents':'Wet'}),
               gnb.getInference(oil,evs={'OilContents':'Soaking'}),
               ncols=4)
pyAgrum▶Models▷Influence DiagramG pyAgrum▶Models▷Influence DiagramTestResult TestResult pyAgrum▶Models▷Influence DiagramDrilling Drilling pyAgrum▶Models▷Influence DiagramTestResult->Drilling pyAgrum▶Models▷Influence DiagramOilContents OilContents pyAgrum▶Models▷Influence DiagramOilContents->TestResult pyAgrum▶Models▷Influence DiagramReward Reward pyAgrum▶Models▷Influence DiagramOilContents->Reward pyAgrum▶Models▷Influence DiagramTesting Testing pyAgrum▶Models▷Influence DiagramTesting->TestResult pyAgrum▶Models▷Influence DiagramTesting->Drilling pyAgrum▶Models▷Influence DiagramCost Cost pyAgrum▶Models▷Influence DiagramTesting->Cost pyAgrum▶Models▷Influence DiagramDrilling->Reward
pyAgrum▶Models▷Influence Diagramstructs MEU 77.50 (stdev=104.73) Inference in   0.50ms pyAgrum▶Models▷Influence DiagramTesting 2023-05-24T14:51:10.273636 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramDrilling 2023-05-24T14:51:10.340698 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramTesting->Drilling pyAgrum▶Models▷Influence DiagramTestResult 2023-05-24T14:51:10.395465 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramTesting->TestResult pyAgrum▶Models▷Influence DiagramCost Cost : -10.00 (0.00) pyAgrum▶Models▷Influence DiagramTesting->Cost pyAgrum▶Models▷Influence DiagramReward Reward : 87.50 (104.73) pyAgrum▶Models▷Influence DiagramDrilling->Reward pyAgrum▶Models▷Influence DiagramTestResult->Drilling pyAgrum▶Models▷Influence DiagramOilContents 2023-05-24T14:51:10.450846 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramOilContents->TestResult pyAgrum▶Models▷Influence DiagramOilContents->Reward
pyAgrum▶Models▷Influence Diagramstructs MEU 22.86 (stdev=104.98) Inference in   0.43ms pyAgrum▶Models▷Influence DiagramTesting 2023-05-24T14:51:10.610768 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramDrilling 2023-05-24T14:51:10.658138 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramTesting->Drilling pyAgrum▶Models▷Influence DiagramTestResult 2023-05-24T14:51:10.709927 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramTesting->TestResult pyAgrum▶Models▷Influence DiagramCost Cost : -10.00 (0.00) pyAgrum▶Models▷Influence DiagramTesting->Cost pyAgrum▶Models▷Influence DiagramReward Reward : 32.86 (104.98) pyAgrum▶Models▷Influence DiagramDrilling->Reward pyAgrum▶Models▷Influence DiagramTestResult->Drilling pyAgrum▶Models▷Influence DiagramOilContents 2023-05-24T14:51:10.764063 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramOilContents->TestResult pyAgrum▶Models▷Influence DiagramOilContents->Reward
pyAgrum▶Models▷Influence Diagramstructs MEU 20.00 (stdev=103.92) Inference in   0.40ms pyAgrum▶Models▷Influence DiagramTesting 2023-05-24T14:51:10.986384 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramDrilling 2023-05-24T14:51:11.034462 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramTesting->Drilling pyAgrum▶Models▷Influence DiagramTestResult 2023-05-24T14:51:11.086452 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramTesting->TestResult pyAgrum▶Models▷Influence DiagramCost Cost : 0.00 (0.00) pyAgrum▶Models▷Influence DiagramTesting->Cost pyAgrum▶Models▷Influence DiagramReward Reward : 20.00 (103.92) pyAgrum▶Models▷Influence DiagramDrilling->Reward pyAgrum▶Models▷Influence DiagramTestResult->Drilling pyAgrum▶Models▷Influence DiagramOilContents 2023-05-24T14:51:11.141512 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramOilContents->TestResult pyAgrum▶Models▷Influence DiagramOilContents->Reward
pyAgrum▶Models▷Influence DiagramG pyAgrum▶Models▷Influence DiagramTestResult TestResult pyAgrum▶Models▷Influence DiagramDrilling Drilling pyAgrum▶Models▷Influence DiagramTestResult->Drilling pyAgrum▶Models▷Influence DiagramOilContents OilContents pyAgrum▶Models▷Influence DiagramOilContents->TestResult pyAgrum▶Models▷Influence DiagramReward Reward pyAgrum▶Models▷Influence DiagramOilContents->Reward pyAgrum▶Models▷Influence DiagramTesting Testing pyAgrum▶Models▷Influence DiagramTesting->TestResult pyAgrum▶Models▷Influence DiagramTesting->Drilling pyAgrum▶Models▷Influence DiagramCost Cost pyAgrum▶Models▷Influence DiagramTesting->Cost pyAgrum▶Models▷Influence DiagramDrilling->Reward
pyAgrum▶Models▷Influence Diagramstructs MEU 0.00 (stdev=0.00) Inference in   0.42ms pyAgrum▶Models▷Influence DiagramTesting 2023-05-24T14:51:11.309474 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramDrilling 2023-05-24T14:51:11.358684 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/ pyAgrum▶Models▷Influence DiagramTesting->Drilling pyAgrum▶Models▷Influence DiagramTestResult 2023-05-24T14:51:11.411035 image/svg+xml Matplotlib v3.7.1, https://matplotlib.org/