From e5553dad98b2653cd5754f39c54f328528ae5f52 Mon Sep 17 00:00:00 2001 From: Anthony Marakis Date: Mon, 23 Oct 2017 19:30:48 +0300 Subject: [PATCH 1/3] probability notebook --- probability.ipynb | 693 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 478 insertions(+), 215 deletions(-) diff --git a/probability.ipynb b/probability.ipynb index 7b1cd3605..2fd1c9dae 100644 --- a/probability.ipynb +++ b/probability.ipynb @@ -2,9 +2,7 @@ "cells": [ { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, + "metadata": {}, "source": [ "# Probability \n", "\n", @@ -13,13 +11,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "from probability import *" + "from probability import *\n", + "from notebook import psource" ] }, { @@ -46,11 +45,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.75" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "p = ProbDist('Flip')\n", "p['H'], p['T'] = 0.25, 0.75\n", @@ -66,23 +74,41 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'?'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "p = ProbDist(freqs={'low': 125, 'medium': 375, 'high': 500})\n", - "p.varname\n" + "p.varname" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.125, 0.375, 0.5)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "(p['low'], p['medium'], p['high'])" ] @@ -96,11 +122,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['high', 'medium', 'low']" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "p.values" ] @@ -114,11 +149,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(50, 114, 64)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "p = ProbDist('Y')\n", "p['Cat'] = 50\n", @@ -129,11 +173,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.21929824561403508, 0.5, 0.2807017543859649)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "p.normalize()\n", "(p['Cat'], p['Dog'], p['Mice'])" @@ -148,11 +201,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Cat: 0.219, Dog: 0.5, Mice: 0.281'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "p.show_approx()" ] @@ -171,15 +233,24 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(8, 10)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "event = {'A': 10, 'B': 9, 'C': 8}\n", "variables = ['C', 'A']\n", - "event_values (event, variables)" + "event_values(event, variables)" ] }, { @@ -213,11 +284,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "P(['X', 'Y'])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "variables = ['X', 'Y']\n", "j = JointProbDist(variables)\n", @@ -234,11 +314,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.2, 0.5)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "j[1,1] = 0.2\n", "j[dict(X=0, Y=1)] = 0.5\n", @@ -255,11 +344,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 0]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "j.values('X')" ] @@ -283,9 +381,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -310,12 +408,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ - "%psource enumerate_joint" + "psource(enumerate_joint)" ] }, { @@ -327,11 +423,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.19999999999999998" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "evidence = dict(Toothache=True)\n", "variables = ['Cavity', 'Catch'] # variables not part of evidence\n", @@ -348,11 +453,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.12" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "evidence = dict(Cavity=True, Toothache=True)\n", "variables = ['Catch'] # variables not part of evidence\n", @@ -371,11 +485,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.6" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "ans2/ans1" ] @@ -390,12 +513,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ - "%psource enumerate_joint_ask" + "psource(enumerate_joint_ask)" ] }, { @@ -407,11 +528,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.6, 0.39999999999999997)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "query_variable = 'Cavity'\n", "evidence = dict(Toothache=True)\n", @@ -442,12 +572,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ - "%psource BayesNode" + "psource(BayesNode)" ] }, { @@ -465,7 +593,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": { "collapsed": true }, @@ -484,7 +612,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": { "collapsed": true }, @@ -492,7 +620,7 @@ "source": [ "john_node = BayesNode('JohnCalls', ['Alarm'], {True: 0.90, False: 0.05})\n", "mary_node = BayesNode('MaryCalls', 'Alarm', {(True, ): 0.70, (False, ): 0.01}) # Using string for parents.\n", - "# Equvivalant to john_node definition. " + "# Equivalant to john_node definition." ] }, { @@ -504,7 +632,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": { "collapsed": true }, @@ -523,11 +651,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.09999999999999998" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "john_node.p(False, {'Alarm': True, 'Burglary': True}) # P(JohnCalls=False | Alarm=True)" ] @@ -542,12 +679,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ - "%psource BayesNet" + "psource(BayesNet)" ] }, { @@ -572,11 +707,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "BayesNet([('Burglary', ''), ('Earthquake', ''), ('Alarm', 'Burglary Earthquake'), ('JohnCalls', 'Alarm'), ('MaryCalls', 'Alarm')])" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "burglary" ] @@ -590,22 +734,43 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "probability.BayesNode" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "type(burglary.variable_node('Alarm'))" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(False, False): 0.001,\n", + " (False, True): 0.29,\n", + " (True, False): 0.94,\n", + " (True, True): 0.95}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "burglary.variable_node('Alarm').cpt" ] @@ -628,12 +793,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ - "%psource enumerate_all" + "psource(enumerate_all)" ] }, { @@ -657,7 +820,7 @@ }, "outputs": [], "source": [ - "%psource enumeration_ask" + "psource(enumeration_ask)" ] }, { @@ -669,11 +832,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.2841718353643929" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "ans_dist = enumeration_ask('Burglary', {'JohnCalls': True, 'MaryCalls': True}, burglary)\n", "ans_dist[True]" @@ -705,7 +877,7 @@ }, "outputs": [], "source": [ - "%psource make_factor" + "psource( make_factor)" ] }, { @@ -727,7 +899,7 @@ }, "outputs": [], "source": [ - "%psource all_events" + "psource(all_events)" ] }, { @@ -741,9 +913,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -752,33 +924,60 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f5" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(False,): 0.01, (True,): 0.7}" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f5.cpt" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Alarm']" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f5.variables" ] @@ -792,7 +991,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": { "collapsed": true }, @@ -803,11 +1002,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(False,): 0.30000000000000004, (True,): 0.7}" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "new_factor.cpt" ] @@ -826,12 +1034,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ - "%psource Factor.pointwise_product" + "psource(Factor.pointwise_product)" ] }, { @@ -849,7 +1055,7 @@ }, "outputs": [], "source": [ - "%psource pointwise_product" + "psource(pointwise_product)" ] }, { @@ -867,7 +1073,7 @@ }, "outputs": [], "source": [ - "%psource Factor.sum_out" + "psource(Factor.sum_out)" ] }, { @@ -885,7 +1091,7 @@ }, "outputs": [], "source": [ - "%psource sum_out" + "psource(sum_out)" ] }, { @@ -916,16 +1122,25 @@ }, "outputs": [], "source": [ - "%psource elimination_ask" + "psource(elimination_ask)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'False: 0.716, True: 0.284'" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "elimination_ask('Burglary', dict(JohnCalls=True, MaryCalls=True), burglary).show_approx()" ] @@ -943,11 +1158,11 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ - "%psource BayesNode.sample" + "psource(BayesNode.sample)" ] }, { @@ -969,7 +1184,7 @@ }, "outputs": [], "source": [ - "%psource prior_sample" + "psource(prior_sample)" ] }, { @@ -985,9 +1200,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -1004,7 +1219,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": { "collapsed": true }, @@ -1022,11 +1237,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.508\n" + ] + } + ], "source": [ "answer = len(rain_true) / N\n", "print(answer)" @@ -1041,11 +1262,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.7755905511811023\n" + ] + } + ], "source": [ "rain_and_cloudy = [observation for observation in rain_true if observation['Cloudy'] == True]\n", "answer = len(rain_and_cloudy) / len(rain_true)\n", @@ -1069,7 +1296,7 @@ }, "outputs": [], "source": [ - "%psource rejection_sampling" + "psource(rejection_sampling)" ] }, { @@ -1089,7 +1316,7 @@ }, "outputs": [], "source": [ - "%psource consistent_with" + "psource(consistent_with)" ] }, { @@ -1101,11 +1328,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.7835249042145593" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "p = rejection_sampling('Cloudy', dict(Rain=True), sprinkler, 1000)\n", "p[True]" @@ -1130,7 +1366,7 @@ }, "outputs": [], "source": [ - "%psource weighted_sample" + "psource(weighted_sample)" ] }, { @@ -1145,11 +1381,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "({'Cloudy': True, 'Rain': True, 'Sprinkler': False, 'WetGrass': True}, 0.8)" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "weighted_sample(sprinkler, dict(Rain=True))" ] @@ -1162,7 +1407,7 @@ }, "outputs": [], "source": [ - "%psource likelihood_weighting" + "psource(likelihood_weighting)" ] }, { @@ -1174,11 +1419,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'False: 0.184, True: 0.816'" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "likelihood_weighting('Cloudy', dict(Rain=True), sprinkler, 200).show_approx()" ] @@ -1202,7 +1456,7 @@ }, "outputs": [], "source": [ - "%psource gibbs_ask" + "psource(gibbs_ask)" ] }, { @@ -1214,11 +1468,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'False: 0.17, True: 0.83'" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "gibbs_ask('Cloudy', dict(Rain=True), sprinkler, 200).show_approx()" ] @@ -1240,7 +1503,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.4.3" + "version": "3.5.3" }, "widgets": { "state": {}, @@ -1248,5 +1511,5 @@ } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } From bee57d715004b1065a553ba84e63dc7c9c036ec2 Mon Sep 17 00:00:00 2001 From: Anthony Marakis Date: Mon, 23 Oct 2017 19:34:36 +0300 Subject: [PATCH 2/3] Update test_probability.py --- tests/test_probability.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/test_probability.py b/tests/test_probability.py index e974a7c89..a40ef9728 100644 --- a/tests/test_probability.py +++ b/tests/test_probability.py @@ -188,7 +188,7 @@ def P_motion_sample(kin_state, v, w): Returns from a single element distribution (no uncertainity in motion)""" pos = kin_state[:2] orient = kin_state[2] - + # for simplicity the robot first rotates and then moves orient = (orient + w)%4 for _ in range(orient): @@ -230,6 +230,13 @@ def P_sensor(x, y): assert grid[6][7] > 700 +def test_gibbs_ask(): + possible_solutions = ['False: 0.16, True: 0.84', 'False: 0.17, True: 0.83', + 'False: 0.15, True: 0.85'] + g_solution = gibbs_ask('Cloudy', dict(Rain=True), sprinkler, 200).show_approx() + assert g_solution in possible_solutions + + # The following should probably go in .ipynb: """ From 2a331763ea50e633b356b5f0a021cc0394142376 Mon Sep 17 00:00:00 2001 From: Anthony Marakis Date: Mon, 23 Oct 2017 19:37:53 +0300 Subject: [PATCH 3/3] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2df3b6dd0..5056ab7c8 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ Here is a table of algorithms, the figure, name of the algorithm in the book and | 14.13 | Prior-Sample | `prior_sample` | [`probability.py`][probability] | | Included | | 14.14 | Rejection-Sampling | `rejection_sampling` | [`probability.py`][probability] | Done | Included | | 14.15 | Likelihood-Weighting | `likelihood_weighting` | [`probability.py`][probability] | Done | Included | -| 14.16 | Gibbs-Ask | `gibbs_ask` | [`probability.py`][probability] | | Included | +| 14.16 | Gibbs-Ask | `gibbs_ask` | [`probability.py`][probability] | Done | Included | | 15.4 | Forward-Backward | `forward_backward` | [`probability.py`][probability] | Done | | | 15.6 | Fixed-Lag-Smoothing | `fixed_lag_smoothing` | [`probability.py`][probability] | Done | | | 15.17 | Particle-Filtering | `particle_filtering` | [`probability.py`][probability] | Done | |