[10]:
def get_distribution(samples, variables=None):
    """
    For marginal distribution, P(A): get_distribution(samples, variables=['A'])
    For joint distribution, P(A, B): get_distribution(samples, variables=['A', 'B'])
    """
    if variables is None:
        raise ValueError("variables must be specified")

    return samples.groupby(variables).size() / samples.shape[0]
[24]:
# Define a model
from pgmpy.factors.discrete import TabularCPD

from pgmpy.utils import get_example_model

alarm = get_example_model("alarm")

Normal Bayesian Network (no time variation)

Normal simulation

[28]:
samples = alarm.simulate(n_samples=int(1e4))
get_distribution(samples, variables=["HISTORY"])  # P(HISTORY)
[28]:
HISTORY
FALSE    0.9452
TRUE     0.0548
dtype: float64

Simulation with some evidence

[23]:
samples = alarm.simulate(n_samples=int(1e4), evidence={"CVP": "NORMAL", "HR": "HIGH"})
get_distribution(samples, variables=["HISTORY"])  # P(HISTORY)
[23]:
HISTORY
FALSE    0.9847
TRUE     0.0153
dtype: float64

Simulation with soft/virtual evidence

[32]:
soft_evidence = [
    TabularCPD(
        "CVP", 3, [[0.2], [0.3], [0.5]], state_names={"CVP": ["NORMAL", "LOW", "HIGH"]}
    )
]
samples = alarm.simulate(n_samples=int(1e4), virtual_evidence=soft_evidence)
get_distribution(samples, variables=["HISTORY"])  # P(HISTORY)
[32]:
HISTORY
FALSE    0.9609
TRUE     0.0391
dtype: float64

Simulation with intervention

[33]:
samples = alarm.simulate(n_samples=int(1e4), do={"CVP": "NORMAL", "HR": "HIGH"})
get_distribution(samples, variables=["HISTORY"])  # P(HISTORY)
[33]:
HISTORY
FALSE    0.9488
TRUE     0.0512
dtype: float64

Simulation with soft/virtual intervention

[34]:
soft_evidence = [
    TabularCPD(
        "CVP", 3, [[0.2], [0.3], [0.5]], state_names={"CVP": ["NORMAL", "LOW", "HIGH"]}
    )
]
samples = alarm.simulate(n_samples=int(1e4), virtual_intervention=soft_evidence)
get_distribution(samples, variables=["HISTORY"])  # P(HISTORY)
[34]:
HISTORY
FALSE    0.9508
TRUE     0.0492
dtype: float64
[ ]: