Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
| Download
Project: test
Views: 88919
Kernel: Unknown Kernel

Discrete Bayes Animations

from __future__ import division, print_function import matplotlib.pyplot as plt import sys sys.path.insert(0,'..') # allow us to format the book sys.path.insert(0,'../code') import book_format book_format.load_style(directory='..')

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.

from matplotlib import animation import matplotlib.pyplot as plt import numpy as np from book_plots import bar_plot %matplotlib inline
# the predict algorithm of the discrete bayesian filter def predict(pos, move, p_correct, p_under, p_over): n = len(pos) result = np.array(pos, dtype=float) for i in range(n): result[i] = \ pos[(i-move) % n] * p_correct + \ pos[(i-move-1) % n] * p_over + \ pos[(i-move+1) % n] * p_under return result def normalize(p): s = sum(p) for i in range (len(p)): p[i] = p[i] / s # the update algorithm of the discrete bayesian filter def update(pos, measure, p_hit, p_miss): q = np.array(pos, dtype=float) for i in range(len(hallway)): if hallway[i] == measure: q[i] = pos[i] * p_hit else: q[i] = pos[i] * p_miss normalize(q) return q
pos = [1.0,0,0,0,0,0,0,0,0,0] def bar_animate(nframe): global pos bar_plot(pos) pos = predict(pos, 1, .8, .1, .1) fig = plt.figure(figsize=(6.5, 2.5)) anim = animation.FuncAnimation(fig, bar_animate, frames=100, interval=75) anim.save('02_no_info.gif', writer='imagemagick')
{"metadata":{},"output_type":"display_data","png":"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\n","text":["<matplotlib.figure.Figure at 0x7f8ada768cf8>"]}

pos = np.array([.1]*10) hallway = np.array([1, 1, 0, 0, 0, 0, 0, 0, 1, 0]) def bar_animate(nframe): global pos if nframe == 0: return bar_plot(pos, ylim=(0,1.0)) if nframe % 2 == 0: pos = predict(pos, 1, .8, .1, .1) else: x = (nframe/2) % len(hallway) z = hallway[x] pos = update(pos, z, .6, .2) fig = plt.figure(figsize=(6.5, 2.5)) anim = animation.FuncAnimation(fig, bar_animate, frames=60, interval=75) anim.save('02_simulate.gif', writer='imagemagick')
{"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>"]}