Dynamic Bayesian Network Inference

class pgmpy.inference.dbn_inference.DBNInference(model)[source]

Class for performing inference using Belief Propagation method for the input Dynamic Bayesian Network.

For the exact inference implementation, the interface algorithm is used which is adapted from [1].

Parameters:

model (Dynamic Bayesian Network) – Model for which inference is to performed

Examples

>>> from pgmpy.factors.discrete import TabularCPD
>>> from pgmpy.models import DynamicBayesianNetwork as DBN
>>> from pgmpy.inference import DBNInference
>>> dbnet = DBN()
>>> dbnet.add_edges_from(
...     [(("Z", 0), ("X", 0)), (("X", 0), ("Y", 0)), (("Z", 0), ("Z", 1))]
... )
>>> z_start_cpd = TabularCPD(("Z", 0), 2, [[0.5], [0.5]])
>>> x_i_cpd = TabularCPD(
...     ("X", 0),
...     2,
...     [[0.6, 0.9], [0.4, 0.1]],
...     evidence=[("Z", 0)],
...     evidence_card=[2],
... )
>>> y_i_cpd = TabularCPD(
...     ("Y", 0),
...     2,
...     [[0.2, 0.3], [0.8, 0.7]],
...     evidence=[("X", 0)],
...     evidence_card=[2],
... )
>>> z_trans_cpd = TabularCPD(
...     ("Z", 1),
...     2,
...     [[0.4, 0.7], [0.6, 0.3]],
...     evidence=[("Z", 0)],
...     evidence_card=[2],
... )
>>> dbnet.add_cpds(z_start_cpd, z_trans_cpd, x_i_cpd, y_i_cpd)
>>> dbnet.initialize_initial_state()
>>> dbn_inf = DBNInference(dbnet)
>>> dbn_inf.start_junction_tree.nodes()
NodeView(((('X', 0), ('Y', 0)), (('X', 0), ('Z', 0))))
>>> dbn_inf.one_and_half_junction_tree.nodes()
NodeView(((('Z', 1), ('Z', 0)), (('Y', 1), ('X', 1)), (('Z', 1), ('X', 1))))

References

[1] Dynamic Bayesian Networks: Representation, Inference and Learning

by Kevin Patrick Murphy http://www.cs.ubc.ca/~murphyk/Thesis/thesis.pdf

backward_inference(variables, evidence=None)[source]

Backward inference method using belief propagation.

Parameters:
  • variables (list) – list of variables for which you want to compute the probability

  • evidence (dict) – a dict key, value pair as {var: state_of_var_observed} None if no evidence

Examples

>>> from pgmpy.factors.discrete import TabularCPD
>>> from pgmpy.models import DynamicBayesianNetwork as DBN
>>> from pgmpy.inference import DBNInference
>>> dbnet = DBN()
>>> dbnet.add_edges_from(
...     [(("Z", 0), ("X", 0)), (("X", 0), ("Y", 0)), (("Z", 0), ("Z", 1))]
... )
>>> z_start_cpd = TabularCPD(("Z", 0), 2, [[0.5], [0.5]])
>>> x_i_cpd = TabularCPD(
...     ("X", 0),
...     2,
...     [[0.6, 0.9], [0.4, 0.1]],
...     evidence=[("Z", 0)],
...     evidence_card=[2],
... )
>>> y_i_cpd = TabularCPD(
...     ("Y", 0),
...     2,
...     [[0.2, 0.3], [0.8, 0.7]],
...     evidence=[("X", 0)],
...     evidence_card=[2],
... )
>>> z_trans_cpd = TabularCPD(
...     ("Z", 1),
...     2,
...     [[0.4, 0.7], [0.6, 0.3]],
...     evidence=[("Z", 0)],
...     evidence_card=[2],
... )
>>> dbnet.add_cpds(z_start_cpd, z_trans_cpd, x_i_cpd, y_i_cpd)
>>> dbnet.initialize_initial_state()
>>> dbn_inf = DBNInference(dbnet)
>>> dbn_inf.backward_inference(
...     [("X", 0)], {("Y", 0): 0, ("Y", 1): 1, ("Y", 2): 1}
... )[("X", 0)].values
array([0.66594382, 0.33405618])
forward_inference(variables, evidence=None, args=None)[source]

Forward inference method using belief propagation.

Parameters:
  • variables (list) – list of variables for which you want to compute the probability

  • evidence (dict) – a dict key, value pair as {var: state_of_var_observed} None if no evidence

Examples

>>> from pgmpy.factors.discrete import TabularCPD
>>> from pgmpy.models import DynamicBayesianNetwork as DBN
>>> from pgmpy.inference import DBNInference
>>> dbnet = DBN()
>>> dbnet.add_edges_from(
...     [(("Z", 0), ("X", 0)), (("X", 0), ("Y", 0)), (("Z", 0), ("Z", 1))]
... )
>>> z_start_cpd = TabularCPD(("Z", 0), 2, [[0.5], [0.5]])
>>> x_i_cpd = TabularCPD(
...     ("X", 0),
...     2,
...     [[0.6, 0.9], [0.4, 0.1]],
...     evidence=[("Z", 0)],
...     evidence_card=[2],
... )
>>> y_i_cpd = TabularCPD(
...     ("Y", 0),
...     2,
...     [[0.2, 0.3], [0.8, 0.7]],
...     evidence=[("X", 0)],
...     evidence_card=[2],
... )
>>> z_trans_cpd = TabularCPD(
...     ("Z", 1),
...     2,
...     [[0.4, 0.7], [0.6, 0.3]],
...     evidence=[("Z", 0)],
...     evidence_card=[2],
... )
>>> dbnet.add_cpds(z_start_cpd, z_trans_cpd, x_i_cpd, y_i_cpd)
>>> dbnet.initialize_initial_state()
>>> dbn_inf = DBNInference(dbnet)
>>> dbn_inf.forward_inference(
...     [("X", 2)], {("Y", 0): 1, ("Y", 1): 0, ("Y", 2): 1}
... )[("X", 2)].values
array([0.76738736, 0.23261264])
query(variables, evidence=None, args='exact')[source]

Query method for Dynamic Bayesian Network using Interface Algorithm.

Parameters:
  • variables (list) – list of variables for which you want to compute the probability

  • evidence (dict) – a dict key, value pair as {var: state_of_var_observed} None if no evidence

Examples

>>> from pgmpy.factors.discrete import TabularCPD
>>> from pgmpy.models import DynamicBayesianNetwork as DBN
>>> from pgmpy.inference import DBNInference
>>> dbnet = DBN()
>>> dbnet.add_edges_from(
...     [(("Z", 0), ("X", 0)), (("X", 0), ("Y", 0)), (("Z", 0), ("Z", 1))]
... )
>>> z_start_cpd = TabularCPD(("Z", 0), 2, [[0.5], [0.5]])
>>> x_i_cpd = TabularCPD(
...     ("X", 0),
...     2,
...     [[0.6, 0.9], [0.4, 0.1]],
...     evidence=[("Z", 0)],
...     evidence_card=[2],
... )
>>> y_i_cpd = TabularCPD(
...     ("Y", 0),
...     2,
...     [[0.2, 0.3], [0.8, 0.7]],
...     evidence=[("X", 0)],
...     evidence_card=[2],
... )
>>> z_trans_cpd = TabularCPD(
...     ("Z", 1),
...     2,
...     [[0.4, 0.7], [0.6, 0.3]],
...     evidence=[("Z", 0)],
...     evidence_card=[2],
... )
>>> dbnet.add_cpds(z_start_cpd, z_trans_cpd, x_i_cpd, y_i_cpd)
>>> dbnet.initialize_initial_state()
>>> dbn_inf = DBNInference(dbnet)
>>> dbn_inf.query([("X", 0)], {("Y", 0): 0, ("Y", 1): 1, ("Y", 2): 1})[
...     ("X", 0)
... ].values
array([0.66594382, 0.33405618])