{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# The binomial distribution\n", "\n", "\n", "Copyright 2016 Allen Downey\n", "\n", "MIT License: http://opensource.org/licenses/MIT" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from __future__ import print_function, division\n", "\n", "%matplotlib inline\n", "%precision 6\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from inspect import getsourcelines\n", "\n", "def show_code(func):\n", " lines, _ = getsourcelines(func)\n", " for line in lines:\n", " print(line, end='')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pmf\n", "\n", "Here's a Pmf class that represents a Probability Mass Function, implemented using a Python dictionary that maps from possible outcomes to their probabilities." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "class Pmf:\n", " \n", " def __init__(self, d=None):\n", " \"\"\"Initializes the distribution.\n", "\n", " d: map from values to probabilities\n", " \"\"\"\n", " self.d = {} if d is None else d\n", "\n", " def items(self):\n", " \"\"\"Returns a sequence of (value, prob) pairs.\"\"\"\n", " return self.d.items()\n", " \n", " def __repr__(self):\n", " \"\"\"Returns a string representation of the object.\"\"\"\n", " cls = self.__class__.__name__\n", " return '%s(%s)' % (cls, repr(self.d))\n", "\n", " def __getitem__(self, value):\n", " \"\"\"Looks up the probability of a value.\"\"\"\n", " return self.d.get(value, 0)\n", "\n", " def __setitem__(self, value, prob):\n", " \"\"\"Sets the probability associated with a value.\"\"\"\n", " self.d[value] = prob\n", "\n", " def __add__(self, other):\n", " \"\"\"Computes the Pmf of the sum of values drawn from self and other.\n", "\n", " other: another Pmf or a scalar\n", "\n", " returns: new Pmf\n", " \"\"\"\n", " if other == 0:\n", " return self\n", "\n", " pmf = Pmf()\n", " for v1, p1 in self.items():\n", " for v2, p2 in other.items():\n", " pmf[v1 + v2] += p1 * p2\n", " return pmf\n", " \n", " __radd__ = __add__\n", "\n", " def total(self):\n", " \"\"\"Returns the total of the probabilities.\"\"\"\n", " return sum(self.d.values())\n", "\n", " def normalize(self):\n", " \"\"\"Normalizes this PMF so the sum of all probs is 1.\n", "\n", " Args:\n", " fraction: what the total should be after normalization\n", "\n", " Returns: the total probability before normalizing\n", " \"\"\"\n", " total = self.total()\n", " for x in self.d:\n", " self.d[x] /= total\n", " return total\n", " \n", " def mean(self):\n", " \"\"\"Computes the mean of a PMF.\"\"\"\n", " return sum(p * x for x, p in self.items())\n", "\n", " def var(self, mu=None):\n", " \"\"\"Computes the variance of a PMF.\n", "\n", " mu: the point around which the variance is computed;\n", " if omitted, computes the mean\n", " \"\"\"\n", " if mu is None:\n", " mu = self.mean()\n", "\n", " return sum(p * (x - mu) ** 2 for x, p in self.items())\n", "\n", " def expect(self, func):\n", " \"\"\"Computes the expectation of a given function, E[f(x)]\n", "\n", " func: function\n", " \"\"\"\n", " return sum(p * func(x) for x, p in self.items())\n", "\n", " def display(self):\n", " \"\"\"Displays the values and probabilities.\"\"\"\n", " for value, prob in self.items():\n", " print(value, prob)\n", " \n", " def plot_pmf(self, **options):\n", " \"\"\"Plots the values and probabilities.\"\"\"\n", " xs, ps = zip(*sorted(self.items()))\n", " plt.plot(xs, ps, **options)\n" ] } ], "source": [ "from distribution import Pmf\n", "show_code(Pmf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The infamous biased coin\n", "\n", "I'll create a Pmf that represents a biased coin, which has a 60% chance of landing heads and a 40% chance of landing tails.\n", "\n", "If you are bothered by the fact that it is physically very difficult to bias a coin toss in this way, imagine a 10-sided die with `H` on 6 sides and `T` on 4 sides." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "H 0.6\n", "T 0.4\n" ] } ], "source": [ "coin = Pmf(dict(H=0.6, T=0.4))\n", "coin.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the `+` operator to compute the possible outcomes of two coin tosses and their probabilities." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "HH 0.36\n", "TT 0.16000000000000003\n", "TH 0.24\n", "HT 0.24\n" ] } ], "source": [ "twice = coin + coin\n", "twice.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And similarly, the possible outcomes of three coin tosses." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TTT 0.06400000000000002\n", "HTT 0.096\n", "THT 0.096\n", "HHH 0.216\n", "HHT 0.144\n", "HTH 0.144\n", "TTH 0.09600000000000002\n", "THH 0.144\n" ] } ], "source": [ "thrice = sum([coin]*3)\n", "thrice.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that the outcomes take the order of the tosses into account, so `HT` is considered a different outcome from `TH`.\n", "\n", "If we don't care about the order and we only care about the number of heads and tails, we can loop through the outcomes and count the number of heads." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3 0.216\n", "2 0.144\n", "2 0.144\n", "1 0.096\n", "2 0.144\n", "1 0.096\n", "1 0.09600000000000002\n", "0 0.06400000000000002\n" ] } ], "source": [ "from collections import Counter\n", "\n", "for val, prob in sorted(thrice.items()):\n", " heads = val.count('H')\n", " print(heads, prob)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we can make a new Pmf that maps from the total number of heads to the probability of that total." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def make_pmf_heads(coin, n):\n", " coins = sum([coin]*n)\n", " pmf = Pmf()\n", " for val, prob in coins.items():\n", " heads = val.count('H')\n", " pmf[heads] += prob\n", " return pmf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's what it looks like:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0.06400000000000002\n", "1 0.28800000000000003\n", "2 0.43199999999999994\n", "3 0.216\n" ] } ], "source": [ "pmf_heads = make_pmf_heads(coin, 3)\n", "pmf_heads.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exerise:** Create `pmf_heads` for a few different values of `n` and plot them using the `plot_pmf` method." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEACAYAAABfxaZOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmcjeX/x/HXZwZhSBSRJdmSNZSENJVlhKiIKRQRlZav\nNpJoL1J9q19JvoqKSYkka5gk2XfGvq9lyTK2Wa7fH9eZOsaYOTNzzrnuc5/r+XjMw5xz7uVtjM+5\nz3VfiyilsCzLssJDhOkAlmVZVvDYom9ZlhVGbNG3LMsKI7boW5ZlhRFb9C3LssKILfqWZVlhxKei\nLyIxIrJBRDaJyAsZvH6XiKwSkRUislhEGnm9tsP7NX+GtyzLsrJHsuqnLyIRwCbgDmAfsATopJTa\n4LVNQaXUKc/3NYHxSqnrPI+3AfWUUkcD81ewLMuyfOXLlX59YLNSaqdSKgmIA9p6b5BW8D0KAale\nj8XH81iWZVkB5ksxLg3s9nq8x/PceUSknYgkAD8B3b1eUsAsEVkiIj1zE9ayLMvKHb9dgSulJnma\ndNoBr3u91EgpVRe4E3hcRBr765yWZVlW9uTxYZu9QDmvx2U8z2VIKTVfRCqISDGl1BGl1H7P83+J\nyER0c9H89PuJiJ0EyLIsK5uUUpKd7X250l8CVBKRq0UkH9AJmOy9gYhU9Pq+LpBPKXVERAqKSCHP\n81FAc2BtJuEd/TVo0CC/HzMpKTRyhsrP0+Y0n8PmDN5XTmR5pa+UShGRPsBM9JvE/5RSCSLSS7+s\nRgD3ikhX4BxwGrjPs/uVwETPVXwe4Bul1MwcJXWhVavg3nshIQHy5jWdxrKscOBL8w5KqenAteme\n+8zr+yHAkAz22w5cn8uMrjV5MmzdCtOnQ5s2ptNYlhUObFfKbIiOjvbr8aZNgw4d4Isv/HpYv+cM\nFJvTv2xO/wqVnNmV5eCsYBER5ZQswXDkCJQvD1u2QJUqsHkzFC9uOpVlWaFERFABuJFrBcCsWdCk\nCZQoAXfdBd98YzqRZVnhwBZ9Q6ZNg5Yt9ffdusGoURBGH3QsyzLEFn0DUlP1zdu0on/rrXDiBCxf\nbjaXZVnuZ4u+AStXQpEiUKGCfhwRoa/2/X1D17IsKz1b9A3wbtpJ8+CDEBcHZ86YyWRZVniwRd+A\nadMgJub8566+Gq6/XvfdtyzLChRb9IPs6FE9EvfWWy98Le2GrmVZVqDYoh9ks2bBLbdAgQIXvnbP\nPbBkCezZE/xclmWFB1v0gyyj9vw0BQroEbpjxgQ3k2VZ4cOOyA2i1FQoXRp++w0qVcp4m0WLoHNn\n2LQJJFvj7CzLCjd2RK7DrV4NhQpdvOAD1K+vZ9ycf8GKA5ZlWblni34QZda0k0bE9tm3LCtwbNEP\nIl+KPkCXLjBxIpw8GfhMlmWFF1v0g+Tvv/VIXF9may1ZUvfw+f77gMeyLCvM2KIfJL/8Ao0aZdxV\nMyO2iceyrECwRT9IfG3aSdOqlV5GccuWwGWyLCv82KIfBEqdP6umL/Ll0103v/wyYLEsywpDtugH\nwerVkD9/5l01M9KtG4weDSkpgcllWVb4sUU/CNKadrI72KpmTbjySpg9OzC5LMsKP7boB0F22/O9\n2UnYLMvyJzsNQ4AdOwZlysDBg1CwYPb3P3JEL7ayfTsULer/fJZlha6ATcMgIjEiskFENonICxm8\nfpeIrBKRFSKyWEQa+bqv282eDQ0b5qzgAxQrpufeHzfOv7ksywpPWRZ9EYkAPgZaANWBWBGpmm6z\nX5RStZVSdYCHgZHZ2NfVctO0k8b22bcsy198udKvD2xWSu1USiUBcUBb7w2UUqe8HhYCUn3d182U\n8k/Rb9oUDhyANWv8k8uyrPDlS9EvDez2erzH89x5RKSdiCQAPwHds7OvW61dq/vbV6mSu+NERkLX\nrvZq37Ks3MvjrwMppSYBk0SkMfA60Cy7xxg8ePA/30dHRxPty0Q1DpbTrpoZ6dZNT+Pwzjt66mXL\nssJPfHw88fHxuTpGlr13RKQBMFgpFeN53A9QSql3MtlnK3AjUMXXfd3Ye+e22+CZZ6B1a/8cr0kT\n6NsX2rXzz/Esywptgeq9swSoJCJXi0g+oBMwOd2JK3p9XxfIp5Q64su+bnX8OCxdqgu/v9gbupZl\n5VaWRV8plQL0AWYC64A4pVSCiPQSkUc8m90rImtFZDnwEXBfZvsG4O/hOLNnw803Q1SU/47ZoQPM\nm6dv6lqWZeWEHZwVII88AlWr6uYYf+rWDapXh2ef9e9xLcsKPXaNXIfIyayavureXTfxuOj90bKs\nILJFPwDWr4eICH2l72+NG8O5c7Bkif+PbVmW+9miHwD+7KqZngg89JC9oWtZVs7Yoh8A/hiFm5mu\nXeHbb+H06cCdw7Isd7JF389OnIDFi+H22wN3jrJloX59mDgxcOewLMudbNH3szlz4KaboFChwJ7H\n9tm3LCsnbNH3s0A37aRp2xZWrICdOwN/Lsuy3MMWfT/y16yavsifHzp21GvoWpZl+coWfT9K8Iw1\nvu664Jyve3f48ktITc1yU8uyLMAWfb8KZFfNjNStq+8dzJsXnPNZlhX6bNH3o2A17aQRsTd0LcvK\nHjv3jp+cPAmlSsG+fVC4cPDO+9dfULky7NoFl14avPNalmWenXvHoLlz4cYbg1vwAYoX19M3jx8f\n3PNalhWabNH3k2A37XhLm4TNsiwrK7bo+0Ewu2pmpGVL2LYNNm40c37LskKHLfp+sHEjJCfree5N\nyJMHOnfW3Tcty7IyY4u+HwS7q2ZGunWDMWP0m49lWdbF2KLvByabdtJUq6YnYps502wOy7KczRb9\nXEpMhD/+gDvuMJ3E9tm3LCtrtujn0ty5cMMNzugj36kTzJoFhw+bTmJZllPZop9LTmjaSVOkCLRq\nBWPHmk5iWZZT2aKfC6a7amaka1eIizOdwrIsp7JFPxc2b9aLlNeoYTrJvxo0gFWr7MyblmVlzKei\nLyIxIrJBRDaJyAsZvH6/iKzyfM0XkVper+3wPL9CRBb7M7xp06ZBTIzZrprpFSkCV1yhB2tZlmWl\nl2XRF5EI4GOgBVAdiBWRquk22wY0UUrVBl4HRni9lgpEK6XqKKXq+ye2MzitaSdN7dr6at+yLCs9\nX6706wOblVI7lVJJQBzQ1nsDpdRCpdQxz8OFQGmvl8XH84SUU6fg99+haVPTSS5UqxasXm06hWVZ\nTuRLMS4N7PZ6vIfzi3p6PYBpXo8VMEtElohIz+xHdKb4eL2ISZEippNcKBSK/uK9ixmxbETWG1qW\n5Vd5/HkwEbkN6AY09nq6kVJqv4gURxf/BKXU/Iz2Hzx48D/fR0dHEx0d7c94fuXUph3QzTv9+plO\ncXGJ5xKJnRDLyXMnUUrR64ZepiNZVkiIj48nPj4+V8fIchEVEWkADFZKxXge9wOUUuqddNvVAiYA\nMUqprRc51iDghFLqvQxeC6lFVCpVggkTdIF1mpQUPVhs/35nDBpLr++MvvyZ+CevRL9Cky+b8N+Y\n/9K+WnvTsSwr5ARqEZUlQCURuVpE8gGdgMnpTlwOXfC7eBd8ESkoIoU830cBzYG12QnoRJs3w+nT\nuhnFiSIj9Yyfax34k/5j9x+MWzuOD2I+oGKxivx8/8889vNjzN4223Q0ywoLWRZ9pVQK0AeYCawD\n4pRSCSLSS0Qe8Ww2ECgGfJKua+aVwHwRWYG+wfuTUirkpwRzYlfN9JzYrn8m+QwPT36YD2M+5IqC\nVwBwfcnr+a7Dd8ROiGXpvqWGE1qW+9k1cnPgzjv1alXtHdwi8dFHsH49fPqp6ST/GjB7AAmHEphw\n3wQk3TvmpA2TePTnR/n1oV+pcnkVQwktK7TkpHnHrzdyw8Hp0zB/vvPnt6lVy1nTMazYv4LPl3/O\nqt6rLij4AO2qtuPI6SO0+LoF87vNp/SlmXUQsywrp1zXfz7Qfv0Vrr8eLrvMdJLM1aoFa9Y4YzqG\npJQkuk/uztBmQylVuNRFt+tepzu96/WmxdctOHL6SBATWlb4sEU/m5zcVdNb0aL6jWnHDtNJYMjv\nQyhZqCRda3fNctvnGz1PTKUYWo9tzamkU0FIZ1nhxRb9bEq7iRsKnHAzd/1f6/lg0Qd81vqzDJt1\n0hMRhjQbQuXLK9N+fHuSUpKCkNKywoct+tmwdSucOKGbd0KB6aKfkppC9x+789ptr1GuSDmf94uQ\nCEa2GUlkRCTdJ3cnVTmgjcqyXMIW/WwIha6a3mrXNlv0P1z0Ifnz5OeReo9kvXE6eSPz8m37b9l+\ndDvPzHiGUOnZZVlOZ4t+NoRKe36aWrXMzba55cgW3vjtDUbeNZIIydmvWcG8Bfkp9idmb5/N2/Pf\n9nNCywpPtp++j86cgRIlYOdOfZM0FCQn62kY/vwTChUK3nlTVSp3jLmDNlXa0Pfmvrk+3r4T+2g8\nqjEv3vIiPer28ENCy3KHQE3DYAErVkDlyqFT8AHy5IHrroN164J73hHLRnA66TRP3fSUX453VeGr\nmNF5Bi/PfZkfEn7wyzEtK1zZou+jRYvgpptMp8i+YC+osuvYLgbOHciotqOIjIj023ErX16ZKfdP\nofeU3szdPtdvx7WscGOLvo8WL4b6IbjuVzB78Cil6DWlF0/d9BTVilfz+/HrlqrLt+2/peP3HVm+\nf7nfj29Z4cAWfR+F6pV+MIv+V6u/4sDJA7zQ6IJllP3mtmtuY3jr4bQe25rNhzcH7DyW5VZ27h0f\n/PUXHD4M115rOkn2pRV9pQLb1fTAyQM8O/NZZnSeQd7IvIE7EXDPdfdw+NRhPU9P9/lcVfiqgJ7P\nstzEXun7YMkSuOEGiAjBn9YVV0BUFOzaFbhzKKV47OfH6Fm3J3VK1Qncibz0rNeTnnV70uLrFhw9\nfTQo57QsNwjBMhZ8odq0kybQTTzfr/+ehEMJDLx1YOBOkoF+jfvR9JqmtBnXxs7TY1k+skXfB7bo\nX9yhU4d4cvqTjLprFPnz5A/MSS5CRBjWYhjXFL2Gjt93tPP0WJYPbNHPglKh23MnTSC7bT49/Wk6\nVe/EzWVvDswJshAhEYy6axQpqSn0+KmHnafHsrJgi34WtmyBwoWhZEnTSXIuUFf6UzZN4Y89f/D6\n7a/7/+DZkDcyL991+I7NhzczbMEwo1ksy+ls0c9CqDftgO51tGsXnPJjs/exM8d49OdHGdlmJFH5\novx34ByKyhfFhy0/5LNln9nJ2SwrE7boZyHUm3YA8ubVhd+f0zE8N+s5WlVuxW3X3Oa/g+ZSvVL1\niJAIluxbYjqKZTmWLfpZcMOVPvi3iWf2ttlM3zKdIc2G+OeAfiIixNaIZdyacaajWJZj2aKfibNn\nYe1aqFfPdJLc81fRTzyXSM+fejK89XAuveTS3B/Qz2JrxvLtum9JSU0xHcWyHMkW/UysXAlVqkDB\ngqaT5J6/evAMmDOAxuUac2flO3N/sACoekVVShYqya87fzUd5eLmzze/jqUVtnwq+iISIyIbRGST\niFwwsYqI3C8iqzxf80Wklq/7Opkb2vPTeE/HkFO/7/qd8evG80HMB/4LFgCObuIZPRruvReaNoXn\nn/fv3XXL8kGWRV9EIoCPgRZAdSBWRKqm22wb0EQpVRt4HRiRjX0dyy3t+aAXgMmXD/buzdn+Z5LP\n8PDkh/mo5UcUK1DMv+H8rGONjvyw4QfOpZwzHeVfSsE778CgQRAfr9+Bd++GGjVgxgzT6aww4suV\nfn1gs1Jqp1IqCYgD2npvoJRaqJQ65nm4ECjt675O5qaiD7lr138l/hVqXlmTe6vd699QAVCuSDmq\nFa/GjC0OKaapqfD00/DNN/D773plm5IlYdw4+OQT6N0b7r8fDh40ndQKA74U/dLAbq/He/i3qGek\nBzAth/s6xpEj+v9g1ZD5XJK1nLbrrzm4hlErR/Fxy4/9HypA7q9xP2PXjjUdQ/cGiI3VP/h586B0\nul//mBjdW6BMGahZE0aO1G8SlhUgfp1aWURuA7oBjXOy/+DBg//5Pjo6mujoaL/kyonFi/XMmpH+\nW/zJuFq1YOrU7O/32bLP6HNjH64sdKX/QwVI+2rt6T+7P4nnEs0NHjt2DO6+G4oVg+nTIf9F5iaK\nioIhQ/TV/iOPwFdfwWefueuKw/KL+Ph44uPjc3cQpVSmX0ADYLrX437ACxlsVwvYDFTM7r6e15ST\nDB6sVL9+plP418qVSlWrlr19ziSdUVcMuUJtP7o9IJkCKebrGDV29VgzJ9+3T6natZV6/HGlkpN9\n3y85WakPP1Tq8suVGjRIqTNnAhbRCn2eupllHff+8qV5ZwlQSUSuFpF8QCdgsvcGIlIOmAB0UUpt\nzc6+TuWmnjtprrsOtm2DM2d832fq5qlUL16d8peVD1iuQDHWxLNxIzRsCPfdBx99lL2Pi5GR8MQT\nsGKF7jNcuzb86uDup1bIybLoK6VSgD7ATGAdEKeUShCRXiLyiGezgUAx4BMRWSEiizPbNwB/D79S\nyn03cUH33qlcGdav932fMavH0LV218CFCqB2Vdsxb+c8jpw+EryTLloEt94KL78ML76Y8+XKypaF\nSZPgrbegc2fo0UPfaLKsXBLlkMmpREQ5JcvWrRAdrXvUuU3nzrqL+EMPZb3toVOHqPRhJXb9Z5cj\nR9/6osN3HWheoTk96/UM/MmmTtU/2C++gFat/Hfc48dhwAD4/nsYNkzfGA7k2pdWyBARlFLZ+mWw\nI3Iz4MamnTS1avneg+fbtd9yZ+U7Q7bgg27iGbc2CAO1vvwSuneHyZP9W/ABLr1UNxNNmgRvvw0t\nW+p2OsvKAVv0M+DGpp00tWv73ld/zOoxPFj7wcAGCrCWlVuy8sBK9h7P4ai0rCilm2BeeUUPumrQ\nIDDnAf1LuWwZ3HabvioZMgSS7GphVvbYop8BNxf9tCv9rFrSNhzawO5ju7mjwh3BCRYg+fPkp23V\ntoxfN97/B09JgSefhLg4PegqGF0s8+aFF17QH0dnz9b9ihcvDvx5LdewRT+dc+f0lbAbZtbMSMmS\nujn4wIHMtxuzagwP1HyAPBF+HcphRECaeM6c0W3ra9fqQVdXXeXf42elQgXd9/+FF6BtW93jJzEx\nuBmskGSLfjqrV0PFilCokOkkgSGS9cjcVJXKV6u/CtleO+ndds1t7Dq2i82HN/vngMeO6XZ1pWDa\nNChSxD/HzS4RPaBr3TrYsUPP62NZWbBFPx03N+2kyWoOnvgd8VxR8ApqXlkzeKECKE9EHjpU60Dc\n2rjcH2zfPmjSRE+UFhd38VG2wVSsGHz+ue41ZG/wWlmwRT8dW/R1006o38BNL7ZmLOPWjsvd+rkb\nN0KjRtCpE3z4obPm6ChZUk/q9uKLppNYDmeLfjpu7q6ZJrNumyfPneTHjT8SWyM2uKEC7OYyN3M6\n+TSrD+ZwmtGFC/Wgq0GDoH9/Z/aT79tXL9CycKHpJJaD2aLv5ehR/em9enXTSQKrWjXYskVPAJne\nxISJNCrbKKQmV/OFiNCpeifGrsnBtAw//wxt2sCoUb6NajMlKgpeew2efTZ3q+VYrmaLvpclS6Bu\nXWd9ag+E/Pl1548NGy58LZSnXchKbM1Y4tbFkaqyMXXxhAl6CoQpU+BOZy4ReZ6uXeHECZg40XQS\ny6Fs0fcSDk07aTJq4tlzfA/L9i2jTZU2ZkIFWM0SNSmcrzB/7P7Dtx1OntRdISdNCp0bPZGR8O67\nuivnOQetHGY5hi36XsLhJm6ajEbmfrP6G9pXa0+BvAXMhAowESG2RqzvTTxDh8Ltt4feL0WzZlCp\nEgwfbjqJ5UC26Hu4dWbNi0nfg0cpxehVo13Xaye9TjU68d3670hOTc58w7174eOP4Y03ghPM34YO\nhddfh7//Np3Echhb9D127IA8eS5czc6t0hf9ZfuXcTblLA3LNjQXKggqFqtIhaIVmL1tduYbDhyo\nV7G6+urgBPO3GjX0SN033zSdxHIYW/Q9Fi/WV/lO7IkXCKVL67m60tbiHrNqDF1rdUXC4AcQWyM2\n82kZVq3S0yT36xe8UIHw6qvwv//pKxrL8rBF3yOcmnZAv7mlXe2fSzlH3No4utTuYjpWUNxX/T5+\n3Pgjp5NOX/iiUrrL48CB5qZX8JdSpfSEcHbAluXFFn2PRYvCp+dOmrSiP33LdK694loqFK1gOlJQ\nlCpcinql6jF1cwarxE+frlfPeeSRC18LRc8+q5dbtDNxWh626KObOVat0rPUhpO0bpujV42may13\n9s2/mAybeJKTdZEcMkRPYewGUVG6mccO2LI8bNEH1qyB8uX1AkXhpHZtWJ5whF+2/cJ91e8zHSeo\n7rnuHmZtm8WxM8f+ffKLL6B4cT361k0eekgPN//xR9NJLAewRZ/wa89PU60abMz7LS0qtKRI/hBv\nv86mogWKEl0+mkkbJuknTpzQ8+oMG+a+u/lpA7aef96utGXZog/hNRLXW8GCkKfeGKKLhlfTTprz\nFlcZOhTuuMO9q+e0aAHXXAOffWY6iWWYLfqE75X+psOb4LLtFDrY3HQUI9pc24aFexZyaPMq+L//\nC92BWL4aOlRPyHbsWNbbWq4V9kX/2DHYtUuPZQk3Y1aNoW7e+1m3JvSXRMyJgnkL0qpKK/7q21v3\n1ilXznSkwKpVC1q31gu5W2HLp6IvIjEiskFENonICxm8fq2ILBCRMyLSN91rO0RklYisEBHH9Rtb\nuhTq1NGjccNJ2pKI913bNdMFVdyud2QDSsxbpufIDwevvqpX2dq503QSy5Asi76IRAAfAy2A6kCs\niFRNt9lh4AlgaAaHSAWilVJ1lFKOazkP16adeTvncVn+y2jX4PpM18t1NaVo9OFE3r49HztTj5pO\nExylS0OfPjBggOkkliG+XOnXBzYrpXYqpZKAOKCt9wZKqUNKqWVARrNYiY/nMSJci37atAvlysGp\nU/DXX6YTGTB9OhF793Gya6x/1s8NFc89B3Pm6I+5VtjxpRiXBnZ7Pd7jec5XCpglIktEpGd2wgVa\n2sya4dZz51TSKSZumMj9Ne//ZzqGNWtMpwqytIFYQ4fSqU7nzOficZtCheCVV+yArTAVjJbsRkqp\n/SJSHF38E5RS8zPacPDgwf98Hx0dTXR0dECD7fa8lbn9/l16ExMm0qBMA0oVLgX8OzL39tsNBwum\nUaOgRAlo3ZpbUBw6dYj1f62nWvFqppMFR7du8N//wk8/wV13mU5j+Sg+Pp74+PhcHcOXor8X8C6L\nZTzP+UQptd/z518iMhHdXJRl0Q+GtKYdt43FycqY1WN4qPZD/zyuXRsWLDCXJ+hOnIDBg3XBEyEC\noWP1joxbM47Xbn/NdLrgyJNHd+H8z3+gZUv3TDvhcukvhl955ZVsH8OX5p0lQCURuVpE8gGdgMmZ\nbP9PCRWRgiJSyPN9FNAcWJvtlAESjk07e4/vZcneJbSr2u6f59LPre96Q4ZA06bnDcSKrann4lHh\n1NwREwNly+rePFbYyLLoK6VSgD7ATGAdEKeUShCRXiLyCICIXCkiu4H/AANEZJen2F8JzBeRFcBC\n4Cel1MxA/WWyK20O/XAyds1Y7rnunvOWRKxRAxISdDO36+3ZA598oleV8lKvVD0iJIKl+8Lo5qaI\nvtp/9VU7YCuMiFOubEREBTNLcjJcdpleFS/Up033lVKKmp/W5JNWn9Dk6ibnvValil7/u5rbm7S7\nddPzzGewotSguYM4ce4E77V4z0AwgzL5mVjOJiIopbLVQO3YrpSBtnat/mQbLgUfYOWBlSQmJdK4\nXOMLXguLJp6VK2HatIuuiBVbU3fdTElNCXIww157Tc/Js2uX6SRWEIRt0Q/Hpp3Rq0bTpVYXIuTC\nf3bXF32l4Jln9EyaF5lDu+oVVSlZqCTzds4LcjjDypSBxx6Dl14yncQKgrAt+uE2KCspJYlxa8fR\npVbGSyKmddt0rWnTYN8+6NEj082yXD/XrZ5/HmbNguXLTSexAswW/TAxY+sMKhWrROXLK2f4eu3a\nLr7Sz8aKWB1rdGRCwgTOpZwLUjiHKFxYfwp65hk7YMvlwrLonzgB27dDzZqmkwRP2rQLF3P11boD\nx5EjQQwVLP/7H5QsqWeYzEK5IuWoXrw6M7bMCEIwh+nRAw4cgJ9/Np3ECqCwLPpLl8L114fPeJSj\np48yY+uMTJdEjIjQb4Kuu9pPG4j17rs+j8IL2yaetAFbzz0XJv13w1NYFv1wa9oZv248zSs2p2iB\noplu58omnnfegWbNoG5dn3dpX609UzdPJfFcYgCDOVSrVrr75siRppNYARK2RT+cRuKOWZ15004a\n1/Xg2bMHPv002ytiFY8qTsOyDZm8MbOB5y4loj8VvfKK/pRkuU5YFv1w6q655cgWthzZQkylmCy3\ndV0Pnpdegt699YCMbArbJh7Qn4qaNdM3vi3XCbsRuXv26N/pgwfDY6K1QXMHcezsMT6I+SDLbU+c\n0Pc7jx+HyMgghAukFSvgzjth48aL9svPzImzJyjzfhm2P7WdYgWKBSCgw+3apZeUW7VK9+O3HMmO\nyPVBWtNOOBT8VJWqm3ZqZ920A7rXXsmSsGVLgIMFmg8DsbJS+JLCNK/YnAnrJ/g5XIgoV0735kk3\nR5EV+sKu6IdT0878XfOJyhtFnZJ1fN7HFe36U6fC/v1ZDsTKyv017g/fJh7QA7a+/x62bTOdxPKj\nsCv64dRzZ8wqfZUv2fhYE/Lt+snJusvh0KG5Xu2+ZeWWrDywkn0n9vkpXIi5/HK9nm4O5my3nCus\nin5KCixbBjfeaDpJ4J1OOs2EhAk8UPOBbO0X8t02R47UbVStWuX6UPnz5Kdd1XaMWxPGV/v/+Y+e\nwiIhwXQSy0/CquivXw9XXQVFM++u7go/bvyRG6+6kdKXZmc54xBv3jl+XF+VDhvmt5s2D9d5mM+X\nfx5ei6t4K1Lk3/sjliuEVdEPt6adB2s/mO39KlSAQ4fg778DECrQ3n4bmjfXvU78pGHZhuSNzEv8\njni/HTPk9OkDv/2me0RZIS/sin44DMraf2I/f+z547wlEX0VEaFX0lqzJgDBAmnbNj0nvJ8XAhER\netfrzfArpGsKAAAc0UlEQVRlw/163JASFQX9+8PLL5tOYvlBWBX9cOm5M3bNWNpVbUdUvqgc7R+S\n7frPPQd9+0Lp7DVn+aJzrc7M3DqTgycP+v3YIaNXL32Hf+FC00msXAqbon/ypO5/Xru26SSB5+u0\nCxcTcj145szR88D37RuQwxfJX4T217Vn1IpRATl+SLjkEhg40C604gJhU/SXLdPFLF8+00kCa/n+\n5Rw9fZRby9+a42OE1M3c5GR4+mk9X0yBAllvn0O9b+jNiOUjwm8pRW8PPQQ7dsDcuaaTWLkQNkU/\nXNrzh/w+hCdvejLDJRF9VauWXkM4NdWPwQLl8891f/J77gnoaepdVY/iBYszY2sYzrOfJm9ePU31\nSy/ZhVZCWNgU/XBoz990eBOzt8+mV71euTpOkSJwxRUhMBDz6FFdhD74ICjzavS+oTfDl4bxDV2A\n2FjdtWvaNNNJrBwKm6IfDt01h/w+hMdvfJzClxTO9bFCol3/lVfg7ruDdqOmY/WO/L77d3Yd2xWU\n8zlSZCS8+qq+2g+Jj4JWej4VfRGJEZENIrJJRF7I4PVrRWSBiJwRkb7Z2TcY9u2D06d1H3S32nN8\nDz8k/MAT9Z/wy/Ec34Nn/Xr45ht47bWgnTIqXxQP1HyAkcvDfIGRe+7Rn6wmTjSdxMqBLIu+iEQA\nHwMtgOpArIhUTbfZYeAJYGgO9g24xYvdP7PmsAXD6HZ9Ny4veLlfjufom7lK6Z46AwZA8eJBPXWv\ner0YuXwkSSlJQT2vo4jo2TcHDtRzm1ghxZcr/frAZqXUTqVUEhAHtPXeQCl1SCm1DEi/sGaW+waD\n25t2/kr8i9GrRtP3Zv91WXR0887UqbBzJzz+eNBPXb1EdSpfXjk8V9XyFhOj5zMZF8bzEoUoX4p+\naWC31+M9nud8kZt9/cbtPXc+XPQhHap1yPY8O5mpVEkvNHP8uN8O6R/nzulJwN57z9jK9mE/Qhf0\n1f4bb+gb6Ulh/KknBOVu7lk/Gzx48D/fR0dHEx0dnetjpqTA0qXuLfrHzx7n06WfsqjHIr8eNzIS\nqlfXXTcbNvTroXPno4+gcmVo2dJYhHuuu4enpj/F5sObqXx5ZWM5jIuOhvLl4csvoWdPw2HCQ3x8\nPPHx8bk6RpbLJYpIA2CwUirG87gfoJRS72Sw7SDghFLqvRzsG5DlEtetg3btYPNmvx/aEYb8PoSV\nB1Yy9t6xfj92jx5Qrx48+qjfD50zf/4J1arB77/DtdcajfLCrBdIVakMbT40643dbOFCuO8+2LQJ\n8uc3nSbsBGq5xCVAJRG5WkTyAZ2AzBo0vQNkd1+/c3PTzumk07y/8H36Ne4XkOM77mbuSy/Bgw8a\nL/gAj9R7hNGrRnMm+YzpKGY1aKC7eo0YYTqJ5aMsi75SKgXoA8wE1gFxSqkEEeklIo8AiMiVIrIb\n+A8wQER2iUihi+0bqL9MRtw8KOuLlV9w41U3UuvKWgE5vqO6ba5YAZMn6x4jDlCxWEXqlqrL9+u/\nNx3FvNdeg7fegsRE00ksH2TZvBMsgWreqVMHhg93X+FPSkmiysdVGHvPWG4ue3NAznHkiG6y/ftv\nPeWyMUrBrbdC587wyCMGg5xv0oZJvLvgXeZ3n286inn33afbAl8wMhQnbAWqeSdknTqlmxrdOLNm\n3No4yl9WPmAFH6BYMT0lw44dATuFb777Tncjevhhw0HO17pKa3b8vYM1B0Nt8YEASFux7Ngx00ms\nLLi66C9bpnuguO3+UqpK5a35b/Fi4xcDfi7j7fqnT8Pzz8N//6u7FDlInog89Kjbg8+WfWY6innX\nXad7VL3/vukkVhZcXfTd2p4/eeNkCuYtSNMKTQN+LuPt+u++q+/E35rzqaIDqUfdHoxbO46T506a\njmLeoEG6S+3hw6aTWJlwddF340hcpRRv/vYmL97yIhKEeSWMjszdvVvPoDlkiKEAWStzaRmaXN2E\ncWvsyFQqVIAOHRz972WFQdF3W3fN2dtnc+LciRytf5sTRpt3+vWDxx7Td5MdrHe93ny69FOc0inC\nqJdegpEjYf9+00msi3Bt0T9wAE6c0IM33eTN396kf+P+uVokJTuqVIG9e/Vyk0G1YAHMm6cLv8M1\nq9iMv8/8zdJ9S01HMa9MGejaVXfhtBzJtUXfjTNrLtyzkG1HtxFbIzZo58yTR9+jW7s2aKfU87Q/\n9RS8/TZE5Wxx92CKkAh61etlF1hJ07+/nvZ6VxivO+Bgri36bmzaeWv+WzzX8DnyRgZ3orGgN/GM\nGaPfbe6/P4gnzZ1udbrxw4YfOHr6qOko5pUoAb16BXWtA8t3ri36buu5s/bPtSzeu5judboH/dxB\nLfrHj8OLL+oumiH0Ma1EVAliKsXw1eqvTEdxhueeg0mT3DvpVQhzZdE/dw6WLHHXlf7b89/m6Zue\npkDeAkE/d8OGes3coHjzTWjePCT/8R694VGGLx1ub+iCnmv/qaf0oC3LUVw5DcPnn+tBnDNn+uVw\nxm07uo36n9dn21PbuPSSS03HCZytW/XHszVroFQp02myTSlF9U+qM7z1cJpc3cR0HPNOnNALM8ye\nDTVqmE7jSnYaBvR6Dm++qceJuMWQ34fQ+4be7i74AM8+q79CsOCD/g/Y+4be9oZumsKF9WhqN/1n\ndAHXFf2vv9ZjRBo1Mp3EP/ad2Mf4deN56qanTEcJrF9+0aPAnn7adJJc6VKrC9O2TOPPxD9NR3GG\nxx7Tc+4vW2Y6ieXhqqKfnKxXcHPThcX7f7xPl1pdKB4V3AXAgyo5WRf7YcNCfqKkogWKcnfVu/li\nxRemozhDgQJ6AXuHTIltuazojxunx4Y0cUlz6pHTR/jfiv/xbMNnTUcJrBEj4Mor9RJnLvDoDY/y\n2bLPSFWppqM4Q48esH69XvHMMs41RT8lBV5/HV5+2XQS//lo0UfcXfVuyhYpazpK4Bw5ont4fPBB\nSHXRzMwNV91A0QJFmbV1lukozpAvn/74PWCAXhvBMso1Rf/bb6F4cbjtNtNJ/OPkuZP835L/44XG\nLl+UYvBguPdeqFnTdBK/ERF61+vN8GX2hu4/unTR8/HMnm06SdhzRZfNlBRdMz74QHfxdoP3/niP\nhXsWMr7DeNNRAmfdOoiOhoSEIA4ECI6T505S7v1yrH50NWUuLWM6jjPExen59hcudM2nOtPCtsvm\nhAl6hadmzUwn8Y+zyWcZ9scw+jfubzpK4CgF//mPvsHnsoIPUChfIWJrxDJy+UjTUZzjvvt0n+pP\nPzWdJKyFfNFPTdVTfLz8snsuHkavGk3tK2tTp1Qd01ECJy4O9uyBRx81nSRget/Qm5HLR5Kcmmw6\nijNERMD48bpJb8EC02nCVsgX/YkTdS+/mBjTSfwjOTWZIb8P4cVbAr8UojG//aaH6H/zDeQN7uRx\nwVTzypqUv6w8UzZNMR3FOSpVgi++0Ff9ds59I0K66Kemwquvuusq/7t131GqcCkal2tsOkpgrFsH\n7dvD2LFQx8WfZDzsCN0MtGoFPXvqVbbOnTOdJuyEdNH/6Se9Vnbr1qaT+IdSKmgLnhuxZw/ceSe8\n9x40Dfz6vk7Qvlp7lu1fxtYjW01HcZaBA6FYMXjmGdNJwo5PRV9EYkRkg4hsEpEM+xCKyIcisllE\nVopIHa/nd4jIKhFZISKL/RVcKfdd5f+8+WciIyKJqeSStipvf/8NLVtCnz7wwAOm0wRN/jz5ebD2\ng4xYNsJ0FGeJiICvvoIZM/T6CVbQZFn0RSQC+BhoAVQHYkWkarptWgIVlVKVgV6A9+35VCBaKVVH\nKeW3+XKnTtWj9++6y19HNEspxRu/vUH/xv2DsuB5UJ05A23bwh136AnVwkyver34YuUXnE0+azqK\nsxQpom/KPfMMLF9uOk3Y8OVKvz6wWSm1UymVBMQBbdNt0xYYA6CUWgQUEZErPa+Jj+fxmVJ6EOfA\ngfqCwQ1+3fkrh08d5t7r7jUdxb9SU/XAnJIldbOO297QfFD58srULlmbHxJ+MB3FeapXh08+gXvu\ngUOHTKcJC76UzNLAbq/HezzPZbbNXq9tFDBLRJaISM+cBvU2YwYkJurfE7d487c36de4H5ERkaaj\n+E9aX/y//oLRo93zDp0DdoRuJjp0gI4dITZWf3y3AipPEM7RSCm1X0SKo4t/glJqfkYbDh48+J/v\no6OjiY6OvmAbN17lL923lA2HNtC5VmfTUfxr6FCYOxfmzQv52TNz665r7+KJaU+w7s91VC9R3XQc\n53njDd3vesAAeOcd02kcKz4+nvj4+FwdI8tpGESkATBYKRXjedwPUEqpd7y2GQ7MVUp963m8AbhV\nKXUw3bEGASeUUu9lcB6fpmH45Rd44glYu1b33HGDe8ffS5NyTXiqgYvmzP/qK3jpJT0Ip3T6D4bh\naeCcgRw7e4wPW35oOoozHToEN9ygLxY6dDCdJiQEahqGJUAlEblaRPIBnYDJ6baZDHT1hGgA/K2U\nOigiBUWkkOf5KKA5sDY7Ab2lXeW/9JJ7Cn7CXwnM3zWfHnV7mI7iP7Nm6Ru2U6fagu+lZ72efLPm\nGxLPJZqO4kxXXAE//KAXXlm3znQa18qy6CulUoA+wExgHRCnlEoQkV4i8ohnm6nAdhHZAnwGPObZ\n/UpgvoisABYCPymlcrxybXw8HDyom//c4p3f3+HJ+k8SlS/KdBT/WL5cd8mcMEHfpLP+Ua5IORqV\nbcS36741HcW56taFd9+Fu+/W3XwtvwupWTZvuw0eeggefDA4mQJt0Z5F3Dn2TrY+uZXL8l9mOk7u\nbdsGt9wCH33krrvsfjR181QGxw9mcU+/DVlxpz59YOdO+PFH99y8CwBXz7I5bx7s2uWecT3zd82n\nzbg2jG432h0F/9AhfSPuxRdtwc9Ei4ot+DPxTxbvtUU/U++9B0eP6pWRLL8KmaL/2mv6xn6eYPQ3\nCrC52+dy97d38/U9X9O6igvmkEhM1HNhtG8Pjz9uOo2jRUZE8uptr9Lx+47sPrY76x3CVb588N13\neinNn382ncZVQqJ5Z8ECfYW/aVPoT8o4Y8sMOk/szHcdviO6fLTpOLmXnKzbX4sVgy+/DMvBVzkx\nbMEwPlv2GfO6zaNkoZKm4zjXggV67eTff4fKlU2ncRzXNu+8+ir07x/6BX/Kpil0mdiFSR0nuaPg\nKwW9e+uFMUaOtAU/G55p+AxdanWh2VfNOHzqsOk4ztWwoe6yd889cPKk6TSu4Pgr/UWLdJfdzZvh\nkksMBPOTCesn8NjUx/gp9ifql/bbFERmDR4MU6boblWFCplOE3KUUvSf3Z9ftv3C7K6zKZK/iOlI\nzqQUPPywbkaMi7MXF15ceaX/2mvQr19oF/xxa8bx+NTHmf7AdPcU/BEj9ACsn3+2BT+HRIS37niL\nhmUbcufYOzl5zl7JZkhEz8+zdSsMG2Y6Tchz9JX+smV6csatW0O36I9eOZr+s/szs8tMapSoYTqO\nf0yeDL166S5Vtp0111JVKj0n92THsR1MiZ1CgbwFTEdypl274Kab9Iprt99uOo0j5ORK39FFv107\nPRvvE08YCpVLI5aN4LV5rzGryyyqXlE16x1CwR9/6Pmsf/4Z6rvkU4sDpKSm0GViF46dPcbEjhPJ\nF5nPdCRnmjNH9+pYtAjKlTOdxjhXFf2VK/UiS1u3QoEQvPD5aNFHvPvHu8zuOptKxSqZjuMfGzfC\nrbfCqFH6H8fyq6SUJDp814E8EXmIax9HnggX9E8OhHff1W37v/0WmsXBj1xV9O+9Fxo31jPzhpp3\nF7zLp0s/ZXbX2ZS/rLzpOP6xf7/uSfHyy9Ctm+k0rnU2+Sxt49pSPKo4o9uNJkIcf9st+JTS0zAX\nKKAvQML4xq5riv6aNdC8ub7KL1jQcLBsemPeG4xeNZo5D86hzKVlTMfxj0OHoFkz/U780kum07je\nqaRTtPymJVUvr8rw1sPdt5KaPyQmQoMGenK2Rx81ncYY1/Teef11vYJaKBV8pRQD5wzkmzXf8OtD\nv7qj4B8/rvtIV62q17cdMMB0orBQMG9BpsROYdXBVfSd0RenXJg5SlSUXmpx0CA9gMvymeOK/vr1\nutt3796mk/hOKcULv7zA5E2TiX8onlKFS5mOlDunTuk5zStX1h+3Fi+GN98M64/RwVb4ksJMe2Aa\n8TvjGTh3oOk4zlSpEnzxhR7IM22abvaxsuS4ov/667odP1S6fiuleHr608zZPoc5XedQIqqE6Ug5\nd+4c/N//6WK/aJFe9WrMGKhQwXSysFS0QFFmdp7JxA0Teeu3t0zHcaZWrWD4cN000KQJzM9wUT7L\ni6Pa9BMSFLfcomfoLVzYdKKspapUHvv5MVYdXMW0B6aF7myZycl6oNUrr0C1avqdt25d06ksj/0n\n9tPkyyb0ubGPu1ZX86eUFPj6a93cU62aXn6xTh3TqQIu5Nv033wTnnoqNAp+SmoKD09+mPV/rWdm\n55mhWfBTU2H8eKhRQ0+W9vXXerUrW/AdpVThUvzS5RfeX/g+I5ePNB3HmSIj9UIbGzfq7sR33qlX\nW9q0yXQyx3HUlf4VVyi2bIEiDp+CJDk1ma4Tu3Iw8SCTO00OvVWvlNKDq156Sc9i98YbuneObbN3\ntC1HthD9ZTTvNH2HB2q5ZGGJQElMhA8/1PPyt22rPwGULWs6ld+F/JV+nz7OL/jnUs7R6ftOHD1z\nlCmxU0Kv4M+ZA40a6WlLBw/WN2mbN7cFPwRUKlaJGZ1n8OysZ5mYMNF0HGeLitK/45s2QYkScP31\n+mbhn3+aTmaco670jxxRFC1qOsnFnU0+S4fvOiAijG8/nkvyhNCEQAsX6i6Xu3bptvuOHd2zunyY\nWbF/BTHfxPBl2y9pWbml6Tih4cAB/Yl27Fi90M8zzzj/CtMHIX+l79SCn5SSxG87f6PNuDZckucS\nvu/wfegU/FWr9Fw5992nRzGuXw/3328LfgirU6oOkzpOouukrszdPtd0nNBQsqReu3npUn3hU7my\n7pZ8+rTpZEHnqCt9p2QB2HZ0GzO2zGDG1hnE74inYrGKtLu2Hf1v6R8ac6Js3KjbMX/9Vc9N3asX\n5M9vOpXlR/E74unwXQd+7PQjDcs2NB0ntKxfDwMH6k/AAwfq+fpDcJUm10zDYMLxs8eZu30uM7fO\nZMbWGSQmJdK8YnNaVGxB0wpNnd//PjUVdu7Uc1hMmgQ//QR9++opSkNl0IOVbdO3TKfrxK5M7zyd\nuqVsr6tsW7JEN3tu3aqX6OvUKaQ+BQes6ItIDPABujnof0qpdzLY5kOgJZAIPKSUWunrvp7tglr0\nU1Uqy/Yt+6fIrziwggZlGtC8QnNaVGpBzRI1nTvnyeHDurh7f61dq9soa9bUM9U9/jhcFoLdSK1s\nm7RhEr2n9GZ219lUL1HddJzQNHeuvvGbmKjb/tu0CYnODQEp+iISAWwC7gD2AUuATkqpDV7btAT6\nKKVaichNwH+VUg182dfrGAEv+nuP72Xm1pnM3DaTX7b9QomoEv8U+SZXN6Fg3swn+4mPjyc6Ojqg\nGc9z+jQkJFxY4BMTdd/6mjX//apRQy9ObiJnDtmc/jNpwyTObjlLx9YdTUfJkmN/nkrpT8gDBsAl\nlxBfpgzRjRvDNdf8++WwG485Kfq+NE7XBzYrpXZ6ThIHtAW8C3dbYAyAUmqRiBQRkSuBa3zYN2BO\nJ53mt12//dM2v//kfppWaEqLii0Y0nQIZYtkr99uwH5ZU1P1MOT0xX3nTj2/SFphf+IJ/We5cple\nhTj2P1U6Nqf/tKvajsFxg6G16SRZc+zPU0R3emjVCmbPJv7994neu1dP7bB9u/6KiDj/TcD7q3z5\nkJgl0peiXxrY7fV4D/qNIKttSvu4b4aUUpxJPkNiUiInz50k8ZznT6/HF30tKZE/E/9k6b6lXF/y\nelpUbMGotqOoV6oekRF+aq9TSl+JJyZm/HXq1MVf83798GF9NX/55f8W97vv1vPWX3st5LMrKFlW\nUEVG6rErCxbosSxplIIjR/59A9i2TTer/vSTfrxrl25SvdibQtmyjrhZHKhuKDlqDJtbI4rk1BRS\nUpNJUSlEEEGeiEgiJZLIiDxESiQFIyK51PM47bU8EklkRCSRkofICP04b0QeilxSn7xEQOpcSJ2t\nr6iV0n+m/8ro+fTPHTqkF2hOTNQF/5JL9CAQ76+CBS98Lu2rVKkLn7vsMrjuOlf0GbYsVxPRF2eX\nXw433HDh66mpsG/fv28K27frTwlffaW/P3lSX+QZvlfgS5t+A2CwUirG87gfoLxvyIrIcGCuUupb\nz+MNwK3o5p1M9/U6hjO6EVmWZYWQQLTpLwEqicjVwH6gExCbbpvJwOPAt543ib+VUgdF5JAP++Yo\nuGVZlpV9WRZ9pVSKiPQBZvJvt8sEEemlX1YjlFJTReROEdmC7rLZLbN9A/a3sSzLsjLlmMFZlmVZ\nVuAZn3tHRGJEZIOIbBKRF0znyYiIlBGROSKyTkTWiMiTpjNlRkQiRGS5iEw2neViPN16vxORBM/P\n9SbTmdITkf+IyFoRWS0i34iIY7pSicj/ROSgiKz2eq6oiMwUkY0iMkNEjPYOuEjGIZ5/85UiMkFE\nLjWZ0ZPpgpxerz0jIqkiUsxEtnRZMswpIk94fqZrROTtrI5jtOh7Bm99DLQAqgOxIlLVZKaLSAb6\nKqWqAzcDjzs0Z5qngPWmQ2Thv8BUpdR1QG3AUc1+InIV8ARQVylVC90U2slsqvN8gf5/460f8ItS\n6lpgDtA/6KnOl1HGmUB1pdT1wGbMZ4SMcyIiZYBmwM6gJ8rYBTlFJBpoA9RUStUE3s3qIKav9P8Z\n+KWUSgLSBm85ilLqQNq0Ekqpk+gCVdpsqox5flHvBBy7xJLn6u4WpdQXAEqpZKXUccOxMhIJRIlI\nHqAgelS5Iyil5gNH0z3dFhjt+X400C6oodLJKKNS6helVKrn4UKgTNCDpXORnyXA+8BzQY5zURfJ\n+SjwtlIq2bPNoayOY7roX2xQl2OJSHngemCR2SQXlfaL6uSbNdcAh0TkC08z1AgRKWA6lDel1D5g\nGLAL2IvukfaL2VRZKqGUOgj6QgVw+CyBdAemmQ6RERG5C9itlFpjOksWqgBNRGShiMwVkQwGEJzP\ndNEPKSJSCPgeeMpzxe8oItIKOOj5VCLkcJBcEOQB6gL/p5SqC5xCN004hohchr5yvhq4CigkIveb\nTZVtjn3jF5EBQJJSaqzpLOl5LkBeBAZ5P20oTlbyAEWVUg2A54HxWe1guujvBcp5PS7jec5xPB/x\nvwe+Ukr9aDrPRTQC7hKRbcA44DYRGWM4U0b2oK+ilnoef49+E3CSpsA2pdQRpVQK8APg9EnrD3rm\nvEJESgKOXBtQRB5CN0E69U20IlAeWCUi29F1aZmIOPGT02707yZKqSVAqohcntkOpov+PwO/PD0j\nOqEHejnRKGC9Uuq/poNcjFLqRaVUOaVUBfTPco5SqqvpXOl5miB2i0gVz1N34Lwbz7uABiKSX/Qc\n23fgsJvNXPhpbjLwkOf7BwEnXJycl9Ez1fpzwF1KqbPGUl3on5xKqbVKqZJKqQpKqWvQFyl1lFJO\neBNN/28+CbgdwPP/Ka9S6nBmBzBa9D1XUGmDt9YBcU4cvCUijYAHgNtFZIWnHTrGdK4Q9yTwjYis\nRPfeedNwnvMopRajP4GsAFah/6ONMBrKi4iMBRYAVURkl4h0A94GmonIRvSbVJbd9wxk/AgoBMzy\n/D/6xGRGuGhObwoHNO9cJOcooIKIrAHGAlle5NnBWZZlWWHEdPOOZVmWFUS26FuWZYURW/Qty7LC\niC36lmVZYcQWfcuyrDBii75lWVYYsUXfsiwrjNiib1mWFUb+H2WitPsQ+RUIAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Solution\n", "\n", "for n in [5, 10, 15]:\n", " make_pmf_heads(coin, n).plot_pmf()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exerise:** Run the following example and see how long it takes. Try it out with a few values of `n` and see how the run time depends on `n`. " ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 164 ms, sys: 0 ns, total: 164 ms\n", "Wall time: 164 ms\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEACAYAAABfxaZOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl41NW9x/H3FxAVRNwQWxFwRYugQEUUi3HBRqlFbatI\nrywKoldrb61Wq/aBXq+K1l2rFqQKCOKuWEsLFqNgBVGRRdlc2BWlIhXEGsj3/nEGGWJCJiGZMzO/\nz+t58pCZ+f1mPgnJN2fOOb9zzN0REZFkqBc7gIiIZI+KvohIgqjoi4gkiIq+iEiCqOiLiCSIir6I\nSIJkVPTNrNjM5pvZQjO7qoLHe5vZrNTHVDNrn/bY4tT9M83s9doMLyIi1WNVzdM3s3rAQuAkYCUw\nA+jl7vPTjukCzHP3tWZWDAxx9y6pxz4AOrn7mjr6GkREJEOZtPQ7A4vcfYm7lwLjgJ7pB7j7NHdf\nm7o5Ddg37WHL8HVERKSOZVKM9wWWpd1eztZFvbwBwIS02w5MMrMZZjaw+hFFRKS2NKjNJzOzE4D+\nwHFpd3d194/MrBmh+M9z96m1+boiIpKZTIr+CqBl2u0Wqfu2khq8HQYUp/ffu/tHqX8/NbNnCN1F\n3yr6ZqZFgEREqsndrTrHZ9K9MwM4yMxamVlDoBcwPv0AM2sJPAWc5+7vp93fyMx2SX3eGDgFmLuN\n8Dn9MXjw4OgZlFM5lVM5N3/URJUtfXffZGaXAhMJfyRGuPs8MxsUHvZhwO+APYD7zMyAUnfvDDQH\nnkm14hsAY9x9Yo2SiojIdsuoT9/d/wa0KXffn9I+Hwh8a5DW3T8EjtzOjCIiUks0lbIaioqKYkfI\niHLWLuWsXcoZV5UXZ2WLmXmuZBERyQdmhtfBQK6IiBQIFX0RkQRR0RcRSRAVfRGRBFHRFxFJEBV9\nEZEEUdEXEUkQFX0RkQRR0RcRSRAVfRGRBFHRFxFJEBV9EZEEUdEXEUkQFX0RkQRR0RcRSRAVfRGR\nBFHRFxFJEBV9EZEEUdEXEUkQFX0RkQRR0RcRSRAVfRGRBFHRFxFJEBV9EZEEUdEXEUkQFX0RkQRR\n0RcRSRAVfRGRBFHRFxFJEBV9EZEEUdEXEUkQFX2RLPvySygtjZ1CkkpFXySL1q+HLl3gxBPhs89i\np5EkUtEXyRJ3uOAC6NABjj4aunaFxYtjp5Kkyajom1mxmc03s4VmdlUFj/c2s1mpj6lm1j7Tc0WS\n4vbbYdEieOABuPVWuPjiUPjfeit2MkkSc/dtH2BWD1gInASsBGYAvdx9ftoxXYB57r7WzIqBIe7e\nJZNz057Dq8oikq8mT4bevWH6dGjVasv9Tz8NgwbBqFFw6qnx8kl+MjPc3apzTiYt/c7AIndf4u6l\nwDigZ/oB7j7N3dembk4D9s30XJFCt2RJKPhjx25d8AHOOgueew7694cRI+Lkk2TJpOjvCyxLu72c\nLUW9IgOACTU8V6SgbNgQCvuVV4bB24oceyy8/DLccAMMHhz6/kXqSoPafDIzOwHoDxxXk/OHDBny\nzedFRUUUFRXVSi6RGNzhoovgkEPg8su3fWybNvDaa/CjH8GyZfCnP8EOO2Qnp+SPkpISSkpKtus5\nMunT70Looy9O3b4acHe/udxx7YGngGJ3f78656YeU5++FJR774Vhw0Ixb9w4s3PWr4dzzoGNG+GJ\nJ6BJk7rNKPmtrvr0ZwAHmVkrM2sI9ALGl3vhloSCf97mgp/puSKFaMoUuP56eOaZzAs+hGOffTb0\n/XfrBh99VHcZJZmqLPruvgm4FJgIvAOMc/d5ZjbIzC5MHfY7YA/gPjObaWavb+vcOvg6RHLGihXQ\nqxeMHAkHHlj98xs0CNM6f/YzOOYYePfd2s8oyVVl9062qHtHCsF//gNFRaFv/tprt//5Ro+GK64I\nXT3dum3/80lhqUn3joq+SC0aNAg+/RSefBLq1dL17i++GKZ83nNP6O8X2awmRb9WZ++IJNmDD8Ir\nr4QLsGqr4AOcfDJMmhTePSxfHmYCWbV+zUW2UEtfpBZMnw6nnx4GcNu0qZvXWLYsXLV70klhSYf6\n9evmdSR/1NXsHRHZhlWr4Kc/heHD667gA+y3H0ydCnPmhEHeDRvq7rWkcKnoi2yH0tJQgPv3h55Z\nWGBkt91gwgTYeefQ4l+9uu5fUwqLir7IdrjiinABVdrF5HVuxx3DrJ7jjw+rdH7wQfZeW/KfBnJF\namj0aHjhBZgxo3YHbjNRrx7cdFPo8jnuuLBo21FHZTeD5CcN5IrUwFtvwQ9/CC+9BIcfHjfLc8/B\ngAHwt79Bp05xs0h2aZ6+SBasXh1a1TffDGefHTtNcOed8MYb8MgjsZNINqnoi9SxjRuhuBg6doRb\nbomdZovPPoMDDgj9+3vsETuNZIumbIrUsWuuCRdG3Xhj7CRb22OPcPHW6NGxk0iuU9EXydDjj4c1\ncMaNC4ui5ZqBA8O1AnrDLNuioi+SgTlz4JJLwp62e+4ZO03FunUL1w289lrsJJLLVPRFqrBmDZx5\nZlj6oEOH2GkqZ7altS9SGQ3kimxDWVlYU+egg+Cuu2Knqdqnn8LBB8PixeHqXSlsGsgVqWV33glf\nfAG33ho7SWaaNQvXD4wdGzuJ5Cq19EUqUVYWpkE+/XSYopkvXnwxLA8xc6aWYC50aumL1KJJk2Cv\nvfKr4AOceCL8+9/hYi2R8lT0RSoxbFgYGM039eppQFcqp+4dkQp8/DEcdhgsWQK77ho7TfV99BF8\n73uwdGlYBVQKk7p3RGrJww+HjVHyseADfOc7cMIJ4UIykXQq+iLllJWFrpF87NpJN3Bg6KISSaei\nL1LO5MmhSyTf16c/5RT45BN4++3YSSSXqOiLlDN8OFx4Yf5Pd6xfHy64QAO6sjUN5Iqk+eQTOOSQ\nMIDbtGnsNNtv+XJo3x6WLYPGjWOnkdqmgVyR7TRyZFhnpxAKPkCLFmEf3SeeiJ1EcoWKvkiK+5au\nnUKiAV1Jp6IvkvLyy9CwIXTpEjtJ7TrttNBdNXdu7CSSC1T0RVKGDSuMAdzyGjSA88/XgK4EGsgV\nAf71LzjwwMLdY3bxYvj+98PA7k47xU4jtUUDuSI1NGpUWDe/EAs+QOvWoeg/9VTsJBKbir4knvuW\nrp1CpgFdARV9EV59Nfx73HFxc9S100+HBQvChySXir4k3uYllAttALe8hg2hXz8N6CadBnIl0das\ngf33h/feCxumFLr33oNjjw1X6O64Y+w0sr3qbCDXzIrNbL6ZLTSzqyp4vI2Z/dPMvjKzy8s9ttjM\nZpnZTDN7vTrhROraI4+EeexJKPgQNnhv1w6efTZ2EomlyqJvZvWAe4EfAm2Bc83s0HKH/Qv4BfCH\nCp6iDChy9w7u3nk784rUms0DuPm+hHJ1aVetZMukpd8ZWOTuS9y9FBgH9Ew/wN1Xu/ubwMYKzrcM\nX0ckq6ZNg6++gqKi2Emy68wzYdYseP/92EkkhkyK8b7AsrTby1P3ZcqBSWY2w8wS1qaSXFYoSyhX\n1447Qp8+8OCDsZNIDNlogXd1947AacAlZlbgE+MkH6xdC08/DX37xk4Sx4ABYUvI0tLYSSTbGmRw\nzAqgZdrtFqn7MuLuH6X+/dTMniF0F02t6NghQ4Z883lRURFFSXvfLVkzZkzYWWrvvWMnieOww+Dg\ng+H55+Gss2KnkUyVlJRQUlKyXc9R5ZRNM6sPLABOAj4CXgfOdfd5FRw7GFjn7relbjcC6rn7OjNr\nDEwEfu/uEys4V1M2JSvcoUMHuPVWOPnk2GniGT0axo6FCRNiJ5GaqsmUzYzm6ZtZMXAXoTtohLsP\nNbNBgLv7MDNrDrwBNCHM1lkHfA9oBjxD6NdvAIxx96GVvIaKvmTFjBlwzjlhznq9BE8x2LAhbLLy\n5pthbR7JP3VW9LNBRV+yZeBAOOAA+O1vYyeJ77LLYLfd4H//N3YSqQkVfZEqfPEFtGwJ8+bBPvvE\nThPfnDlw6qlh6eUGmYzwSU7R0soiVXj0UTjhBBX8zdq1g/32U79+kqjoS6IkYQnl6tIVusmi7h1J\njLfeCtMT338f6tePnSZ3rF8fWvuzZ4eBXckf6t4R2Ybhw+GCC1Twy2vcOMxmeuih2EkkG9TSl0RY\nty4M4M6ZA/tWZxGRhNC7oPyklr5IJR5/HH7wAxX8ynTsGJaXnjQpdhKpayr6kghJXEK5ujSgmwzq\n3pGCN3s29OgBH36ouejb8u9/Q6tWuoYhn6h7R6QCmwdwVfC3bddd4Sc/CatvSuFSS18K2pdfhumI\nM2eGgVzZtunToXdvWLQo2esS5Qu19EXKefJJ6NJFBT9TnTvDLrvASy/FTiJ1RUVfCpquwK0eMw3o\nFjp170jBeucd6N4dli5Vf351rFkD++8funiaNYudRrZF3TsiaR58EM4/XwW/unbfHXr2hFGjYieR\nuqCWvhSkr74K68jMmBFarVI9U6eGfXTnzUvexvH5RC19kZSnnoJOnVTwa6pr1zB7Z8qU2Emktqno\nS0EaPlwDuNvDDPr1UxdPIVL3jhScBQvg+ONh2TLYYYfYafLXypXQti2sWAGNGsVOIxVR944IoZXf\nr58K/vb67nfDvP1nn42dRGqTir4UlP/8J3RJDBgQO0lh6NtXXTyFRkVfCsqzz0L79nDQQbGTFIYz\nzghLM6xcGTuJ1BYVfSkoWkK5djVqFDZXeeSR2EmktmggVwrGe+/BsceGAdwdd4ydpnC88gpcfDHM\nnas5+7lGA7mSaMOHQ58+Kvi17bjjYMOGsKWi5D+19KUgfPVVWEnzn/9Uf35dGDw4rMlz992xk0g6\ntfQlsZ58Ejp0UMGvK336wLhx8PXXsZPI9lLRl4Jw333w3/8dO0XhOvBAaNMGJkyInUS2l4q+5L23\n3w6Dtz16xE5S2Pr00Zz9QqA+fcl7gwaFLRGvuy52ksK2dm3YOP3992HPPWOnEahZn76KvuS1tWuh\ndeuwBPA++8ROU/jOPTfM5rnkkthJBDSQKwk0ejSccooKfraoiyf/qehL3nLXAG62de8exk/mz4+d\nRGpKRV/y1iuvhCtEu3WLnSQ5GjSAn/8cRo6MnURqSkVf8tZ994XlAbQ0QHb16RPW4tm0KXYSqQkV\nfclLH38MEyfCeefFTpI87dpBs2bw0kuxk0hNZFT0zazYzOab2UIzu6qCx9uY2T/N7Cszu7w654rU\nxIMPwtlnQ9OmsZMkU9++6uLJV1VO2TSzesBC4CRgJTAD6OXu89OO2QtoBZwBrHH32zM9N+05NGVT\nMrJxIxxwAIwfD0ceGTtNMn3yCRxySBjUbdIkdprkqqspm52BRe6+xN1LgXFAz/QD3H21u78JbKzu\nuSLV9cIL0KKFCn5Me+8dBtCfeip2EqmuTIr+vsCytNvLU/dlYnvOFanQ/feHAVyJS108+UkDuZJX\n3nsvrOv+s5/FTiI/+hHMmQNLlsROItXRIINjVgAt0263SN2XiWqdO2TIkG8+LyoqoqioKMOXkaR4\n4AHo3x922il2EtlxxzCYPnq01j3KlpKSEkpKSrbrOTIZyK0PLCAMxn4EvA6c6+7zKjh2MLDO3W+r\nwbkayJVt2rAhbJQyfXoYyJX4pk8P02YXLND1EjHUZCC3ypa+u28ys0uBiYTuoBHuPs/MBoWHfZiZ\nNQfeAJoAZWb2S+B77r6uonOr+XWJAPD443DUUSr4uaRzZ6hXD6ZNg2OOiZ1GMqFVNiVvdOkC114L\np58eO4mku/FGWLo0dL1JdmlpZSlYb70FZ54JH3wA9evHTiPpli0L02dXrNBYS7ZpaWUpWPffHzZL\nUcHPPfvtF/Ynfv752EkkE2rpS877/HPYf/+wnG/z5rHTSEVGjQpjLn/5S+wkyaKWvhSkUaOguFgF\nP5eddRa8+iqsWhU7iVRFRV9ymnvo2tFGKbltl12gZ08YOzZ2EqmKir7ktJKS0I9/3HGxk0hV+vTR\nsgz5QEVfctrm7RB14U/uKyqCNWtg1qzYSWRbNJArOWvlSjj8cFi8GHbdNXYaycR114Urp2+7LXaS\nZNBArhSUBx+Ec85Rwc8n550HY8aEPQ8kN6noS07auBGGDdMSyvmmTZswvXbixNhJpDIq+pKTnn8e\nWreG9u1jJ5Hq0jr7uU19+pKTuncPSyj37h07iVTXZ5+FRfE+/BB23z12msKmPn0pCAsXwuzZ8JOf\nxE4iNbHHHuGP9hNPxE4iFVHRl5zzwANw/vlhkw7JT+riyV3q3pGc8uWXYaOUN94IffqSn0pLw+b1\nr74KBx0UO03hUveO5L3HHgvr5qvg57cddgjjMaNGxU4i5anoS065/35N0ywUffuGol9WFjuJpFPR\nl5wxYwZ8+mlYUVPy3xFHhAvrpkyJnUTSqehLzrj/frjoIm2UUijMNKCbizSQKzlhzZowt3vhQmjW\nLHYaqS0ffwyHHQbLl0PjxrHTFB4N5Ereevhh6NFDBb/Q7LMPHHMMPPts7CSymYq+RFdWpgHcQqYu\nntyioi/RTZ4MO+8Mxx4bO4nUhR//OFx3sXx57CQCKvqSAza38rVRSmHaeWf46U/DkssSnwZyJaoV\nK6BdO1iyBJo0iZ1G6sqrr8LAgfDOO/rjXps0kCt5Z/hwOPdcFfxCd+yx8PXXoZtH4lLRl2hKS0PR\n1wBu4TMLG6drWYb4VPQlmueeC4txHX547CSSDX36wLhxocUv8ajoSzSappksrVtDp05h72OJRwO5\nEsX8+VBUBEuXQsOGsdNItsyaBaecAgsWwG67xU6T/zSQK3nBHX7zG7jsMhX8pDniCDj9dLjhhthJ\nkkstfcm6J56AIUNg5kwV/ST6+OMwjjN9Ohx4YOw0+a0mLX0VfcmqNWugbVt48kldgZtkN94Ib74J\nTz0VO0l+U9GXnDdgAOy0E9x7b+wkEtOGDWH1zZEj4fjjY6fJXzUp+g3qKoxIeS+9BBMnwty5sZNI\nbDvvDEOHwuWXh81z6ml0MWv0rZas2LABLrwwtPB33TV2GskF55wTxnRGj46dJFkyKvpmVmxm881s\noZldVckxd5vZIjN728w6pN2/2MxmmdlMM3u9toJLfrn+eujQIay4KALhKt077oBrr4X162OnSY4q\n+/TNrB6wEDgJWAnMAHq5+/y0Y04FLnX3HmZ2NHCXu3dJPfYB0Mnd11TxOurTL1CzZkH37jB7dthU\nQyRd795w8MHw+9/HTpJ/6mqefmdgkbsvcfdSYBzQs9wxPYFRAO4+HWhqZs0358rwdaQAbdoUVle8\n6SYVfKnY0KGh20/r7WdHJsV4X2BZ2u3lqfu2dcyKtGMcmGRmM8xsYE2DSn66556wN+r558dOIrmq\nZUu46CL47W9jJ0mGbMze6eruH5lZM0Lxn+fuUys6cMiQId98XlRURFFRURbiSV1ZvBj+7//gtde0\nhrps29VXQ5s2YSbPUUfFTpO7SkpKKCkp2a7nyKRPvwswxN2LU7evBtzdb0475gHgJXd/LHV7PnC8\nu68q91yDgS/c/fYKXkd9+gXEHU47Dbp1UwtOMjNiBDz0EEyZokZCpuqqT38GcJCZtTKzhkAvYHy5\nY8YDfVIhugCfu/sqM2tkZruk7m8MnAJolnYCPPoorFwJV1wRO4nki379YN26cLW21J2Mrsg1s2Lg\nLsIfiRHuPtTMBhFa/MNSx9wLFAPrgf7u/paZ7Q88Q+jXbwCMcfehlbyGWvoFYvXqsLbK+PHQuXPs\nNJJPJk+GCy6AefPClduybVqGQXJC376wxx5hDrZIdfXsCV27hpVYZdtU9CW6iRPDlbdz58Iuu8RO\nI/lo4cKwGN+778Lee8dOk9tU9CWq9euhXTv44x/h1FNjp5F89qtfhaU7HnggdpLcpqIvUV15ZRi8\nHTMmdhLJd2vWhCmc//hHaEhIxVT0JZo33wxTNOfM0VtyqR133w1/+Qv8/e+awlkZbZcoUZSWhnXy\n//AHFXypPRdfHPZQnjAhdpLCoqIv2+2OO6BZMzjvvNhJpJDssAPceiv8+tehYSG1Q907sl3efx+O\nPhpefx0OOCB2Gik07nDKKWEa56WXxk6Te9SnL1nlHpZMLi7WlbdSd2bPhpNPhgULYPfdY6fJLerT\nl6waOTLMsvif/4mdRApZ+/ZwxhlhIx7ZfmrpS4188kmYSjdhAnTsGDuNFLpVq6Bt27Bi68EHx06T\nO9S9I1nTuze0aAG33BI7iSTF0KEwfTo880zsJLlDRV+y4q9/hV/8IszJb9QodhpJiq++gkMPDcsv\nn3BC7DS5QX36Uue++CLMn/7Tn1TwJbt22gluvhkuvzxswyk1o6Iv1XLddaGVdfLJsZNIEp19dmhs\njBoVO0n+UveOZGz69DCLYu5c2HPP2GkkqaZPh7POClM4k76Sq7p3pM58/TUMHAi3366CL3EdfTQU\nFYWuHqk+tfQlIzfcAK++Ci+8oMWvJL6lS6FDB5g5E1q2jJ0mHs3ekTrx+uthBc0334RWrWKnEQl+\n9zv44INkL+Wt7h2pVWVlcNtt0KMHjBihgi+55aqroKQk9PFL5tTSlwqtWgX9+sHnn8PYsbD//rET\niXzbQw/B8OEwZQrUrx87TfappS+1YtKksLRCx47wyisq+JK7+vSBJk3Cwn8rV8ZOkx9U9OUbpaXh\nLXO/fmEe9A03hDXNRXJV/frhCvGiIujUSRuuZELdOwKEAbFzz4W99oKHHw6boojkk5dfhv/6L+jV\nKzRYGjaMnajuqXtHauTRR8Pc5969w56kKviSj44/PkzhnD8ffvCD0JCRb1PRT7B166B/fxgyJGw+\n/ctfag6+5Le99oLx40MDpksXePzx2Ilyj4p+Qs2cGfpAzcL8e62JL4XCLDRgJkyAa6+FCy+EL7+M\nnSp3qOgnjDvceWfYd3TIEPjzn7V+iRSmTp1Cg2b9eujcGd55J3ai3KCB3AT59NMwM2f16tCPr43M\nJQncw9aeV14JN94IAwYUTjemBnKlUv/4Bxx5ZNjicOpUFXxJDrPQ2JkyBe69N8zuWbs2dqp4VPQL\nXGkpXHNNuIjl4YfDlnOaey9JdOihMG1aGOzt0CGsKZVE6t4pYB9+GGYx7LZbeHu7996xE4nkhqef\nhosugt/8JuzEVS9Pm7/q3pFvPPZYmHt/9tlhOWQVfJEtzjortPSffjosKPjJJ7ETZY+KfgFxD7sJ\nDRgQlp2dMAF+9av8bcWI1KXWrcNVvB06hCnLkyfHTpQd6t7JY+7w7rvhB/fll8PiaA0bQs+e4TL0\nJk1iJxTJD5MmQd++cMEFMHgwNGgQO1FmtIlKgSsrgzlzti7yu+4aLj/f/NG6deyUIvnp44/DhIcN\nG8Jy4vvtFztR1eqs6JtZMXAnoTtohLt/a3dKM7sbOBVYD/Rz97czPTd1nIp+OZs2wdtvbynyU6aE\nmQdFRaHAd+uWHz+YIvmirAxuuSV8dOwI7dvDEUeEfw87DHbaKXbCrdXJQK6Z1QPuBX4ItAXONbND\nyx1zKnCgux8MDAIeyPTcfFJSUlKnz79xYxhcuuWWMLi0555w3nmwaFFYAfOdd2DhQhg2DH7+88oL\nfl3nrC3KWbuUc/vVqwdXXx26Tbt3L6F5c5g4Mfwe7r47tG0bZsQNHRqWdF6+PHSz5pNMhvg6A4vc\nfYm7lwLjgJ7ljukJjAJw9+lAUzNrnuG5eaO2flg3bYI1a2Dx4nCh1E03QXFxKPIDBsCyZWEhtIUL\nww/f/feHC0q+853s5qxrylm7lLP27LMPbNhQwlVXhT14584Nu8iNGRN+V1evhjvuCO8G9toLTjgh\nrPczYgS88UZur/WTyXDFvsCytNvLCcW8qmP2zfDcvFJWFlanXLs2fHz++ZbPK7uv/O3168Mga9Om\n0Lw5dO0a5gyPGRMKv4jknh13DFe1H3nk1vevWgWzZ8OsWaEb9p57wiy6Vq1Ct1B6F1HLlvGXgKir\nMeoafVk9emz5vPxbpprcLisLrera+LesDL74Aq6/Hho1CgV788duu219u2nT8J9b2TFNmmgapUih\naN48bNfYvfuW+0pLw7r+s2eHj/vugyVLcmPRtyoHcs2sCzDE3YtTt68GPH1A1sweAF5y98dSt+cD\nxwP7V3Vu2nPkWc+YiEh81R3IzaSlPwM4yMxaAR8BvYBzyx0zHrgEeCz1R+Jzd19lZqszOLdGwUVE\npPqqLPruvsnMLgUmsmXa5TwzGxQe9mHu/lczO83M3iNM2ey/rXPr7KsREZFtypmLs0REpO5FH040\ns2Izm29mC83sqth5KmJmLcxsspm9Y2ZzzOyy2Jm2xczqmdlbZjY+dpbKmFlTM3vCzOalvq9Hx85U\nnpn9yszmmtlsMxtjZg1jZ9rMzEaY2Sozm5123+5mNtHMFpjZ382saQ5mvCX1f/62mT1lZrvGzJjK\n9K2caY/92szKzGyPGNnKZakwp5n9IvU9nWNmQ6t6nqhFP48u3toIXO7ubYFjgEtyNOdmvwTejR2i\nCncBf3X3w4AjgJzq9jOz7wK/ADq6e3tCV2ivuKm28hDh9ybd1cCL7t4GmAz8NuuptlZRxolAW3c/\nElhE/IxQcU7MrAXQHViS9UQV+1ZOMysCTgfauXs74NaqniR2Sz8vLt5y9483Lyvh7usIBWrfuKkq\nlvpBPQ14MHaWyqRadz9w94cA3H2ju/87cqyK1Acam1kDoBGwMnKeb7j7VGBNubt7AiNTn48Ezshq\nqHIqyujuL7p7WermNKBF1oOVU8n3EuAO4Mosx6lUJTkvBoa6+8bUMaurep7YRb+yi7pylpm1Bo4E\npsdNUqnNP6i5PFizP7DazB5KdUMNM7OdY4dK5+4rgduApcAKwoy0F+OmqtLe7r4KQkMFyPVdFM4H\nJsQOUREz+zGwzN3nxM5ShUOAbmY2zcxeMrPvV3VC7KKfV8xsF+BJ4JepFn9OMbMewKrUuxKjhhfJ\nZUEDoCPwR3fvCHxJ6JrIGWa2G6Hl3Ar4LrCLmfWOm6racvYPv5ldC5S6+9jYWcpLNUCuAQan3x0p\nTlUaALu7exfgN8DjVZ0Qu+ivAFqm3W6Rui/npN7iPwmMdvfnYuepRFfgx2b2AfAocIKZjYqcqSLL\nCa2oN1JGRiE3AAABi0lEQVS3nyT8EcglJwMfuPtn7r4JeBo4NnKmqqxKrXmFme0D5OR+UGbWj9AF\nmat/RA8EWgOzzOxDQl1608xy8Z3TMsLPJu4+Aygzs20u5hK76H9z4VdqZkQvwoVeuejPwLvuflfs\nIJVx92vcvaW7H0D4Xk529z6xc5WX6oJYZmaHpO46idwbeF4KdDGznczMCBlzarCZb7+bGw/0S33e\nF8iFxslWGVNLrV8J/Njd/xMt1bd9k9Pd57r7Pu5+gLvvT2ikdHD3XPgjWv7//FngRIDU79MO7v6v\nbT1B1KKfakFtvnjrHWBcLl68ZWZdgZ8DJ5rZzFQ/dHHsXHnuMmCMmb1NmL1zY+Q8W3H31wnvQGYC\nswi/aMOihkpjZmOBfwKHmNlSM+sPDAW6m9kCwh+pKqfvRch4D7ALMCn1e3RfzIxQac50Tg5071SS\n88/AAWY2BxgLVNnI08VZIiIJErt7R0REskhFX0QkQVT0RUQSREVfRCRBVPRFRBJERV9EJEFU9EVE\nEkRFX0QkQf4fJEx1ZslEVUgAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n = 15\n", "%time make_pmf_heads(coin, n).plot_pmf()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This way of computing `pmf_heads` is not very efficient. For `n` tosses, there are $2^n$ possible outcomes, and for large values of `n`, that is not tractable.\n", "\n", "In the next section we will figure out a better way." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The symbolic version\n", "\n", "Looking at numerical output doesn't tell us much about how to generalize from this example. We can learn more by replacing the numbers with symbols.\n", "\n", "Here's a version of the Pmf where the probability of heads is the symbol `p`:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "H p\n", "T -p + 1\n" ] } ], "source": [ "from sympy import symbols\n", "\n", "p = symbols('p')\n", "sym_coin = Pmf(dict(H=p, T=1-p))\n", "sym_coin.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can see the distribution of the number of heads, which I'll call `k`, after a few tosses:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 (-p + 1)**2\n", "1 2*p*(-p + 1)\n", "2 p**2\n" ] } ], "source": [ "make_pmf_heads(sym_coin, 2).display()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 (-p + 1)**3\n", "1 3*p*(-p + 1)**2\n", "2 3*p**2*(-p + 1)\n", "3 p**3\n" ] } ], "source": [ "make_pmf_heads(sym_coin, 3).display()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 (-p + 1)**4\n", "1 4*p*(-p + 1)**3\n", "2 6*p**2*(-p + 1)**2\n", "3 4*p**3*(-p + 1)\n", "4 p**4\n" ] } ], "source": [ "make_pmf_heads(sym_coin, 4).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The general pattern is that probability of `k` heads after `n` tosses is the product of three terms\n", "\n", "* The probability of `k` heads, which is `p**k`.\n", "* The probability of `n-k` tails, which is `(1-p)**(n-k)`.\n", "* An integer coefficient.\n", "\n", "You might already know that the coefficient is the \"binomial coefficient\", which is written $n \\choose k$ and pronounced \"n choose k\". But pretend for a moment that you don't know that and let's figure it out.\n", "\n", "## The binomial coefficient\n", "\n", "To make the pattern easier to see, I'll create a fair coin where `p = 1-p = 1/2`" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "H p\n", "T p\n" ] } ], "source": [ "fair_coin = Pmf(dict(H=p, T=p))\n", "fair_coin.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now the probability of all outcomes is `p**n`" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TTT p**3\n", "HTT p**3\n", "THT p**3\n", "HHH p**3\n", "HHT p**3\n", "HTH p**3\n", "TTH p**3\n", "THH p**3\n" ] } ], "source": [ "thrice = sum([fair_coin]*3)\n", "thrice.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So when we count the number of heads, it is easier to see the coefficients." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 p**3\n", "1 3*p**3\n", "2 3*p**3\n", "3 p**3\n" ] } ], "source": [ "pmf_heads = make_pmf_heads(fair_coin, 3)\n", "pmf_heads.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And even easier if we divide through by `p**n`" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 1\n", "1 3\n", "2 3\n", "3 1\n" ] } ], "source": [ "for val, prob in pmf_heads.items():\n", " print(val, prob / p**3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can assemble the code from the previous cells into a function that prints the coefficients for a given value of `n`:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def coefficients(n):\n", " fair_coin = Pmf(dict(H=p, T=p))\n", " pmf_heads = make_pmf_heads(fair_coin, n)\n", " for val, prob in pmf_heads.items():\n", " print(prob / p**n, end=' ')\n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are the coefficients for `n=3`" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 3 3 1 \n" ] } ], "source": [ "coefficients(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And here they are for `n` in the range from `1` to `9`" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 1 \n", "1 2 1 \n", "1 3 3 1 \n", "1 4 6 4 1 \n", "1 5 10 10 5 1 \n", "1 6 15 20 15 6 1 \n", "1 7 21 35 35 21 7 1 \n", "1 8 28 56 70 56 28 8 1 \n", "1 9 36 84 126 126 84 36 9 1 \n" ] } ], "source": [ "for n in range(1, 10):\n", " coefficients(n)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can look for patterns.\n", "\n", "* If we flip the coin `n` times, the coefficient associated with getting `k` heads is `1` if `k` is `0` or `n`.\n", "\n", "* Otherwise, the `(n, k)` coefficient is the sum of two coefficients from the previous row: `(n-1, k)` and `(n-1, k-1)`\n", "\n", "We can use these observations to compute the binomial coefficient recursively:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def binomial_coefficient(n, k):\n", " if k==0 or k==n:\n", " return 1\n", " return binomial_coefficient(n-1, k) + binomial_coefficient(n-1, k-1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And it yields the same results." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "126" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "binomial_coefficient(9, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are the results for `n` from 1 to 9 again." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 1 \n", "1 2 1 \n", "1 3 3 1 \n", "1 4 6 4 1 \n", "1 5 10 10 5 1 \n", "1 6 15 20 15 6 1 \n", "1 7 21 35 35 21 7 1 \n", "1 8 28 56 70 56 28 8 1 \n", "1 9 36 84 126 126 84 36 9 1 \n" ] } ], "source": [ "for n in range(1, 10):\n", " for k in range(n+1):\n", " print(binomial_coefficient(n, k), end=' ')\n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So far so good." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise:** SciPy provides a \"special\" function called `binom` that you can import from `scipy.special`. Test it to confirm that it is consistent with our function.\n", "\n", "Note that `scipy.special.binom` returns a float, so for large values of `n` it is only approximate." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "126.000000" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Solution\n", "\n", "from scipy.special import binom\n", "binom(9, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise:** The recursive implementation of `binomial_coefficient` is inefficient for large values of `n` because it computes the same intermediate results many times. You can speed it up (a lot!) by memoizing previously computed results.\n", "\n", "Write a version called `fast_binom` that caches results in a dictionary." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 1 \n", "1 2 1 \n", "1 3 3 1 \n", "1 4 6 4 1 \n", "1 5 10 10 5 1 \n", "1 6 15 20 15 6 1 \n", "1 7 21 35 35 21 7 1 \n", "1 8 28 56 70 56 28 8 1 \n", "1 9 36 84 126 126 84 36 9 1 \n" ] } ], "source": [ "# Solution\n", "\n", "def fast_binom(n, k, cache={}):\n", " if k==0 or k==n:\n", " return 1\n", " try:\n", " return cache[n, k]\n", " except KeyError:\n", " res = fast_binom(n-1, k) + fast_binom(n-1, k-1)\n", " cache[n, k] = res\n", " return res\n", "\n", "for n in range(1, 10):\n", " for k in range(n+1):\n", " print(binomial_coefficient(n, k), end=' ')\n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Binomial PMF\n", "\n", "Bringing it all together, we have\n", "\n", "$PMF(k; n,p) = {n \\choose k} p^k (1-p)^{n-k}$\n", "\n", "This equation can be interpreted at two levels:\n", "\n", "* If you want to know the probability of `k` heads in `n` tosses, where the probability of heads in each toss is `p`, you can use the formula on the right to compute it.\n", "\n", "* More abstractly, this equation states that the formula on the right is the PMF of `k` with the parameters `n` and `p`.\n", "\n", "To make the difference between these interpretations clear, let's look at two functions:\n", "\n", " 1. `eval_binomial_pmf` evaluates this formula for given values of `k`, `n`, and `p`.\n", " 2. `make_binomial_pmf` evaluates the formula for a range of values of `k`, and returns the resulting `Pmf` object.\n", " \n", "First, here's `eval_binomial_pmf`:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from scipy.special import binom\n", "\n", "def eval_binomial_pmf(k, n, p):\n", " return binom(n, k) * p**k * (1-p)**(n-k)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use it to compute probabilities for each value of `k` directly:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0.064\n", "1 0.288\n", "2 0.432\n", "3 0.216\n" ] } ], "source": [ "n = 3\n", "p = 0.6\n", "\n", "for k in range(n+1):\n", " print(k, eval_binomial_pmf(k, n, p))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And here's the corresponding `pmf_heads` for comparison" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0.06400000000000002\n", "1 0.28800000000000003\n", "2 0.43199999999999994\n", "3 0.216\n" ] } ], "source": [ "coin = Pmf(dict(H=p, T=1-p))\n", "make_pmf_heads(coin, n).display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "They are the same, at least within floating point error.\n", "\n", "Now here's `make_binomial_pmf`" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def make_binomial_pmf(n, p):\n", " pmf = Pmf()\n", " for k in range(n+1):\n", " pmf[k] = eval_binomial_pmf(k, n, p)\n", " return pmf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use it to make a Pmf that contains the possible values of `k` and their probabilities:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0.064\n", "1 0.288\n", "2 0.432\n", "3 0.216\n" ] } ], "source": [ "pmf = make_binomial_pmf(n, p)\n", "pmf.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's what the distribution of `k` looks like for given values of `n` and `p`:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pmf.plot_pmf()\n", "plt.xlabel('k');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we hold `p` constant, we can see how the distribution of `k` changes as `n` increases" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p = 0.6\n", "for n in [5, 10, 15]:\n", " make_binomial_pmf(n, p).plot_pmf(label=n)\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise:** Keeping `n=10`, plot the distribution of `k` for a few different values of `p`." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Solution\n", "\n", "n = 10\n", "for p in [0.2, 0.5, 0.8]:\n", " make_binomial_pmf(n, p).plot_pmf(label=p)\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Pmf objects we just created represent differnet distributions of `k` based on different values of the parameters `n` and `p`.\n", "\n", "As `make_binomial_pmf` demonstrates, if you give me `n` and `p`, I can compute a distribution of `k`.\n", "\n", "Speaking casually, people sometimes refer to this equation as the PMF of \"the\" binomial distribution:\n", "\n", "$PMF(k; n,p) = {n \\choose k} p^k (1-p)^{n-k}$\n", "\n", "More precisely, it is a \"family\" of distributions, where the parameters `n` and `p` specify a particular member of the family." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise:** Suppose you toss a fair coin 10 times. What is the probability of getting 5 heads?\n", "\n", "If you run this experiment many times, what is the mean number of heads you expect? What is the variance in the number of heads?" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.24609375\n", "5.0\n", "2.5\n" ] } ], "source": [ "# Solution\n", "\n", "n = 10\n", "p = 0.5\n", "pmf = make_binomial_pmf(n, p)\n", "print(pmf[5])\n", "print(pmf.mean())\n", "print(pmf.var())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise:** Suppose you toss a fair coin 10 times. What is the probability of getting fewer than 5 heads?\n", "\n", "If you run this experiment many times, what is the median number of heads you expect? What is the interquartile range (IQR) in the number of heads?\n", "\n", "Hint: You might want to make a CDF." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.376953125\n", "5 2\n" ] } ], "source": [ "# Solution\n", "\n", "from distribution import compute_cumprobs, Cdf\n", "\n", "xs, ps = compute_cumprobs(pmf.d)\n", "cdf = Cdf(xs, ps)\n", "print(cdf[4])\n", "\n", "low, median, high = cdf.values([0.25, 0.5, 0.75])\n", "print(median, high-low)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "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.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }