Edited so I can report bug to matplotlib.

This commit is contained in:
Roger Labbe committed 2016-01-09 08:20:28 -08:00
1 parent cb45bf236e
commit 8bab476b31
1 file changed
+474 -402
+474 -402
View File
@@ -1,409 +1,481 @@
{
"metadata": {
"name": "",
"signature": "sha256:8f58b707cf76c184d840e41abdb14f1e584995252c4df05a742336b9f07b9b0b"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
"cells": [
{
"cells": [
"cell_type": "markdown",
"metadata": {},
"source": [
"# Discrete Bayes Animations"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"cell_type": "heading",
"level": 1,
"data": {
"text/html": [
"<style>\n",
"@import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\n",
"@import url('http://fonts.googleapis.com/css?family=Vollkorn');\n",
"@import url('http://fonts.googleapis.com/css?family=Arimo');\n",
"@import url('http://fonts.googleapis.com/css?family=Fira_sans');\n",
"\n",
".CodeMirror pre {\n",
" font-family: 'Source Code Pro', Consolas, monocco, monospace;\n",
"}\n",
" div.cell{\n",
" width: 900px;\n",
" margin-left: 0% !important;\n",
" margin-right: auto;\n",
" }\n",
" div.text_cell code {\n",
" background: transparent;\n",
" color: #000000;\n",
" font-weight: 600;\n",
" font-size: 11pt;\n",
" font-style: bold;\n",
" font-family: 'Source Code Pro', Consolas, monocco, monospace;\n",
" }\n",
" h1 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
"\t}\n",
"\t\n",
" div.input_area {\n",
" background: #F6F6F9;\n",
" border: 1px solid #586e75; \n",
" }\n",
"\n",
" .text_cell_render h1 {\n",
" font-weight: 200;\n",
" font-size: 30pt;\n",
" line-height: 100%;\n",
" color:#c76c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 1em;\n",
" display: block;\n",
" white-space: wrap;\n",
" text-align: left;\n",
" } \n",
" h2 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" text-align: left;\n",
" }\n",
" .text_cell_render h2 {\n",
" font-weight: 200;\n",
" font-size: 16pt;\n",
" font-style: italic;\n",
" line-height: 100%;\n",
" color:#c76c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 1.5em;\n",
" display: block;\n",
" white-space: wrap;\n",
" text-align: left;\n",
" } \n",
" h3 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h3 {\n",
" font-weight: 200;\n",
" font-size: 14pt;\n",
" line-height: 100%;\n",
" color:#d77c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 2em;\n",
" display: block;\n",
" white-space: wrap;\n",
" text-align: left;\n",
" }\n",
" h4 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h4 {\n",
" font-weight: 100;\n",
" font-size: 14pt;\n",
" color:#d77c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 0.5em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" }\n",
" h5 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
"\n",
" .text_cell_render h5 {\n",
" font-weight: 200;\n",
" font-style: normal;\n",
" color: #1d3b84;\n",
" font-size: 16pt;\n",
" margin-bottom: 0em;\n",
" margin-top: 0.5em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" }\n",
" div.text_cell_render{\n",
" font-family: 'Fira sans', verdana,arial,sans-serif;\n",
" line-height: 150%;\n",
" font-size: 110%;\n",
" font-weight: 400;\n",
" text-align:justify;\n",
" text-justify:inter-word;\n",
" }\n",
" div.output_subarea.output_text.output_pyout {\n",
" overflow-x: auto;\n",
" overflow-y: scroll;\n",
" max-height: 50000px;\n",
" }\n",
" div.output_subarea.output_stream.output_stdout.output_text {\n",
" overflow-x: auto;\n",
" overflow-y: scroll;\n",
" max-height: 50000px;\n",
" }\n",
" div.output_wrapper{\n",
" margin-top:0.2em;\n",
" margin-bottom:0.2em;\n",
"}\n",
"\n",
" code{\n",
" font-size: 6pt;\n",
"\n",
" }\n",
" .rendered_html code{\n",
" background-color: transparent;\n",
" }\n",
" ul{\n",
" margin: 2em;\n",
" }\n",
" ul li{\n",
" padding-left: 0.5em; \n",
" margin-bottom: 0.5em; \n",
" margin-top: 0.5em; \n",
" }\n",
" ul li li{\n",
" padding-left: 0.2em; \n",
" margin-bottom: 0.2em; \n",
" margin-top: 0.2em; \n",
" }\n",
" ol{\n",
" margin: 2em;\n",
" }\n",
" ol li{\n",
" padding-left: 0.5em; \n",
" margin-bottom: 0.5em; \n",
" margin-top: 0.5em; \n",
" }\n",
" ul li{\n",
" padding-left: 0.5em; \n",
" margin-bottom: 0.5em; \n",
" margin-top: 0.2em; \n",
" }\n",
" a:link{\n",
" font-weight: bold;\n",
" color:#447adb;\n",
" }\n",
" a:visited{\n",
" font-weight: bold;\n",
" color: #1d3b84;\n",
" }\n",
" a:hover{\n",
" font-weight: bold;\n",
" color: #1d3b84;\n",
" }\n",
" a:focus{\n",
" font-weight: bold;\n",
" color:#447adb;\n",
" }\n",
" a:active{\n",
" font-weight: bold;\n",
" color:#447adb;\n",
" }\n",
" .rendered_html :link {\n",
" text-decoration: underline; \n",
" }\n",
" .rendered_html :hover {\n",
" text-decoration: none; \n",
" }\n",
" .rendered_html :visited {\n",
" text-decoration: none;\n",
" }\n",
" .rendered_html :focus {\n",
" text-decoration: none;\n",
" }\n",
" .rendered_html :active {\n",
" text-decoration: none;\n",
" }\n",
" .warning{\n",
" color: rgb( 240, 20, 20 )\n",
" } \n",
" hr {\n",
" color: #f3f3f3;\n",
" background-color: #f3f3f3;\n",
" height: 1px;\n",
" }\n",
" blockquote{\n",
" display:block;\n",
" background: #fcfcfc;\n",
" border-left: 5px solid #c76c0c;\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" width:680px;\n",
" padding: 10px 10px 10px 10px;\n",
" text-align:justify;\n",
" text-justify:inter-word;\n",
" }\n",
" blockquote p {\n",
" margin-bottom: 0;\n",
" line-height: 125%;\n",
" font-size: 100%;\n",
" }\n",
"</style>\n",
"<script>\n",
" MathJax.Hub.Config({\n",
" TeX: {\n",
" extensions: [\"AMSmath.js\"],\n",
" equationNumbers: { autoNumber: \"AMS\", useLabelIds: true}\n",
" },\n",
" tex2jax: {\n",
" inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n",
" displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n",
" },\n",
" displayAlign: 'center', // Change this to 'center' to center equations.\n",
" \"HTML-CSS\": {\n",
" scale:95,\n",
" availableFonts: [],\n",
" preferredFont:null,\n",
" webFont: \"TeX\",\n",
" styles: {'.MathJax_Display': {\"margin\": 4}}\n",
" }\n",
" });\n",
"</script>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 1,
"metadata": {},
"source": [
"Discrete Bayes Animations"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from __future__ import division, print_function\n",
"import matplotlib.pyplot as plt\n",
"import sys\n",
"sys.path.insert(0,'..') # allow us to format the book\n",
"sys.path.insert(0,'../code') \n",
"import book_format\n",
"book_format.load_style(directory='..')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<style>\n",
"@import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\n",
"@import url('http://fonts.googleapis.com/css?family=Vollkorn');\n",
"@import url('http://fonts.googleapis.com/css?family=Arimo');\n",
"\n",
" div.cell{\n",
" width: 850px;\n",
" margin-left: 0% !important;\n",
" margin-right: auto;\n",
" }\n",
" div.text_cell code {\n",
" background: transparent;\n",
" color: #000000;\n",
" font-weight: 600;\n",
" font-size: 11pt;\n",
" font-style: bold;\n",
" font-family: 'Source Code Pro', Consolas, monocco, monospace;\n",
" }\n",
" h1 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
"\t}\n",
"\t\n",
" div.input_area {\n",
" background: #F6F6F9;\n",
" border: 1px solid #586e75;\n",
" }\n",
"\n",
" .text_cell_render h1 {\n",
" font-weight: 200;\n",
" font-size: 30pt;\n",
" line-height: 100%;\n",
" color:#c76c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 1em;\n",
" display: block;\n",
" white-space: wrap;\n",
" } \n",
" h2 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h2 {\n",
" font-weight: 200;\n",
" font-size: 20pt;\n",
" font-style: italic;\n",
" line-height: 100%;\n",
" color:#c76c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 1.5em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" } \n",
" h3 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h3 {\n",
" font-weight: 300;\n",
" font-size: 18pt;\n",
" line-height: 100%;\n",
" color:#d77c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 2em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" }\n",
" h4 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h4 {\n",
" font-weight: 300;\n",
" font-size: 16pt;\n",
" color:#d77c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 0.5em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" }\n",
" h5 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h5 {\n",
" font-weight: 300;\n",
" font-style: normal;\n",
" color: #1d3b84;\n",
" font-size: 16pt;\n",
" margin-bottom: 0em;\n",
" margin-top: 1.5em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" }\n",
" div.text_cell_render{\n",
" font-family: 'Arimo',verdana,arial,sans-serif;\n",
" line-height: 135%;\n",
" font-size: 125%;\n",
" width:750px;\n",
" margin-left:auto;\n",
" margin-right:auto;\n",
" text-align:justify;\n",
" text-justify:inter-word;\n",
" }\n",
" div.output_subarea.output_text.output_pyout {\n",
" overflow-x: auto;\n",
" overflow-y: scroll;\n",
" max-height: 50000px;\n",
" }\n",
" div.output_subarea.output_stream.output_stdout.output_text {\n",
" overflow-x: auto;\n",
" overflow-y: scroll;\n",
" max-height: 50000px;\n",
" }\n",
" code{\n",
" font-size: 70%;\n",
" }\n",
" .rendered_html code{\n",
" background-color: transparent;\n",
" }\n",
" ul{\n",
" margin: 2em;\n",
" }\n",
" ul li{\n",
" padding-left: 0.5em; \n",
" margin-bottom: 0.5em; \n",
" margin-top: 0.5em; \n",
" }\n",
" ul li li{\n",
" padding-left: 0.2em; \n",
" margin-bottom: 0.2em; \n",
" margin-top: 0.2em; \n",
" }\n",
" ol{\n",
" margin: 2em;\n",
" }\n",
" ol li{\n",
" padding-left: 0.5em; \n",
" margin-bottom: 0.5em; \n",
" margin-top: 0.5em; \n",
" }\n",
" ul li{\n",
" padding-left: 0.5em; \n",
" margin-bottom: 0.5em; \n",
" margin-top: 0.2em; \n",
" }\n",
" a:link{\n",
" font-weight: bold;\n",
" color:#447adb;\n",
" }\n",
" a:visited{\n",
" font-weight: bold;\n",
" color: #1d3b84;\n",
" }\n",
" a:hover{\n",
" font-weight: bold;\n",
" color: #1d3b84;\n",
" }\n",
" a:focus{\n",
" font-weight: bold;\n",
" color:#447adb;\n",
" }\n",
" a:active{\n",
" font-weight: bold;\n",
" color:#447adb;\n",
" }\n",
" .rendered_html :link {\n",
" text-decoration: underline; \n",
" }\n",
" .rendered_html :hover {\n",
" text-decoration: none; \n",
" }\n",
" .rendered_html :visited {\n",
" text-decoration: none;\n",
" }\n",
" .rendered_html :focus {\n",
" text-decoration: none;\n",
" }\n",
" .rendered_html :active {\n",
" text-decoration: none;\n",
" }\n",
" .warning{\n",
" color: rgb( 240, 20, 20 )\n",
" } \n",
" hr {\n",
" color: #f3f3f3;\n",
" background-color: #f3f3f3;\n",
" height: 1px;\n",
" }\n",
" blockquote{\n",
" display:block;\n",
" background: #fcfcfc;\n",
" border-left: 5px solid #c76c0c;\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" width:680px;\n",
" padding: 10px 10px 10px 10px;\n",
" text-align:justify;\n",
" text-justify:inter-word;\n",
" }\n",
" blockquote p {\n",
" margin-bottom: 0;\n",
" line-height: 125%;\n",
" font-size: 100%;\n",
" }\n",
"</style>\n",
"<script>\n",
" MathJax.Hub.Config({\n",
" TeX: {\n",
" extensions: [\"AMSmath.js\"]\n",
" },\n",
" tex2jax: {\n",
" inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n",
" displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n",
" },\n",
" displayAlign: 'center', // Change this to 'center' to center equations.\n",
" \"HTML-CSS\": {\n",
" styles: {'.MathJax_Display': {\"margin\": 4}}\n",
" }\n",
" });\n",
"</script>\n"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"<IPython.core.display.HTML at 0x7f8ada8a3d30>"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook creates the animations for the Discrete Bayesian filters chapter. It is not really intended to be a readable part of the book, but of course you are free to look at the source code, and even modify it. However, if you are interested in running your own animations, I'll point you to the examples subdirectory of the book, which contains a number of python scripts that you can run and modify from an IDE or the command line. This module saves the animations to GIF files, which is quite slow and not very interactive. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from matplotlib import animation\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from book_plots import bar_plot\n",
"%matplotlib inline"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# the predict algorithm of the discrete bayesian filter\n",
"def predict(pos, move, p_correct, p_under, p_over):\n",
" n = len(pos)\n",
" result = np.array(pos, dtype=float)\n",
" for i in range(n):\n",
" result[i] = \\\n",
" pos[(i-move) % n] * p_correct + \\\n",
" pos[(i-move-1) % n] * p_over + \\\n",
" pos[(i-move+1) % n] * p_under \n",
" return result\n",
"\n",
"\n",
"def normalize(p):\n",
" s = sum(p)\n",
" for i in range (len(p)):\n",
" p[i] = p[i] / s\n",
" \n",
"# the update algorithm of the discrete bayesian filter\n",
"def update(pos, measure, p_hit, p_miss):\n",
" q = np.array(pos, dtype=float)\n",
" for i in range(len(hallway)):\n",
" if hallway[i] == measure:\n",
" q[i] = pos[i] * p_hit\n",
" else:\n",
" q[i] = pos[i] * p_miss\n",
" normalize(q)\n",
" return q"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pos = [1.0,0,0,0,0,0,0,0,0,0]\n",
"def bar_animate(nframe):\n",
" global pos\n",
" bar_plot(pos)\n",
" pos = predict(pos, 1, .8, .1, .1)\n",
"\n",
"\n",
"fig = plt.figure(figsize=(6.5, 2.5))\n",
"anim = animation.FuncAnimation(fig, bar_animate,\n",
" frames=100, interval=75)\n",
"anim.save('02_no_info.gif', writer='imagemagick')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f8ada768cf8>"
]
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"02_no_info.gif\">"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pos = np.array([.1]*10)\n",
"hallway = np.array([1, 1, 0, 0, 0, 0, 0, 0, 1, 0])\n",
"\n",
"def bar_animate(nframe):\n",
" global pos\n",
" if nframe == 0:\n",
" return\n",
"\n",
" bar_plot(pos, ylim=(0,1.0))\n",
" if nframe % 2 == 0:\n",
" pos = predict(pos, 1, .8, .1, .1)\n",
" else:\n",
" x = (nframe/2) % len(hallway)\n",
" z = hallway[x]\n",
" pos = update(pos, z, .6, .2)\n",
" \n",
"\n",
"fig = plt.figure(figsize=(6.5, 2.5))\n",
"anim = animation.FuncAnimation(fig, bar_animate,\n",
" frames=60, interval=75)\n",
"anim.save('02_simulate.gif', writer='imagemagick')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAbgAAACsCAYAAAAJ+rmKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADXJJREFUeJzt3X2QXXddx/H3pwm1BMpW6FgkXSYokZRRbHlIOyAPSpSk\naquMY41UxypYR4M4jlrgD/zDGRn+YGSYYifUtlMUGocCGsYmZRBEEKwN9IHSrJMUdkwCVJ66DA91\nEvn6xz2Nl+1m7+7mbs7Nr+/XTCb3nPPL3s/sZvdzf79zzt1UFZIkteaMvgNIkrQaLDhJUpMsOElS\nkyw4SVKTLDhJUpMsOElSk0YWXJIbkzyY5LOLjHl7kgNJ7kly0XgjSpK0fEuZwd0EbD3RwSSXAs+s\nqo3A7wLXjSmbJEkrNrLgqurjwDcWGXIZcHM39g7gnCTnjSeeJEkrs3YMH2M9cGho+zBwPvDgIzvm\n5uZ8uxRJ0qqZmprK/H3jushk/ge20CRJvRpHwR0Bpoe2z+/2SZLUm3EsUe4GdgC7klwCPFRVD55o\n8NTU1BieUpL0WDc3N7fo8ZEFl+QW4KXAuUkOAX8OPA6gqnZW1W1JLk1yEPg2cNVJp5Yk6STlVPy6\nnOGLTJzBSZLGYXgGt5oXmUiSNFEsOElSkyw4SVKTLDhJUpMsOElSkyw4SVKTLDhJUpMsOElSkyw4\nSVKTLDhJUpMsOElSkyw4SVKTLDhJUpMsOElSkyw4SVKTLDhJUpMsOElSkyw4SVKTLDhJUpNGFlyS\nrUlmkhxIcs0Cx89NsjfJ3UnuS/Jbq5JUkqRlWLTgkqwBrgW2As8Gtie5YN6wHcBdVXUh8DLgrUnW\nrkJWSZKWbNQMbjNwsKpmq+oosAu4fN6YLwFP6h4/CfhaVR0bb0xJkpZn1ExrPXBoaPswcPG8MdcD\nH0nyReBs4FfHF0+SpJUZNYOrJXyMNwJ3V9XTgAuBdyQ5+6STSZJ0EkYV3BFgemh7msEsbtgLgfcC\nVNUDwBeAZ40roCRJKzGq4PYBG5NsSHImcAWwe96YGWALQJLzGJTb58cdVJKk5Vj0HFxVHUuyA7gd\nWAPcUFX7k1zdHd8J/CVwU5J7GBTmn1XV11c5tyRJi0rVUk6znZy5ubnjTzI1NbXqzydJat/c3Nzx\nx1NTU5l/3HcykSQ1yYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1\nyYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1yYKTJDXJgpMkNcmCkyQ1aWTBJdmaZCbJgSTX\nnGDMy5LcleS+JP8y9pSSJC3T2sUOJlkDXAtsAY4AdybZXVX7h8acA7wDeEVVHU5y7moGliRpKUbN\n4DYDB6tqtqqOAruAy+eN+XXgfVV1GKCqvjr+mJIkLc+oglsPHBraPtztG7YReHKSjybZl+Q3xhlQ\nkqSVWHSJEqglfIzHAc8FXg6sAz6V5N+r6sDJhpMkaaVGFdwRYHpoe5rBLG7YIeCrVfVd4LtJ/hX4\nScCCkyT1ZtQS5T5gY5INSc4ErgB2zxvzj8BPJVmTZB1wMXD/+KNKkrR0i87gqupYkh3A7cAa4Iaq\n2p/k6u74zqqaSbIXuBf4HnB9VVlwkqRepWopp9lOztzc3PEnmZqaWvXnkyS1b25u7vjjqampzD/u\nO5lIkppkwUmSmmTBSZKaZMFJkppkwUmSmjTqRm9J0mPUzMzDzM72m2HDBti06awV/VsLTpK0oNlZ\n2LZtZeUyLnv2PMymTSv7ty5RSpKaZMFJkppkwUmSmmTBSZKaZMFJkppkwUmSmmTBSZKaZMFJkppk\nwUmSmmTBSZKaZMFJkppkwUmSmjSy4JJsTTKT5ECSaxYZ94Ikx5K8crwRJUlavkULLska4FpgK/Bs\nYHuSC04w7i3AXiCrkFOSpGUZNYPbDBysqtmqOgrsAi5fYNxrgVuBr4w5nyRJKzKq4NYDh4a2D3f7\njkuynkHpXdftqrGlkyRphUYV3FLK6m3A66uqGCxPukQpSerdqN/ofQSYHtqeZjCLG/Y8YFcSgHOB\nbUmOVtXusaWUJGmZRhXcPmBjkg3AF4ErgO3DA6rqRx55nOQm4IOWmySpb4sWXFUdS7IDuB1YA9xQ\nVfuTXN0d33kKMkqStGyjZnBU1R5gz7x9CxZbVV01plySJJ0U38lEktQkC06S1CQLTpLUJAtOktQk\nC06S1CQLTpLUJAtOktQkC06S1CQLTpLUJAtOktQkC06S1CQLTpLUJAtOktQkC06S1CQLTpLUJAtO\nktQkC06S1CQLTpLUJAtOktSkJRVckq1JZpIcSHLNAsdfleSeJPcm+bckzxl/VEmSlm5kwSVZA1wL\nbAWeDWxPcsG8YZ8HXlJVzwH+AnjnuINKkrQcS5nBbQYOVtVsVR0FdgGXDw+oqk9V1Vy3eQdw/nhj\nSpK0PEspuPXAoaHtw92+E/kd4LaTCSVJ0slau4QxtdQPluSngd8GXrTiRJIkjcFSCu4IMD20Pc1g\nFvd9ugtLrge2VtU3xhNPkqSVWcoS5T5gY5INSc4ErgB2Dw9I8nTg/cCVVXVw/DElSVqekTO4qjqW\nZAdwO7AGuKGq9ie5uju+E3gT8IPAdUkAjlbV5tWLLUmnv5mZh5md7e/5N2yATZvO6i/AKlvKEiVV\ntQfYM2/fzqHHrwZePd5oktS22VnYtq2/gtmz52E2bert6Ved72QiSWqSBSdJapIFJ0lqkgUnSWqS\nBSdJatKSrqIcp717Hz7VT3lc65fESpL+3ykvOC+JlSSdCi5RSpKaZMFJkppkwUmSmmTBSZKaZMFJ\nkpp0yq+inGS+s7cktcOCG+I7e0tSO1yilCQ1yYKTJDXJJUpJTer7nDp4Xr1vFpykJvV9Th08r943\nlyglSU0aWXBJtiaZSXIgyTUnGPP27vg9SS4af0xJkpZn0SXKJGuAa4EtwBHgziS7q2r/0JhLgWdW\n1cYkFwPXAZesYubHLM8pSNLSjToHtxk4WFWzAEl2AZcD+4fGXAbcDFBVdyQ5J8l5VfXgKuR9TPOc\ngiaFL7Z0OkhVnfhg8ivAK6rqNd32lcDFVfXaoTEfBN5cVZ/stj8MXFNVn35kzNzc3ImfRJKkkzQ1\nNZX5+0adg1tqMc3/wBaaJKlXowruCDA9tD0NHB4x5vxunyRJvRl1Dm4fsDHJBuCLwBXA9nljdgM7\ngF1JLgEemn/+baGpoyRJq2nRgquqY0l2ALcDa4Abqmp/kqu74zur6rYklyY5CHwbuGrVU0uSNMKi\nF5lIknS6Oi3eyWQpN5v3KcmNSR5M8tm+sywkyXSSjyb5XJL7kvxh35nmS3JWkjuS3J3k/iRv7jvT\nQpKsSXJXd/XwxEkym+TeLuN/9J1nId2tRLcm2d99rSfqvtkkz+o+f4/8mZu075kkb+i+nz+b5D1J\nfqDvTPMleV2X774kr+slw6TP4Lqbzf+ToZvNge3DN5v3LcmLgW8B76qqn+g7z3xJngo8taruTvJE\n4NPAL03S5xAgybqq+k6StcAngD+pqk/0nWtYkj8GngecXVWX9Z1nviRfAJ5XVV/vO8uJJLkZ+FhV\n3dh9rZ9QVXN951pIkjMY/NzZXFWH+s4D0F0T8RHggqr6nyR/D9xWVTf3GmxIkh8HbgFeABwF9gK/\nV1UPnMocp8MM7vjN5lV1FHjkZvOJUVUfB77Rd44TqaovV9Xd3eNvMbhR/2n9pnq0qvpO9/BMBud8\nJ+qHdJLzgUuBv+HRt8ZMkonNlmQKeHFV3QiD8/yTWm6dLcADk1JunW8yKI113QuEdUzeleubgDuq\n6uGq+l/gY8ArT3WI06Hg1gPD/7kOd/u0At2rv4uAO/pN8mhJzkhyN/Ag8NGqur/vTPP8FfCnwPf6\nDrKIAj6cZF+S1/QdZgHPAL6S5KYkn0lyfZJ1fYdaxK8B7+k7xLBudv5W4L8YXN3+UFV9uN9Uj3If\n8OIkT+6+vj/P4BayU+p0KLjJXkM9jXTLk7cCr+tmchOlqr5XVRcy+EZ4SZKX9RzpuCS/APx3Vd3F\nBM+QgBdV1UXANuAPuuXzSbIWeC7w11X1XAZXXr++30gLS3Im8IvAe/vOMizJjwJ/BGxgsBLzxCSv\n6jXUPFU1A7wF+BCwB7iLHl4Yng4Ft5SbzTVCkscB7wP+rqr+oe88i+mWrP4JeH7fWYa8ELisO8d1\nC/AzSd7Vc6ZHqaovdX9/BfgAgyX+SXIYOFxVd3bbtzIovEm0Dfh097mcJM8HPllVX6uqY8D7Gfz/\nnChVdWNVPb+qXgo8xOBailPqdCi44zebd6+ormBwc7mWKEmAG4D7q+ptfedZSJJzk5zTPX488LMM\nXvVNhKp6Y1VNV9UzGCxbfaSqfrPvXMOSrEtydvf4CcDPARN1ZW9VfRk4lOTHul1bgM/1GGkx2xm8\nmJk0M8AlSR7ffW9vASZtOZ8kP9T9/XTgl+lhqXfif6P3iW427znW90lyC/BS4ClJDgFvqqqbeo41\n7EXAlcC9SR4pjTdU1d4eM833w8DN3VVrZwB/W1X/3HOmxUzi0vl5wAcGP/NYC7y7qj7Ub6QFvRZ4\nd/eC9QEm8M0huhcIW4CJO49ZVfd0qwf7GCz7fQZ4Z7+pFnRrkqcwuCDm96vqm6c6wMTfJiBJ0kqc\nDkuUkiQtmwUnSWqSBSdJapIFJ0lqkgUnSWqSBSdJapIFJ0lq0v8ByVyjNXG2/lYAAAAASUVORK5C\nYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x7f8ada701d30>"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" <img src=\"02_simulate.gif\">"
]
"output_type": "execute_result"
}
],
"metadata": {}
"source": [
"from __future__ import division, print_function\n",
"import matplotlib.pyplot as plt\n",
"import sys\n",
"sys.path.insert(0,'..') # allow us to format the book\n",
"sys.path.insert(0,'../code') \n",
"import book_format\n",
"book_format.load_style(directory='..')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook creates the animations for the Discrete Bayesian filters chapter. It is not really intended to be a readable part of the book, but of course you are free to look at the source code, and even modify it. However, if you are interested in running your own animations, I'll point you to the examples subdirectory of the book, which contains a number of python scripts that you can run and modify from an IDE or the command line. This module saves the animations to GIF files, which is quite slow and not very interactive. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from matplotlib import animation\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from book_plots import bar_plot\n",
"%matplotlib inline\n",
"\n",
"# the predict algorithm of the discrete bayesian filter\n",
"def predict(pos, move, p_correct, p_under, p_over):\n",
" n = len(pos)\n",
" result = np.array(pos, dtype=float)\n",
" for i in range(n):\n",
" result[i] = \\\n",
" pos[(i-move) % n] * p_correct + \\\n",
" pos[(i-move-1) % n] * p_over + \\\n",
" pos[(i-move+1) % n] * p_under \n",
" return result\n",
"\n",
"\n",
"def normalize(p):\n",
" s = sum(p)\n",
" for i in range (len(p)):\n",
" p[i] = p[i] / s\n",
" \n",
"# the update algorithm of the discrete bayesian filter\n",
"def update(pos, measure, p_hit, p_miss):\n",
" q = np.array(pos, dtype=float)\n",
" for i in range(len(hallway)):\n",
" if hallway[i] == measure:\n",
" q[i] = pos[i] * p_hit\n",
" else:\n",
" q[i] = pos[i] * p_miss\n",
" normalize(q)\n",
" return q"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'imagemagick'"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import matplotlib\n",
"matplotlib.matplotlib_fname()\n",
"matplotlib.rcParams['animation.writer']"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"\"anim = animation.FuncAnimation(fig, bar_animate,\\n frames=100, interval=75)\\nanim.save('02_no_info.gif', writer='imagemagick')\""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x4e46d30>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.figure.Figure at 0x7d08a90>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x4e46d68>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from gif_animate import animate\n",
"\n",
"pos = [1.0,0,0,0,0,0,0,0,0,0]\n",
"def bar_animate(nframe):\n",
" global pos\n",
" bar_plot(pos)\n",
" plt.title('Step {}'.format(nframe + 1))\n",
" pos = predict(pos, 1, .8, .1, .1)\n",
"\n",
"for i in range(10):\n",
" bar_animate(i)\n",
"\n",
"fig = plt.figure(figsize=(6.5, 2.5))\n",
"animate('foo.gif', bar_animate, frames=100, interval=75);\n",
"'''anim = animation.FuncAnimation(fig, bar_animate,\n",
" frames=100, interval=75)\n",
"anim.save('02_no_info.gif', writer='imagemagick')'''"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"02_no_info.gif\">"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"pos = np.array([.1]*10)\n",
"hallway = np.array([1, 1, 0, 0, 0, 0, 0, 0, 1, 0])\n",
"\n",
"def bar_animate(nframe):\n",
" global pos\n",
" if nframe == 0:\n",
" return\n",
"\n",
" bar_plot(pos, ylim=(0,1.0))\n",
" if nframe % 2 == 0:\n",
" pos = predict(pos, 1, .8, .1, .1)\n",
" else:\n",
" x = (nframe/2) % len(hallway)\n",
" z = hallway[x]\n",
" pos = update(pos, z, .6, .2)\n",
" \n",
"\n",
"fig = plt.figure(figsize=(6.5, 2.5))\n",
"anim = animation.FuncAnimation(fig, bar_animate,\n",
" frames=60, interval=75)\n",
"anim.save('02_simulate.gif', writer='imagemagick')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" <img src=\"02_simulate.gif\">"
]
}
]
}
],
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}