Skip to content

Instantly share code, notes, and snippets.

@bearloga
Created January 9, 2019 03:23
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bearloga/cded2130fddd673a4d034b6b1e20100c to your computer and use it in GitHub Desktop.
Save bearloga/cded2130fddd673a4d034b6b1e20100c to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's an example of a [Bayesian network](https://en.wikipedia.org/wiki/Bayesian_network) (BN) using [PPL](https://en.wikipedia.org/wiki/Probabilistic_programming_language) in Python called [pomegranate](https://pomegranate.readthedocs.io/en/latest/)\n",
"\n",
"There are multiple ways to create a BN. You could specify the structure & probabilities, you could specify structure & learn probabilities from data, or you could learn both structure *and* probabilities from data. This is an example where the structure & probabilities are provided by us."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from pomegranate import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Suppose it rains 25% of the time:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"raining = DiscreteDistribution({'Yes': 0.25, 'No': 0.75})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and that the sprinkler has a probability of 0.1% of being on when it's raining and a probability of 80% of being on when it's not:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"sprinkler = ConditionalProbabilityTable(\n",
" [['Yes', 'On', 0.001],\n",
" ['Yes', 'Off', 0.999],\n",
" ['No', 'On', 0.8],\n",
" ['No', 'Off', 0.2]],\n",
" [raining]\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"now, let's describe the conditional probabilities of the pavement being wet/dry given the weather and the state of the sprinkler:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"pavement = ConditionalProbabilityTable(\n",
" [['Yes', 'On', 'Wet', 1.0],\n",
" ['Yes', 'On', 'Dry', 0.0],\n",
" ['Yes', 'Off', 'Wet', 1.0],\n",
" ['Yes', 'Off', 'Dry', 0.0],\n",
" ['No', 'On', 'Wet', 0.75],\n",
" ['No', 'On', 'Dry', 0.25],\n",
" ['No', 'Off', 'Wet', 0.01],\n",
" ['No', 'Off', 'Dry', 0.99]],\n",
" [raining, sprinkler]\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"then we specify these as nodes in the network and specify the relationships between them as edges:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"s1 = Node(raining, name = 'raining')\n",
"s2 = Node(sprinkler, name = 'sprinkler')\n",
"s3 = Node(pavement, name = 'pavement')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"model = BayesianNetwork('wet pavement model')\n",
"model.add_states(s1, s2, s3)\n",
"model.add_edge(s1, s2)\n",
"model.add_edge(s1, s3)\n",
"model.add_edge(s2, s3)\n",
"model.bake()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"here's how our probabilistic [DAG](https://en.wikipedia.org/wiki/Directed_acyclic_graph) looks:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"model.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"what's really cool about BNs is that they enable inference with partial information (incomplete data)\n",
"\n",
"suppose we observe that the pavement is wet and we know that it didn't rain today, what's the probability the sprinkler was on? we can calculate this by hand with [Bayes' theorem](https://en.wikipedia.org/wiki/Bayes%27_theorem) or we can have pomegranate do those calculations for us:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['No'\n",
" {\n",
" \"class\" :\"Distribution\",\n",
" \"dtype\" :\"str\",\n",
" \"name\" :\"DiscreteDistribution\",\n",
" \"parameters\" :[\n",
" {\n",
" \"On\" :0.9966777408637874,\n",
" \"Off\" :0.0033222591362126854\n",
" }\n",
" ],\n",
" \"frozen\" :false\n",
"}\n",
" 'Wet']\n"
]
}
],
"source": [
"print(model.predict_proba(['No', None, 'Wet']))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"99.7% probability that the sprinkler was on. suppose we didn't know whether it rained but we knew for sure that the sprinkler never turned on, we can similarly calculate the probability that it rained:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[{\n",
" \"class\" :\"Distribution\",\n",
" \"dtype\" :\"str\",\n",
" \"name\" :\"DiscreteDistribution\",\n",
" \"parameters\" :[\n",
" {\n",
" \"Yes\" :0.9940298507462686,\n",
" \"No\" :0.0059701492537314734\n",
" }\n",
" ],\n",
" \"frozen\" :false\n",
"}\n",
" 'Off' 'Wet']\n"
]
}
],
"source": [
"print(model.predict_proba([None, 'Off', 'Wet']))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"99.4% chance that it rained"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment