{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Example Using the Earthquake network\n", "================================" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example I will try to create the Alarm Bayesian Network using pgmpy and do some simple queries on the network.\n", "This network is mentioned in Bayesian Artificial Intelligence - Section 2.5.1 (https://bayesian-intelligence.com/publications/bai/book/BAI_Chapter2.pdf)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Importing Library\n", "from pgmpy.models import BayesianNetwork\n", "from pgmpy.inference import VariableElimination" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Defining network structure\n", "\n", "alarm_model = BayesianNetwork(\n", " [\n", " (\"Burglary\", \"Alarm\"),\n", " (\"Earthquake\", \"Alarm\"),\n", " (\"Alarm\", \"JohnCalls\"),\n", " (\"Alarm\", \"MaryCalls\"),\n", " ]\n", ")\n", "\n", "# Defining the parameters using CPT\n", "from pgmpy.factors.discrete import TabularCPD\n", "\n", "cpd_burglary = TabularCPD(\n", " variable=\"Burglary\", variable_card=2, values=[[0.999], [0.001]]\n", ")\n", "cpd_earthquake = TabularCPD(\n", " variable=\"Earthquake\", variable_card=2, values=[[0.998], [0.002]]\n", ")\n", "cpd_alarm = TabularCPD(\n", " variable=\"Alarm\",\n", " variable_card=2,\n", " values=[[0.999, 0.71, 0.06, 0.05], [0.001, 0.29, 0.94, 0.95]],\n", " evidence=[\"Burglary\", \"Earthquake\"],\n", " evidence_card=[2, 2],\n", ")\n", "cpd_johncalls = TabularCPD(\n", " variable=\"JohnCalls\",\n", " variable_card=2,\n", " values=[[0.95, 0.1], [0.05, 0.9]],\n", " evidence=[\"Alarm\"],\n", " evidence_card=[2],\n", ")\n", "cpd_marycalls = TabularCPD(\n", " variable=\"MaryCalls\",\n", " variable_card=2,\n", " values=[[0.1, 0.7], [0.9, 0.3]],\n", " evidence=[\"Alarm\"],\n", " evidence_card=[2],\n", ")\n", "\n", "# Associating the parameters with the model structure\n", "alarm_model.add_cpds(\n", " cpd_burglary, cpd_earthquake, cpd_alarm, cpd_johncalls, cpd_marycalls\n", ")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Checking if the cpds are valid for the model\n", "alarm_model.check_model()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "NodeView(('Burglary', 'Alarm', 'Earthquake', 'JohnCalls', 'MaryCalls'))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Viewing nodes of the model\n", "alarm_model.nodes()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OutEdgeView([('Burglary', 'Alarm'), ('Alarm', 'JohnCalls'), ('Alarm', 'MaryCalls'), ('Earthquake', 'Alarm')])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Viewing edges of the model\n", "alarm_model.edges()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Burglary ⟂ Earthquake)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Checking independcies of a node\n", "alarm_model.local_independencies(\"Burglary\")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(JohnCalls ⟂ Burglary, MaryCalls, Earthquake | Alarm)\n", "(JohnCalls ⟂ MaryCalls, Earthquake | Burglary, Alarm)\n", "(JohnCalls ⟂ Burglary, Earthquake | Alarm, MaryCalls)\n", "(JohnCalls ⟂ Burglary, MaryCalls | Alarm, Earthquake)\n", "(JohnCalls ⟂ Earthquake | Burglary, MaryCalls, Alarm)\n", "(JohnCalls ⟂ MaryCalls | Burglary, Earthquake, Alarm)\n", "(JohnCalls ⟂ Burglary | Alarm, MaryCalls, Earthquake)\n", "(MaryCalls ⟂ JohnCalls, Burglary, Earthquake | Alarm)\n", "(MaryCalls ⟂ Burglary, Earthquake | JohnCalls, Alarm)\n", "(MaryCalls ⟂ JohnCalls, Earthquake | Burglary, Alarm)\n", "(MaryCalls ⟂ JohnCalls, Burglary | Alarm, Earthquake)\n", "(MaryCalls ⟂ Earthquake | JohnCalls, Burglary, Alarm)\n", "(MaryCalls ⟂ Burglary | JohnCalls, Alarm, Earthquake)\n", "(MaryCalls ⟂ JohnCalls | Burglary, Earthquake, Alarm)\n", "(Earthquake ⟂ Burglary)\n", "(Earthquake ⟂ JohnCalls, MaryCalls | Alarm)\n", "(Earthquake ⟂ MaryCalls | JohnCalls, Alarm)\n", "(Earthquake ⟂ JohnCalls, MaryCalls | Burglary, Alarm)\n", "(Earthquake ⟂ JohnCalls | Alarm, MaryCalls)\n", "(Earthquake ⟂ MaryCalls | JohnCalls, Burglary, Alarm)\n", "(Earthquake ⟂ JohnCalls | Burglary, MaryCalls, Alarm)\n", "(Burglary ⟂ Earthquake)\n", "(Burglary ⟂ JohnCalls, MaryCalls | Alarm)\n", "(Burglary ⟂ MaryCalls | JohnCalls, Alarm)\n", "(Burglary ⟂ JohnCalls | Alarm, MaryCalls)\n", "(Burglary ⟂ JohnCalls, MaryCalls | Alarm, Earthquake)\n", "(Burglary ⟂ MaryCalls | JohnCalls, Alarm, Earthquake)\n", "(Burglary ⟂ JohnCalls | Alarm, MaryCalls, Earthquake)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Listing all Independencies\n", "alarm_model.get_independencies()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 4 }