Define the Bayesian Network structure

!pip install pgmpy
Collecting pgmpy
  Downloading pgmpy-0.1.25-py3-none-any.whl.metadata (6.4 kB)
Requirement already satisfied: networkx in /opt/conda/lib/python3.10/site-packages (from pgmpy) (3.2.1)
Requirement already satisfied: numpy in /opt/conda/lib/python3.10/site-packages (from pgmpy) (1.26.4)
Requirement already satisfied: scipy in /opt/conda/lib/python3.10/site-packages (from pgmpy) (1.11.4)
Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.10/site-packages (from pgmpy) (1.2.2)
Requirement already satisfied: pandas in /opt/conda/lib/python3.10/site-packages (from pgmpy) (2.2.1)
Requirement already satisfied: pyparsing in /opt/conda/lib/python3.10/site-packages (from pgmpy) (3.1.1)
Requirement already satisfied: torch in /opt/conda/lib/python3.10/site-packages (from pgmpy) (2.1.2+cpu)
Requirement already satisfied: statsmodels in /opt/conda/lib/python3.10/site-packages (from pgmpy) (0.14.1)
Requirement already satisfied: tqdm in /opt/conda/lib/python3.10/site-packages (from pgmpy) (4.66.1)
Requirement already satisfied: joblib in /opt/conda/lib/python3.10/site-packages (from pgmpy) (1.3.2)
Requirement already satisfied: opt-einsum in /opt/conda/lib/python3.10/site-packages (from pgmpy) (3.3.0)
Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.10/site-packages (from pandas->pgmpy) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.10/site-packages (from pandas->pgmpy) (2023.3.post1)
Requirement already satisfied: tzdata>=2022.7 in /opt/conda/lib/python3.10/site-packages (from pandas->pgmpy) (2023.4)
Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.10/site-packages (from scikit-learn->pgmpy) (3.2.0)
Requirement already satisfied: patsy>=0.5.4 in /opt/conda/lib/python3.10/site-packages (from statsmodels->pgmpy) (0.5.6)
Requirement already satisfied: packaging>=21.3 in /opt/conda/lib/python3.10/site-packages (from statsmodels->pgmpy) (21.3)
Requirement already satisfied: filelock in /opt/conda/lib/python3.10/site-packages (from torch->pgmpy) (3.13.1)
Requirement already satisfied: typing-extensions in /opt/conda/lib/python3.10/site-packages (from torch->pgmpy) (4.9.0)
Requirement already satisfied: sympy in /opt/conda/lib/python3.10/site-packages (from torch->pgmpy) (1.12)
Requirement already satisfied: jinja2 in /opt/conda/lib/python3.10/site-packages (from torch->pgmpy) (3.1.2)
Requirement already satisfied: fsspec in /opt/conda/lib/python3.10/site-packages (from torch->pgmpy) (2024.3.0)
Requirement already satisfied: six in /opt/conda/lib/python3.10/site-packages (from patsy>=0.5.4->statsmodels->pgmpy) (1.16.0)
Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.10/site-packages (from jinja2->torch->pgmpy) (2.1.3)
Requirement already satisfied: mpmath>=0.19 in /opt/conda/lib/python3.10/site-packages (from sympy->torch->pgmpy) (1.3.0)
Downloading pgmpy-0.1.25-py3-none-any.whl (2.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.0/2.0 MB 34.4 MB/s eta 0:00:0000:01
Installing collected packages: pgmpy
Successfully installed pgmpy-0.1.25
from pgmpy.models import BayesianModel
from pgmpy.factors.discrete import TabularCPD
from pgmpy.inference import VariableElimination
model = BayesianModel([('Outlook', 'Rain')])
# Define conditional probability distributions (CPDs)
cpd_outlook = TabularCPD(variable='Outlook', variable_card=3, values=[[0.4], [0.3], [0.3]],
state_names={'Outlook': ['sunny', 'overcast', 'rainy']})
cpd_rain = TabularCPD(variable='Rain', variable_card=2, values=[[0.8, 0.4, 0.2],
[0.2, 0.6, 0.8]],
evidence=['Outlook'], evidence_card=[3],
state_names={'Rain': ['yes', 'no'],
'Outlook': ['sunny', 'overcast', 'rainy']})
# Add CPDs to the model
model.add_cpds(cpd_outlook, cpd_rain)
# Check model for consistency
print("Model is consistent:", model.check_model())
Model is consistent: True
# Perform inference
inference = VariableElimination(model)
# Predict whether it will rain given the outlook
query = inference.query(variables=['Rain'], evidence={'Outlook': 'sunny'})
print("Predicted probability of rain given sunny outlook:", query.values[0])
Predicted probability of rain given sunny outlook: 0.8
query = inference.query(variables=['Rain'], evidence={'Outlook': 'overcast'})
print("Predicted probability of rain given overcast outlook:", query.values[0])
Predicted probability of rain given overcast outlook: 0.4
query = inference.query(variables=['Rain'], evidence={'Outlook': 'rainy'})
print("Predicted probability of rain given rainy outlook:", query.values[0])
Predicted probability of rain given rainy outlook: 0.2