{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Bayesian Statistics Made Simple\n", "\n", "Code and exercises from my workshop on Bayesian statistics in Python.\n", "\n", "Copyright 2020 Allen Downey\n", "\n", "MIT License: https://opensource.org/licenses/MIT" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Bayesian bandit problem\n", "\n", "Suppose you have several \"one-armed bandit\" slot machines, and there's reason to think that they have different probabilities of paying off.\n", "\n", "Each time you play a machine, you either win or lose, and you can use the outcome to update your belief about the probability of winning.\n", "\n", "Then, to decide which machine to play next, you can use the \"Bayesian bandit\" strategy, explained below.\n", "\n", "First, let's see how to do the update." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The prior\n", "\n", "If we know nothing about the probability of wining, we can start with a uniform prior." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "xs = np.linspace(0, 1, 101)\n", "prior = pd.Series(1/101, index=xs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's what it looks like." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def decorate_bandit(title):\n", " \"\"\"Labels the axes.\n", " \n", " title: string\n", " \"\"\"\n", " plt.xlabel('Probability of winning')\n", " plt.ylabel('PMF')\n", " plt.title(title)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "prior.plot()\n", "decorate_bandit('Prior distribution')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The update\n", "\n", "The following function takes a prior distribution and an outcome, either `'W'` or `'L'`.\n", "\n", "It does a Bayesian update in place; that is, it modifies the distribution based on the outcome." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def update(pmf, data):\n", " \"\"\"Likelihood function for Bayesian bandit\n", " \n", " pmf: Series that maps hypotheses to probabilities\n", " data: string, either 'W' or 'L'\n", " \"\"\"\n", " xs = pmf.index\n", " if data == 'W':\n", " pmf *= xs\n", " else:\n", " pmf *= 1-xs\n", " \n", " pmf /= pmf.sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's an example that starts with a uniform prior and updates with one win and one loss." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEWCAYAAABxMXBSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAAA7YUlEQVR4nO3dd3xV5f3A8c83ixAIM2EHEiBsmWGI4LYFtWJdgAMULKWuapdau+xurbWlDooVERyIGxVFHCyZQdkzhACBQMIKkBCyvr8/7uHX25hxE3Jz7s39vl+vvHLvOc9zzve5Sc43zxnPI6qKMcYY46swtwMwxhgTXCxxGGOMqRZLHMYYY6rFEocxxphqscRhjDGmWixxGGOMqRZLHMYVInKbiHzix+3PEpHfO69HisiOWtz2RyIy0Xl9p4gsr8Vt+/VzqSkRURHp6nYctUVEpovIL92OI1hZ4ggBIpIhImdE5LSIHBaRF0Wk8Xls7zci8vL5xKSqr6jqt85nG9XY1zJV7V5VOV/bpaqjVfWl841LRBKdA3KE17br5HMRkT4islBEjohIQD/MJSK/E5FNIlIsIr+pjW2q6lRV/V1tbCsUWeIIHd9R1cbAQGAw8Au3AvE+UNagroiIK7+3bu7bD4qAecBktwPxQRrwM+BDtwMxHvXlj8D4SFUPAB8BfQBE5DoR2SIiJ0RksYj0PFdWRB4WkQMickpEdojIFSIyCvg5MNbpwWxwyjYVkRdEJMup83sRCXfW3SkiX4rIUyJyDPhN2VM8IjJcRNaKSK7zfbjXusUi8gcR+RLIBzqXbZeIDBCRr5xYXweivdZdKiKZNWzXN/btLLv7f3cv/3Ji3y4iV3ityBCRK73ee/dqljrfTzj7vLAGn8vvnM/2lIh8IiJxFfzo/4eq7lDVF4AtvpT35vysZ4tIjojsFZFfnEuoItJVRJY48R5xfhbnku5TIpLtrNsoIn18jPUlVf0IOFVFXNHi6VnHOe9/4fRSmjjvfy8i/3Bee5/KvFREMkXkx058WSJyV3U/l1BiiSPEiEgCcDXwtYh0A14DHgTigQXA+yISJSLdgfuAwaoaC3wbyFDVj4E/Aq+ramNV7eds+iWgGOgKDAC+BXgfXIcC6UAr4A9lYmqB57/JaUBL4O/AhyLS0qvYHcAUIBbYW6Z+FPAuMAdoAbwB3FhB+6vbrkr3XaZtccCvgbedNlXlYud7M2efK8vE6svncitwF57PNQr4iQ/7PV//ApriSeCXABOcGAB+B3wCNAc6OGXB8/twMdANaAaMBY7WZlCqWgCsdWLC2d9e4CKv90sqqN4GT5va4+mFPSMizWszvvrEEkfoeFdETgDL8fzx/BHPH++HqrpIVYuAvwENgeFACdAA6CUikaqaoaq7y9uwiLQGRgMPqmqeqmYDTwHjvIodVNV/qWqxqp4ps4lrgF2qOsdZ/xqwHfiOV5lZqrrFWV9Upv4wIBL4h6oWqeqbeA4g5fG5XT7uGyDba9+vAzucNp0vXz6XF1V1p/OZzgP618J+K+T0IscCj6rqKVXNAJ7Ek1zBcwqsE9BOVQtUdbnX8ligByCquk1Vs/wQ4hLgEvGcDu2LJ+leIiLReE7RLqugXhHwW+dnuAA4DVR5XSxUWeIIHderajNV7aSq9zgHmnZ4/QetqqXAfqC9qqbh6Yn8BsgWkbki0q6CbXfCc+DOEs8prxPAv/H8F3zO/kpi+584HHvx/Pfna/0D+r8jdpbXM6Ca7fJl31Sw76q26QtfPpdDXq/zgRrf9OCjODw9G++4vGP6GSDAGvGcAp0EoKqfA08DzwCHRWTGuVNItWwJcCmea3mbgEV4eiDDgDRVPVJBvaOqWuz1vi4+y6BliSO0HcRz0Ac856GBBOAAgKq+qqojnDIK/MUpWvYunP3AWSDOSU7NVLWJqvb2KlPZnTv/E4ej47k4fKifBbR34veuX65qtMuXfVPBvg86r/OAGK91baqxXV8+l7p2hP/2Ks75/5hU9ZCqfk9V2wHfB54V5zZeVZ2mqoOA3nhOWf3UD/GtwNNT+C6wRFW3OvFdQ8WnqUw1WeIIbfOAa5yLw5HAj/EkgBUi0l1ELheRBkABcAbPaR6Aw0DiuQuizimHT4AnRaSJiISJSBcRueQbeyzfAqCbiNwqIhEiMhboBXzgY/2VeK6vPODUvwEYUl7B6rSrGlo5+44UkZuBnk6bANYD45x1KcBNXvVygFLKudjvOK/Pxbkwf2cF68Q5fRPlvI92PpNKqWoJnt+bP4hIrIh0An4EvOxs52YR6eAUP44nOZaIyGARGer8nuXh+exLnDp3ikhGJe2IdGINAyKcWMMriC8fWAfcy38TxQo8ScwSRy2xxBHCVHUHcDueC5hH8Jw7/46qFuK5DvBnZ/khPAfHnztV33C+HxWRr5zXE/AchLbiOWC8CbT1MY6jwLV4EtdRPKc7rq3ktELZ+oXADcCdzr7HAm9XULy67fLFaiDZ2eYfgJucNgH8EujixPU48KpX3PlO+S+dU3zDyrSrxp+Lc8NAS2BVBUU64Uma5+6qOoPn2owv7sdz8E/Hc83sVWCms24wsFpETgPzgR+q6h6gCfA8ns9hr9Oevzl1EoAvK9nf805844HHnNd3VFJ+CZ5Tp2u83sfy37vYzHkSm8jJmPpHREYA96rqeLdjqYp4npT/oapuczsW4xtLHMYYY6rFTlUZY4ypFkscxhhjqsUShzHGmGqp8WBzwSQuLk4TExPdDsMYY4LKunXrjqhqfNnlIZE4EhMTSU1NdTsMY4wJKiJS7ggMdqrKGGNMtVjiMMYYUy2WOIwxxlSLJQ5jjDHVYonDGGNMtVjiMMYYUy2WOIwxxlRLSDzHYYxbSkuVnNNnOXjiDMfzCzmeV0TumSIKS0opLC6luFSJCheiIsKIjgynWUwUzWMiadmoAe2bN6Rpw0i3m2DMN1jiMKaWHMotYP3+E2w/dJJtWSdJyz5N5vEznC0urfE2mzaMpGOLGLq1jqVn21h6tW1C34RmNG5gf7rGPfbbZ0wNHT5ZwJIdOaxMP8rajGNkHj8DgAgktWxEt9axXNGzNQnNG9KuWUNaNm5Ai5gomjSMoEFEOFERYYQJFJcqhcWlnCkq4UR+EcfzC8k5dZbM4/nsP3aGjKN5LN2Vw1tfZQIQJtCrXRNSOrVgZHIcF3ZpSUyU/SmbumO/bcZUw87Dp/hgYxafbj3M1qyTAMQ1bsCQpOZMuiiJAR2b0aNNExpGlTuzabkiw4XI8DAaNYggrnHFs7ceOX2WLQdPsm7vcVIzjvH62v3MWpFBVEQYQ5NaMKpPG0b1bkPLSrZhTG0IiYmcUlJS1MaqMjV1+GQBb67L5L31B9h5+DRhAimJLbiseysu7R5PjzaxiEidx3W2uIS1e46zeEc2n2/PJv1IHuFhwvAuLblhYHtG92lLdKTvCcyYskRknaqmfGO5JQ5jvqm0VPliRzavrt7HFzuyKVUYnNic7/Rrx6g+bWgVG+12iP9DVdl+6BQfbDzI+xuy2Hcsn9joCK7v3547LuxEt9axbodogpAlDkscxgf5hcW8tS6TmV9msOdIHvGxDbh5UAduSUkgMa6R2+H5pLRUWbXnKPPW7mfB5kMUFpcyMjmOySOSuKRbvCu9IxOcLHFY4jCVOFVQxOyVe/nPsnSO5xfRL6EZk0ckMbpPGyLDg/dxp+N5hby6Zh8vrcgg+9RZerZtwgOXd+XbvdsQFmYJxFTOEoclDlOO/MJiXvwygxlL08k9U8Rl3eO597KuDOrUvF79Z15YXMr8DQd59os00o/k0b11LA9d1Y1v925dr9ppapclDkscxktxSSlvrsvk74t2kn3qLFf0aMUDVyTTL6GZ26H5VUmp8sHGg0z7bBe7c/IY1Kk5P7+6B4M6tXA7NBOALHFY4jCOlbuP8uv5m9l5+DQDOzbj51f3JCUxtA6cxSWlvLEuk6ecxHnNBW157JqetGvW0O3QTACpKHH49eStiIwSkR0ikiYij5SzXkRkmrN+o4gM9Fo3U0SyRWRzBdv+iYioiMT5sw2m/jiUW8D9r33N+OdXkV9YwnO3DeStHwwPuaQBEBEexvghHVn800t56MpufLrtMFc8uYRnF6dxtrjE7fBMgPNb4hCRcOAZYDTQCxgvIr3KFBsNJDtfU4DnvNbNAkZVsO0E4CpgX+1Gbeqj0lJlzqq9XPn3JSzccogfXpHMpz+6hNEXtA358/sxURH88ErP5zEyOY6/fryDa6YtZ93e426HZgKYP3scQ4A0VU1X1UJgLjCmTJkxwGz1WAU0E5G2AKq6FDhWwbafAn4G1P/zbOa87DmSx7jnV/HLdzfTP6EZix66mIeu6mYPxpWR0CKGGRNSePHOweSfLeam6St4/P0t5BcWux2aCUD+TBztgf1e7zOdZdUt8z9E5DrggKpuqKLcFBFJFZHUnJwc36M29YKqMntlBqP/uZRtWSf56419mTN5CJ1aBsezGG65rEcrPvnRJdwxrBMvfpnB1f9cxlf7rPdh/pc/E0d55wDK9hB8KfPfwiIxwGPAr6rauarOUNUUVU2Jj4+vqripR7JPFXDXrLX86r0tDE1qyac/uoRbBieE/GkpXzVuEMFvx/Rh7pRhFJUoN09fyVOLdlJUUvNRfk394s/EkQkkeL3vABysQRlvXYAkYIOIZDjlvxKRNucdrakXluzMYdQ/lrFy91F+O6Y3s+4aTOsmgTU8SLAY1rklHz04kjH92vHPz3Zxy79XcuDEGbfDMgHAn4ljLZAsIkkiEgWMA+aXKTMfmODcXTUMyFXVrIo2qKqbVLWVqiaqaiKexDNQVQ/5qQ0mSBSXlPLEwu1MnLmG+MYN+PCBEUy4MNF6GeepSXQkfx/bn3+NH8Cuw6e5ZtoyPt9+2O2wjMv8ljhUtRi4D1gIbAPmqeoWEZkqIlOdYguAdCANeB6451x9EXkNWAl0F5FMEZnsr1hNcDty+iy3/Wc1z3yxm7EpCbx770V0bWWD+tWm7/Rrx/v3j6Bd04ZMmpXKXz7eTkmp3ZsSquwBQBPUNmXmMmVOKsfzC/nD9Rdw46AObodUrxUUlfD4+1t5bc0+LukWz7RxA2gaY9Pb1leuPABojD+983UmN01fQZgIb04dbkmjDkRHhvOnGy7gj9+9gBW7jzDmmeXsPHzK7bBMHbPEYYJOaanyxMLtPPT6BgZ0bMb8+y6iT/umbocVUm4d2pG5U4aRV1jCjc+uYOlOu+U9lFjiMEGloKiEB+Z+zTNf7Gbc4ATmTB5qU6W6ZFCnFsy/7yI6tIjhrllreWX1XrdDMnXEEocJGsfyCrn1+VV8sDGLR0f34E83XBDUc2XUB22bNuSNqRdycXIcj72zmT8u2EapXTSv9+yvzgSFzOP53DR9BZsPnuTZ2wby/Uu62K22AaJxgwien5DCHcM6MWNpOj9+Y4M9LFjPRbgdgDFV2Xn4FBNeWENeYTFzJg1haOeWbodkyogID+O3Y3rTukkD/vbJTo7lFfLc7QOJibJDTH1kPQ4T0L7ed5ybp6+kVJV537/QkkYAExHuuzyZP91wAct25XDr86vJzS9yOyzjB5Y4TMBanX6U2/+zmqYNI3nrB8Pp2baJ2yEZH4wf0pFnbxvE1oMnGf/8Ko6ePut2SKaWWeIwAWnZrhwmvriGNk2jmff9C0loEeN2SKYaRvVpw4wJg9idc5pxM1aRfbLA7ZBMLbLEYQLOFzuymTwrlcSWjXj9+xfSpqkNUhiMLu3eihfvGsyBE2cYO2MVhy151BuWOExAWbozh+/PWUdy68bMnTKMOHtGI6gN7xLHnMlDyD5ZwPjnV5F9ypJHfWCJwwSM5buO8L3ZqXSJb8zLk4fSLCbK7ZBMLRjUqQWzJg3hUG4Btz6/mpxTds0j2FniMAFhdfpR7p69lqS4Rrxy91CaN7KkUZ8MTmzBi3cO5sDxM9z2n1Uczyt0OyRzHixxGNdtzDzB5JdSad+sIS/fPZQWljTqpaGdW/LCnSlkHM1n4otrOFVgt+oGK0scxlW7Dp9i4sw1NIuJ5JW77ZpGfTe8SxzP3TaQrQdPcvdLqRQUlbgdkqkBSxzGNfuP5XPbf1YTER7Gy5OH2t1TIeKKnq158pZ+rMk4xj2vfGXDkwQhSxzGFcfyCpkwcw0FRSXMmTyExLhGbodk6tCY/u353Zg+fL49m0ff3kQoTChXn9hAMqbO5RcWM2nWWg6eOMPLdw+lRxt7IjwU3T6sE9mnzjLts120aRLNT77d3e2QjI/82uMQkVEiskNE0kTkkXLWi4hMc9ZvFJGBXutmiki2iGwuU+cJEdnulH9HRJr5sw2mdhWXlHL/q1+zMfME/xw3gMGJLdwOybjooSuTGTc4gae/SGPOKpvPI1j4LXGISDjwDDAa6AWMF5FeZYqNBpKdrynAc17rZgGjytn0IqCPqvYFdgKP1m7kxl9UlV/P38Jn27P57Zg+jOrTxu2QjMtEhN9f34cre7biV+9t5tOth90OyfjAnz2OIUCaqqaraiEwFxhTpswYYLZ6rAKaiUhbAFVdChwru1FV/URVi523qwCbaDpIvLB8D6+s3sfUS7pw+7BObodjAkREeBjTxg+gT7umPDD3azYfyHU7JFMFfyaO9sB+r/eZzrLqlqnMJOCj8laIyBQRSRWR1Jwcmw/ZbQu3HOIPC7Zx9QVt+JmdyzZlxERF8MLEFJo1jGTyS2s5lGtDkwQyfyaO8qZnK3vrhC9lyt+4yGNAMfBKeetVdYaqpqhqSnx8vC+bNH6y+UAuD85dT98Ozfj7Lf0JC7OZ+8w3tWoSzQt3DibvbAmTZq0lv7C46krGFf5MHJlAgtf7DsDBGpT5BhGZCFwL3KZ2H19Ayz5VwPdmp9KiURT/mZBCdGS42yGZANazbRP+desAth86yY/nbbD5ywOUPxPHWiBZRJJEJAoYB8wvU2Y+MMG5u2oYkKuqWZVtVERGAQ8D16lqvj8CN7XjbHEJU+es40R+ETMmDCI+1p4KN1W7rHsrHh3dk482H+Jfn6e5HY4ph98Sh3MB+z5gIbANmKeqW0RkqohMdYotANKBNOB54J5z9UXkNWAl0F1EMkVksrPqaSAWWCQi60Vkur/aYGpOVfnFO5v5at8J/nZzP3q3a+p2SCaI3D0yiRsGtuepT3fy8eZK/5c0LvDrA4CqugBPcvBeNt3rtQL3VlB3fAXLu9ZmjMY/XlqRwRvrMnng8q5c07et2+GYICMi/PG7F5Cek8eP5m0gKa4x3dvEuh2WcdiQI6bWrc04xu8/3MaVPVvz4JXd3A7HBKnoyHD+fccgGjWIYOrL6zhpo+kGDEscplZlnyzgnle+IqFFDH8f28/uoDLnpXWTaJ69bSD7j+Xzo9ftYnmgsMRhak1hcSn3vPIVpwuKmX77IJpER7odkqkHBie24LFrevLptsM8u9gulgcCSxym1vzpo22k7j3OX2/qa+ejTa26c3giY/q348lFO1m2yx7odZslDlMrPt6cxYtfZnDn8ES+06+d2+GYekZE+NMNF5DcqjEPzl3P4ZP2ZLmbLHGY87b3aB4/fWMj/RKa8fOre7odjqmnYqIiePa2geQXlnD/q19TbBNAucYShzkvBUUl3PvqV4jA0+MHEBVhv1LGf7q2iuWPN/RhTcYx/r5op9vhhCz7Kzfn5U8LtrH5wEmevKU/CS1i3A7HhIDvDujAuMEJPLt4N0t22vUON1jiMDW2aOthXlq5l0kXJXFVr9Zuh2NCyG+u60331rH8eN56ck6ddTuckGOJw9TIodwCfvbmBnq3a8LDo22YdFO3oiPDmTZ+AKcKivnxG/Z8R12zxGGqraRUeej19ZwtLuVf4wfQIMJGvDV1r3ubWH55bS+W7szhheV73A4npFjiMNU2fcluVqYf5fHretM5vrHb4ZgQdtvQjny7d2v+unA7mzJt5sC6YonDVMumzFyeWrSTa/u25aZBNmuvcZeI8Jcb+9KyUQMefP1rzhSWuB1SSLDEYXx2prCEB1//mrjGDfjD9RcgYuNQGfc1i4nibzf3Y3dOHn/+aJvb4YQESxzGZ3/+aBu7c/J48pZ+NI2xcahM4BiRHMddFyXy0sq9LN6R7XY49Z4lDuOTxTuy///W24u6xrkdjjHf8PCoHiS3asxP39zIsbxCt8Op1yxxmCrl5hfx8Fsb6da6MT8bZbfemsAUHRnOP8b150R+Ib98b7Pb4dRrfk0cIjJKRHaISJqIPFLOehGRac76jSIy0GvdTBHJFpHNZeq0EJFFIrLL+d7cn20w8Jv3t3DkdCFP3tyf6Ei79dYErt7tmvLA5cl8uDGLDzYedDucestviUNEwoFngNFAL2C8iPQqU2w0kOx8TQGe81o3CxhVzqYfAT5T1WTgM+e98ZOFWw7xztcHuPeyrlzQweYNN4HvB5d2oW+Hpvzy3c32VLmf+LPHMQRIU9V0VS0E5gJjypQZA8xWj1VAMxFpC6CqS4Fj5Wx3DPCS8/ol4Hp/BG/gWF4hj72ziV5tm3DfZTbVuwkOEeFhPHlzP/IKS3jsnU2o2lPltc2fiaM9sN/rfaazrLplymqtqlkAzvdW5RUSkSkikioiqTk5NhBaTfzqvc3kniniyVv62ai3Jqgkt47lx1d145Oth3lvvZ2yqm3+PBqUd5N/2dTvS5kaUdUZqpqiqinx8fG1scmQ8smWQ3ywMYv7L0+mZ9smbodjTLXdPbIzAzo24/H3t3DktJ2yqk3+TByZQILX+w5A2dTvS5myDp87neV8t5u2a1numSJ+8e5merZtwg8u7eJ2OMbUSHiY8Ncb+5J3toRfz9/idjj1ij8Tx1ogWUSSRCQKGAfML1NmPjDBubtqGJB77jRUJeYDE53XE4H3ajNoA3/4cCtH8wp54qa+RIbbKSoTvJJbx3L/5V35cGMWC7cccjucesNvRwVVLQbuAxYC24B5qrpFRKaKyFSn2AIgHUgDngfuOVdfRF4DVgLdRSRTRCY7q/4MXCUiu4CrnPemlizblcO81EymXNyZPu3tLioT/KZe2oWebZvwi3c3k5tf5HY49YKEwh0HKSkpmpqa6nYYAS+/sJhvPbWUqPAwFvxwpD2zYeqNzQdyGfPMl9w8qAN/vrGv2+EEDRFZp6opZZfbeQjz//756S4yj5/hTzdcYEnD1Ct92jdl8ogk5q7dz+r0o26HE/QscRgAthzM5T/L9zBucAJDO7d0Oxxjat2DVybToXlDHn1nE2eLbfj182GJw1BSqjz69iaax0Tx6OiebodjjF/EREXw++v7kJ6Tx3OLd7sdTlCzxGF4aUUGGzNz+dV3etlw6aZeu7R7K67r145nv9hNWvYpt8MJWpY4Qtyh3AKe/GQHl3SL5zt927odjjF+98tre9EwKpxfvLvZhiOpIUscIe53H26luFT53Zg+NqOfCQnxsQ342ajurEo/xrvrD7gdTlCyxBHClu7M4cONWdx7WVc6toxxOxxj6sz4wR3pl9CMP3y4jdwz9mxHdVniCFEFRSX86r3NJMU14vuXdHY7HGPqVFiY8Ifr+3Asr5C/LdzhdjhBxxJHiPr3knQyjubz2zG9aRBhz2yY0NOnfVMmXJjIy6v3sjHzhNvhBBVLHCFo/7F8nl2cxjV92zIy2UYONqHrR9/qRlzjBvzyvS2UltqFcl9Z4ghBv/tgK2Ei/OIae2bDhLYm0ZE8OroHG/af4M11mW6HEzQscYSYJTtz+GTrYe6/oittmzZ0OxxjXPfdAe0Z1Kk5f/l4u10o95EljhBSWFzK4/O3kBTXiMkjktwOx5iAICI8fl1vjuUX8tSinW6HExQscYSQmV/uIf1IHr/6Ti+7IG6Mlz7tm3LrkI7MWbWX7YdOuh1OwLPEESKyTxYw7bNdXNmzFZd1L3eadmNC2k++1Z3Y6Agen7/VniivgiWOEPHXhTsoKinlF9f0cjsUYwJS80ZR/OiqbqxMP8rCLYfdDiegWeIIARszPXeMTLooicS4Rm6HY0zAunVIR7q1bswfF2yzodcr4dfEISKjRGSHiKSJyCPlrBcRmeas3ygiA6uqKyL9RWSViKwXkVQRGeLPNgQ7VeW3728lrnEU913e1e1wjAloEeFh/PLaXuw7ls/M5RluhxOw/JY4RCQceAYYDfQCxotI2fMko4Fk52sK8JwPdf8KPK6q/YFfOe9NBd7fmEXq3uPO+VsbMt2YqoxMjufKnq14+vNdZJ8qcDucgOTPHscQIE1V01W1EJgLjClTZgwwWz1WAc1EpG0VdRVo4rxuChz0YxuCWkFRCX/5aDu92jbh5pQEt8MxJmg8dk0vCktKeXKh3Z5bnkoTh4jM8no9sZrbbg/s93qf6SzzpUxldR8EnhCR/cDfgEerGVfIeGH5Hg6cOMMvr+1FeJgNmW6Mr5LiGjHhwkTmrdvPtiy7Pbesqnoc/bxe/7Ca2y7vSFX2HreKylRW9wfAQ6qaADwEvFDuzkWmONdAUnNycnwMuf44cvoszy3ezZU9W3NhF5tD3Jjquv/yrjSJjuSPC7bZ7bllVJU4zufTygS8z4904JunlSoqU1ndicDbzus38JzW+gZVnaGqKaqaEh8fegP5PbVoJwVFJTx6dQ+3QzEmKDWLieKBK5JZtusIi3eG3j+flakqcXRw7nr6l9fr//+qou5aIFlEkkQkChgHzC9TZj4wwbm7ahiQq6pZVdQ9CFzivL4c2OVTS0PIrsOnmLt2P7cN7UiX+MZuh2NM0LpjWCc6tYzhjx9uo7ik1O1wAkZEFet/6vU6tTobVtViEbkPWAiEAzNVdYuITHXWTwcWAFcDaUA+cFdldZ1Nfw/4p4hEAAV47sYyXv700XZiIsN54Ipkt0MxJqhFRYTxyKge/OCVr5iXmsmtQzu6HVJAkFA4d5eSkqKpqdXKe0Fr5e6jjH9+FQ+P6sEPLu3idjjGBD1V5ebpK9l7LJ8lP72UmKiq/t+uP0RknaqmlF1e6ScgImVPLf0PVb3ufAMztUdV+fNH22jbNJq7Lkp0Oxxj6gUR4dGre3Djcyv5z7I91pOn6lNVF+K5LfY1YDXl3+1kAsSHm7LYkJnLEzf1JTrSRr81prYM6tSCb/duzb+X7ObWoR2Ja9zA7ZBcVdXF8TbAz4E+wD+Bq4AjqrpEVZf4Ozjju6KSUp5YuIPurWO5YWAHt8Mxpt756bd7UFBcytOfp7kdiusqTRyqWqKqH6vqRGAYnovYi0Xk/jqJzvjstTX72Hs0n4dHd7eH/Yzxg66tGnNLSgKvrN7L3qN5bofjqiqHHBGRBiJyA/AycC8wjf8+R2ECQN7ZYqZ9touhSS1srg1j/OihK5OJCAvjb5+E9lAkVQ058hKwAhiIZ2DBwar6O1U9UCfRGZ/MXL6HI6cLeXh0D0Sst2GMv7RqEs2kEYm8v+EgWw7muh2Oa6rqcdwBdMMz3MhKETnpfJ0SERvAJQAczytkxtJ0rurVmoEdm7sdjjH13pSLu9C0YSR/W7jD7VBcU9U1jjBVjfX6auJ8xapqk8rqmroxfcluThcW85NvdXc7FGNCQtOGkUy9pAtf7MhhbcYxt8NxRVWnqqJF5EERedoZNDB0nnwJAodyC5i1IoPv9m9P9zaxbodjTMi4c3girWIb8NePt4fkAIhVnap6CUgBNuEZGuRJv0dkfDbt812UqvLQVd3cDsWYkNIwyjOkz9qM4yzeEXoDIFaVOHqp6u2q+m/gJmBkHcRkfLD3aB7z1u5n3OCOJLSIcTscY0LO2MEJdGoZwxMLd1BaGlq9jqoSR9G5F6pa7OdYTDX887NdhIcJ99s84sa4IjI8jB9ekczWrJMs3HLI7XDqVJUTOXnfSQX0tbuq3JeWfZp3vz7AhAs70apJtNvhGBOyxvRvT5f4Rjz16U5KQqjXUdVdVeFl7qSKsLuq3PePT3cSHRnO1Ets9Ftj3BQeJjx0VTd2Hj7NBxvLzlNXf1X55LgJLNsPneSDjVncdVEiLUN8oDVjAsHVfdrSo00s//h0V8hM9mSJI8g8tWgnsdERTBlpvQ1jAkFYmPCjq7qx50ge73wdGoNqWOIIIpsP5LJwy2HuHtGZpjGRbodjjHFc1as1fTs0ZdrnuygKgV6HJY4g8s/PdtEkOoK7RiS6HYoxxouI8OCVyew/doZ3vqr/vQ6/Jg4RGSUiO0QkTUQeKWe9iMg0Z/1GERnoS10Rud9Zt0VE/urPNgSKzQdyWbT1MHeP7EyTaOttGBNoLuveir4dmvKvL+p/r8NviUNEwoFngNFAL2C8iPQqU2w0kOx8TQGeq6quiFwGjAH6qmpv4G/+akMgOdfbuNOmhDUmIIVSr8OfPY4hQJqqpqtqITAXzwHf2xhgtnqsApqJSNsq6v4A+LOqngVQ1Ww/tiEgWG/DmOAQKr0OfyaO9njmKz8n01nmS5nK6nYDRorIahFZIiKDy9u5Myhjqoik5uQE91gy1tswJjiESq/Dn4mjvBmFyj5aWVGZyupGAM3xTGX7U2CelDN7karOUNUUVU2Jj4/3PeoAs+Wgp7cxeYT1NowJBt69jvr6XIc/E0cmkOD1vgNQ9tHKispUVjcTeNs5vbUGKAXiajHugPL052nENrDehjHBQkS4/3JPr+O99fXzaXJ/Jo61QLKIJIlIFDAOmF+mzHxggnN31TAgV1Wzqqj7LnA5gIh0A6KAI35sh2t2Hj7FR5sPcedFiTRtaL0NY4LFlT1b0bNtE575Iq1ejmHlt8ThjKZ7H7AQ2AbMU9UtIjJVRKY6xRYA6UAa8DxwT2V1nTozgc4ishnPRfOJWk9nUnnmizQaRYUz6aIkt0MxxlSDp9fRlfQjeSzYlOV2OLXOrzP6qeoCPMnBe9l0r9cK3OtrXWd5IXB77UYaePYcyeP9DQf53sWdad4oyu1wjDHVNKp3G7q2aszTn6dxzQVtCQsr79JtcLInxwPUM1+kERURxt0jOrsdijGmBsLChPsu68qOw6f4ZOtht8OpVZY4AtD+Y/m88/UBxg/pSHysjYBrTLC6tm9bElvG8PQXu+rV3OSWOALQjKXphAlMudh6G8YEs4jwMO65tCubD5xk6a76cw+PJY4Ak32qgNdT93PjwA60bdrQ7XCMMefp+gHtads0mme+SHM7lFpjiSPAzFyeQXFJKd+32f2MqReiIsL43sjOrNlzjNSMY26HUysscQSQ3PwiXl61l2v6tiMprpHb4Rhjasm4IQm0aBTFs4t3ux1KrbDEEUBmr8zg9Nli7rnUehvG1CcxURFMuiiRz7dns/XgSbfDOW+WOAJEfmExL67I4PIenidOjTH1yx0XJtK4QQTPLg7+ax2WOALEvLX7OZZXaL0NY+qppg0juX1YJxZsymLv0Ty3wzkvljgCQFFJKc8v28PgxOakJLZwOxxjjJ9MuiiRiLAwnl+W7nYo58USRwD4cGMWB06c4fsXW2/DmPqsVZNobhjYnjdSMzly+qzb4dSYJQ6XqSrTl+wmuVVjLu/Ryu1wjDF+9r2LO1NYUspLKzLcDqXGLHG4bMnOHLYfOsWUizvXq0HQjDHl6xLfmG/1as3slXvJO1vsdjg1YonDZdOX7KZt02jG9C87q64xpr6aekkXcs8U8dqafW6HUiOWOFy0Yf8JVqUfY/KIJKIi7EdhTKgY0LE5Q5Na8MLyPRQF4fSydrRy0Yxl6cRGRzB2cELVhY0x9cr3L+lMVm4BH24MvomeLHG4ZP+xfD7alMWtQzsSG23TwhoTai7t1oqurRozY2l60A257tfEISKjRGSHiKSJyCPlrBcRmeas3ygiA6tR9ycioiIS5882+MsLy/cQJsJdw21aWGNCUViY8L2RSWzNOsmK3UfdDqda/JY4RCQceAYYDfQCxotIrzLFRgPJztcU4Dlf6opIAnAVEJRXlk7kFzIvdT/X9W9Hm6bRbodjjHHJmP7tiWvcgBlLg+uBQH/2OIYAaaqa7swTPhcYU6bMGGC2eqwCmolIWx/qPgX8DAiu/p3jldX7yC8s4XsjbaImY0JZdGQ4dw7vxJKdOew4dMrtcHzmz8TRHtjv9T7TWeZLmQrrish1wAFV3VDZzkVkioikikhqTk5OzVrgB2eLS5i1IoORyXE2mKExhtuGdqJhZHhQDUPiz8RR3tNsZXsIFZUpd7mIxACPAb+qaueqOkNVU1Q1JT4+vspg68r89QfJOXXWpoU1xgDQvFEUt6R04L31B8g+WeB2OD7xZ+LIBLzvM+0AHPSxTEXLuwBJwAYRyXCWfyUibWo1cj9RVV5YvocebWIZ0TUor+kbY/xg0ogkikuVOav2uh2KT/yZONYCySKSJCJRwDhgfpky84EJzt1Vw4BcVc2qqK6qblLVVqqaqKqJeBLMQFU95Md21JoVu4+y/dApJl2UhIgNL2KM8ejUshFX9mzNy6v2UlBU4nY4VfJb4lDVYuA+YCGwDZinqltEZKqITHWKLQDSgTTgeeCeyur6K9a68sLyPcQ1juK6/u3cDsUYE2Amj0jieH4Rb391wO1QqhThz42r6gI8ycF72XSv1wrc62vdcsoknn+UdWN3zmk+357Ng1cmEx0Z7nY4xpgAMzSpBX3aN2Hml3sYNzghoAc9tSfH68jM5XuIigjj9mGd3A7FGBOARITJI5JIyz7Nkl2BcydoeSxx1IHjeYW89VUm1/dvR1zjBm6HY4wJUNdc0I5WsQ2YuXyP26FUyhJHHXht7T4KikqZNMKGFzHGVCwqIoyJwxNZtusIOw8H7gOBljj8rKiklDkr9zK8S0t6tLEH/owxlRs/pCMNIsJ48csMt0OpkCUOP1u45RBZuQXcdZH1NowxVWvRKIrr+7fnna8zOZFf6HY45bLE4WezvsygY4sYm0/cGOOzu0YkUlBUyty1+6su7AJLHH60KTOX1L3HmTg8kfAAvrXOGBNYerRpwoWdWzJ7RQbFAThDoCUOP3rxyz00igrn5pQObodijAkyd12UyMHcAj7ZetjtUL7BEoefZJ8q4P2NB7lpUAea2Ax/xphquqJnaxJaNOTFLwPv1lxLHH7y2ur9FJUoE4cnuh2KMSYIhYcJEy9MZG3GcTYfyHU7nP9hicMPikpKeWX1Xi7pFk/n+MZuh2OMCVI3D0qgYWQ4c1YG1qi5ljj8YOGWQ2SfOsvE4Ta8iDGm5prGRHL9gPa8u/4Ax/MC59ZcSxx+MHvFXjq2iOGSbnYLrjHm/Ewc3omzxaXMSw2cW3MtcdSyrQdPsibjGBMu7GS34BpjzluPNk0YmtSCOav2UlJadhJVd1jiqGWzV2YQHRnGzYMSqi5sjDE+mDg8kczjZ/hie7bboQCWOGrVifxC3l1/gO8OaE/TGLsF1xhTO67q1Zo2TaJ5aWWG26EAljhq1ZvrMikoKuWOYYluh2KMqUciw8O4bWhHlu06wu6c026H49/EISKjRGSHiKSJyCPlrBcRmeas3ygiA6uqKyJPiMh2p/w7ItLMn23wVWmp8vKqvQxObE6vdjYKrjGmdo0dkkBkuPDKqn1uh+K/xCEi4cAzwGigFzBeRHqVKTYaSHa+pgDP+VB3EdBHVfsCO4FH/dWG6liedoSMo/k2w58xxi9axUYzqk9b3li3n/zCYldj8WePYwiQpqrpqloIzAXGlCkzBpitHquAZiLStrK6qvqJqp771FYBATEQ1OyVe4lrHMWoPm3cDsUYU0/dMawTpwqKeX/DQVfj8GfiaA9433ic6SzzpYwvdQEmAR+dd6TnKfN4Pp9vP8zYwQk0iAh3OxxjTD01OLE53VvHMnvlXlTduzXXn4mjvIcYyra0ojJV1hWRx4Bi4JVydy4yRURSRSQ1J8e/E7+/tsZzznH8kI5+3Y8xJrSJCLdf2IktB0+yfv8J1+LwZ+LIBLwfZugAlO1fVVSm0roiMhG4FrhNK0i7qjpDVVNUNSU+Pr7GjajK2eISXl+7n8t7tKZD8xi/7ccYYwC+O6A9jaLCmbPKvfGr/Jk41gLJIpIkIlHAOGB+mTLzgQnO3VXDgFxVzaqsroiMAh4GrlPVfD/G75OPNx/iyOlC7rjQLoobY/yvcYMIbhjYgQ82ZnHMpfGr/JY4nAvY9wELgW3APFXdIiJTRWSqU2wBkA6kAc8D91RW16nzNBALLBKR9SIy3V9t8MUrq/fRsUUMI7vGuRmGMSaE3D6sE4XFpby1LtOV/Uf4c+OqugBPcvBeNt3rtQL3+lrXWd61lsOssV2HT7FmzzEeGd2DMBuXyhhTR7q3iSWlU3NeXbOPu0cmIVK3xx97cvw8vLpmH5Hhws2DAuKOYGNMCLltWEf2HMlj5e6jdb5vSxw1dKawhLfWZTKqT1taNm7gdjjGmBAzuk9bmsVE8srqun+S3BJHDX2w8SAnC4q5bajdgmuMqXvRkeHcNLCDM3FcQZ3u2xJHDb26Zh9d4hsxNKmF26EYY0LU+KEdKS5V3kit24vkljhqYMvBXL7ed4Jbh3aq84tSxhhzTpf4xgzv0pLX1uyr00meLHHUwGtr9hEVEcaNA8sbBcUYY+rOrUM7knn8DEt3+XeEDG+WOKopv7CYd78+yLUXtKVZTJTb4RhjQty3erWhZaMo5q6pu4vkljiq6YONWZw+W8w4G5fKGBMAoiLCuGlQBz7dlk32ybq5SG6Jo5pecy6KD05s7nYoxhgDwNjBCZSUKm/U0ZPkljiqYfuhk3y97wTjh3S0i+LGmIDROb4xwzq3YO7afZTWwUVySxzVMHfNfqLCw7hhoD0pbowJLOOHdGT/sTN8ufuI3/dlicNHBUUlvP1VJqP6tKFFI7sobowJLN/u3YZmMZHMXbO/6sLnyRKHjxZsyuJkQbFN1mSMCUjRkeHc6DxJnnPqrF/3ZYnDR3PX7iexZQzDOtuT4saYwDR+SALFpco7X/v3IrklDh+k55xmzZ5jjB1sF8WNMYGra6tYBnVqzty1+/06J7klDh/MS80kPEy4cZA9KW6MCWxjUxJIz8lj3d7jftuHJY4qFJWU8ua6TC7v0YpWsdFuh2OMMZW6pm9bGkWFM3et/y6SW+Kowhfbszly+ixjUxLcDsUYY6rUqEEE3+nXjg83ZnGqoMgv+/Br4hCRUSKyQ0TSROSRctaLiExz1m8UkYFV1RWRFiKySER2Od/9+gj362v30yq2AZd2j/fnbowxptaMHZzAmaIS3t+Q5Zft+y1xiEg48AwwGugFjBeRXmWKjQaSna8pwHM+1H0E+ExVk4HPnPd+cSi3gC92ZHNzSgciwq1zZowJDv0TmtG9dSyvp/rndJU/j4ZDgDRVTVfVQmAuMKZMmTHAbPVYBTQTkbZV1B0DvOS8fgm43l8NeOurTEoVbrHTVMaYICIi3DI4gQ37T7D90Mla374/E0d7wDvdZTrLfClTWd3WqpoF4HxvVd7ORWSKiKSKSGpOTs3GqY+PbcDYlAQ6tWxUo/rGGOOW7w5oz8Xd4ikqrv3bciNqfYv/Vd4DD2VbUFEZX+pWSlVnADMAUlJSavTJ3ZKSYL0NY0xQatEoitmThvhl2/7scWQC3kfdDsBBH8tUVvewczoL53t2LcZsjDGmCv5MHGuBZBFJEpEoYBwwv0yZ+cAE5+6qYUCuc/qpsrrzgYnO64nAe35sgzHGmDL8dqpKVYtF5D5gIRAOzFTVLSIy1Vk/HVgAXA2kAfnAXZXVdTb9Z2CeiEwG9gE3+6sNxhhjvkn8OZ5JoEhJSdHU1FS3wzDGmKAiIutUNaXscns4wRhjTLVY4jDGGFMtljiMMcZUiyUOY4wx1RISF8dFJAfYW8PqcYD/Z38PLNbm0GBtDg3n0+ZOqvqNEV5DInGcDxFJLe+ugvrM2hwarM2hwR9ttlNVxhhjqsUShzHGmGqxxFG1GW4H4AJrc2iwNoeGWm+zXeMwxhhTLdbjMMYYUy2WOIwxxlSLJQ6HiIwSkR0ikiYi35jH3Bn6fZqzfqOIDHQjztrkQ5tvc9q6UURWiEg/N+KsTVW12avcYBEpEZGb6jK+2uZLe0XkUhFZLyJbRGRJXcdY23z4vW4qIu+LyAanzXe5EWdtEpGZIpItIpsrWF+7xy9VDfkvPEO37wY6A1HABqBXmTJXAx/hmZ1wGLDa7bjroM3DgebO69Gh0Gavcp/jGfb/Jrfj9vPPuBmwFejovG/ldtx10OafA39xXscDx4Aot2M/z3ZfDAwENlewvlaPX9bj8BgCpKlquqoWAnOBMWXKjAFmq8cqoNm5mQiDVJVtVtUVqnrcebsKz0yMwcyXnzPA/cBbBP/skr6091bgbVXdB6CqodBmBWJFRIDGeBJHcd2GWbtUdSmedlSkVo9fljg82gP7vd5nOsuqWyaYVLc9k/H8xxLMqmyziLQHvgtMr8O4/MWXn3E3oLmILBaRdSIyoc6i8w9f2vw00BPPdNSbgB+qamndhOeaWj1++W0GwCAj5Swre5+yL2WCic/tEZHL8CSOEX6NyP98afM/gIdVtcTzD2lQ86W9EcAg4AqgIbBSRFap6k5/B+cnvrT528B64HKgC7BIRJap6kk/x+amWj1+WeLwyAQSvN53wPPfSHXLBBOf2iMifYH/AKNV9WgdxeYvvrQ5BZjrJI044GoRKVbVd+skwtrl6+/1EVXNA/JEZCnQDwjWxOFLm+8C/qyek/9pIrIH6AGsqZsQXVGrxy87VeWxFkgWkSQRiQLGAfPLlJkPTHDuThgG5KpqVl0HWouqbLOIdATeBu4I4v9AvVXZZlVNUtVEVU0E3gTuCdKkAb79Xr8HjBSRCBGJAYYC2+o4ztrkS5v34elhISKtge5Aep1GWfdq9fhlPQ5AVYtF5D5gIZ67Mmaq6hYRmeqsn47nDpurgTQgH89/LUHLxzb/CmgJPOv8B16sQTyyqI9trjd8aa+qbhORj4GNQCnwH1Ut95bOYODjz/h3wCwR2YTnFM7DqhrUQ62LyGvApUCciGQCvwYiwT/HLxtyxBhjTLXYqSpjjDHVYonDGGNMtVjiMMYYUy2WOIwxxlSLJQ5jjDHVYonDBA1ntNr1IrJZRN5wnjvwte6dIvJ0Nfd3uoLlvxWRK53Xi0UkxXm9QESaOV/3VGdfVcTxhDOK6xPVrJciItPOY7//305jvNntuCZoiMhpVW3svH4FWKeqf/daH66qJRXUvRNIUdX7arK/SsosBn6iqqleyxKBD1S1j6/7qmIfJ4F4VT1bG9sz5nxZj8MEq2VAV2cuiS9E5FVgk4hEi8iLIrJJRL52xtk6J0FEPnbmavj1uYUi8q4zwN8WEZnivRMReVJEvhKRz0Qk3lk2S8qZp0NEMkQkDvgz0MXpHT0hInNEZIxXuVdE5LoydcUpu9mJfayzfD7QCFh9bplXnU1O70ZE5Kg4AxQ6+7vS+Ww+cJb9RjxzNiwWkXQRecBZnigi20Tkeaf9n4hIw7LtdNr2uPNZbBKRHs7yeBFZ5Cz/t4jsdT4DU49Z4jBBR0Qi8MwPsslZNAR4TFV7AfcCqOoFwHjgJRGJ9ip3G9AfuPncKSZgkqoOwjNO1QMi0tJZ3gj4SlUHAkvwPI3ri0eA3araX1V/imesr7uc2JvimedkQZk6Nzhx9QOuBJ4Qkbaqeh1wxtnW62XqfAlcBPTGM2TGSGf5MDzD4JfVA88Af0OAX4tIpLM8GXhGVXsDJ4AbK2jXEeezeA74ibPs18DnzvJ3gI4V1DX1iCUOE0waish6IBXPeEMvOMvXqOoe5/UIYA6Aqm4H9uIZOhxgkaoeVdUzeMbgOjfa7wMisgHPwTYBz4EUPENwnDtYv0wNRwdW1SV4eket8CSzt1S17PwPI4DXVLVEVQ/jSVSDq9j0MjwT+FyM52B+gXiGhT+mquVdn/lQVc86w2tkA62d5XtUdb3zeh2QWMH+3i6nzAg8c16gqh8Dx79ZzdQ3NlaVCSZnVLW/9wLxjKGV572okvplL+ipiFyK5z/8C1U137lmEU35zueC4Bw8vZ1xwKRy1tdkDPeleHpYHYHH8MwjchOehFIe72skJfz377/s8oZV1PeuG/Rjz5vqsx6HqW+W4jlAIyLd8BxUdzjrrhKRFs45/OvxnOppChx3kkYPPKd5zgnDcyAGz0x5y32M4RQQW2bZLOBBAFXdUkHcY0Uk3LmWcjFVDPOtqvvxDP2erKrpTnw/oeLE4Q/LgVsARORbQPM63LdxiSUOU988C4SLZ+TT14E7ve5GWo7nP//1eE4XpQIfAxEishHPqKne1wbygN4isg7PpD+/9SUAZ96SL50L3U84yw7jGa78xQqqvYNnhNoNeOY7/5mqHvJhd6v579wZy/DM6uZrgqsNjwPfEpGv8Fx3ysKTOE09ZrfjGlMHxPPMySZgoKrmuh1PbRGRBkCJM5z5hcBzZU8nmvrHrnEY42fOQ3Qzgb/Xp6Th6AjME5EwoBD4nsvxmDpgPQ5jjDHVYtc4jDHGVIslDmOMMdViicMYY0y1WOIwxhhTLZY4jDHGVMv/AbWEZgCLRGCZAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "bandit = prior.copy()\n", "update(bandit, 'W')\n", "update(bandit, 'L')\n", "bandit.plot()\n", "decorate_bandit('Posterior distribution, 1 loss, 1 win')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1\n", "\n", "Suppose you play a machine 10 times and win once. What is the posterior distribution of $x$?" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Solution\n", "\n", "bandit = prior.copy()\n", "\n", "for outcome in 'WLLLLLLLLL':\n", " update(bandit, outcome)\n", " \n", "bandit.plot()\n", "decorate_bandit('Posterior distribution, 9 loss, one win')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multiple bandits" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now suppose we have several bandits and we want to decide which one to play.\n", "\n", "For this example, we have 4 machines with these probabilities:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "actual_probs = [0.10, 0.20, 0.30, 0.40]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function `play` simulates playing one machine once and returns `W` or `L`." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from collections import Counter\n", "\n", "# count how many times we've played each machine\n", "counter = Counter()\n", "\n", "def flip(p):\n", " \"\"\"Return True with probability p.\"\"\"\n", " return np.random.random() < p\n", "\n", "def play(i):\n", " \"\"\"Play machine i.\n", " \n", " returns: string 'W' or 'L'\n", " \"\"\"\n", " counter[i] += 1\n", " p = actual_probs[i]\n", " if flip(p):\n", " return 'W'\n", " else:\n", " return 'L'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's a test, playing machine 3 twenty times:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "L W W W L L L W L W W W L L L W W W W W " ] } ], "source": [ "for i in range(20):\n", " result = play(3)\n", " print(result, end=' ')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`counter` keeps track of how many times each machine has been played." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({3: 20})" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "counter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now I'll make four copies of the prior to represent our beliefs about the four machines." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "machines = [prior.copy() for i in range(4)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This function displays four distributions in a grid." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "options = dict(xticklabels='invisible', yticklabels='invisible')\n", "\n", "def plot(machines, **options):\n", " for i, m in enumerate(machines):\n", " plt.subplot(2, 2, i+1)\n", " m.plot(label='Machine %s' % i)\n", " plt.gca().set_yticklabels([])\n", " plt.legend()\n", " \n", " plt.tight_layout()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot(machines)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2\n", "\n", "Write a nested loop that plays each machine 10 times and updates them based on the results; then plot the posterior distributions. \n", "\n", "Hint: call `play` and then `update`." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# Solution\n", "\n", "for i in range(4):\n", " for _ in range(10):\n", " outcome = play(i)\n", " update(machines[i], outcome)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Solution\n", "\n", "plot(machines)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After playing each machine 10 times, we can summarize `machines` by printing the posterior mean and credible interval:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def pmf_mean(pmf):\n", " \"\"\"Compute the mean of a PMF.\n", " \n", " pmf: Series representing a PMF\n", " \n", " return: float\n", " \"\"\"\n", " return np.sum(pmf.index * pmf)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "from scipy.interpolate import interp1d\n", "\n", "def credible_interval(pmf, prob):\n", " \"\"\"Compute the mean of a PMF.\n", " \n", " pmf: Series representing a PMF\n", " prob: probability of the interval\n", " \n", " return: pair of float\n", " \"\"\"\n", " # make the CDF\n", " xs = pmf.index\n", " ys = pmf.cumsum()\n", " \n", " # compute the probabilities\n", " p = (1-prob)/2\n", " ps = [p, 1-p]\n", " \n", " # interpolate the inverse CDF\n", " options = dict(bounds_error=False,\n", " fill_value=(xs[0], xs[-1]), \n", " assume_sorted=True)\n", " interp = interp1d(ys, xs, **options)\n", " return interp(ps)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.1668194469884906 [0.02859509 0.35941186]\n", "0.07883360420960964 [0. 0.2295994]\n", "0.07883360420960964 [0. 0.2295994]\n", "0.2500001236675582 [0.07369568 0.46517711]\n" ] } ], "source": [ "for i, m in enumerate(machines):\n", " print(pmf_mean(m), credible_interval(m, 0.9))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bayesian Bandits\n", "\n", "To get more information, we could play each machine 100 times, but while we are gathering data, we are not making good use of it. The kernel of the Bayesian Bandits algorithm is that it collects and uses data at the same time. In other words, it balances exploration and exploitation.\n", "\n", "The following function chooses among the machines so that the probability of choosing each machine is proportional to its \"probability of superiority\"." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "def pmf_choice(pmf):\n", " \"\"\"Draw a random sample from a PMF.\n", " \n", " pmf: Series representing a PMF\n", " \n", " returns: quantity from PMF\n", " \"\"\"\n", " return np.random.choice(pmf.index, p=pmf)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "def choose(machines):\n", " \"\"\"Use the Bayesian bandit strategy to choose a machine.\n", " \n", " Draws a sample from each distributions.\n", " \n", " returns: index of the machine that yielded the highest value\n", " \"\"\"\n", " ps = [pmf_choice(m) for m in machines]\n", " return np.argmax(ps)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This function chooses one value from the posterior distribution of each machine and then uses `argmax` to find the index of the machine that chose the highest value.\n", "\n", "Here's an example." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "choose(machines)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The strategy\n", "\n", "Putting it all together, the following function chooses a machine, plays once, and updates `machines`:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "def choose_play_update(machines, verbose=False):\n", " \"\"\"Chose a machine, play it, and update machines.\n", " \n", " machines: list of Pmf objects\n", " verbose: Boolean, whether to print results\n", " \"\"\"\n", " # choose a machine\n", " i = choose(machines)\n", " \n", " # play it\n", " outcome = play(i)\n", " \n", " # update beliefs\n", " update(machines[i], outcome)\n", " \n", " if verbose:\n", " print(i, outcome, pmf_mean(machines[i]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's an example" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3 L 0.23076939985507136\n" ] } ], "source": [ "choose_play_update(machines, verbose=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Trying it out" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start again with a fresh set of machines and an empty `Counter`." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "machines = [prior.copy() for i in range(4)]\n", "counter = Counter()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we run the bandit algorithm 100 times, we can see how `machines` gets updated:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaMAAAEYCAYAAADxmJlCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAAA+9UlEQVR4nO3deXwc1ZXo8d/tRWrt+75YlmVbli0Z2zJgmcUEMJjFJMQkQEIgQIiTEEjyCAPZk3n5POaRzGSGmYTwGMaTZHAWIOwE44AxYBvhHS+y5UW2tVirta/dXe+PVhtbsiypVdXVy/l+PnyQuktVx6U6Ol333rpXaZqGEEIIYSaL2QEIIYQQUoyEEEKYToqREEII00kxEkIIYTopRkIIIUxnm8zGqampWkFBgUGhCBG4tm3b1qJpWpoe+5I8EuFsrFwatxgppe4D7gPIz89n69atBoQnRGBTSh3Ta18FBQWSRyJsjZVL4zbTaZr2lKZp5Zqmlael6fLBUAghhDiL9BkJIYQwnWnFSNM0Ko+20T3gNCsEIQLS9uOn2HKk1ewwhPCrSQ1g0Mug080jz+/mhR11xERY+fzifL5//RysFmVGOEFnaGiI2tpa+vv7zQ4l5DgcDnJzc7Hb7abF8NjrVbg1jee+VmFaDOFCcsk4k80lvxcjTdNY/YdtvF3VxFcvK6Sxs59nPjhKYrSdB66c6e9wglJtbS1xcXEUFBSglBRwvWiaRmtrK7W1tUyfPt20OIoyYnltdwOapsnv12CSS8bwJZf8Xox213bwdlUTD187m68vKzr9+r/+vZqKGSmUFyT7O6Sg09/fL8ljAKUUKSkpNDc3mxrHzPRYOvqGaO4eID3OYWosoU5yyRi+5JLf+4zWVh4nym7ljounnX7tHz89j5zEKP7h+d243DKL+ERI8hgjEM7rrIw4AA41dpscSXgIhN95KJrsefVrMerqH+LlXfWsnJ9NnOOTdsQ4h52Hr53N4eYe1u096c+QhAg4M9NjATjY2GVyJEL4j1+L0Us76+kddHH7Rfmj3lsxL4vpqTH8x4ZDyBpLgU8pxR133HH6e6fTSVpaGjfccINP+ysoKKClpWXU6y+//DKPPfaYz3Geadu2bZSWllJUVMQDDzwQsNdZWlwk8Q4b1U1yZxQOgjGXvv/975OXl0dsbKwu+wM/F6O/7TnJzPRYynITRr1ntSi+elkhe+o62Vg9+kSKwBITE8OePXvo6+sD4K233iInJ0f346xcuZJHHnlEl3197Wtf46mnnqK6uprq6mr+9re/6bJfvSmlmJkRJ8UoTARjLt14441UVlbqsi8vvxUjl1tj54l2LipMHrMt8TMLc0iLi+T3m2v8FZaYghUrVvDaa68BsHbtWm677bbT71VWVlJRUcGCBQuoqKjgwIEDALhcLh566CFKS0spKyvjiSeeOP0zTzzxBAsXLqS0tJSqqioA1qxZw/333w/AXXfdxQMPPEBFRQWFhYU899xzp3/28ccfZ/HixZSVlfHjH/94VKwNDQ10dnayZMkSlFJ86Utf4sUXX9T9nOhlZnosh6QYhY1gyiWAiy++mKysLF3Pgd9G0x1u7qZ7wMmCvKQxt4m0Wbl5YQ5Pv3eUpq5+GUk0AT99ZS/76jt13WdJdjw/vnHuuNvdeuut/OxnP+OGG25g9+7d3H333bz33nsAFBcXs3HjRmw2G+vXr+d73/sezz//PE899RRHjx5lx44d2Gw22traTu8vNTWV7du38+tf/5pf/OIXPP3006OO2dDQwPvvv09VVRUrV65k1apVrFu3jurqaiorK9E0jZUrV7Jx40Yuu+yy0z9XV1dHbm7u6e9zc3Opq6ubymky1MyMOP740QlauwdIiY00O5ywILk0sVwyit+K0fZjpwBYOG3sYgRwy6I8fvvuEV7cUcd9l83wR2jCR2VlZdTU1LB27Vquu+66s97r6OjgzjvvpLq6GqUUQ0NDAKxfv57Vq1djs3kuveTkT4by33zzzQAsWrSIF1544ZzH/PSnP43FYqGkpITGxkYA1q1bx7p161iwYAEA3d3dVFdXn5VA5+ofCuRRVJ8MYuhmiRSjkBdMuWQUvxWjHcfbSYy2U5ASfd7titJjWZCfyJ+31vKVSwsD+g9GIJjIpy4jrVy5koceeogNGzbQ2vrJFDY//OEPueKKK/jrX/9KTU0Ny5YtAzjvg5yRkZ4/ularFafz3NNEebfx7sv7/0cffZSvfvWrY8aZm5tLbW3t6e9ra2vJzs6e2D/SBDMzPMWouqmLJTNSTI4mPEguTSyXjOK3PqMdJ06xIC9xQsXlc+V5HGrqZldthx8iE1Nx991386Mf/YjS0tKzXu/o6DjdCbtmzZrTry9fvpwnn3zydIKc2bTgq2uuuYZnnnmG7m5PH0tdXR1NTU1nbZOVlUVcXBxbtmxB0zR+97vfcdNNN0352EbJjHcQ57Bx4KQM7w4XwZJLRvFLMersH6K6qZsF+edvovO6rjQLu1Xx6q56gyMTU5Wbm8uDDz446vWHH36YRx99lKVLl+JyuU6/fu+995Kfn09ZWRnz58/n2WefnXIMy5cv5/bbb2fJkiWUlpayatUqurpG/xH/zW9+w7333ktRUREzZsxgxYoVUz72RCml7lNKbVVKbZ3IU+lKKeZkxrO/Qd8+DBG4gimXHn74YXJzc+nt7SU3N5ef/OQnUz62msyzFuXl5Zovi4K9V93MHf9ZyR/uuYhLZqZO6GfuXvMRVQ2dfPDIp6SpboT9+/czZ84cs8MIWec6v0qpbZqmleux/4nm0Y9f2sNz22r5+CfXYJFJhA0huWSsyeSSX+6MvJ/uSnNGP180lutLs6jv6GfHiXaDohIisM3Jiqdn0MWJU71mhyKE4fxSjGpae0mOiSAheuLT8l9VkkGE1cJruxsMjEyIwDUnKx5AmupEWPBPMWrpYdo4o+hGSoiyc+nMVF7/uCFgp20xk5wTYwTSeZ2VEYdFwf4GGcRgpED6nYeSyZ5XvxSjY629FKTETPrnVpRm0dDRz8d1MqruTA6Hg9bWVkkinXnXYHE4AuNh66gIKwWpMXJnZCDJJWP4kkuGP2fUP+SivqNv0ndGAFcWp2O1KNbtbaQsN1H/4IKU95kZs9fdCUXe1SkDxZyseHbXtpsdRsiSXDLOZHPJ8GJUe6oXTcOnO6OkmAgWFySxbt9JHrpmtgHRBSe73W7qSqTCf+ZkxvHa7ga6+ofOWnZF6ENyKXAY3kxX0+IZCeTLnRHA8pJMDjZ2c7SlR8+whAgKJdmeQQxV8vCrCHHGF6NWTxHx5c4I4OqSDADe2ieL7onwMy/b8zjExzIbiQhxhhejY629xDtsJE5iWPeZ8pKjKcmKZ93eRp0jEyLwpcc7yIiPlEE8IuT55c6oIDVmSrMoXFWSwfbjp2jrGdQxMiGCQ2lOogxiECHPL3dG03xsovO6ak46bg3eqfLPhH1CBJKy3ASOtPTQ1T9kdihCGMbQYjTodFN7qnfcZSPGMy87gfS4SP5eJU11IvyU5iSgabBX54XfhAgkhhaj+vY+3BrkJ0+tGFksiivnpLPxYAuDTrdO0QkRHOYNz+m4R/qNRAgztBg1dvYDkJkw9SfaryzOoHvAyYdHW8ffWIgQkhYXSXaCg90yok6EMEOLUVPXAADpcVMvRkuLUnHYLfx9v/QbifBTmpsggxhESPNTMYocZ8vxRUVYWTojlfX7G2UeKRF2ynITqWntpb1XRpSK0GRwMeonwmrx+Rmjka6ck0HtqT6qm7p12Z8QwWLh8CrJO463mxuIEAYZtxhNdrnkMzV3DpAWF6nbSq2fKk4HYP1+GVUnwsv8vASsFsW2Y6fMDkUIQ4xbjDRNe0rTtHJN08rT0tImtfOmLk8x0ktmgoN5OfHSbyTCTnSEjeLMOLYfl2IkQpPhzXR69Bed6cpiz2wMrd0Duu5XiEC3aFoSu06043TJ4w0i9Bg+gCEjXt+Fyq6ak4GmwYYDsv6ICB5Tae72WpifRM+giwONMoO3CD2GFaMBp4v23iHd74zm5cSTER8p/UYiqEyludvLO4hhuwxiECHIsGLU7B3WHa9vMVJKcdWcDN492Ez/kEvXfQsRyPKSo0iNjWS7DGIQIciwYqTnA68jXTUng95BF1uOyGwMInwopVhckETl0TazQxFCd8YVo05PMdJzNJ3XkhkpRNmt0lQnws7FhSnUtfdxoq3X7FCE0JWBzXSeeen0bqYDcNitXDYrlb/vb5LZGERYuagwGUBaBUTIMbSZzqIgJUb/YgRwdUkmDR397KmTafVF+JiVHkdStJ0PpalOhBhDm+lSYyOxWvSZfWGkK4vTsShYt++kIfsXIhBZLIqLpqfInZEIOQbeGfUb0kTnlRQTwYXTk1m3V/qNRHi5qDCZ2lN91J6SfiMROgxtpjNiJN2ZlpdkcqCxi5qWHkOPI0QgubgwBYAtR6SpToQOw4pRS/cAabHG3RkBXF2SAcBb++TuSISP2RlxpMRE8H61zEIiQodhxai9d4jEGH2WjhhLXnI0JVnx/G2v9BuJ8GGxKC6Zmcr7h1pwu2U0qQgNhhSjvkEXA043iVERRuz+LCvmZbLt2ClOdvQbfiwhAsVlM9No6R5kX4OMJhWhwZBi1N7nWY1Sr0X1zmdFaSYAb8rdkQgjl85MBeC96haTIxFCH8YUo94hABKjjC9GRelxzEyP5Y09DYYfS4hAkR7voDgzjo0Hpd9IhAZji1G08c10ACtKs6g82kaLrHEkwsjls9LYeqyNngGn2aEIMWUGFSP/NdOBp9/IrUlTnQgvl89OY8il8f4haaoTwc+gPiPvnZF/ilFxZhyFaTG8sqveL8cTIhAsLkgm3mFjvTzaIEKAwX1G/mmmU0pxY1k2Hx5to7FTRtWJ8GC3WriiOJ23q5pwyRBvEeQMa6aLsFlw2A1d1fwsN87PRtPgtd0ykEGEj6tLMmjtGWT7cVlwTwQ3w+6MkqLtKGXMJKnnUpQeS0lWPK/slqY6ET4un5WG3apkFhIR9Ax7zshfTXRnunF+NjuOt3O8VSaQFOEhzmHn4sIU1u09KWt7iaBm2J1Rgp8GL5xp5QXZALy4s87vxxbCLCvmZVHT2iuzMYigZlgx8scDryPlJEaxpDCFF7bXyqdEEVCUUvcppbYqpbY2N+v7oOq18zKxWhSv7JL+UhG8jGumM+HOCODmhTnUtPay/Xi7KccX4lw0TXtK07RyTdPK09LSdN13ckwElxSl8uruevkQJoKWgQMY/N9nBJ7ZGBx2Cy9srzXl+EKY4cb52dSe6mPniXazQxHCJ7oXo/4hz4zdZvQZAcRG2rh2biav7Kqnf8hlSgxC+NvyuRlEWC3SVCeClu7F6JR3KiATRtN5fW5xHp39Tpk8VYSNeIedTxWn89LOOoZcbrPDEWLSdC9Gn0ySas6dEcCSwhQKUqJZW3nCtBiE8LdbynNp7Rnk7aoms0MRYtKMK0YmjKbzUkrx+cX5VB5t43Bzt2lxCOFPl89KIy0ukr9slf5SEXx0L0YdpxfWM6+ZDmDVolxsFsXaD4+bGocQ/mKzWrh5YQ7vHGiiqUvmaBTBxYA+I/Ob6QDS4iK5Zm4mf9lWS9+gDGQQ4eGWRXm43BrPbZO7IxFcxi1Gk31YLxD6jLzurCigo29IZmQQYaMoPZaKGSn8YfMxnDKQQQSRcYvRZB/Wa+8bJMJqIcpu1SXAqVhckMScrHjWfFAjDwOKsHFnRQH1Hf2s3y+Tp4rgoX+f0fC8dP6csXssSim+XFHAgcYuNh9pNTscIfziqjkZ5CRGsWZTjdmhCDFhuhejrn4ncQ6b3rv12coLskmJieD/bTxidihC+IXVorhjyTS2HGljT12H2eEIMSH6F6MBJ3GRgVOMHHYrd1UU8M6BZvbLrMYiTNx2YT6xkTZ+8+5hs0MRYkJ0L0Y9A05iA+jOCOBLSwqIibDyW0lMESYSouzcsWQar3/cwBF51k4EAd2LUXe/k9gAujMCSIi2c9uF+byyu0EW3hNh4+6l04mwWnhSPoSJIKB/MRpwEhNgxQjgK5cVYrMo/u3tarNDEcIv0uIiue3CfJ7fXsfRlh6zwxHivAwpRoHUZ+SVEe/gixdP44XttdJsIcLG16+YQYTVwj+/ddDsUIQ4L12LkaZpdAdgn5HX6stnEGmz8qv1cnckwkN6nIN7LpnOK7vqZWSdCGi6FqP+ITcut0ZspPmzL5xLWlwkdy0t4OVd9eyubTc7HCH84r7LC0mMtvPz1/bLw98iYOlajLoGPFMBxUaaP/vCWL6+bAYpMRH871clMUV4iHfY+V/LZ7P5SCuv7pY1vkRg0rUY9Qx4JiQN1GY6gDiHne8sn0VlTRt/23PS7HCE8IvbL8xnbnY8P39tPz0DTrPDEWIUXYtRd7/nIg/UZjqvz5fnUZwZxz++uk8SU/jFZCcc1pvVovjZTfM42dnP428e8PvxhRiPQc10gXtnBJ51X37+mVLqO/r5FxllJPxgshMOG2HRtCTuqihgzaYatshcjSLAGNNMF+DFCDyJ+YWL8nnmg6MymEGEjYevnc20lGi++9wuuvqHzA5HiNP0babz3hkFcJ/RmR6+tpj0OAff/tNO+odkAT4R+qIjbPzylvnUt/fz6AsfyyAeETAM6jMKjmKUEGXn8VvKONzcw2NvVJkdjhB+UV6QzHeunsWruxv4nw+Pmx2OEIDufUaeYhRIS0iM59KZaafb0WV0nQgXX7t8Bstmp/HTV/ZK/5EICDr3GTmxWhSRNt1nGTLUIyuKKctN4KG/7JKpgkRYsFgU/3rrAvKTo1n9h20yd50wne7NdLGRtoBY5XUyHHYrv/niIuxWxVd+t5WOXunYFaEvIcrOM3ctRgF3/OeHNHT0mR2SCGO6N9MFS3/RSDmJUfzmi4s40dbHV36/lQGnDGgQoW9aSgz/ffeFtPcO8YWnP6Spq9/skESY0r2ZLliLEcDFhSn84nPzqTzaxv3P7mDQ6TY7JCEMV5abyDN3LaahvZ9bntzMiTZZ80v4n85DuwN3xu6JWjk/m5+unMtb+xr55trtUpBEWLhwejL/85WLaO8d4rO/2STP3gm/M6TPKNjdWVHAT24s4c29jdzz3x/Jw4EiLCzMT+LPX12C3Wrhlic389LOOrNDEmFE7ozGcNfS6fzfVWVsOtzKLU9uluXKRViYnRnHy/cvZX5eIg/+cScPP7dL5m8UfqF/MYoIjWIE8LnyPJ65azH17X3c8MR7rN/XaHZIQhguJTaSZ++9iPuvKOIv22q55lcbea/a/5O7ivCifzNdiNwZeV0+K41Xv3kpecnR3Pu7rTz83C46+qTZToQ2m9XCQ9fM5k/3LSHCauGO/6zka3/YJi0EwjC6FSO3W6Nn0BUSfUYj5adE88LXK/j6shk8t62WK3+5gT9/dAKXW+b1EqHtwunJvP7gpXzn6llsONDMlf+8gUdf2C0j7oTudCtGPYPBNxXQZETarDx8bTEv338J01JiePj53Vzzq428vKsep0tG3InQ5bBbeeDKmWz47jJuuzCf57fVcfnj77D699t4v7oFt3woEzrQrXJ0D3dyxoTgndGZ5uUk8NzqJbz2cQP/ur6aB9bu4J8So7j9onw+uzCXzASH2SEKYYiMeAc/u2keX19WxO821/Bs5XH+tvckOYlR3DA/i+vmZVGak4DFElwzsIjAoF8xCrIZu6dCKcUNZdmsmJfF21VNPPP+UR5/8wC/XHeAC6cnc+3cTJbNTmdaSnTQTY0kxHgyExw8fG0xD1w5k3X7Gnl+Wy3/+d5RfvvuEdLiIrl0ZipLClNYXJAsOSAmTPc7o1AbwHA+Vovi6pIMri7JoKalhxd21PHGxw385JV98Mo+chKjWFyQxIL8JOblxDMzI454R2AvyS7ERDnsVlbOz2bl/Gzaewd550ATf9/fxIYDzbyw3fOMUnJMBHOz4ynJjmdWehwz0mOZnhJDQrTkgTib7sUoLgzujM6lIDWG71w9i+9cPYualh7eq25m85FWNh1u5cWd9ae3y4iPpCAlhrzkaLITHGQkOEiLjSQlNpKkaDsJUXbiHHYigmzmcxHeEqMj+MyCXD6zIBe3W+NgUxfbj7Wz4/gp9tZ38sz7RxlyfdK3FO+wkZMUTVaCg4x4B2mxEZ4ciIkgMcqbBzZiHTZiI204bFZp/gtxujfThXqf0UQUpMZQkBrDHUsK0DSNxs4B9tR1cLCpi0NN3Rxv7eW96maaugYYa6HNCJuFmAgr0RE2Iu0WIm1WIm0WImwW7FaFzeL5v0UpbMP/tyiF1aJQChTe/4NFeb4G+KTFRI343vvK2cKlheWnK+dhlT92urBYFMWZ8RRnxnP7RfkAOF1ualp7OdLcTU1rD7Wn+qg91cfJjn52nWinrXdwzFzwctgtRNmtOOyf5EKEzXI6F2wWCzarwmbx5oHCekZOeHLE08w+MkfO/B5G58nZr418Z7RwyZuRFuYncfPCXJ9+dtzKoZS6D7gPID8/f8zt3JrnljxUR9P5SilFZoKDzAQHV5VknPXekMtNa/cgTV39tPUMcqp3kM4+J519Q3QPOukdcNE76KLf6WJgyMWA082g003foAuX5sLpcuNyazjdGm5Nw+3WcGkamsbwfxoa4B7Ocm+ye3P+7OQf/ZcgnFak/smNczn/n5epmWgehSqb1UJReixF6bHnfN/pctPeN8SpnkHa+4bo6B2ie8BJ14CTngEnvYMu+gad9A+56R9yMejy5MKg082gy43TpeFya/Q7XThdnnxwuT254NI+yQ+3Bhoa7uEBsN4c0YZfh9F5cuZrZ7wy5r81nPJmJJvF4nMxUtokzlx5ebm2detWnw4kRDBTSm3TNK1cj31JHolwNlYuSceEEEII00kxEkIIYTopRkIIIUw3qT4jpVQzcOw8m6QCLVMNSicSy7kFSiyBEgdMLJZpmqal6XGwCeTRRGPyF4lltECJA4IvlnPm0qSK0XiUUlv16uSdKonl3AIllkCJAwIrFq9AikliCdw4IHRikWY6IYQQppNiJIQQwnR6F6OndN7fVEgs5xYosQRKHBBYsXgFUkwSy2iBEgeESCy69hkJIYQQvpBmOiGEEKaTYiSEEMJ0PhUjpdS1SqkDSqlDSqlHzvG+Ukr92/D7u5VSC6ceqs+xfGE4ht1KqU1KqflmxXLGdouVUi6l1Cqz4lBKLVNK7VRK7VVKvWtEHBOJRSmVoJR6RSm1aziWLxsUxzNKqSal1J4x3vfbNTviuAGRS5JHvsciuTTqfd+uWU3TJvUfYAUOA4VABLALKBmxzXXAG3imQb4Y+HCyx9ExlgogafjrFWbGcsZ2bwOvA6tMOieJwD4gf/j7dBN/P98D/mn46zSgDYgwIJbLgIXAnjHe98s168P5MTwuyaMpnRfJpdHv+3TN+nJndCFwSNO0I5qmDQJ/BG4asc1NwO80jy1AolIqy4djTTkWTdM2aZp2avjbLYBv85vrEMuwbwLPA00mxnE78IKmaccBNE0zMxYNiFNKKSAWTwI59Q5E07SNw/sei7+u2TMFSi5JHvkei+TSaD5ds74UoxzgxBnf1w6/Ntlt9DDZ49yDp2IbYdxYlFI5wGeAJw2KYUJxALOAJKXUBqXUNqXUl0yM5d+BOUA98DHwoKZpboPiOR9/XbOTPaY/4pI88jEWJJfOxadr1peV8M61AtnI8eET2UYPEz6OUuoKPEl0iQFxTDSWXwH/oGmaSxm3FORE4rABi4ArgShgs1Jqi6ZpB02I5RpgJ/ApYAbwllLqPU3TOnWOZTz+umYne0x/xCV55Hsskkuj+XTN+lKMaoG8M77PxVOJJ7uNHiZ0HKVUGfA0sELTtFYD4phoLOXAH4cTKBW4Tinl1DTtRT/HUQu0aJrWA/QopTYC8wG9E2gisXwZeEzzNDYfUkodBYqBSp1jGY+/rtnJHtMfcUke+R6L5NJovl2zPnRe2YAjwHQ+6UibO2Kb6zm7A6tS7060ScSSDxwCKoyIYTKxjNh+DcYMYJjIOZkD/H1422hgDzDPpFh+A/xk+OsMoA5INeh3VMDYna5+uWZ9OD+GxyV5NKXzIrk0+j2frllfA7kOT+U/DHx/+LXVwOrhrxXwH8PvfwyUG3jxjhfL08ApPLevO4GtZsUyYlsjk2jcOIDv4hkFtAf4lom/n2xg3fB1sgf4okFxrAUagCE8n9zuMeuaneT58Utckke+xyK5pE8uyXRAQgghTCczMAghhDCdFCMhhBCmk2IkhBDCdFKMhBBCmE6KkRBCCNNJMRJCCGE6KUZCCCFMJ8VICCGE6aQYCSGEMJ0UIyGEEKaTYiSEEMJ0k1pCIjU1VSsoKDAoFCEC17Zt21o0TUvTY1+SRyKcjZVLkypGBQUFbN26Vb+ohAgSSqljeu1L8kiEs7FySZrphBBCmE6KkRBCCNP5sux4SPj95hq2HGkDBd++ahZF6bFmhyREQDrS3M2/rK8GoDgzjq9eVojNKp9jhb7Cshi9XdXID1/aS25SFB29Q1Q1dPLy/ZcQExkcp2NoaIja2lr6+/vNDiXkOBwOcnNzsdvtZocSEPbUdXDnM5UMutwkx0Twyq569jd08qvPXxASBUlyyTiTzaXg+Ouro47eIR55/mOKM+N4+f5L2FrTxhf+80N+8OIe/uXzF5gd3oTU1tYSFxdHQUEBSimzwwkZmqbR2tpKbW0t06dPNzsc07X3DvKFpz8kNtLGX1YvoTAtliffPcxjb1QR57Dxf24uMzvEKZNcMoYvuRT8H20m6V/WH6S1Z5DHV80nwmahoiiV+68o4q876thd2252eBPS399PSkqKJI/OlFKkpKTIp+Rhv914hM7+IZ6+s5zCNE8z9urLZ/CVS6eztvIEH9d2mBzh1EkuGcOXXAqrYjTkcvPyrnpWzMukNDfh9Ov3XlpIpM3Cnz46YWJ0kyPJYww5rx5NXf2s+aCGG8uymZMVf9Z7D1w5k5SYCH7++j40TTMpQv3I79wYkz2vYVWMNh1upa1nkJXzs896PSHKzvWlWby8s56+QZdJ0QkROH777hEGXW6+ddXMUe/FOex866qZbDnSxttVTSZEJ0LRuMVIKXWfUmqrUmprc3OzP2IyzCu76olz2Lh89ugH6T+/OI+uASevf9xgQmTBRynFHXfccfp7p9NJWloaN9xwg0/7KygooKWlZdTrL7/8Mo899pjPcXr19vZy/fXXU1xczNy5c3nkkUemvM9QNeRy88L2Wq6dl3m6eW6kWy/MJycxiv/6oMa/wYWgYMslgGuvvZb58+czd+5cVq9ejcs19Q/x4xYjTdOe0jStXNO08rQ0XWZDMcWA08Wbe0+yvCSTSJt11PsXTk9memoMf94aPE11ZoqJiWHPnj309fUB8NZbb5GTk6P7cVauXKlb4XjooYeoqqpix44dfPDBB7zxxhu67DfUfHCohVO9Q3z6grF/n3arhc8vzuP9Qy0ca+3xY3ShJxhz6c9//jO7du1iz549NDc385e//GXK+wybZrr3q1vo6ndy4/ysc76vlOKGsiw+qmmjo3fIz9EFpxUrVvDaa68BsHbtWm677bbT71VWVlJRUcGCBQuoqKjgwIEDALhcLh566CFKS0spKyvjiSeeOP0zTzzxBAsXLqS0tJSqqioA1qxZw/333w/AXXfdxQMPPEBFRQWFhYU899xzp3/28ccfZ/HixZSVlfHjH/94VKzR0dFcccUVAERERLBw4UJqa2t1PiOh4ZVdDcQ5bFw2K/W8232uPA+rRbG2Uj7ATVUw5RJAfLynH9HpdDI4OKhLv1vYDO3edLiVCJuFJTNSxtzm8llpPPH2IT443MJ1pecuWoHmp6/sZV99p677LMmO58c3zh13u1tvvZWf/exn3HDDDezevZu7776b9957D4Di4mI2btyIzWZj/fr1fO973+P555/nqaee4ujRo+zYsQObzUZbW9vp/aWmprJ9+3Z+/etf84tf/IKnn3561DEbGhp4//33qaqqYuXKlaxatYp169ZRXV1NZWUlmqaxcuVKNm7cyGWXXXbOuNvb23nllVd48MEHfTxDoat/yMW6vSe5dt65WxDOlJng4FPF6Ty37QTfuXoWEbbg/mwruTS5XLrmmmuorKxkxYoVrFq1agpnySO4r55J+KimjQvyEs+bYBfkJRLnsLHxYHD3jflLWVkZNTU1rF27luuuu+6s9zo6OrjllluYN28e3/72t9m7dy8A69evZ/Xq1dhsns9BycnJp3/m5ptvBmDRokXU1NSc85if/vSnsVgslJSU0NjYCMC6detYt24dCxYsYOHChVRVVVFdXX3On3c6ndx222088MADFBYWTunfH4o2Hmyma8DJDSMG+YzltgvzaOke5F3JmSkJxlx68803aWhoYGBggLfffntK/34IkzujngEne+s7+drlM867nc1q4ZKiVN492IymaUEx5HMin7qMtHLlSh566CE2bNhAa2vr6dd/+MMfcsUVV/DXv/6Vmpoali1bBnDe8xoZGQmA1WrF6XSedxvvvrz/f/TRR/nqV786brz33XcfM2fO5Fvf+tZE/nlh550DTcRF2qg4TwvCmS4pSiPeYeONPQ1cXZJhcHTGklyaXC6BZ5aFlStX8tJLL3H11VdP6GfGEhZ3RtuPn8Ll1lg8PXncbS+flUZDRz/VTd1+iCz43X333fzoRz+itLT0rNc7OjpOd8KuWbPm9OvLly/nySefPJ0gZzYt+Oqaa67hmWeeobvb8zurq6ujqWn0kOMf/OAHdHR08Ktf/WrKxwxVHxxq5aLCFOwTnOonwmbh6pJM1u9rZNDpNji60BYsudTd3U1Dg2fUsdPp5PXXX6e4uHjKxw6LYvTR0TYsChbmJ4677WWzPCMGpaluYnJzc8/Z9/Lwww/z6KOPsnTp0rOGfd57773k5+dTVlbG/PnzefbZZ6ccw/Lly7n99ttZsmQJpaWlrFq1iq6urrO2qa2t5ec//zn79u1j4cKFXHDBBedsRw9nJ9p6Od7Wy9Kiid0VeV1Xmklnv5NNh0cPJxYTFyy51NPTw8qVK08fNz09ndWrV0/52GoyT1CXl5drwbgo2K1PbaZ7wMmr37x0Qtt/6hcbKEyL4ek7FxscmW/279/PnDlzzA4jZJ3r/CqltmmaVq7H/gM1j/780Qkefn436759GbMy4ib8cwNOF4v+cT03lGXx2GeDa746ySVjTSaXQv7OaNDpZueJdhYXjN9E57VoWhLbjp0KialOhJioDw63kBobycxJLqcSabNy5Zx01u1rxOWWnBG+CflidOBkF/1DbhbmJ034Z8oLkjjVO8ThZnmYT4QHTdPYdLiVihm+TRp65ZwM2noG2RUkkw2LwBPyxWhvvWdm4Xk5CeNs+Yny4buobcem3iFoFLlrM0a4ntfDzd00dw1Mur/I67KZqVgUbDgQfH2t4fo7N9pkz2vIF6N9DZ3ERtqYlhw94Z8pTI0hOSaCj2pOGRiZ7xwOB62trZJEOvOuweJwOMwOxe+2H2sHPvkgNlmJ0REsyE9iw4HgmjhVcskYvuRSyD9ntLe+kzlZcVgsE296UEqxMN/TbxSIcnNzqa2tJdgnrg1E3tUpw82OE6dIiLIzPSXG530sm5XGL986SHPXAGlxkeP/QACQXDLOZHMppIuRy62xv6GTz5XnTfpnywuSWL+/kZbuAVJjAyux7Ha7rEQqdLXjeDvz8xIn9aFtpCuK0/nlWwfZeLCZzy4KjoIuuRQ4QrqZrqa1h95BFyXZ8eNvPEL5NM+Ah0C9OxJCLz0DTg42drEgL3FK+ynJiictLpIN8oye8EFIF6O9w5MezvWhGM3LScBmUUGzFLkQvtpd24Fbgwsm8FD4+VgsikuLUtl0qAW3DPEWkxTixagDu1UxM33iD/B5OexWZmXEsbu2w4DIhAgcO0547v4vyE2c8r6WFqXS2jNI1cmu8TcW4gwhXYz21XcyKyPO56nt5+clsLu2Q0baiJC243g7hakxJMVETHlfS4s8ayB9cEimBhKTE9LFaH9DF3OyJt9E51WWm0hH3xDHWnt1jEqEI6XUfUqprUqprYE2cmvniXYumGJ/kVdmgoOi9Fjel2IkJilki9GpnkFaugeYPYk5tkaaP9xsIU+Vi6nSNO0pTdPKNU0rT0tLMzuc05o6+2nuGqA0d+IPhY/nkqJUKo+2MeB0jb+xEMNCthgdbPS0WRdlTG6erTPNyojFYbew64T0G4nQ9MkgH32LUd+Qix3H23Xbpwh9oVuMhtcjmszswyPZrBbmZifIiDoRsvbUeT5ozcnyPU9GuqgwGatFSb+RmJSQLUbVjV3ERtrITpja1C5luQnsqe/A6ZKFw0To2VvfSUFKNHEOu277jHPYKc1JYPPh1vE3FmJYyBajg41dFKXHTnnp8LLcBPqH3DKDtwhJexs6dG2i81oyI4WdJ9rpGTj3ktdCjBSyxai6sZtZU+gv8iodnu374zrpNxKhpaNviBNtfT7NUDKeihkpON0aW2UGEzFBIVmMWrsHaO0ZnFJ/kdf01FiiI6yn29aFCBX7pjBDyXjKpyVjtypZilxMWEgWo4ONnsELM3UoRlaLYm52vNwZiZDjXevLiGa6qAgrC/KS2CL9RmKCQrIYVTd5hnXr0UwHnmTdV98pSyqLkLKvvpP0uEjDlnu4eEYKH9d10NE3ZMj+RWgJzWLU2E1cpI3MeH0WSSvNSaBvyMXh5m5d9idEINjX0GlIf5HXksIU3Bp8dDRwV0wWgSMki9Ghpm5m6DCSzsv7dPrHMmmqCBFDLjeHm7spzjSuGC3ITyTCZmHzEWmqE+MLzWLU3E1Ruj5NdAAz0mKJslul30iEjCPNPQy5NF0fdh3JYbeyKD9JnjcSEzJuMQrkCR7PpaNviOauAV2LkdWiKMmOlxF1ImRUnfSMpDPyzgg8zxvtP9lJe++goccRwW/cYhSoEzyOxduvMyNNv2IEnn6jfQ0yiEGEhv0NXditisK0GEOPs2RGCpoGH0q/kRhHyDXTHRqek07POyPwPIvRO+jiaIsMYhDBr+pkJzPSYrFbjf0TUJabgMNukaY6Ma6QK0aHm7qJsFrIS4rSdb+nBzFIU50IAVVTXOtroiJtVsqnJbNFBjGIcYReMWrupiA1GpvOn/iK0jzLSXxc26nrfoXwt/beQU529lOcadzghTMtmZFC1ckuWrsH/HI8EZxCrhgdatJ3JJ2XzWphTpYMYhDBr+qk56HwYj/cGYGnGAFsOSL9RmJsIVWM+odcHG/rpUjnwQtepTkJ7K3vwC2DGEQQq2rwjqTzz51RWU4CsZE2madOnFdIFaOa1h7cGsww4M4IYF5OAj2DLo60yHISIngdaOwiMdpOukHTAI1ks1q4cHqyDGIQ5xVSxehwk6dI6D2s28u7nIQ01YlgVnWyi9kZcbrNUDIRFTNSONLSQ0NHn9+OKYJLSBWjQ03dKGVcMSpKjyXSZpERdSJoud0aB092+a2JzsvbbyR3R2IsoVWMmrvJSYwiKsJqyP7tVgsl2fHsrm03ZP9CGK2uvY+eQRezDZ55YaQ5mfEkRtv54JAUI3FuoVWMDBpJd6b5uYnsqevE6XIbehwhjHBgeCTdbD/fGVksiooZKWw63IKmyQAgMVrIFCOXW+NIc7dhI+m8ynI9y0kckuUkRBA60GhOMQJYWpRKQ0e/DAAS5xQyxajuVB8DTrfhd0ZluYkA7JblJEQQqjrZRW5SFLGRNr8f+9Iiz9yW71fLEG8xWsgUo0PNnk98RhejwtQY4iJt0m8kgtKBk53MzvD/XRFAfko0eclRvH9IipEYLXSKkUETpI5ksSjm5STInZEIOoNON0eae0xpovO6pCiNLYdbpc9VjBJSxSg1NoLE6AjDj1WWl8D+hk4GnC7DjyWEXg43d+N0ayYXo1S6BpzskpYFMUJIFSOjni8aaX5uIkMujaqGLr8cTwg9eBfU88ds3WNZWpSCRcHGg9JUJ84WEsVI0zQON/cY3kTndUFeIgA7jp/yy/GE0ENVQxcRVguFqcYuqHc+idERzM9L5N2Dgb9qtPCvkChGzd0DdPQN+a0YZSdGkRnvYPvxdr8cTwg97D/ZxcyMWN2XV5msy2elsau2nbYeWYpcfCIkilF1o2fwwiw/jhJaOC2R7XJnJIJIVUMnxX6eeeFcls1OR9PgvWq5OxKfCIli5H2q3K/FKD+J2lN9NHX1++2YQviqtXuApq4B5mSZN3jBqzQngaRoO+8ekGIkPhESxai6qYukaDupscaPpPNakJ8EwPZj7X47phC+8n5gC4Q7I6tFcdmsNDZWN8vaYOK0kChGB052McvPU+LPy4knwmqRQQwiKOw/vbqr+XdGAMtmp9HSPSgz4IvTgr4YaZpGdWO3X5voACJtVubmxEu/kQgKVQ2dpMZGkhrrnwX1xrNsVjpWi2L9/kazQxEBIuiLUUNHP10DTmaZ8CDfwvwkdtV2yMOvYlxKqfuUUluVUlubm/3fV1J1sisg+ou8kmIiKJ+WxFv7pBgJj6AvRgeHZyGe5adh3WdaXJDMoNMtUwOJcWma9pSmaeWappWnpaX59dhDLjcHGv2/oN54ri7JoOpkFyfaes0ORQSA0ClGJkz+eOH0ZAA+PCILhonAdbi5m0Gnm3k5CWaHcpYr52QA8HdpqhOERDHqJi0ukqQY/42k80qOiWB2RhwfHm3z+7GFmKi9dZ5pgOZmmz+S7kzTU2MoSo/lLSlGghAoRp6RdP5vovO6qDCZbcdOMSSzEIsAtae+gyi7lemp5uXJWJaXZLDlSJvMxiCCuxh528JLTJz48aLpKfQOumSIqghYe+s7mZMVh9Xiv0cfJur6sixcbo039540OxRhsqAuRt628LnZ5rWFf9JvJE11IvC43Rr76ztNzZHzKcmKpyAlmtd2N5gdijDZuMXI7CGp57MnANrC0+IiKUqPZbMMYhAB6HhbL10DzoDrL/JSSnF9WRabj7TS2j1gdjjCROMWIzOHpI5nb30HDruFQj+tYzSWS4pSqTzaSv+QPG8kAsvees8HtkAbSXem60uzcbk1/iZNdWEtqJvpPG3h8aa3hV8+K43+ITeVMqpOBJi99R3YLIqZJg7yGc+crDgK02J4aWe92aEIEwVtMfqkLdz85oeLCpOJsFnYKAuGiQCzu7aD2ZlxRNqsZocyJqUUn12YS+XRNo63ygOw4Spoi9GJU962cPObH6IjbFw0PVlWrxQBxeXW2HminQX5iWaHMq7PLMhBKXh+e63ZoQiTBG0x8raFB8KdEXia6qqbuqlr7zM7FCEAz2jT7gEnC/KSzA5lXNmJUSydkcoLO2plWYkwFbTFaE+dpy3cjGmAzuXyWZ7BHbJgmAgU3uVNguHOCOCzi3I40dYnM5qEqaAtRtuOnaIkOx6HPTDawovSY8lLjpKH90TA2HG8nYQoO9NTY8wOZUKunZtFQpSdP3x4zOxQhAmCshgNudzsqm1n0bTAaX5QSnHdvCw+ONRCR++Q2eEIcbq/yJ+LTk5FVISVWxbl8uaekzR29psdjvCzoCxG++o76R9yB1QxAlhRmoXTrcmCYcJ03QNODjR2BUV/0Zm+ePE0nG6NZz88bnYows+CshhtO+ZpCy+flmxyJGebn5tAdoKDN/bI1CbCXLtPtKNpwdNf5FWQGsPls9J4tvI4g06ZfDicBG0xykmMIjPBYXYoZ1FKsaI0i40HW+jsl6Y6YZ4tR9uwKJifl2h2KJP25aUFNHcN8NcdMsw7nARdMdI0ja3H2igvCMzmh+vLshh0uXnjY7k7EubZdKiF0pwEEqLsZocyaZfPSmNeTjy/2XAYlwzzDhtBV4zq2vto7BwIuP4irwV5iRSlx/LHj06YHYoIUz0DTnaeaKeiKNXsUHyilOIby4qoae3lNflQFzaCrhhtOuyZHXtxQWD1F3kppbh1cR47jrdz4GSX2eGIMFRZ04bTrbF0RnAWI4Br5mZSlB7LE3+vxikLV4aFoCtGGw40kRnvoDgzMB52PZebF+Zityr+JHdHwgSbDrUQYbUEbFP2RFgsiv919Syqm7r5yzbpOwoHQVWMhlxu3jvYwhXFaQH97ERyTATL52by/PZaegacZocjwswHh1pZOC0xYB4I99W18zIpn5bEL9cdlDwKA0FVjLbWnKJrwMmy2elmhzKuey6ZTkffEGsr5XkJ4T8t3QPsa+gM6iY6L6UU379+Di3dA/zHO4fMDkcYLKiK0TsHmrBbFUuDoGN2YX4SFTNSeGrjEVl0T/jNur2eB66vnJNhciT6WJCfxKpFufx24xH21neYHY4wUHAVo6omLpyeTGykzexQJuQbVxTR1DXAc9LmLfzktY/rmZ4aw5yswO1TnawfXD+HpOgIHn5uN0MymCFkBU0xqjrZSXVTN1cF0Se+ihkpLMxP5F//Xk2XPAQrDNbaPcDmw61cX5oV0H2qk5UYHcE/3jSXvfWd/GLdAbPDEQYJmmL0x8oTRFgt3HRBjtmhTJhSih/dOJeW7gH+dX212eGIEPfm3kbcGlxXmmV2KLpbUZrF7Rfl89t3j8jM+CEqKIpR/5CLv+6oY/ncDJJjIswOZ1IuyEvk1sV5/NemGnnuSBjq1d2h10R3ph/dUEJZbgIP/XmX9B+FoKAoRm/uPUlH3xC3XZhvdig++e41xSRG2fnm2u30DsoQVaG/Aye72HS4lZsX5IRUE92ZHHYrT35xEbEOG3c+U8nRlh6zQxI6CvhipGka//VBDXnJUSwpTDE7HJ8kx0Twq1svoLqpmx/8dQ+aJvNtCX09tfEIUXYrX7x4mtmhGCo7MYrf33MRbg1ufWoz+xs6zQ5J6CTgi9GruxvYeaKdbywrwmIJ3k98l85M48ErZ/LCjjp+ue6gFCShm4aOPl7aWcfnF+eRFGTN2L4oSo/l2a9chELxuSc3886BJrNDEjoI6GLUP+TisTeqKMmK55byPLPDmbIHPjWTz5fn8e/vHOIX6w7glhmJhQ7+/e1DaHgetA4XxZnxvPD1CnKSovjyf33Ez17ZR9+gPM8XzAK2GGmaxmNvVFHX3sePbizBGsR3RV4Wi+L/3FzKrYvz+I93DvOV323lVM+g2WGJILbxYDP/8+FxvrRkGnnJ0WaH41fZiVG8+I2l3LlkGs98cJSr/vldXtpZJ8tOBKmALUa/3XiENZtquHvpdC4O0r6ic/EWpJ+unMvG6mY+9csN/PemGgac8qlOTE5z1wAP/WUXRemx/MO1xWaHYwqH3cpPb5rHn+67mPgoOw/+cSdX/fO7rPngKG3yQS+oqMn0XZSXl2tbt241MBzo7B/isTeqePbD49xQlsW/3bogqPuKzmdffSf/+Oo+Nh9pJTkmglWLclleksEFeYnYrAH7OSEsKaW2aZpWrse+9MijqpOd3LNmKy3dAzz/tQrm5SToEVpQc7k13tx7kt++e5hdtR3YLIrFBclcPjuNxQVJzM1OCPrJY0PBWLlkWjFyuTUGnW66B5y09gxwuKmH9w+18Lc9DXT0DXH30ul899rZRNpC++LRNI0PDrXyhy3HWL+/EadbIzrCyrzsBGZmxDItJZqMeAcpMZHER9mIibQRHWEl0mbFblXYLBasFoVFgUUplCJkh/aaycxi5HZrDDjdtHQPcKi5m1d3NfDK7noSo+z8vy+VB+XS4karOtnJizvq2XCgiarh5/ssCqalxFCQEk1uUjQZ8ZGkxkaSGG0n3mE/nVsOu5UImwW71ZNbNosazjFPnimlUCC55iPDi9FLO+v49p92jrsPDRjrkNERVq6ak8E9l0wPywTr6Bvi/eoWPqppY3dtO0daemjv9X0aIW+eSLqM7+D/XnHeu1F/FqPP/3YzH9W0jZkrMRFWblqQw4NXziQj3qFHSCGtuWuAHcdPsae+k+rGLo619lJ7qpfOfv2e+RtZk8I151YtyuX/rpp/3m3GyqVxZxxVSt0H3AeQnz/2Q6cz0+P4xhVF4wY7vE+sSmG3KeIibSTFRFCQEkNRemxY30YnRNm5viyL68s+mc6lo2+I5q4BWrsH6Op30j3gpG/IxaDTzaDTjUvTcLrcaBq4NA1N8xR8718x6cqdGKM/4U40jwA+syCHC6d7VjJWw7FFRVhJiLJTmBrDvJwEYoJksuBAkBYXyfK5mSyfm3nW6/1DLlq6B+joG6Kr30nPcG71D7mH88uF063hcmunc8vl9ubY6FzzCuecm5vte3NxwPUZCRGIAq3PSIhgNVYuSS+5EEII00kxEkIIYTopRkIIIUw3qT4jpVQzcOw8m6QCLVMNSicSy7kFSiyBEgdMLJZpmqal6XGwCeTRRGPyF4lltECJA4IvlnPm0qSK0XiUUlv16uSdKonl3AIllkCJAwIrFq9AikliCdw4IHRikWY6IYQQppNiJIQQwnR6F6OndN7fVEgs5xYosQRKHBBYsXgFUkwSy2iBEgeESCy69hkJIYQQvpBmOiGEEKaTYiSEEMJ0PhUjpdS1SqkDSqlDSqlHzvG+Ukr92/D7u5VSC6ceqs+xfGE4ht1KqU1KqfNPKWtgLGdst1gp5VJKrTIrDqXUMqXUTqXUXqXUu0bEMZFYlFIJSqlXlFK7hmP5skFxPKOUalJK7Rnjfb9dsyOOGxC5JHnkeyySS6Pe9+2a1TRtUv8BVuAwUAhEALuAkhHbXAe8gWfS4YuBDyd7HB1jqQCShr9eYWYsZ2z3NvA6sMqkc5II7APyh79PN/H38z3gn4a/TgPagAgDYrkMWAjsGeN9v1yzPpwfw+OSPJrSeZFcGv2+T9esL3dGFwKHNE07omnaIPBH4KYR29wE/E7z2AIkKqWyRu5IB+PGomnaJk3TTg1/uwXINSCOCcUy7JvA80CTiXHcDrygadpxAE3TzIxFA+KUUgqIxZNA+i004z2Ipm0c3vdY/HXNnilQcknyyPdYJJdG8+ma9aUY5QAnzvi+dvi1yW6jh8ke5x48FdsI48ailMoBPgM8aVAME4oDmAUkKaU2KKW2KaW+ZGIs/w7MAeqBj4EHNU1zGxTP+fjrmp3sMf0Rl+SRj7EguXQuPl2zvqzQda5VyEaOD5/INnqY8HGUUlfgSaJLDIhjorH8CvgHTdNcyrjF3CYShw1YBFwJRAGblVJbNE07aEIs1wA7gU8BM4C3lFLvaZrWqXMs4/HXNTvZY/ojLskj32ORXBrNp2vWl2JUC+Sd8X0unko82W30MKHjKKXKgKeBFZqmtRoQx0RjKQf+OJxAqcB1Simnpmkv+jmOWqBF07QeoEcptRGYD+idQBOJ5cvAY5qnsfmQUuooUAxU6hzLePx1zU72mP6IS/LI91gkl0bz7Zr1ofPKBhwBpvNJR9rcEdtcz9kdWJV6d6JNIpZ84BBQYUQMk4llxPZrMGYAw0TOyRzg78PbRgN7gHkmxfIb4CfDX2cAdUCqQb+jAsbudPXLNevD+TE8LsmjKZ0XyaXR7/l0zfoayHV4Kv9h4PvDr60GVg9/rYD/GH7/Y6DcwIt3vFieBk7huX3dCWw1K5YR2xqZROPGAXwXzyigPcC3TPz9ZAPrhq+TPcAXDYpjLdAADOH55HaPWdfsJM+PX+KSPPI9FsklfXJJpgMSQghhOpmBQQghhOmkGAkhhDCdFCMhhBCmk2IkhBDCdFKMhBBCmE6KkRBCCNNJMRJCCGG6/w/YmtSJtqri3AAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "num_plays = 100\n", "\n", "for _ in range(num_plays):\n", " choose_play_update(machines)\n", " \n", "plot(machines)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can summarize `machines` by printing the posterior mean and credible interval:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.12521873467491973 [0.01974788 0.27462064]\n", "0.07239953242078516 [0. 0.2121182]\n", "0.26530612244897933 [0.16305684 0.36842118]\n", "0.23333333336076842 [0.11396953 0.36311353]\n" ] } ], "source": [ "for i, m in enumerate(machines):\n", " print(pmf_mean(m), credible_interval(m, 0.9))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The credible intervals usually contain the true values (0.1, 0.2, 0.3, and 0.4).\n", "\n", "The estimates are still rough, especially for the lower-probability machines. But that's a feature, not a bug: the goal is to play the high-probability machines most often. Making the estimates more precise is a means to that end, but not an end itself.\n", "\n", "Let's see how many times each machine got played. If things go according to plan, the machines with higher probabilities should get played more often." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 14\n", "1 11\n", "2 47\n", "3 28\n" ] } ], "source": [ "for i, count in sorted(counter.items()):\n", " print(i, count)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Exercise 3\n", "\n", "Go back and run this section again with a different value of `num_play` and see how it does." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The algorithm I presented in this notebook is called [Thompson sampling](https://en.wikipedia.org/wiki/Thompson_sampling). It is an example of a general strategy called [Bayesian decision theory](https://wiki.lesswrong.com/wiki/Bayesian_decision_theory), which is the idea of using a posterior distribution as part of a decision-making process, usually by choosing an action that minimizes the costs we expect on average (or maximizes the benefits).\n", "\n", "In my opinion, strategies like this are the biggest advantage of Bayesian methods over classical statistics. When we represent knowledge in the form of probability distributions, Bayes's theorem tells us how to change our beliefs as we get more data, and Bayesian decision theory tells us how to use those beliefs to make better decisions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "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.8.5" } }, "nbformat": 4, "nbformat_minor": 1 }