{ "metadata": { "name": "", "signature": "sha256:8f58b707cf76c184d840e41abdb14f1e584995252c4df05a742336b9f07b9b0b" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 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": [ "\n", "\n" ], "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "" ] } ], "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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\n", "text": [ "" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "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": [ "" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] } ], "metadata": {} } ] }