{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Testing" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "remove-cell" ] }, "source": [ "Think Bayes, Second Edition\n", "\n", "Copyright 2020 Allen B. Downey\n", "\n", "License: [Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:57.008876Z", "iopub.status.busy": "2021-04-16T19:35:57.008345Z", "iopub.status.idle": "2021-04-16T19:35:57.010962Z", "shell.execute_reply": "2021-04-16T19:35:57.010380Z" }, "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "# If we're running on Colab, install empiricaldist\n", "# https://pypi.org/project/empiricaldist/\n", "\n", "import sys\n", "IN_COLAB = 'google.colab' in sys.modules\n", "\n", "if IN_COLAB:\n", " !pip install empiricaldist" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:57.015477Z", "iopub.status.busy": "2021-04-16T19:35:57.014870Z", "iopub.status.idle": "2021-04-16T19:35:57.017060Z", "shell.execute_reply": "2021-04-16T19:35:57.017656Z" }, "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "# Get utils.py\n", "\n", "from os.path import basename, exists\n", "\n", "def download(url):\n", " filename = basename(url)\n", " if not exists(filename):\n", " from urllib.request import urlretrieve\n", " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", "download('https://github.com/AllenDowney/ThinkBayes2/raw/master/soln/utils.py')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:57.022776Z", "iopub.status.busy": "2021-04-16T19:35:57.021815Z", "iopub.status.idle": "2021-04-16T19:35:57.803761Z", "shell.execute_reply": "2021-04-16T19:35:57.802992Z" }, "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "from utils import set_pyplot_params\n", "set_pyplot_params()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In <<_TheEuroProblem>> I presented a problem from David MacKay's book, [*Information Theory, Inference, and Learning Algorithms*](http://www.inference.org.uk/mackay/itila/p0.html):\n", "\n", "\"A statistical statement appeared in *The Guardian* on Friday January 4, 2002:\n", "\n", "> When spun on edge 250 times, a Belgian one-euro coin came up heads 140 times and tails 110. \\`It looks very suspicious to me,' said Barry Blight, a statistics lecturer at the London School of Economics. \\`If the coin were unbiased, the chance of getting a result as extreme as that would be less than 7%.'\n", "\n", "\"But [MacKay asks] do these data give evidence that the coin is biased rather than fair?\"\n", "\n", "We started to answer this question in <<_EstimatingProportions>>; to review, our answer was based on these modeling decisions:\n", "\n", "* If you spin a coin on edge, there is some probability, $x$, that it will land heads up.\n", "\n", "* The value of $x$ varies from one coin to the next, depending on how the coin is balanced and possibly other factors.\n", "\n", "Starting with a uniform prior distribution for $x$, we updated it with the given data, 140 heads and 110 tails. Then we used the posterior distribution to compute the most likely value of $x$, the posterior mean, and a credible interval.\n", "\n", "But we never really answered MacKay's question: \"Do these data give evidence that the coin is biased rather than fair?\"\n", "\n", "In this chapter, finally, we will." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Estimation\n", "\n", "Let's review the solution to the Euro problem from <<_TheBinomialLikelihoodFunction>>. We started with a uniform prior." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:57.810691Z", "iopub.status.busy": "2021-04-16T19:35:57.810259Z", "iopub.status.idle": "2021-04-16T19:35:57.812763Z", "shell.execute_reply": "2021-04-16T19:35:57.812378Z" } }, "outputs": [], "source": [ "import numpy as np\n", "from empiricaldist import Pmf\n", "\n", "xs = np.linspace(0, 1, 101)\n", "uniform = Pmf(1, xs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we used the binomial distribution to compute the probability of the data for each possible value of $x$." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:57.816818Z", "iopub.status.busy": "2021-04-16T19:35:57.816328Z", "iopub.status.idle": "2021-04-16T19:35:57.818361Z", "shell.execute_reply": "2021-04-16T19:35:57.817986Z" } }, "outputs": [], "source": [ "from scipy.stats import binom\n", "\n", "k, n = 140, 250\n", "likelihood = binom.pmf(k, n, xs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We computed the posterior distribution in the usual way." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:57.823943Z", "iopub.status.busy": "2021-04-16T19:35:57.823225Z", "iopub.status.idle": "2021-04-16T19:35:57.833447Z", "shell.execute_reply": "2021-04-16T19:35:57.833883Z" }, "tags": [ "remove-output" ] }, "outputs": [ { "data": { "text/plain": [ "0.39840637450199173" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "posterior = uniform * likelihood\n", "posterior.normalize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And here's what it looks like." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:57.838678Z", "iopub.status.busy": "2021-04-16T19:35:57.837996Z", "iopub.status.idle": "2021-04-16T19:35:58.041887Z", "shell.execute_reply": "2021-04-16T19:35:58.042248Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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2bJlC5WVlYwcOTKtfdTEJyIdtmfPHgYNGqTkJGkzMwYNGtShWrcSlMgBpqGhkb219Z0+jpKTdFRHf2eUoEQOIFu27+Yf//OPfPGW3/H2+5uyHY5Im5SgRA4gT7++km07dlNX38Bjf16a7XA65corr2To0KGMHTs25fbbbrsNM2Pz5pZpqm655RZGjRrFEUccwTPPPJNyvxEjRiTs01VmzJjBo48+2uXHBaiqquKee+7p8H533nknRx55JJddljiF1nPPPccxxxzDuHHjOOaYY3j++eebt51yyikcccQRTJgwgQkTJrBx40YA9u7dy0UXXcSoUaM47rjjWL16dafeEyhBiRww3J2/LF7T/Hrxyk1U79qbxYg6Z8aMGTz99NMpt61Zs4bnnnuO4cOHN6975513eOSRR1iyZAlPP/001157LQ0NDSn37272N0Hdc889zJ07l9mzZyesHzx4ML/73e9YvHgxs2bN4gtf+ELC9tmzZ7Nw4UIWLlzI0KFDAXjggQcYMGAAK1as4Bvf+AY33HDD/r+hkBKUyAFi1boqPty2q/m147z+ztosRtQ506ZNY+DAgSm3feMb3+DHP/5xwj2Pp556iosvvpgePXowcuRIRo0axRtvvJFy/7vuuotJkyYxbtw43n33XQB27drFlVdeybHHHsvEiRN56qmnAFi9ejUnnXQSkyZNYtKkSbz66qtA8IXguuuuY8yYMZx11lnNNQ2AmTNnMmbMGMaPH8+3v/3tfc6/detWPvOZzzB+/HimTp3KokWLAPjBD37Abbfd1lxu7NixrF69mpkzZ7Jy5UomTJjAd77znX2Od/vttzN27FjGjh3LT37yEwCuueYaVq1axTnnnMMdd9yRUH7ixIkceuihABx11FHs2bOHvXvb/jLz1FNP8cUvfhGACy+8kD/96U90dkJcdTMXOUBEa08t6yr51LEf7dRxL7gxnmYrgMd+dGGH95kzZw7l5eUcffTRCevXrl3L1Kkts9dXVFSwdm3qBD148GAWLFjAPffcw2233cYvfvELbr75ZqZPn86DDz5IVVUVU6ZM4dRTT2Xo0KE899xzlJaWsnz5ci655BLmzZvHE088wbJly1i8eDEffvghY8aM4corr2Tr1q088cQTvPvuu5gZVVVV+5z/pptuYuLEiTz55JM8//zzXH755SxcuLDV93zrrbfy9ttvpywzf/58HnroIV5//XXcneOOO46TTz6Z++67j6effpoXXniBwYMHt3rsxx57jIkTJ9KjR4/mdVdccQWFhYVccMEFfP/738fMWLt2LcOGDQOgqKiI/v37s2XLljaP3R7VoEQOAO7Oq0sq91m/5P1NbNuRPw/b1tTUcPPNN/PDH/5wn22pvs231qvs/PPPB+CYY45pvpfy7LPPcuuttzJhwgROOeUU9uzZwwcffEBdXR1f/vKXGTduHJ/97Gd55513AHjppZe45JJLKCws5NBDD2X69OkA9OvXj9LSUq666ioef/xxevXqtc/5X3nlleZmtenTp7Nlyxaqq6s7fkHCY5133nn07t2bPn36cP755/Pyyy+nte+SJUu44YYb+PnPf968bvbs2SxevJiXX36Zl19+mV/96ldAx65vupSgRA4Ayyu3sqmqBoDepSUcMXwQ0P2b+ZKtXLmS999/n6OPPpoRI0ZQWVnJpEmT2LBhAxUVFaxZ01KLrKysbG7GStZUWygsLKS+PuiS7+489thjzfdePvjgA4488kjuuOMODjroIP72t78xb948amtrm4+T6gO6qKiIN954gwsuuIAnn3yS008/fZ8yrX3YFxUV0djY2LwunWeK9reZrbKykvPOO4+HH36Yww47rHl9eXk5AH379uXSSy9tbiaNXt/6+nqqq6tbbYJNl5r4RA4Af1ncUns6bsyhHHboAJZ9sCXY9nYlpx93WGu7tmt/muHiMm7cuIR7PU1T8AwePJhzzjmHSy+9lG9+85usW7eO5cuXM2XKlLSPfdppp3HXXXdx1113YWa89dZbTJw4kerqaioqKigoKGDWrFnNHS+mTZvGz3/+cy6//HI2btzICy+8wKWXXsrOnTupqanhzDPPZOrUqYwaNWqfc02bNo3Zs2dz44038uKLLzJ48GD69evHiBEj+P3vfw/AggULeP/994EgWezYsSNl3NOmTWPGjBnMnDkTd+eJJ55orvW0pqqqirPOOotbbrmFE088sXl9fX09VVVVDB48mLq6On7/+99z6qmnAnDOOecwa9Ysjj/+eB599FGmT5+uGpSItM3defXtlgR14rhhTD2qHCP48Fi6ejNbt+/OVnj77ZJLLuH4449n2bJlVFRU8MADD7RZ/qijjuJzn/scY8aM4fTTT+fuu++msLAw7fPdeOON1NXVMX78eMaO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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from utils import decorate\n", "\n", "posterior.plot(label='140 heads out of 250')\n", "\n", "decorate(xlabel='Proportion of heads (x)',\n", " ylabel='Probability',\n", " title='Posterior distribution of x')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, the posterior mean is about 0.56, with a 90% credible interval from 0.51 to 0.61." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.046639Z", "iopub.status.busy": "2021-04-16T19:35:58.046025Z", "iopub.status.idle": "2021-04-16T19:35:58.048789Z", "shell.execute_reply": "2021-04-16T19:35:58.048386Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.5595238095238094 [0.51 0.61]\n" ] } ], "source": [ "print(posterior.mean(), \n", " posterior.credible_interval(0.9))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The prior mean was 0.5, and the posterior mean is 0.56, so it seems like the data is evidence that the coin is biased.\n", "\n", "But, it turns out not to be that simple." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evidence\n", "\n", "In <<_OliversBlood>>, I said that data are considered evidence in favor of a hypothesis, $A$, if the data are more likely under $A$ than under the alternative, $B$; that is if\n", "\n", "$$P(D|A) > P(D|B)$$\n", "\n", "Furthermore, we can quantify the strength of the evidence by computing the ratio of these likelihoods, which is known as the [Bayes factor](https://en.wikipedia.org/wiki/Bayes_factor) and often denoted $K$:\n", "\n", "$$K = \\frac{P(D|A)}{P(D|B)}$$\n", "\n", "So, for the Euro problem, let's consider two hypotheses, `fair` and `biased`, and compute the likelihood of the data under each hypothesis.\n", "\n", "If the coin is fair, the probability of heads is 50%, and we can compute the probability of the data (140 heads out of 250 spins) using the binomial distribution:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.053831Z", "iopub.status.busy": "2021-04-16T19:35:58.053237Z", "iopub.status.idle": "2021-04-16T19:35:58.057509Z", "shell.execute_reply": "2021-04-16T19:35:58.057086Z" } }, "outputs": [ { "data": { "text/plain": [ "0.008357181724918204" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k = 140\n", "n = 250\n", "\n", "like_fair = binom.pmf(k, n, p=0.5)\n", "like_fair" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's the probability of the data, given that the coin is fair.\n", "\n", "But if the coin is biased, what's the probability of the data? That depends on what \"biased\" means.\n", "If we know ahead of time that \"biased\" means the probability of heads is 56%, we can use the binomial distribution again:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.061641Z", "iopub.status.busy": "2021-04-16T19:35:58.061171Z", "iopub.status.idle": "2021-04-16T19:35:58.063847Z", "shell.execute_reply": "2021-04-16T19:35:58.064196Z" } }, "outputs": [ { "data": { "text/plain": [ "0.05077815959518337" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "like_biased = binom.pmf(k, n, p=0.56)\n", "like_biased" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can compute the likelihood ratio:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.067262Z", "iopub.status.busy": "2021-04-16T19:35:58.066813Z", "iopub.status.idle": "2021-04-16T19:35:58.069918Z", "shell.execute_reply": "2021-04-16T19:35:58.069347Z" } }, "outputs": [ { "data": { "text/plain": [ "6.075990838368465" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K = like_biased / like_fair\n", "K" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data are about 6 times more likely if the coin is biased, by this definition, than if it is fair.\n", "\n", "But we used the data to define the hypothesis, which seems like cheating. To be fair, we should define \"biased\" before we see the data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Uniformly Distributed Bias\n", "\n", "Suppose \"biased\" means that the probability of heads is anything except 50%, and all other values are equally likely.\n", "\n", "We can represent that definition by making a uniform distribution and removing 50%." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.074465Z", "iopub.status.busy": "2021-04-16T19:35:58.073171Z", "iopub.status.idle": "2021-04-16T19:35:58.077599Z", "shell.execute_reply": "2021-04-16T19:35:58.077998Z" }, "tags": [ "remove-output" ] }, "outputs": [ { "data": { "text/plain": [ "100" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "biased_uniform = uniform.copy()\n", "biased_uniform[0.5] = 0\n", "biased_uniform.normalize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To compute the total probability of the data under this hypothesis, we compute the conditional probability of the data for each value of $x$." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.081758Z", "iopub.status.busy": "2021-04-16T19:35:58.081326Z", "iopub.status.idle": "2021-04-16T19:35:58.082976Z", "shell.execute_reply": "2021-04-16T19:35:58.083364Z" } }, "outputs": [], "source": [ "xs = biased_uniform.qs\n", "likelihood = binom.pmf(k, n, xs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then multiply by the prior probabilities and add up the products:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.088242Z", "iopub.status.busy": "2021-04-16T19:35:58.087311Z", "iopub.status.idle": "2021-04-16T19:35:58.093392Z", "shell.execute_reply": "2021-04-16T19:35:58.092951Z" } }, "outputs": [ { "data": { "text/plain": [ "0.003900491927770735" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "like_uniform = np.sum(biased_uniform * likelihood)\n", "like_uniform" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So that's the probability of the data under the \"biased uniform\" hypothesis.\n", "\n", "Now we can compute the likelihood ratio of the data under the `fair` and `biased uniform` hypotheses:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.098055Z", "iopub.status.busy": "2021-04-16T19:35:58.097522Z", "iopub.status.idle": "2021-04-16T19:35:58.100321Z", "shell.execute_reply": "2021-04-16T19:35:58.100683Z" } }, "outputs": [ { "data": { "text/plain": [ "2.1425968518013625" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K = like_fair / like_uniform\n", "K" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data are about two times more likely if the coin is fair than if it is biased, by this definition of \"biased\".\n", "\n", "To get a sense of how strong that evidence is, we can apply Bayes's rule.\n", "For example, if the prior probability is 50% that the coin is biased, the prior odds are 1, so the posterior odds are about 2.1 to 1 and the posterior probability is about 68%." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.105140Z", "iopub.status.busy": "2021-04-16T19:35:58.104540Z", "iopub.status.idle": "2021-04-16T19:35:58.107287Z", "shell.execute_reply": "2021-04-16T19:35:58.107715Z" } }, "outputs": [ { "data": { "text/plain": [ "2.1425968518013625" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prior_odds = 1\n", "posterior_odds = prior_odds * K\n", "posterior_odds" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.112140Z", "iopub.status.busy": "2021-04-16T19:35:58.111425Z", "iopub.status.idle": "2021-04-16T19:35:58.114066Z", "shell.execute_reply": "2021-04-16T19:35:58.113607Z" } }, "outputs": [], "source": [ "def prob(o):\n", " return o / (o+1)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.118640Z", "iopub.status.busy": "2021-04-16T19:35:58.117930Z", "iopub.status.idle": "2021-04-16T19:35:58.121841Z", "shell.execute_reply": "2021-04-16T19:35:58.121067Z" } }, "outputs": [ { "data": { "text/plain": [ "0.6817918278551092" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "posterior_probability = prob(posterior_odds)\n", "posterior_probability" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Evidence that \"moves the needle\" from 50% to 68% is not very strong." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now suppose \"biased\" doesn't mean every value of $x$ is equally likely. Maybe values near 50% are more likely and values near the extremes are less likely.\n", "We could use a triangle-shaped distribution to represent this alternative definition of \"biased\":" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.129005Z", "iopub.status.busy": "2021-04-16T19:35:58.128299Z", "iopub.status.idle": "2021-04-16T19:35:58.130682Z", "shell.execute_reply": "2021-04-16T19:35:58.131027Z" }, "tags": [ "remove-output" ] }, "outputs": [ { "data": { "text/plain": [ "2500" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ramp_up = np.arange(50)\n", "ramp_down = np.arange(50, -1, -1)\n", "a = np.append(ramp_up, ramp_down)\n", "\n", "triangle = Pmf(a, xs, name='triangle')\n", "triangle.normalize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we did with the uniform distribution, we can remove 50% as a possible value of $x$ (but it doesn't make much difference if we skip this detail)." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.135933Z", "iopub.status.busy": "2021-04-16T19:35:58.135294Z", "iopub.status.idle": "2021-04-16T19:35:58.138207Z", "shell.execute_reply": "2021-04-16T19:35:58.137815Z" }, "tags": [ "remove-output" ] }, "outputs": [ { "data": { "text/plain": [ "0.98" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "biased_triangle = triangle.copy()\n", "biased_triangle[0.5] = 0\n", "biased_triangle.normalize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's what the triangle prior looks like, compared to the uniform prior." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.173569Z", "iopub.status.busy": "2021-04-16T19:35:58.156145Z", "iopub.status.idle": "2021-04-16T19:35:58.338847Z", "shell.execute_reply": "2021-04-16T19:35:58.337549Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABWJ0lEQVR4nO2deZwU1bX4v6eqelgEBAEVBQEVVARkE1AEIdG4xMQlJnGLW4xi9GV5v5enSV423/PFl5e3xLwo7ktc0GhMiJIYY9hUkEUBWURWcQDZ93Wq6/z+qOqmpumZ6Rmmp3pmzvfz6c/0uXVv3VPVNX363nvuOaKqGIZhGEap4SStgGEYhmHkwwyUYRiGUZKYgTIMwzBKEjNQhmEYRkliBsowDMMoScxAGYZhGCWJGSijVojIOBH5UUy+XUTWi8guEemYpG6Hi4ioiJx8mOfYJSIn1pdO1fSzSkTOK3Y/UV+VPvMinD97LSLyAxF5tB7Pnf08RORJEfm3ejx3Ue+LAV7SChgNi4go0EtVl8XKfgqcrKrX1dReVcfG2qWA/waGq+q8IqhbMojIZOAZVa32y1NV2zSMRg1H/DNvgL7+vZB6Df15iMiNwC2qek7s3A12X5orNoIyDodjgJbAwto2lJAm8/yJSJP8sSci7mG0TeyeNNXPo7nRZL4gjPpBREaLSLmI/D8R2SAi60TkptjxJ0Xk30SkN7AkKt4mIn+Pjp8tIrNEZHv09+xY28kicq+IvA3sAU6MptW+KSJLRWSniPyriJwkItNFZIeIvCgiZVXoepKI/F1ENovIJhF5VkTax46vEpF/EpH5kT4viEjL2PHvRde3VkRuruae3AuMBP4vmjL6v6hcReQOEVkKLI2VnRy9/7yIvB9dxyfRSDVzzh5R3RtEZHWk/w9jx1uJyFMislVEFovIP4tIeRX6OSJyt4gsj+7FiyJyVBV1M5/vD6I+V4nItbHjT4rIgyIyUUR2A2Nyp8ZE5BsiskxEtojIBBE5LnbskHuSR4evicjHka4/zDn2UxF5JnrfUkSeiepti56nY+r6eUR0EpE3omdtioh0z/k8vJguk0XkFhE5DRgHnBX1ty12r2pzX8ZGz/lWEfmNiEh07ORIl+3RZ/JCvvvWLFFVezWjF6CE03nxsp8STpcAjAZ84B4gBVxMaEw6RMefBP4tet8jOp8XyUcBW4GvEU4fXx3JHaPjk4HVwOnR8VTUfgLQLirfD7wJnAgcCSwCbqjiWk4GzgdaAJ2BqcD/xo6vAmYCx0W6LQbGRscuBNYDfYEjgOfy3ZvYuSYTTvHk3ss3onO3yr2/0b3sR/hDsH/U32U59+4RoBVwRnTtp0XH7wOmAB2ArsB8oDzn2s6L3n8HmBHVawE8BDxfxXVkPt//juqeC+wGTol9vtuBEZHeLXM+888Am4BBUftfA1Oruyc5/fcBdgGjovb/HemTuZafcvBZvA34E9AacIHBQLvD+DyeBHbG+v4V8Fa+Zzm3D+DGTN3Y8drel1eB9sAJwEbgwujY88APY/f7nKS/J0rlZSMoIx8VwD2qWqGqEwm/UE4poN3ngaWq+ltV9VX1eeBD4AuxOk+q6sLoeEVU9h+qukNVFwILgL+q6gpV3Q78GRiYrzNVXaaqb6jqflXdSPhld25OtftVda2qbiH8shsQlX8FeEJVF6jqbsIvxrrwc1Xdoqp78+g3WVU/UNVAVecTfhHl6vczVd2r4RrePEJDldHv31V1q6qWA/dXo8NtwA9VtVxV90fXcqVUP831o+i+TQFei/rL8EdVfTvSe19Ou2uBx1X1vaiv7xOOLHrE6lR5T4ArgVdVdWrU/kdAUIWOFUBHQgOTVtU5qrqjmmuqqW+A12J9/zDSvVsN5yyEQu7Lfaq6TVVXA5M4+CxWAN2B41R1n6q+VQ/6NAnMQDU/0oQjlzgpwn+SDJtV1Y/Je4BCFpuPAz7OKfsYOD4mf5Kn3frY+7155Lx9i8jRIjJeRNaIyA7gGaBTTrVPY+/j13Fcji65ehdKvuvJ6DdMRCaJyEYR2Q6MPQz9quyH8MvtlWgabBvhSDFNuEaYj62RUc7wcdRfIX1V+oxVdRewmZo/43j77PFIj81V1P0t8DowPpqG/YWEjjnVUV3flY5Hum+h8rXXlULuS1Wf9T8DAswUkYXVTTc3N8xANT9WE05nxOlJ3b+g46wl/LKMcwKwJibXZ/j8n0fn66+q7YDrCP/RC2EdEP/lfEIN9avSu7rreY5w+rKbqh5JuI5RG/26xuTqfuV/Alykqu1jr5aquqaK+h1E5IiYfALhZ5ehumuq9BlH5+lI4Z9xpfsuIq2j9ocQjeB/pqp9gLOBS4Dra+ijpucr3ncbwunAtYTTnBBOJ2Y4thbnLeS+5EVVP1XVb6jqcYSj4QfkMLc7NBXMQDU/XgD+RUS6Rovr5xFOwb1UD+eeCPQWkWtExBORrxKuObxaD+fOR1vC6cdtInI88L1atH0RuFFE+kRfkj+pof56wnWx2uq3RVX3ichQ4Jpa6vd9EekQXdud1dQdB9wbW/DvLCKX1nD+n4lImYiMJPzi/12Bej0H3CQiA0SkBfDvwLuquqrA9i8Bl4jIORI6v9xDFd9DIjJGRPpJ6Em4g3CUn44O1+XzALg41ve/Rrp/Ek0RrwGuExE3GsWcFGu3HugqVTjscBj3RUS+LCKZHyNbCY1hupomzQYzUM2Pe4B3gLcI/xl+AVyrqgsO98Squpnwy+7/EU5v/DNwiapuOtxzV8HPCBeltxOuo/y+0Iaq+mfgf4G/A8uiv9XxK8J1na0iUt16UJxvAveIyE7gx4RGp1DuAcqBlcDfCL/Y91ej2wTgr1FfM4Bh1Zz7U8LPfi3wLKHjyIeFKKWqbxKuG71MOBo6CbiqkLZR+4XAHYRf6OsiPfJ6JxKOYF4iNE6LCZ1GnomO1eXzIOr3J4RTe4MJ144yfIPwR85mQoedd2LH/k64neJTETnkeT7M+3Im8K6I7CL8HL+tqitrcU1NFlG1hIWGUeqIyO3AVaqa62RR2/OMJvSS61pDVcNIHBtBGUYJIiJdRGRENA17CuGo9JWk9TKMhsR2WxtGaVJGuJ+pJ7ANGA88kKRChtHQ2BSfYRiGUZLYFJ9hGIZRkjTrKb5OnTppjx49klbDMAyjWTNnzpxNqto5t7xZG6gePXowe/bspNUwDMNo1ohI3kABNsVnGIZhlCRmoAzDMIySxAyUYRiGUZI06zUowzCaLhUVFZSXl7NvX27GECMpWrZsSdeuXUmlagpKH2IGyjCMJkl5eTlt27alR48eRMlrjQRRVTZv3kx5eTk9e/YsqE1Rp/hE5EIRWRKlQb47z3ERkfuj4/NFZFBU3i3Ko7M4yo/y7ViboyRM2bw0+tshduz70bmWiMgFxbw2wzBKm3379tGxY0czTiWCiNCxY8dajWiLZqCiEPm/AS4iTLlwtYj0yal2EdAret0KPBiV+8D/U9XTgOHAHbG2dwNvqmovwtTgd0f99SGMHnw6YTrvByIdDKPJoEEarcgf1Fwr9qNBVclpmydmnEqL2n4exRxBDQWWRam7DxDGEsvNUXMp8LSGzADai0gXVV2nqu8BqOpOwlD7x8faPBW9fwq4LFY+PkpjvZIwhcLQIl2bYTQ4unc7FX/6Vw6M/w7pFTMrHUt/OIkDz38L/y//gR7Yk5CGhlG/FNNAHU/l9MvlVE5/XFAdEekBDATejYqOUdV1ANHfo2vRHyJyq4jMFpHZGzdurM31GEZiaNrHn/Iwun0daECw/J1Kx9PLQjnYtAr/rSexGJuNk9mzZ/Otb30LgP3793PeeecxYMAAXnjhhYQ1C/nxj3/M3/72twbrr5hOEvnGcrn/NdXWiVIyvwx8R1V31EN/qOrDwMMAQ4YMsf9io1GQnvMSwYZlsYKKnAoH5aB8HukPJuL1/3wDaWfUF0OGDGHIkCEAvP/++1RUVDB37tyC26fTaVy3OCsb6XSae+65p9ZtDkefYo6gyoFuMbkrYQbPguqISIrQOD2rqvFMqetFpEtUpwuwoRb9GUajI718BukPJ1Uu1Jy1pqByhvD03D8RrDnsJMnGYbBq1Sr69u2blX/5y1/y05/+FIDRo0dz1113MXToUHr37s20adMAmDx5MpdccgkbNmzguuuuY+7cuQwYMIDly5fz5ptvMnDgQPr168fNN9/M/v3hWmSPHj245557OOecc/jd735Hjx49+MEPfsBZZ53FkCFDeO+997jgggs46aSTGDduXF49Tz31VG644Qb69+/PlVdeyZ49e/Ke+8Ybb+Sll14CKFifw6GYI6hZQC8R6QmsIXRguCanzgTgThEZT5iieruqrpNwJe0xYLGq/neeNjcA90V//xgrf05E/hs4jtDxYiaG0YgJtqzGn/HMIeWaY5ByDRQo/tRHSX3+B0i7o2nufOlHLxXt3C//65V1auf7PjNnzmTixIn87Gc/qzR1dvTRR/Poo4/yy1/+kldffZV9+/YxevRo3nzzTXr37s3111/Pgw8+yHe+8x0g3F/01ltvAXD33XfTrVs3pk+fzne/+11uvPFG3n77bfbt28fpp5/O2LFjD9FlyZIlPPbYY4wYMYKbb76ZBx54gH/6p3865Nx/+ctfgNBD8sYbbyxIn8OhaCMoVfWBO4HXCZ0cXlTVhSIyVkQyd2gisILQoeER4JtR+Qjga8BnRGRu9Lo4OnYfcL6ILAXOj2RUdSHwIrAI+Atwh6rm/tcaRqNB9+/CnzQuO30nqVYHD+Z668VGVJl6WrGXisnjqvT6M5LliiuuAGDw4MGsWrWq2rpLliyhZ8+e9O7dG4AbbriBqVOnZo9/9atfrVT/i1/8IgD9+vVj2LBhtG3bls6dO9OyZUu2bdt2yPm7devGiBEjALjuuusqGZfcc9dFn7pS1I26qjqR0AjFy8bF3itwR552b5F/TQlV3Qx8topj9wL3HobKhlESaBDgT30M3b0ZAPFa4p51Hf7UR6IKOb+9YrJ3zk1UTHkIgjS6bQ3+9N/ijfy6uVw3MJ7nEcR+SOTu/2nRogUAruvi+36156rJ6eWII47Ie27HcbLvM3K+vnKfjbice+666FNXLJKEYZQg6XkTCNYtysreyJuhbWyqLncEFZOl84l4w67Fn/50eGjVLIJOPXD7nFdUnUuZuk7DHQ7HHHMMGzZsYPPmzbRp04ZXX32VCy+8sE7nOvXUU1m1ahXLli3j5JNP5re//S3nnntuvem6evVqpk+fzllnncXzzz/POeeck6g+GSxYrGGUGOnV75P+4M9Z2e13MU63Myr/ys0dQcXXoMTB7TUCt9fIbJE/52WCdR8WS2UjD6lUih//+McMGzaMSy65hFNPPbXO52rZsiVPPPEEX/7yl+nXrx+O4+RdS6orp512Gk899RT9+/dny5Yt3H777Ynqk0Ga836JIUOGqCUsNEqJYNs6Kib+HPxw3cg57nS8z9yJOA66cxMHXvkhAHJER8q+9O/Zdvuf+1a2TdnV9yOpFmi6Av/1/yLYtDJs07Jt6DRxxFENfFXJsHjxYk477bSk1Sh5Vq1axSWXXMKCBQ3j9ZnvcxGROao6JLeujaAMo0TQA3vxJz+YNTTSphPeyJsRJ/o3dWL/rrlu5nE5GmmJm8IbfRvSsm1YZd/O0GnCP1C0azCM+sQMlGGUAKqK/9YT6I71YYGbwhs9FmnR5mAliRuoaqb4nIMbI6V1B7xzb8u21c0fk545vr7VNxoxPXr0aLDRU20xA2UYJUD6gz8TlM/Lyt5Z1+Mc1a1ypZjhIX3QIKlqzgiq8r+1c0wvvCFfPth02dukP5qKYZQ6ZqAMI2GCNQtIz52Qld3TPot7Yp44x1LFFF+OccrnTu6cOgbnxGFZ2Z85nmDjisPS2zCKjRkow0gQ3bkRf9pjZMJGOsf0wh10Rf7KsRGUxo1SjgdfPkQEb/h1SIdu2Tb+5HHo3ppCXBpGcpiBMoyEUP9A6LQQpceQ1u3xRt2KuFVsT4wbn7hRinviOlUH5hSvjNTosUhZuIlS927Hn/IQmq5+k6hhJIUZKMNIAFXFn/5bdGt5WOC4eOfehrRqV3WjKqf4DhorqWIElT3ethPeqFvIBGoJNiwjPad4ceqaM9u2beOBBx6ots7ZZ59d7/1mAs4Wg1tuuYVFixbVXLGeMANlGAkQfPh3gpUHYxl7Q6/G6Xxi9Y3ioyMNDoabiUeVqGYEla1yXB+8gQdzh6Y/nER6+YyC9DYKpzoDlY6cXN555528x0uRdDrNo48+Sp8+uYnRq29zOJiBMowGJvj0I/zZB0ctbq9zcHuPrKZFiIjkH0UFsSk6p7B/aafvhTgnDMjK/oxnCLasLqitURh33303y5cvZ8CAAXzve99j8uTJjBkzhmuuuYZ+/foB0KZNuI1g165dfPazn2XQoEH069ePP/4xTNKwatUqTjvtNL7xjW9w+umn87nPfY69e/cCMGvWLPr3789ZZ53F9773vUqpPTLs3r2bm2++mTPPPJOBAwdmzxtn8uTJjBo1issvv5w+ffowduzYbAzBNm3aZKNhTJ8+ndGjR5MJbvD888/Tr18/+vbty1133ZU9X26bw8Fi8RlGA6K7t+BPfThrXJxOPXCHXlX4CcSJGaZ0OGKq5MVXWHI4EcEbcRMV236O7vgU0hX4k8aRuuQHlfdeNRH2P31b0c7d4vqH8pbfd999LFiwIJtwcPLkycycOZMFCxbQs2fPSnVbtmzJK6+8Qrt27di0aRPDhw/PRiRfunQpzz//PI888ghf+cpXePnll7nuuuu46aabePjhhzn77LO5++678+pw77338pnPfIbHH3+cbdu2MXToUM4777xDgrnOnDmTRYsW0b17dy688EJ+//vfc+WVV7J792769u17SKLCtWvXctdddzFnzhw6dOjA5z73Of7whz9w2WWXVdmmLtgIyjAaCE1XhE4J+3YCYegh79zbEDdV+ElypvmAylN8NaxBxZFUS1Jjbke8luHpdm8OI6jnBqI16o2hQ4ceYpwgXJP8wQ9+QP/+/TnvvPNYs2YN69eHm7Z79uzJgAEDgIOpObZt28bOnTuza1jXXJObai/kr3/9K/fddx8DBgxg9OjR7Nu3j9WrDx0pDx06lBNPPBHXdbn66quz6TZc1+VLX/rSIfVnzZrF6NGj6dy5M57nce2112bTbVTVpi7YCMowGoj0zBcINq0KBXFCj71axsUTccj67GU8+eJRJQqc4sue78hj8UbeTMWkcK0kWLeI9LwJeAMvq9V5jMKoKg3Fs88+y8aNG5kzZw6pVIoePXpk03PE02W4rsvevXtrTHeRQVV5+eWXOeWUU6qtV1W6jZYtW+ZN2V5d/1W1qQtmoAyjAUgvfYv00mlZ2Rv8JZxje9f+RHnWoCqNeAqc4ovjdDsDt99F2Qjq6Q/+jHTsjnvCwNrrV6JUNQ1XTNq2bcvOnTsLqrt9+3aOPvpoUqkUkyZN4uOPP662focOHWjbti0zZsxg+PDhjB+fP3zVBRdcwK9//Wt+/etfIyK8//77DBx46Oc6c+ZMVq5cSffu3XnhhRe49dZbq+1/2LBhfPvb32bTpk106NCB559/nn/4h38o6FprQ1Gn+ETkQhFZIiLLROSQSVIJuT86Pl9EBsWOPS4iG0RkQU6bF2JZdleJyNyovIeI7I0dG4dhlADBppX47z6XlZ0eZ+KcljfnZs04efZCHcYIKoN7xhdxjjvoneW/9QS6/dM6ncsI6dixIyNGjKBv375873vfq7butddey+zZsxkyZAjPPvtsQak5HnvsMW699VbOOussVJUjjzzykDo/+tGPqKiooH///vTt25cf/ehHec911llncffdd9O3b1969uzJ5ZdfXm3fXbp04ec//zljxozhjDPOYNCgQVx66aXVtqkLRUu3ISIu8BFhWvZyYBZwtaouitW5GPgH4GJgGPArVR0WHRsF7AKeVtVD3VPCOv8FbFfVe0SkB/BqVXXzYek2jGKj+3ZS8eq96J6tAEj740ldfDfildXpfAdeujt7rrIv/Rw54iiCLaupeDVMJC0dulH2hX+pm677d1Hx2s/RXZvCc7U7htTF30fKWtXQsjRp6uk2du3alfUCvO+++1i3bh2/+tWvan2eyZMn88tf/pJXX321vlXMS6mk2xgKLFPVFap6ABgP5JrYSwkNkKrqDKC9iHQBUNWpwJaqTi7hJOlXgOeLor1hHCaa9kOniIxxKmsdOSXUzTiFJ4mPoGLefBnqOIICkBZt8EaPhchpQ3esx3/7yYLXO4yG5bXXXmPAgAH07duXadOm8S//UrcfJqVMMQ3U8cAnMbk8KqttnaoYCaxX1aWxsp4i8r6ITBGRvBtLRORWEZktIrM3btxYYFeGUXvS7/2eYH3m8RS8kV9H2nY+vJNWygkVGaaYgZICNupWe/qjuuGddX1WDj6ZWym7r1E6fPWrX2Xu3LksWLCA1157jc6d6/ZsjR49usFGT7WlmAbq0JDKkPtTrJA6VXE1lUdP64ATVHUg8I/AcyJySNwYVX1YVYeo6pC6fqCGURPpFTNJL34zK7sDvohzfMGzz1UTc4LIOkfU0c28KtwTh+LG1sjScycQrCnNfEE1YaO/0qK2n0cxDVQ5EE9o0xVYW4c6hyAiHnAF8EKmTFX3q+rm6P0cYDlQBzcpwzg8gi2f4E9/Ois73Qbg9ruofk6ebwSltQt1VAjuoCtwjumV6Qh/2mPozsY149CyZUs2b95sRqpEUFU2b95My5YtC25TTDfzWUAvEekJrAGuAnJ3k00A7hSR8YROEttVdV0B5z4P+FBVyzMFItIZ2KKqaRE5EegFWMIbo0HR/bvCtO3pCiB0NPBG3Jg3R1OdiLuRZ0ZO1SQrrHs3Ht6oW6l47V50zzb0wB4qJo8jddFdh7eG1oB07dqV8vJybCq/dGjZsiVdu3YtuH7RDJSq+iJyJ/A64AKPq+pCERkbHR8HTCT04FsG7AFuyrQXkeeB0UAnESkHfqKqj0WHr+JQ54hRwD0i4gNpYKyqVulkYRj1jQYB/rTH0V2bwwKvBd7o2+vXC66GNaj6MlAA0qod3rm3UfH6LyFIo1vL8af/Fu+cm+vP4BaRVCqVN2qD0Xgo6kZdVZ1IaITiZeNi7xW4o4q2V1dz3hvzlL0MvFxXXQ3jcEnP+xPB2oVZ2RtxI077LvXaR/5IEvU/xZc9XecT8YZejT/jmbDLlTMJOvWotEZlGMXCYvEZRj0QfDKP9AcHf4u5fS/A7T6omhZ1xDl0ik8ruZnXr4ECcHuPxD15RFb2Z79E8OlH9d6PYeRiBsowDhPd/in+W49nZadLH9wBlxWns7zBYoszxRfHHXY1Tqce2X79qQ9n93cZRrEwA2UYh4FW7AvTtleEgT3liI54o76OHMaG2WrJlw+qiFN82W7dVBh5vWXbsMt9O/EnP4RGziCGUQzMQBlGHVHVMNLC9sjx1E3hjRlb3HxKlSJJRIkK4xt1izSCApAjjsIbdWtWh2DTStIzX6ihlWHUHTNQhlFHggWvE6x+Pyt7w6/DOeqE4nZaaYpPK//NPV6M7o/tjTf4YK6f9NJppJe+XdQ+jeaLGSjDqAPB2kX47/8hK7unjsE9aXjxO45NHWq+aOZFHEFlVTjtszg9h2Zl/91nCTatLHq/RvPDDJRh1BLduQl/6qNkonI5R5+MO/jKhum80kbd4u6DqlIFEbyzvoa0Pz7bvz/5YKZgw6gvzEAZRi1Q/0DoFHFgNwDS6ki8c29F3AbK/ZnPiy/uJFFPmUxrQrwyUqPHIqlwE7Lu2Yo/5eHKLu+GcZiYgTKMAlFV/BnPoFujAPyOG3q2tTo0UVyxqOQEkXcE1TAGCkDaHY036hYyMZ+D9R+RnmN75Y36wwyUYRRI8OEkghXvZmXvzK/iHH1SwyqRz0kiHs28WO7tValzfF/cAV/IyunFb5JeOatBdTCaLmagDKMAgvVL8Wf/Liu7J4/A6T2q4RWRQ2PxaQM7SeTi9rsYp+sZWdl/5ymCreXVtDCMwjADZRg1EK6vPJRd65GO3XGHXpVMwNS8U3zxaOYNN8WX7VIE75ybkHbHhAXpCvxJD6L7dzW4LkbTwgyUYVRDmLb94ayHmrRoQ+rcscmlnHDyGKj4CKqBp/gySFkrvNG3g9ciVGnXpjCye9x4GkYtMQNlGNWQnvUCwcZMWjHBG/UNpM1RySlUgxefJDCCyuC074I34sasHKxdSHrenxLTx2j8mIEyjCpIL32b9EdTs7I3+AqcLqcmqBH5ExYm6CSRi9t9EG7fC7Jy+oOJBJ/MS1AjozFjBsow8hBsWoX/7nNZ2ek+GKfP+QlqlFEkFkkim7DQjx1PbgSVwR1wGU6XPlnZn/Y4uv3TBDUyGitFNVAicqGILBGRZSJyd57jIiL3R8fni8ig2LHHRWSDiCzIafNTEVkjInOj18WxY9+PzrVERC7AMOpAGKl7XPaLX9ofh3f2DaWRRbamEVQCXny5iOOEEd2P6AiA+pUjvhtGoRTtaZZwMvw3wEVAH+BqEemTU+0ioFf0uhV4MHbsSeDCKk7/P6o6IHpNjPrrQ5gK/vSo3QOS5IS80SjRII0/9ZFsriNJtSI1+nYk1SJhzSLypXxvgHQbtUVatMEbMxbcFAC6fV0Y+T0e2NYwaqCYP7eGAstUdYWqHgDGA5fm1LkUeFpDZgDtRaQLgKpOBbbUor9LgfGqul9VVwLLIh0Mo2DS771C8OmSSBK8kTcj7Y5OVKc4lX5z5Qt1VEK/yZyjTsAbfl1WDla/T7Dg9QQ1MhobxTRQxwOfxOTyqKy2dfJxZzQl+LiIdKjNuUTkVhGZLSKzN27cWEBXRnMhvXIW6UVvZGX3jEtwuvZPUKM85HMzrxTqqASmIWO4Jw3HPXVMVvbf/wPB2kUJamQ0JoppoPL9p+SO7wupk8uDwEnAAGAd8F+1OZeqPqyqQ1R1SOfOnWvoymguBFvL8d95Ois7Xfvj9v98ghpVQZ6NulqCU3xx3MFX4hx9ciQp/tRH0V2bE9XJaBwU00CVA91icldgbR3qVEJV16tqWsP/ykc4OI1X63MZBoAe2BM6RaQPACBtjw4jI5TYaASobICyThLJhjqqCXG9MOJ7FFRXD+ymYtKDqH8gYc2MUqeYT/MsoJeI9BSRMkIHhgk5dSYA10fefMOB7aq6rrqTZtaoIi4HMl5+E4CrRKSFiPQkdLyYWR8XYjRdVBV/2mPozmi612uBN+Z2pKx1sopVRd6Nuun8x0uIMC3JbVn9dOsnYWR4c5owqqFoBkpVfeBO4HVgMfCiqi4UkbEiMjaqNhFYQejQ8AjwzUx7EXkemA6cIiLlIvL16NAvROQDEZkPjAG+G/W3EHgRWAT8BbhDK0XRNIxDSc97lWDNwZ0M3tnX47Q/LkGNaiCfk0TMzVxK1EABOEefhHfmV7NysOJdgiWTk1PIKHmKmmUtcgGfmFM2LvZegTuqaHt1FeVfq6a/e4F766Ss0ewIPplHev6rWdk9/QLcHkMS1KgA4tOOCWXUPRyc3qNwN39MetnbAPizXkQ6dMM55uQaWhrNkdJ+mg2jSOiO9fhvPZ6VnS6n4Q7M3QVRgsRGSJrPzbyER1AQRj53h16FdOweFmiAP2UcumdbonoZpYkZKKPZoRX7w0X6KLKBHNERb+QtJT09liVfug0trUgSNSFeWRgRvkUbIIrcMeUhNO3X0NJobpT+02wY9Yiq4r/zFLo98sVxPLzRtyEt2ySrWKFUcpJofFN8GaTNUXijvkE2XfzGFaRnvZCsUkbJ0TieZsOoJ4KFfyX4eE5W9oZfi5OZbmoESD43cy2daOa1welyKt7gK7Jy+qOppJe+naBGRqnReJ5mwzhMgnWL8d97JSu7p4zGPfnsBDWqA3mcJDQofTfzqnD6nI8Tc0zx332OYNOq5BQySgozUEazQHdtxp/yCJngIk7nk3CHfDlZpeqCE3O8zeNm3tgMlIjgnXU9knHtD3z8yeOyGYyN5o0ZKKPJo/6BMN3Dgd0ASKt2YWQDt6i7LIpDfI0p30bdRrIGFUdSLaKI8a0A0D1bw4jygW1jbO40vqfZMGqBqpJ+9zl0y+qwQBy8c29DWrdPVK86k8+LLyjNaOa1QdodjTfyZrJOE58uIR2bjjWaJ2agjCZN8NEU0sunZ2Vv6FdjgUsbIU71IyhpRE4SuThd++OecUlWTi96g/TKWQlqZCRN432aDaMGgg3L8Ge9mJXdk87C6X1ughrVA/GNuk1oBJXB7f/5SilO/HeeJti6JkGNjCQxA2U0SXTPNvwpD2WnweSoE3CHXVOaEcprQ76U743UzTwfIhJGkm8bJYlMH8Cf/CB6YE+yihmJ0LifZsPIg6Z9/CkPo3t3ACBlR5AaPRbxyhLWrB7Im/K9cTtJ5CJlrfHG3A5eCwB050b8aY9b5PNmSON/mg0jh/Ts3xFsXB5JgjfqFqRNx0R1qjfyjaDS8X1QjdAzMQ9O++PwRtyQlYM1H5Ce92o1LYymiBkoo0mRXvYO6VgKB2/Q5TjH9UlOoXpG8o6gms4UXxy3+2Dc0y/Iyun5rxJ8Mi9BjYyGpuk8zUazJ9i8Gn/Gs1nZ6T4I5/TPJahREcgzgqqU8r2RO0nk4g68FOfYU7Oy/9bj6PZPE9TIaEjMQBlNAt23C3/ygxCEEbHlyC54Z9/Q+J0icsnnZl4pWGzTul5x3HCK9oijANCKfeGm64r9CWtmNARFNVAicqGILBGRZSJyd57jIiL3R8fni8ig2LHHRWSDiCzIafOfIvJhVP8VEWkflfcQkb0iMjd6jcNoFmiQxp/2KLp7CwCSahk6RaRaJqxZEZCapvia1ggKQFq2xRs9Nru+ptvXhRHpzWmiyVM0AyUiLvAb4CKgD3C1iOQuBlwE9IpetwIPxo49CVyY59RvAH1VtT/wEfD92LHlqjogeo3N09ZogqTf/yPBusVZ2TvnZuTIYxPUqIjEDVA6HX5JN7J8UHXB6dgdb/i1WTn4eA7BojcS1MhoCIr5NA8FlqnqClU9AIwHclOWXgo8rSEzgPYi0gVAVacCW3JPqqp/VdVMZrMZQNeiXYFR8qRXzSa98PWs7Pb/PE63MxLUqMjkxuLLMU5Nbkozhnvy2bixjdb+nN9X+mFiND2KaaCOBz6JyeVRWW3rVMfNwJ9jck8ReV9EpojIyHwNRORWEZktIrM3btxYi66MUiPYthb/naezsnN8X9wzvpCgRg1Absr3Rpis8HBwz/wKTueTIknxpzyC7tqcqE5G8SjoiRaRS0Rq/fTn+ymXO2lcSJ2qdPoh4AMZt611wAmqOhD4R+A5EWl3yMlVH1bVIao6pHPnzoV0ZZQgemAP/qQHwQ8Xy6Vt53BqrwmPIIBDg8U28fWnXMT1wkj0rcJ/bT2wm4opD6H+gYQ1M4pBoUbnKmCpiPxCRE4rsE050C0mdwXW1qHOIYjIDcAlwLUarZSq6n5V3Ry9nwMsB3oXqKvRiFBV/LeeQHduCAvcMrzRY5EWRySrWENQKeV75RFU7X9DNk6kdXu8c2/LGmvd/HEYsd6cJpocBT3RqnodMJDwS/8JEZkeTZW1rabZLKCXiPQUkTJCIzchp84E4PrIm284sF1V11Wni4hcCNwFfFFV98TKO0eOGYjIiYSOFysKuT6jcZGe/xpB+fys7J19PU6HZrIUWd0aVDMYQWVwjj4Z78yvZOX08ukEH01JUCOjGBT8k0tVdwAvEzo7dAEuB94TkX+oor4P3Am8DiwGXlTVhSIyVkQyHnYTCY3IMuAR4JuZ9iLyPDAdOEVEykXk69Gh/wPaAm/kuJOPAuaLyDzgJWCsqh7iZGE0boLy+ZVC3rh9zsfteWaCGjUsIlLZSKUrDr5vQlEkCsE5ZTTuSWdlZX/WiwQbliWokVHfFBS4S0S+CNwEnAT8FhiqqhtEpDWh8fl1vnaqOpHQCMXLxsXeK3BHFW2vrqI8bzIfVX2Z0IAaTRTdsQF/2uNk07YfewruoMuTVSoJxDk4coobqCYWRaImRAR32DUEW9eECSmDNP6Uh0l9/geNNyGlUYlCf3JdCfyPqvZX1f9U1Q0A0RTbzUXTzjAitGI/FZMfRCv2AiCtO+CN+gbSjKa1ssQ9+SoZqOY1ggIQryzclF0Wrj/q3u1hJPu0X0NLozFQ6BO9LtqXlEVE/gNAVd+sd60MI4aq4k//Lbot8p9xvNApomV1S6BNl0rOEHHvtWY2xZdB2nTEG3UL2XTxG5eTnv1SskoZ9UKhT/T5ecouqk9FDKMqgsV/I1h1MPW3N+wanE49klMoaSpFk4iNFJpIqo264BzXBy823ZteMon08ukJamTUB9UaKBG5XUQ+AE6NYt9lXiuB+dW1NYz6IFj3If6c32dlt/co3F4jEtSoBHCqcJJohlN8cZzTP4fTPRvOE3/GswSbVyeokXG41PREPwd8Afhj9DfzGhy5nhtG0dDdW/CnPZp1CHA69cSNuRY3Wyql3IiNoJq5gRKRMIL9kV3CgnQF/uRx6L5dySpm1JmanmhV1VWEnnY7Yy9E5KjiqmY0Z9Q/EKZV2LcTyES0vg1xUwlrVgLEDJHaGlQlciPZ6+7NYaT7eEgoo9FQyAgKYA4wO/o7JyYbRr2jqqRnjkc3fxwWiIN37m1I6w7JKlYqVDHF1yw9GvMgRx6Ld85B5+Jg3WLSc/+YoEZGXal2VVVVL4n+9mwYdQwDgqXTSC97Oyt7Q76Mc0yvBDUqMeJTfLYGlRen2xm4/T9Pev5rAKQXvI507I7bfXDCmhm1oVoDFU8gmA9Vfa9+1TGaO8HGFfgzx2dl58RhOKeOSVCjEqQqJwkbQVXCPeML6OaPCdaEOU/9t59CjjwOp32XhDUzCqUmv9T/quaYAp+pR12MZo7u3Y4/eVw2AKp06IY3/LqmH6G8ttgIqiBEBG/k16l47d/RnRvB348/6QFSn/8+UtY6afWMAqhpis9+uhoNgqb9MALA3u0ASNkR4WK3V5awZiVIbASlNoKqFilrjTd6LBUT/wPSB9CdG/DfehJvzO32w6cRUNM+qM9Ef6/I92oYFY3mQHrOS7FAn4I36hakbadEdSpVpKqNus0sFl+hOB264p19fVYOyudl16aM0qamKb5zgb8T7n3KRYHf5yk3jFqRXj6D9IeTsrI38DKc4/okqFGJUymaubmZF4Lb88wwb9SiNwBIz3sVp2N3nK79EtbMqI6apvh+Ev29qWHUMZobwZbV+DOeycrOCQNx+l6QoEaNgCpHUGagqsMddDm6ZTXBp0sAxZ/2WBj5vN3RSatmVEGhKd87isj9IvKeiMwRkV+JSMdiK2c0bXT/LvxJ47IL/XJkF7wRN9raQE1UmQ/KpviqQxw3jIAf7afTir3hZvCK/QlrZlRFoT+5xgMbgS8Rpt7YCLxQLKWMpo8GAf7Ux9DdmwEQr3IEAKMaJL+TRHNJ+X44hBFJxmYD6+q2NfjTn7Z08SVKoU/0Uar6r6q6Mnr9G9C+pkYicqGILBGRZSJyd57jEo3MlkVBaAfFjj0uIhtEZEFOm6NE5A0RWRr97RA79v3oXEtExOaJSpj03D8SrFuUlb2RNyNHHpugRo2I+EipUqgjG0EVgtOpB96wa7JysGo2QbQ2ZZQWhcbnnyQiVwEvRvKVQLVuMCLiAr8hTNVRDswSkQmquihW7SKgV/QaBjwY/QV4kjC9+9M5p74beFNV74uM3t3AXSLSB7gKOB04DvibiPRW1XoPwnWgIs3kuR/X92mbDW03L6LbRwf9azYeP4qNn7aFT1ckqFXj4ZQtezlWCdMfRcFiVZVVG3ayYpbdw8LoQpcWfeiwPorY9uYzrFrnsOfIE5NVqxHzuTPr/97VFEliJ6G3ngD/CGRWsx1gF/CTapoPBZap6oroXOOBS4G4gboUeDpK/T5DRNqLSBdVXaeqU0WkR57zXgqMjt4/BUwG7orKx6vqfmCliCyLdKj3pDD7K3wemmBBNOrCUbqNa4OJfEz4xbpKjuOVDUeic+1+FsolwceM7riT4zq1za5BfbJhB3/9aBV/n2P3sVBcPZavaIouugmAfesf5ln5PLvkiIQ1a5wUw0BVO8Wnqm1VtV3011FVL3o5qtquhnMfD3wSk8ujstrWyeUYVV0X6bcOyLjgFHQuEblVRGaLyOyNGzfW0JVRn5TpAS7VyaQi47RD2jBRRqK2dlIrAhx27gmn9jJrUDv3HCAoeMbeAEiLy59kNHskXPdspfu4VCfjqqWLLxUKTsEZrfX0ArKr2Llp4HOb5CnLXYkspE6hFHQuVX0YeBhgyJAhdeor5bmcN9ji59YKVfqvfYXOu32gNWnxWHHCtZzTwlx8C2XH7v3M/HAtAUIQRI9uZKCCQAmif4Gz+3ajdYvmm123tmza045B5S8iBHRmL99st5zFx1wA5k2aOAU9xSJyC/BtoCswFxhOOHVWXSy+cqBbTO4KrK1DnVzWZ6YBRaQLsOEwzlUnWpZ53H6ZRUWuDf78iaR3boK2RwLgjbyF03qembBWjYtV67ZFBsoh0BwDpYpGI6gbL+pPx3atklKzETKY9OJ2+LNCx+TurGbk6Xtwe49KWC+j0DmBbwNnAh9H8fkGErqaV8csoJeI9BSRMkIHhgk5dSYA10fefMOB7Znpu2qYANwQvb+BMNtvpvwqEWkhIj0JR3szC7g2o8gEaxaQnnvwo3dP+yyuGadak0qFXnoBctAtOn3QSSIzgirzbKqvtjinjsE5cVhW9meOJ9hoDidJU+iTvE9V9wGISAtV/RA4pboGquoDdwKvA4uBF1V1oYiMFZGxUbWJwApgGfAI8M1MexF5nnCUdoqIlIvI16ND9wHni8hSQg/B+6L+FhJ6GS4C/gLcUQwPPqN26I4N+FMfJTPb6hzTC3eQhXGsCyk3/HdV5OAIKnIzD5SsgUp55m5eW0QkjJzfIZqECdJhuvi9O5JVrJlT6ER1uYi0B/4AvCEiWylg+kxVJxIaoXjZuNh7JUwnn6/t1VWUbwY+W8Wxe4F7a9LLaBi0Yn+0U38vANK6fZgZ17X1kbrQoiy8bwEOQRCWaboCNFqDipxNysxA1QnxykiNHhum5ziwO0z/MuUhvPO/a89sQhQ0glLVy1V1m6r+FPgR8BhwWRH1Mho5qoo/4xl025qwwHHxRo9FWrZNVrFGTGYElc5Zg8pM9wUiuK6D49jifl2Rtp3wRt1Cxucq2LCM9HsvJ6tUM6bgyWoRGSQi3wL6A+WqeqCmNkbzJVj8JsHKg0uA3tCrcTqZ5+PhUBatQSlOLDSPZo2V4mSNmFF3nOP64A28LCunF/+d9PIZySnUjCk0WOyPCTfFdgQ6AU+IyL8UUzGj8RJ8ugR/zsFfnW6vc3B7j0xQo6aB6wiCRE4SHBw5Zf7iZI2YcXg4fS/AOWFgVvZnPEOwZXWCGjVPCv25dTVwpqr+JErBMRy4tnhqGY0V3b0Ff+ojoOEiidOpB+7QqxLWqmkgIqRSTtYZIjOIyvwNEFt/qidEJIysf2SXsCBdETpN7N+VrGLNjEIN1CpiG3SBFsDyetfGaNRougJ/ykPovp1AFDn63NsQN5WwZk2HMs/NRozIbNbN/sUxA1WPSCqKsO+FX326a3MYgT/joWIUnZpSvv9aRO4H9gMLReRJEXkCWEAYi88wsqRnjifYtCoUxMEbdStyxFGJ6tTUSHkuQRThIDhkik/wbA9UvSJHHos38uasHKxbRHpe7nZOo1jU5DsZhfplDvBKrHxyUbQxGi3pj6aRXvpWVvYGfwnn2N4JatQ0aZFysxEjMmtQ2b8ILWwNqt5xup2B2+9i0h+EO2bSH/wZ6dgdN7ZGZRSHmlK+P5V5H0WDyHzjLFHVivytjOZGsGkl/szns7LTcyjOaXm3qhmHScp1qpziS+PYJt0i4Z7xBXTzxwRrFwLgv/UEcvGxOO27JKxZ06ZQL77RwFLC/E4PAB+JiAWqMtC9O/Anj4MgDNohHbrinfU1S9teJFIpN+skcXCKLzwWrkHZFF8xEMcJk2q26RQW+PvxJz+IHtibrGJNnEKf5v8CPqeq56rqKOAC4H+Kp5bRGNC0jz/1YXTPNgCkrHW0qFyWrGJNmJR3cASV9d6LTfHZCKp4SIs2eGNuh8jpR3esx3/7SUsXX0QKNVApVV2SEVT1I8Bcs5o56fd+T7B+aSQJ3sivI207J6pTU6dFnhGU2j6oBsPp0BXvrOuzcvDJXNIf/DlBjZo2hRqoOSLymIiMjl6PEDpOGM2U9IqZpBe/mZXdAV/EOb5vgho1D1Kui2YM1CFu5kLKpviKjnviUNzYGmt67gSCNQsS1KjpUujTPBZYCHyLMPXGoqjMaIYEWz7Bn/50Vna6DcDtd1GCGjUfwjWo/F58tg+q4XAHXYFzTK9IUvxpj6E7LUN3fVOjgRIRB5ijqv+tqldEgWP/R1X3N4B+Romh+3eFThFRojxpd0y4496cIhqEMs+JTfER/T04gjID1TCI64X7/Fq3B0AP7Akj9/sWorQ+qdFAqWoAzBORExpAH6OE0SDAn/Y4umtTWOC1wBt9O1Jm2VsbikqRJHK8+BSxNagGRFq1wzv3NnCiIL5by/Gn/9acJuqRQqf4uhBGknhTRCZkXsVUzCg90vP+lN0HAuCNuNH2gTQwZalDQx1ppX1QtgbVkDidT8QbejB1XbByJsGHf09Qo6ZFoVm4flaXk4vIhcCvABd4VFXvyzku0fGLgT3Ajar6XnVtReQFDmbzbQ9sU9UBItKDMHNvxttwhqraOlk9Eayem91JD+D2vRC3+6AENWqehBt1M8FiD41mbm7mDY/beyS6eVU2koo/+yWkQzeLpFIPVGugRKQloTPEycAHwGNRKvcaERGXcGPv+UA5MEtEJqjqoli1i4Be0WsY8CAwrLq2qvrVWB//BWyPnW+5qg4oRD+jcHT7p/hvPZGVnS59cAdcmqBGzZe4k8ShsfjMSSIp3KFXoVvLw1iUGuBPfZjU539gsSgPk5rmA54ChhAap4sIN+wWylBgmaquiJIbjgdyv9UuBZ7WkBlAexHpUkjbaPT1FeB5jKKhFfuixd99AMgRHfFGfR1xbCopCcI1qJwRVHBwo65FkkgGcVNh5P4oY7Tu24k/5WE0bRHhDoeanuY+qnqdqj4EXAnUJuvc8cAnMbk8KiukTiFtRwLrVXVprKyniLwvIlNEJK+uInKriMwWkdkbN5pbaHWoarhTfvu6sMBN4Y0Zi7Rok6xizZiy1KH7oCrlgzInicSQI47CG3UrSDTC3bSS9MwXEtaqcVOTgcqa/0Kn9mLk8zvOdW+pqk4hba+m8uhpHXCCqg4E/hF4TkTaHXIS1YdVdYiqDunc2aIeVEew4HWC1e9nZW/4dThHmTNnklQKFnuIm7mDZ1N8ieIc2xtv8Jeycnpp5Sj/Ru2oyUniDBHZEb0XoFUkC6CqeogBiFEOdIvJXYG1BdYpq66tiHjAFcDgTFm0L2t/9H6OiCwnjL4+G6PWBGsX4b//h6zsnjoG96ThySlkAJlQR5U36sb3QVm6jeRxTvsszuaPCVbOBMB/9zmkw/E4nXomrFnjo9oRlKq6qtouerVVVS/2vjrjBDAL6CUiPaNUHVcBua7pE4DrJWQ4sF1V1xXQ9jzgQ1UtzxSISOfIuQIROZHQ8WJFjXfAOATduQl/6qNkBq3O0SfjDr4yWaUMIExYmM5xktBYRt2Ua2tQSSMiYUT/9tGqRJDGn3ww07RROEV7mqMpwTuB1wndv19U1YUiMlZEMu7fEwmNyDLgEeCb1bWNnf4qDnWOGAXMF5F5wEvAWFXdUpSLa8KofyB0ijiwGwBpdSTeubcibqE7EoxikvKcQ2PxWbDYkkO8MlJjbkdS4SZ23bM1dJqI0tIYhVHUbx1VnUhohOJl42LvFbij0LaxYzfmKXsZePkw1G32qCr+jGfQrZF/iuPijR6LtDoyWcWMLCnPrTLUkSI2giohpG1nvFG3UPHm/wFKsP4j0nNexjvzK0mr1miwp9nIEnw4iWDFu1nZG3oVTucTE9TIyCXfGtRBLz6HsjIb6ZYSzvF9cQd8MSunF79JeuWsBDVqXJiBMgAI1i/Fn/27rOyePAKnV212FRgNQSoeLDZfug0bQZUcbr+LcLqekZX9d54i2FpeTQsjgz3NRjQ//hBoAIB07I479CqLUF6C5A8WG4tmbmtQJYeI4J1zE9LumLAgXYE/6UF0/+5kFWsEmIFq5mi6opKHkbRsa2nbS5hUbKNuvlh8FkmiNJGyVnijbwevBQC6a1OYQyoIEtastLGnuZmTnvUiwaaVoSAO3shbLH5YCZNvBJVZg1LLB1XSOO274I24MSsHaxeSnven5BRqBJiBasakl75N+qOpWdkbfAVOl1MT1MioibJKThKAhmtQAQIiFs28xHG7D8Lte2FWTn8wkeCTeQlqVNqYgWqmBJtW4b/7bFZ2epyJc9p5CWpkFEI83UY60Erp3l3XwXFs3bDUcQdcitOlT1b2pz2Obv80QY1KFzNQzRDdtzNM2x5tGpT2x4U7380pouQJR1AH16Die6Bseq9xII4TZgQ4oiMA6kcZAyr2JaxZ6WEGqpmhQTrc0b5nKwCSakVq9O1IqkXCmhmF4DqCEqUY13AUBRCIWDbdRoS0aIM3Ziy4KQB0+7owc4Cli6+EPdHNjPR7rxCs/yiSBG/k15F2Ryeqk1E4IoIXcyVPR15glqyw8eEcdQLe8OuycrD6fYIFryeoUelhBqoZkV45i/SiN7Kye8YlOF37JaiRURfKUl7W1Tydtmy6jRn3pOG4p47Jyv77fyBYu6iaFs0LM1DNhGBrOf47T2dlp2t/3P6fT1Ajo67Es+r60QhKEVK2SbdR4g6+EufokyNJ8ac+iu7clKhOpYIZqGaA7t8dOkWkDwAgbY8Od7abU0SjJO5qXnkEZf/OjRFxvTBjQBSUWQ/sDp0m/AMJa5Y89kQ3cVQV/63H0Z1RenuvBd6Y25Gy1skqZtSZlOsQSMbVPLMGZXugGjNhWpvbwIkcYLZ+EmYWaOZOE2agmjjpea8SrFmQlb2zr8dpf1yCGhmHS1nZwRGUnz7oJGHZdBs3ztEn4Q29KisHK94lWDI5OYVKADNQTZjgk3mk57+ald3TL8DtMSRBjYz6IOXmm+KzSOZNAafXSNyTR2Rlf9aLBOuXJqhRshT1iRaRC0VkiYgsE5G78xwXEbk/Oj5fRAbV1FZEfioia0RkbvS6OHbs+1H9JSJyQTGvrdTR7Z/iv/V4Vna6nIY78NIENTLqi7LUway6aXOSaFKISJhJoGP3sEAD/CkPZfctNjeKZqBExAV+A1wE9AGuFpE+OdUuAnpFr1uBBwts+z+qOiB6TYza9CFMBX86cCHwQHSeZodWVN6ZLkd0DIPAOs3ydjQ5whFU5MUXm+KzjbpNA/HKSJ07FmnRBshEfnkITVckrFnDU8wneiiwTFVXqOoBYDyQ+xP+UuBpDZkBtBeRLgW2zeVSYLyq7lfVlcCy6DzNClXFf+cpdPu6sMBNhWnbW7ZJVjGj3qjkxRcc9OJrkbJsuk0FaXMU3qhvQCY55aaVpGe9mKxSCVBMA3U88ElMLo/KCqlTU9s7oynBx0WkQy36Q0RuFZHZIjJ748aNtbmeRkGw8K8EH7+Xlb1h1+B0PCFBjYz6Jp5V9+AIytagmhpOl1PxBl+RldMfTSW99O0ENWp4ivlE59tkk+szWVWd6to+CJwEDADWAf9Vi/5Q1YdVdYiqDuncuXOeJo2XYO0i/PdeycruKaNxTz47QY2MYhDPCRUfQVk23aaH0+d8nB5nZmX/3ecINq1KTqEGppgGqhzoFpO7AmsLrFNlW1Vdr6ppVQ2ARzg4jVdIf00W3bUZf+qjZGyy0/kk3CFfTlYpoyiUxbLqpuMjKFuDanKISJhpILM1JPDxJ4/LZsBu6hTziZ4F9BKRniJSRujAMCGnzgTg+sibbziwXVXXVdc2WqPKcDmwIHauq0SkhYj0JHS8mFmsiysl1D8QOkUc2A1kNv3diri2JtEUqXIEZRt1mySSahFlHGgFgO7Zij/1ETRKl9OUKZqBUlUfuBN4HVgMvKiqC0VkrIiMjapNBFYQOjQ8AnyzurZRm1+IyAciMh8YA3w3arMQeBFYBPwFuENVm/wnqKqk330O3bI6LHDc0Di1bp+oXkbx8Dwna6AyWCSJpo20Oxpv5NfJOk18uoR0bDq/qVLUn9iRC/jEnLJxsfcK3FFo26j8a9X0dy9wb131bYwEH00hvXx6VvbO/Eos8KTRFCnzXNI5S64Wi6/p43Tth3vGJaTn/QmA9KI3kI7dcXueWUPLxos90Y2YYMMy/JkvZGX3pLNwep+boEZGQxB3M8+giDlJNAPc/p/H6do/K/vvPE2wtTxBjYqLGahGiu7Zhj/lIdBwkVyOOgF32DUWobwZUOYdjCSRIdyoawaqqSMiYSaCtlGS0fSB0GniwJ5kFSsSZqAaIZr2w7Tte3cAYfro1OixiFeWsGZGQxBO8VX+102bm3mzQcpa4425HbwWAOjOjfjTHmuSkc/NQDVC0rNeJNi4PJIEb9QtSJuOiepkNBypWMLCDGobdZsVTvvj8EbckJWDNQtIz3u1mhaNE3uiGxnpZe+Q/mhKVvYGXY7T5bQENTIamnxrUAFi6TaaGW73wbinH4yJnZ7/KsEn8xLUqP4xA9WICDZ/jD/j2azsdB+Mc/rnEtTISIKUrUEZEe7Ayyr9QPXfehzdsT5BjeoXM1CNBN23K0zbHvgAyJFd8M6+wZwimiHxjboZAhxLt9EMEccJMxUcEU7xa8U+KiY9iFbsT1iz+sEMVCNAg3S4c3z3FgAk1ZLUmNuRVIuENTOSIB4sNoMFi22+SMs2eKPHgpsCQLevCzMaNAGnCXuiGwHp9/9A8OmHWdk752ak3TEJamQkSYuUl2cflKV8b844HU/AG3ZNVg4+nkOw8K8JalQ/mIEqcdKrZpOOPWhu/0twup2RoEZG0nhVjaAskkSzxj35bNxTRmdl/71XCNYtTk6hesCe6BIm2LYW/52ns7JzfBjqxGjeVLUGZcFiDXfIl3E6nxRJij/lEXTX5kR1OhzMQJUoemAP/qQHwQ8XO6VtZ7yRN5tThFGlm7lt1DXE9cJg0a3aAaAHdoeZDvwDCWtWN8xAlSCqij/tcXTnhrDALQvTtpe1TlYxoyQoyzPFh+vajxcDAGndHu/c20DCr3fdsjrMeNAInSbMQJUg6fmvEaz5ICt7Z1+P06FrghoZpUTKc9Gcf13XsdGTcRDn6JPxzvxKVk4vn04Q2+DfWDADVWIE5fMrhSxx+5zfpMPpG7XHdeSQjbrimoEyKuOcMhr3pLOysj/zBYINyxLUqPaYgSohdMcG/GmPk03bfuwpuIMuT1Ypo+QQERyvcio3z7PsyUZlRCTMcHDUCWGBBvhTHkL3bEtUr9pQVAMlIheKyBIRWSYid+c5LiJyf3R8vogMqqmtiPyniHwY1X9FRNpH5T1EZK+IzI1e43L7K2W0Yj8Vkx9EK/YCIK074I36BmJTN0Yecp8LccxAGYciXlmY6aDsCAB0744wE0LaT1izwiiagRIRF/gNcBHQB7haRPrkVLsI6BW9bgUeLKDtG0BfVe0PfAR8P3a+5ao6IHqNpZGgqvjTn0a3rQ0LHC90imjZNlnFjJLFzZnSyx1RGUYGadMRb9QtZNPFb1xOetaLySpVIMUcQQ0FlqnqClU9AIwHLs2pcynwtIbMANqLSJfq2qrqX1U1Y/5nAI3eeyBY/DeCVbOzsjfsGpxOPZJTyCh5cg1SrsEyjDjOcX3wYssF6Y+mkF72ToIaFUYxDdTxwCcxuTwqK6ROIW0Bbgb+HJN7isj7IjJFREbmU0pEbhWR2SIye+PGjYVdSREJ1n2IP+f3WdntPQq314gENTIaA46bY6BsBGXUgHP653C6D87K/oxnCTavTlCjmimmgcq3KSPXEb+qOjW2FZEfAj6QyT+xDjhBVQcC/wg8JyLtDjmJ6sOqOkRVh3Tu3LmGSyguunsL/tRHsmnbnU49cWOuoYZRFU5O1AhzkjBqQkTCDAhHdgkLAj9MF79vV7KKVUMxDVQ50C0mdwXWFlin2rYicgNwCXCtRrvPVHW/qm6O3s8BlgO96+VKioD6B8Id3vvDh0NatsUbfRsSRSQ2jOpwcpwiHJviMwpAUi2iTAitANDdm/GnPYoG6YQ1y08xDdQsoJeI9BSRMuAqYEJOnQnA9ZE333Bgu6quq66tiFwI3AV8UVX3ZE4kIp0j5wpE5ERCx4sVRby+OqOqpGeORzd/HBaIg3fubUjrDskqZjQa3JwRlE3xGYUi7Y7BG3lzVg7WLSY9948JalQ1RTNQkSPDncDrwGLgRVVdKCJjRSTjYTeR0IgsAx4Bvlld26jN/wFtgTdy3MlHAfNFZB7wEjBWVbcU6/oOh2DpNNLL3s7K3pAv4xzTK0GNjMaG5+bug7KRt1E4Ttf+uP0PBp5OL3id9MdzEtQoP0X92aWqEwmNULxsXOy9AncU2jYqP7mK+i8DLx+Ovg1BsHEF/szxWdk5cRjOqWMS1MhojBzixZeyEZRRO9wzLkE3ryJYswAA/+2nkCO74LQ/LmHNDmKRJBoQ3bs9StsezvdKh254w6+zIJ9GrTnUzdwMlFE7RARv5NeRtpGzmL8ff9KD6IE91TdsQMxANRCa9sMd3Hu3AyBlR4Q7vL2yhDUzGiOpHAOVshGUUQekrHWULj78HtKdG/DfeqJkIp+bgWog0nNeigVqFLxRtyBtOyWqk9F4yXWKMCcJo644HbrinX19Vg7K55Oe/1qCGh3EDFQDkF4+g/SHk7KyN/BSnONyoz4ZRuHk7nsyJwnjcHB7nonb5/ysnJ73KkH5B9W0aBjMQBWZYMtq/BnPZGXnhAE4fS9MUCOjKXDIGpSNoIzDxB10Oc6xp0SS4k97DN2xIVGdzEAVEd2/C3/SOEhXACDtjsUbcZM5RRiHTe6aU5mtQRmHiThumEEh2o+pFXvDYAIV+xPTyQxUkdAgwJ/6GLp7MwDitYx2cLdMWDOjKZDrteeZgTLqgTCizViIIpXotjX403+bmNOEGagikZ77R4J1i7KyN/Jm5MhjE9TIaEp4qcprTm7KvEGN+sHp1ANv2DVZOVg1i2Dx35LRJZFemzjpj98jveAvWdntdzFOtzMS1MhoaqRynCJSKXOSMOoPt9cI3N6jsrI/5/cE6z5scD3MQNUzwbZ1+G8/mZWd407HPeMLySlkNEncMtsHZRQX98yv4HTqGQoa4E99BN3dsNHjzEDVI3pgL/7kB8EPFxWlTadwp7Zjt9moX3I36pqThFHfiJsKMyxEmb11/67QacI/0GA62DdnPaGq4Q7sHevDAjeFN+Z2pMURySpmNEkO2QdlU3xGEZDWHfDOvQ0kNBW6+eMwE0MDOU2Ygaon0h/8maB8Xlb2zr4Bp0Ojz0ZvlCi5a06pMnOSMIqDc0wvvCFfzsrpZW8TLJ3WMH03SC9NnGDNAtJzD6a6ck/7LG7PMxPUyGjqpMpynSRsis8oHs6pY3BOHJaV/ZnjCTYWP92eGajDRHdswJ/6KJmM9M4xvXEHfylZpYwmTyrHrbzMpviMIiIiYeaFDlGi8yAdpouPgl8XCzNQh4FW7I92Wu8FMvO1tyKOpd82ikvuxtzcEZVh1DfilYUZGMrCdXXduz3M0JD2i9ZnUQ2UiFwoIktEZJmI3J3nuIjI/dHx+SIyqKa2InKUiLwhIkujvx1ix74f1V8iIhcU89pUNdxhvW1NWOC4lTxeDKOYlOUYJBtBGQ2BtO2EN+oWIAzXFmxYRnrOS0Xrr2gGSkRc4DfARUAf4GoRyQ3hfRHQK3rdCjxYQNu7gTdVtRfwZiQTHb8KOB24EHggOk9RCBa/SbBqVlb2hl1zcM+AYRSZuJNEgFCWslG70TA4x/XBG3hZVk5/OIn08hnF6asoZw0ZCixT1RWqegAYD1yaU+dS4GkNmQG0F5EuNbS9FHgqev8UcFmsfLyq7lfVlcCy6Dz1TvDpR/hzDmaXd3uNxO11TjG6Moy8lMW89lQcC0BsNChO3wtwThiYlf0ZzxBsWV3//dT7GQ9yPPBJTC6PygqpU13bY1R1HUD09+ha9IeI3Cois0Vk9saNG2t1QVkcJ7u/yenUE3foV+t2HsOoI62OOIJ97cMRu3/0aQlrYzQ3RARvxI1IuzC+qLRsV5R+iumbmu8nXe7urqrqFNK2Lv2hqg8DDwMMGTKkTrvNnKNPJnXJv+DPeA5v2FWIa/P/RsMz8tu/YPXiD+hxusV5NBoeSYUZGvz3/4B31nVIizb13kcxDVQ50C0mdwXWFlinrJq260Wki6qui6YDMxm1Cumv3pDW7Ul95pvFOr1h1EhZixacPGBI0moYzRg58lhSo8cW7fzFnOKbBfQSkZ4iUkbowDAhp84E4PrIm284sD2atquu7QTghuj9DcAfY+VXiUgLEelJ6Hgxs1gXZxiGYRSXoo2gVNUXkTuB1wEXeFxVF4rI2Oj4OGAicDGhQ8Me4Kbq2kanvg94UUS+DqwGvhy1WSgiLwKLAB+4Q1XTxbo+wzAMo7hIUpkSS4EhQ4bo7Nmzk1bDMAyjWSMic1T1kPlqiyRhGIZhlCRmoAzDMIySxAyUYRiGUZKYgTIMwzBKkmbtJCEiG4GPD+MUnYBN9aROY6W534Pmfv1g98Cu//Cvv7uqds4tbNYG6nARkdn5PE+aE839HjT36we7B3b9xbt+m+IzDMMwShIzUIZhGEZJYgbq8Hg4aQVKgOZ+D5r79YPdA7v+ImFrUIZhGEZJYiMowzAMoyQxA2UYhmGUJGagCkBELhSRJSKyTETuznNcROT+6Ph8ERmUhJ7FooDrvza67vki8o6INLkMejXdg1i9M0UkLSJXNqR+xaaQ6xeR0SIyV0QWisiUhtax2BTwf3CkiPxJROZF9+CmJPQsFiLyuIhsEJEFVRyv/+9BVbVXNS/CdB/LgRMJEynOA/rk1LkY+DNhVt/hwLtJ693A13820CF6f1FTuv5C70Gs3t8J08hcmbTeDfwMtCdMdXNCJB+dtN4J3IMfAP8Rve8MbAHKkta9Hu/BKGAQsKCK4/X+PWgjqJoZCixT1RWqegAYD1yaU+dS4GkNmQG0j7L9NgVqvH5VfUdVt0biDMJsxk2JQp4BgH8AXuZgluemQiHXfw3we1VdDaCqzfEeKNBWRARoQ2ig/IZVs3io6lTCa6qKev8eNANVM8cDn8Tk8qistnUaK7W9tq8T/opqStR4D0TkeOByYFwD6tVQFPIM9AY6iMhkEZkjItc3mHYNQyH34P+A04C1wAfAt1U1aBj1SoJ6/x4sWkbdJoTkKcv1zS+kTmOl4GsTkTGEBuqcomrU8BRyD/4XuEtV0+EP6CZFIdfvAYOBzwKtgOkiMkNVPyq2cg1EIffgAmAu8BngJOANEZmmqjuKrFupUO/fg2agaqYc6BaTuxL+QqptncZKQdcmIv2BR4GLVHVzA+nWUBRyD4YA4yPj1Am4WER8Vf1Dg2hYXAr9H9ikqruB3SIyFTgDaCoGqpB7cBNwn4YLMstEZCVwKjCzYVRMnHr/HrQpvpqZBfQSkZ4iUgZcBUzIqTMBuD7yYhkObFfVdQ2taJGo8fpF5ATg98DXmtAv5jg13gNV7amqPVS1B/AS8M0mYpygsP+BPwIjRcQTkdbAMGBxA+tZTAq5B6sJR5CIyDHAKcCKBtUyWer9e9BGUDWgqr6I3Am8TujJ87iqLhSRsdHxcYReWxcDy4A9hL+kmgQFXv+PgY7AA9EIwtcmFN25wHvQZCnk+lV1sYj8BZgPBMCjqprXHbkxUuAz8K/AkyLyAeF0112q2mTScIjI88BooJOIlAM/AVJQvO9BC3VkGIZhlCQ2xWcYhmGUJGagDMMwjJLEDJRhGIZRkpiBMgzDMEoSM1CGYRhGSWIGymjSRJHF54rIAhH5XbRHpyH7/0GO/E6R+zs1ut73ReSknGO7itTnZBEpeFuBiHynplBIIjJeRHodvnZGY8YMlNHU2auqA1S1L3AAGBs/KCJuMTqNNis6hBGus6jq2cXoL8ZlwB9VdaCqLi9yX7VGRDzgZuC5Gqo+CPxz8TUyShkzUEZzYhpwcpS3aJKIPAd8ICItReQJEfkgGnmMARCRG0XkjyLylygP0E8yJxKRf4xGZQtE5DtRWQ8RWSwiDwDvAY8BraIRzbNRnV3RXxGR/4zafyAiX43KR0cjkpdE5EMReVbyBPcTkQEiMkPCvDuviEgHEbkY+A5wi4hMyncDROReCfMVzYiiHSAinUXkZRGZFb1GROVDJczv9X7095SovFU0wpkvIi8Qxt5DRFwReTJ2Td/No8JngPeija9e1N/oqP3PReTe2Gd1XmTQjOZK0jlG7GWvYr6AXdFfjzAcz+2Eu+F3Az2jY/8PeCJ6fyphyJqWwI3AOsIoGa2ABYQx9wYTRqs+gjCtwkJgINCDMIrC8Nz+8+jzJeANwqgEx0R9dol0204Yx8wBpgPn5Lmu+cC50ft7gP+N3v8U+Kcq7oUCX4je/wL4l+j9c5k+gBOAxdH7doAXvT8PeDl6/4+EkRQA+hOmlMjclzdi/bXPo8PPgH+IyacThkQ6H3ifWP6k6P4MTvoZsldyL/t1YjR1WonI3Oj9NMJRzdnATFVdGZWfA/waQFU/FJGPCdNHQPiFuxlARH4f1VXgFQ0Do2bKRxLGIvtYw1w4NXEO8LyqpoH1EmagPRPYEelWHp17LqHheyvTUESOJPzyz2StfQr4XQF9HgBejd7PITQKEBqfPrGBWjsRaQscCTwVrQUpUVgbwsR19wOo6nwRmR+VrwBOFJFfA68Bf82jQxdiMfo0DBf0W+BPwFka5lrKsAE4LtLVaIaYgTKaOntVdUC8IPoi3h0vqqZ9biwwraH+7mqOVVKjmmP7Y+/T1N//aYWqZq4nfl6H0DjsraRgaGgmqerlItIDmBw7fEiMNFXdKiJnEKaduAP4CuF6U5y9hKPTOP2AbYQjyTgto/pGM8XWoAwDpgLXAohIb8JpriXRsfNF5CgRaUXogPB2VP8yEWktIkcQJiqcVsW5K0Qklad8KvDVaN2mM+GopKC0DKq6HdgqIiOjoq8BU6ppUhN/Be7MCCIyIHp7JLAmen9jrH78fvUlnOZDRDoBjqq+DPyIMD14LouBk2N9XUE4hToKuF9E2sfq9iacPjWaKWagDAMeAFwJo1C/ANyoqplRzFvAbwkT0b2sqrNV9T3gSUKD8i5h5O73qzj3w8D8jJNEjFcI15HmAX8H/llVP62FzjcA/xlNrw0gXIeqK98ChkROD4s46On4C+DnIvI24VpZhgeBNlHf/8xBw3o8MDmalnwS+H6evv5MaIwyBu0+4Osapmn5P+BX0bFjCEe/TSVtjVEHLJq5YVSBiNwIDFHVO2uqaxSOiLxCaJCXVlPnu8AOVX2s4TQzSg0bQRmG0dDcTegsUR3bCJ0/jGaMjaAMwzCMksRGUIZhGEZJYgbKMAzDKEnMQBmGYRgliRkowzAMoyQxA2UYhmGUJP8foVJv3LwmyLoAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "biased_uniform.plot(label='uniform prior')\n", "biased_triangle.plot(label='triangle prior')\n", "\n", "decorate(xlabel='Proportion of heads (x)',\n", " ylabel='Probability',\n", " title='Uniform and triangle prior distributions')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise:** Now compute the total probability of the data under this definition of \"biased\" and compute the Bayes factor, compared with the fair hypothesis.\n", "Is the data evidence that the coin is biased?" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.343799Z", "iopub.status.busy": "2021-04-16T19:35:58.343267Z", "iopub.status.idle": "2021-04-16T19:35:58.345785Z", "shell.execute_reply": "2021-04-16T19:35:58.346132Z" } }, "outputs": [ { "data": { "text/plain": [ "0.00698132546485788" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Solution\n", "\n", "like_triangle = np.sum(biased_triangle * likelihood)\n", "like_triangle" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.349999Z", "iopub.status.busy": "2021-04-16T19:35:58.349509Z", "iopub.status.idle": "2021-04-16T19:35:58.352346Z", "shell.execute_reply": "2021-04-16T19:35:58.352665Z" } }, "outputs": [ { "data": { "text/plain": [ "1.1970766535647157" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Solution\n", "\n", "K = like_fair / like_triangle\n", "K" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.356295Z", "iopub.status.busy": "2021-04-16T19:35:58.355503Z", "iopub.status.idle": "2021-04-16T19:35:58.357268Z", "shell.execute_reply": "2021-04-16T19:35:58.357642Z" } }, "outputs": [], "source": [ "# Solution\n", "\n", "# For this definition of \"biased\", the data are \n", "# very slightly in favor of the fair hypothesis." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bayesian Hypothesis Testing\n", "\n", "What we've done so far in this chapter is sometimes called \"Bayesian hypothesis testing\" in contrast with [statistical hypothesis testing](https://en.wikipedia.org/wiki/Statistical_hypothesis_testing).\n", "\n", "In statistical hypothesis testing, we compute a p-value, which is hard to define concisely, and use it to determine whether the results are \"statistically significant\", which is also hard to define concisely.\n", "\n", "The Bayesian alternative is to report the Bayes factor, $K$, which summarizes the strength of the evidence in favor of one hypothesis or the other.\n", "\n", "Some people think it is better to report $K$ than a posterior probability because $K$ does not depend on a prior probability.\n", "But as we saw in this example, $K$ often depends on a precise definition of the hypotheses, which can be just as controversial as a prior probability.\n", "\n", "In my opinion, Bayesian hypothesis testing is better because it measures the strength of the evidence on a continuum, rather that trying to make a binary determination.\n", "But it doesn't solve what I think is the fundamental problem, which is that hypothesis testing is not asking the question we really care about." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To see why, suppose you test the coin and decide that it is biased after all. What can you do with this answer? In my opinion, not much.\n", "In contrast, there are two questions I think are more useful (and therefore more meaningful):\n", "\n", "* Prediction: Based on what we know about the coin, what should we expect to happen in the future?\n", "\n", "* Decision-making: Can we use those predictions to make better decisions?\n", "\n", "At this point, we've seen a few examples of prediction. For example, in <<_PoissonProcesses>> we used the posterior distribution of goal-scoring rates to predict the outcome of soccer games.\n", "\n", "And we've seen one previous example of decision analysis: In <<_DecisionAnalysis>> we used the distribution of prices to choose an optimal bid on *The Price is Right*.\n", "\n", "So let's finish this chapter with another example of Bayesian decision analysis, the Bayesian Bandit strategy." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bayesian Bandits\n", "\n", "If you have ever been to a casino, you have probably seen a slot machine, which is sometimes called a \"one-armed bandit\" because it has a handle like an arm and the ability to take money like a bandit.\n", "\n", "The Bayesian Bandit strategy is named after one-armed bandits because it solves a problem based on a simplified version of a slot machine.\n", "\n", "Suppose that each time you play a slot machine, there is a fixed probability that you win. And suppose that different machines give you different probabilities of winning, but you don't know what the probabilities are.\n", "\n", "Initially, you have the same prior belief about each of the machines, so you have no reason to prefer one over the others. But if you play each machine a few times, you can use the results to estimate the probabilities. And you can use the estimated probabilities to decide which machine to play next.\n", "\n", "At a high level, that's the Bayesian bandit strategy. Now let's see the details." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prior Beliefs\n", "\n", "If we know nothing about the probability of winning, we can start with a uniform prior." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.362415Z", "iopub.status.busy": "2021-04-16T19:35:58.361811Z", "iopub.status.idle": "2021-04-16T19:35:58.364588Z", "shell.execute_reply": "2021-04-16T19:35:58.364200Z" }, "tags": [ "remove-output" ] }, "outputs": [ { "data": { "text/plain": [ "101" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xs = np.linspace(0, 1, 101)\n", "prior = Pmf(1, xs)\n", "prior.normalize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Supposing we are choosing from four slot machines, I'll make four copies of the prior, one for each machine." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.368917Z", "iopub.status.busy": "2021-04-16T19:35:58.368277Z", "iopub.status.idle": "2021-04-16T19:35:58.372099Z", "shell.execute_reply": "2021-04-16T19:35:58.372588Z" } }, "outputs": [], "source": [ "beliefs = [prior.copy() for i in range(4)]" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "This function displays four distributions in a grid." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.378500Z", "iopub.status.busy": "2021-04-16T19:35:58.377897Z", "iopub.status.idle": "2021-04-16T19:35:58.379963Z", "shell.execute_reply": "2021-04-16T19:35:58.380451Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", "options = dict(xticklabels='invisible', yticklabels='invisible')\n", "\n", "def plot(beliefs, **options):\n", " for i, pmf in enumerate(beliefs):\n", " plt.subplot(2, 2, i+1)\n", " pmf.plot(label='Machine %s' % i)\n", " decorate(yticklabels=[])\n", " \n", " if i in [0, 2]:\n", " decorate(ylabel='PDF')\n", " \n", " if i in [2, 3]:\n", " decorate(xlabel='Probability of winning')\n", " \n", " plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's what the prior distributions look like for the four machines." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:58.416688Z", "iopub.status.busy": "2021-04-16T19:35:58.402941Z", "iopub.status.idle": "2021-04-16T19:35:59.013473Z", "shell.execute_reply": "2021-04-16T19:35:59.013020Z" }, "scrolled": false }, "outputs": [ { "data": { "image/png": "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6MZYRDBlyhQ/ce8jrJN8jKRObFATjEWXD9frvsV/z3wMd73aoCRJhWSDUlVFBB/96Ef7Hvf09NDQ0MDZZ589otdrampi69atrxt/9913c8MNN4w4Z69XXnmFD3zgA0yfPp0TTzyRq6++etSvKZUz3uoE4P3vfz8zZszgxBNPZNGiRezatWvUr2mDUlUddNBBbNy4kVdffRWAe++9l6OOOmrMl9PW1jZmzWTJkiVs2rSJRx55hB//+Md873vfG5PXlfZkPNbJN7/5TR577DE2btxId3c33/rWt0b9mjYoVd3cuXO55557AFi1ahXnn39+37T29nZmzZrFSSedxKxZs3jyyScB2LVrF0uWLKG5uZmWlhaWL1/e95zly5czc+ZMmpub2bRpEwArV67ksssuA+Diiy9m8eLFzJo1i2nTpnH77bf3PffGG2/klFNOoaWlhWuvvfZ1Wd/whjdw5plnArD//vszc+ZMurq6xniNSK83nuoE4I1vfCNQ+rb32muvjclxPE8zn6A+vOz28jON0OrPzN/r9PPOO4/rr7+es88+mw0bNrBw4UIeeOABAKZPn866deuoq6vjvvvu45prrmH16tWsWLGCZ555hkceeYS6ujqef/75vtebOnUqDz/8MDfffDM33XQTt9566+uW+eyzz/Lggw+yadMm2tramD9/PmvWrKGzs5P29nZSSrS1tbFu3TrOOOOMIXP//ve/5zvf+Q5XXHHFKNaOxhPrZHh1ctZZZ9He3s7cuXOZP3/v768SNihVXUtLC5s3b2bVqlXMmzdvwLTt27dz0UUX0dnZSUSwc+dOAO677z4WLVpEXV1pkz388MP7nvOhD30IgJNPPpk77rhjyGWee+657Lfffpxwwgk899xzAKxZs4Y1a9Zw0kknAfDSSy/R2dk5ZOH19PRw/vnns3jxYqZNmzbKNSCVNx7r5Ac/+AE7duxgwYIF/OhHP+J973vfqNaBDUo10dbWxpIlS1i7di3btm3rG79s2TLOPPNM7rzzTjZv3szs2bOB0o/89rTL4IADDgBg0qRJ9PT07HWe3tfq/e/SpUv5xCc+UTbvpZdeytve9jauvPLKSt6eNCbGW51A6WoRbW1tfPvb37ZBaWTK7V7I28KFCzn00ENpbm5m7dq1feO3b9/edzB45cqVfePnzJnDLbfcwuzZs/t2XfT/dDgSZ511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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot(beliefs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Update\n", "\n", "Each time we play a machine, we can use the outcome to update our beliefs. The following function does the update." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.016676Z", "iopub.status.busy": "2021-04-16T19:35:59.016156Z", "iopub.status.idle": "2021-04-16T19:35:59.017869Z", "shell.execute_reply": "2021-04-16T19:35:59.018210Z" } }, "outputs": [], "source": [ "likelihood = {\n", " 'W': xs,\n", " 'L': 1 - xs\n", "}" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.022657Z", "iopub.status.busy": "2021-04-16T19:35:59.022046Z", "iopub.status.idle": "2021-04-16T19:35:59.024564Z", "shell.execute_reply": "2021-04-16T19:35:59.024066Z" } }, "outputs": [], "source": [ "def update(pmf, data):\n", " \"\"\"Update the probability of winning.\"\"\"\n", " pmf *= likelihood[data]\n", " pmf.normalize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This function updates the prior distribution in place.\n", "`pmf` is a `Pmf` that represents the prior distribution of `x`, which is the probability of winning.\n", "\n", "`data` is a string, either `W` if the outcome is a win or `L` if the outcome is a loss.\n", "\n", "The likelihood of the data is either `xs` or `1-xs`, depending on the outcome.\n", "\n", "Suppose we choose a machine, play 10 times, and win once. We can compute the posterior distribution of `x`, based on this outcome, like this:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.028218Z", "iopub.status.busy": "2021-04-16T19:35:59.027687Z", "iopub.status.idle": "2021-04-16T19:35:59.030098Z", "shell.execute_reply": "2021-04-16T19:35:59.029565Z" }, "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "np.random.seed(17)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.042870Z", "iopub.status.busy": "2021-04-16T19:35:59.042257Z", "iopub.status.idle": "2021-04-16T19:35:59.044114Z", "shell.execute_reply": "2021-04-16T19:35:59.044493Z" } }, "outputs": [], "source": [ "bandit = prior.copy()\n", "\n", "for outcome in 'WLLLLLLLLL':\n", " update(bandit, outcome)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's what the posterior looks like." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.067179Z", "iopub.status.busy": "2021-04-16T19:35:59.058633Z", "iopub.status.idle": "2021-04-16T19:35:59.174296Z", "shell.execute_reply": "2021-04-16T19:35:59.173745Z" }, "scrolled": true, "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "bandit.plot()\n", "decorate(xlabel='Probability of winning',\n", " ylabel='PDF',\n", " title='Posterior distribution, nine losses, one win')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multiple Bandits" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now suppose we have four machines with these probabilities:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.177407Z", "iopub.status.busy": "2021-04-16T19:35:59.176903Z", "iopub.status.idle": "2021-04-16T19:35:59.180228Z", "shell.execute_reply": "2021-04-16T19:35:59.179776Z" } }, "outputs": [], "source": [ "actual_probs = [0.10, 0.20, 0.30, 0.40]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remember that as a player, we don't know these probabilities.\n", "\n", "The following function takes the index of a machine, simulates playing the machine once, and returns the outcome, `W` or `L`." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.184112Z", "iopub.status.busy": "2021-04-16T19:35:59.183689Z", "iopub.status.idle": "2021-04-16T19:35:59.186969Z", "shell.execute_reply": "2021-04-16T19:35:59.186469Z" } }, "outputs": [], "source": [ "from collections import Counter\n", "\n", "# count how many times we've played each machine\n", "counter = Counter()\n", "\n", "def play(i):\n", " \"\"\"Play machine i.\n", " \n", " i: index of the machine to play\n", " \n", " returns: string 'W' or 'L'\n", " \"\"\"\n", " counter[i] += 1\n", " p = actual_probs[i]\n", " if np.random.random() < p:\n", " return 'W'\n", " else:\n", " return 'L'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`counter` is a `Counter`, which is a kind of dictionary we'll use to keep track of how many times each machine is played.\n", "\n", "Here's a test that plays each machine 10 times." ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.214098Z", "iopub.status.busy": "2021-04-16T19:35:59.213601Z", "iopub.status.idle": "2021-04-16T19:35:59.215958Z", "shell.execute_reply": "2021-04-16T19:35:59.215585Z" } }, "outputs": [], "source": [ "for i in range(4):\n", " for _ in range(10):\n", " outcome = play(i)\n", " update(beliefs[i], outcome)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each time through the inner loop, we play one machine and update our beliefs.\n", "\n", "Here's what our posterior beliefs look like." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.228398Z", "iopub.status.busy": "2021-04-16T19:35:59.227960Z", "iopub.status.idle": "2021-04-16T19:35:59.826737Z", "shell.execute_reply": "2021-04-16T19:35:59.827463Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABXYElEQVR4nO2dd3xUdbr/P98p6YVUCAkhEAhJIAmEUEIHlW5ADCr2RdfVe13LXtcV97ru6sv9uVfvvXtX13Vd18WKDRUQpUkJPQQSkpBCekhI7z2Zyff3x5mcmaFkJsnMnDOT5/165cV8z5zyzHCeec73+T6Fcc5BEARBEHJDIbUABEEQBHEjyEARBEEQsoQMFEEQBCFLyEARBEEQsoQMFEEQBCFLVLa+oL+/Pw8LC7P1ZQlCEs6fP1/POQ8Y6nGkJ8Ro4mZ6YnMDFRYWhrS0NFtfliAkgTFWNpzjSE+I0cTN9IRcfARBEIQssfkMSu5otf2oqGtDRX0bXNRKTAj0QsAYNzDGpBaNIGRDb58W5TUtqG7sgKebEyaO88YYDxepxSIcDDJQOrTafhw6X4Ivj+Siub3b6L3wYB8kL43CnMggMlTEqKa7V4PdJy9j14nL6O7VGL03c8pYbF4WhciJ/hJJRzgaZKAAtHb04I+fnERBReMN3y+qbMKfPjuFeVHBeHJTAtxc1DaW0DL09fWhoqIC3d3dpncmhoSLiwtCQkKgVtvnvWEOV+vb8OqHJ1Db3HHD9zMKa5BRWIO186fgodWxUCntcwWB9MR6DFVPRr2Bamztwh+2H0dFXau4zcvdGVODfdHVq8HlK43QaLUAgLO5lbjybiteemgRAn3cpRJ52FRUVMDT0xNhYWE0E7QgnHM0NDSgoqICkyZNklocq1BW3YI/bD+Olg79j7a/txsmBY1Bc3s3CiuawCHU9fzhTCGKrzbjxfsXwN3VSSqRhw3piXUYjp6MagPVp9Hi/316SjRODAx3rYjCxkXT4KRWAgCa2rrxxeEcHEwrBgBcbWjDH7YfxyuPLIWfl6tksg+H7u5uUjorwBiDn58f6urqpBbFKrR09ODVj06IxkmtUuKRtXFYER8GpW6WdLW+DR/tz8K5vKsAgLzyerz2yUn87qHFcHGyr58Z0hPrMBw9sc85uIX4+EAWiq82AQAUCgWe2TwXdy2PFo0TAPh4uuDxDfF4dvM8URmrG9vxyvbj6Ozuk0TukUBKZx0c9XvlnOOtnefQ1NYFAHB1VuP3Dy/GbXMmi/oAAOP9PfGbexNx320zxG355Q34r89OQ6vtt7ncI8VR/z+lZqjf66g1UBcuV2Pv6UJx/PDqWCyKnXDT/RfFTsCv75kPhUL4yirqWvHWznOgdiWEI/PDmSKkF1SL41/dNe+mQRCMMWxaEomta2eK2y4W1WDHT5esLSbhoIxKA6XR9uNfP1wUx3Mix2Pt/HCTx82JHI8n75gtjlPzruLb4/lWkdFRYYzhgQceEMcajQYBAQFYv379sM4XFhaG+vr667bv3r0br7/++rDlNOT8+fOIiYnBlClT8NRTT42ah5LWjh58flhvXDYsjEB8xDiTx61LnILkZVHi+Nvj+TiTU2kVGR0Ve9ST3/72t5gwYQI8PDwscj5glBqo/anFuNrQBkBwWTyxcbbZU8+lMydiXeIUcbzjpxyUVDVbQ0yHxN3dHdnZ2ejqElxGBw8eRHBwsMWvk5SUhBdeeMEi53riiSfw3nvvoaCgAAUFBdi3b59Fzit3vjySK7qxg/w8cK+B+84U96yINjJmf/vuPJraKCrOXOxRT26//XakpqZa5FwDjDoD1dHViy+P5Ijj5KWR8HZ3HtI5HlwVi6khvgCA/v5+/GXnOfRptBaV05FZs2YN9u7dCwDYsWMHtmzZIr6XmpqKBQsWYNasWViwYAHy84UZqlarxXPPPYeYmBjExsbirbfeEo956623EB8fj5iYGOTl5QEAtm/fjieffBIA8PDDD+Opp57CggULMHnyZHz99dfisW+88QbmzJmD2NhYvPzyy9fJWlVVhdbWViQmJoIxhgcffBDfffedxb8TuVFZ34b9qUXi+MFVQwsbZ4zh6eS5YiBRe1cv/r77wqiZfVoCe9ITAJg/fz6CgoIs+h3YV3iNBTiYVoL2rl4AQOAYd6PZkLmolAr88s45+I+/HkKfRsio35mSj3tWRFtaXKtx50tfm95pmOx8NXnQ9++55x688sorWL9+PTIzM7F161YcP34cABAZGYmUlBSoVCocOnQIL774Inbu3In33nsPJSUlSE9Ph0qlQmOjPmfN398fFy5cwDvvvIM333wT77///nXXrKqqwokTJ5CXl4ekpCQkJyfjwIEDKCgoQGpqKjjnSEpKQkpKCpYsWSIeV1lZiZCQEHEcEhKCykrHd1ftOnEZ/TpjMmNSIOZEDv2Hx8PVCU9umoM/bE8BAJzLu4oTmVewOC7UorJaE9IT8/TEWtjEQDHGHgPwGACEhkp3c2q0/UaBEcnLIqFWKQc54uYE+3vigZUx+OCHDADAtyn5WBoXiiA/y/lfHZXY2FiUlpZix44dWLt2rdF7LS0teOihh1BQUADGGPr6BBfToUOH8Pjjj0OlEm5ZX19f8ZhNmzYBAGbPno1vvvnmhtfcuHEjFAoFoqOjUVNTAwA4cOAADhw4gFmzZgEA2tvbUVBQYKR4N3rit1aEl1z0pKmtG0cz9LU7714RNezPHBseiNVzw7FPNxvbvi8T8RHj7DI/ytbYk55YC5u4+Djn73HOEzjnCQEBQ+48YDFOZF5Boy5c1tvdBYtjR/YjsGZeOMKDfQAAGq0W/9ybQS4MM0lKSsJzzz1n5LYAgJdeegnLly9HdnY29uzZI2bzc85v+iPp7Cy4aJVKJTQazaD7DJxr4N9t27YhIyMDGRkZKCwsxCOPPGJ0XEhICCoqKsRxRUUFxo8fP8RPax5y0ZMfzxSKoeFTQ3wRNcLSRffdNgM+noKrr7m9G58fzjFxBDGAveiJtRg1Lj7OOfacKhDHaxPDjfKdhoNCwfCL2+Pxm3cPg4MjvaAaaflVmBNpnR8wS2LKvWBttm7dCm9vb8TExODo0aPi9paWFnExePv27eL2lStX4t1338WyZctE14Xh0+FwWLVqFV566SXcd9998PDwQGVlJdRqNQIDA8V9goKC4OnpiTNnzmDevHn46KOP8Mtf/nJE15UzvX1a7EstFsdJCyNGPGN0c1Hj4TWx+N8vzwIAfjxThNvmTEZooNeIzmsLSE/M0xNrMWqCJEqqmlFa3QxAyIRfNWeyRc4bHuyDlXP15/poXxY0dpiYaGtCQkLw9NNPX7f9+eefx7Zt27Bw4UJotfrAk0cffRShoaGIjY1FXFwcPvvssxHLsHLlStx7771ITExETEwMkpOT0dbWdt1+f/vb3/Doo49iypQpCA8Px5o1a0Z8bbmSmnsVHd36Ndr50ZaJHFs4IwQxk4UfNA6Oj/ZlWuS8jo496cnzzz+PkJAQdHZ2IiQkBL///e9HfG1ma5dUQkICl6IR2z/2pIt+8CVxoXg6ea7Fzt3S0YN//9996OoR/MCPrp+FNfNM51XZmtzcXERFRZnekRgWN/p+GWPnOecJQz2XVHryh+0pyCyqBQBsuXU6kpda7n4prWrGc+/8JNbs+91DixE3ZazFzm8pSE+sy1D0ZFTMoHr7tEjJLBfHK+LDLHp+b3dn3Lk0Uhx/cThHNFYEYS/UNnUgq0iok8bAsGzmRIuePyxoDJbH68/50f4sWrMlBmVUGKjUvKtiwmHgGHfMmGT5Beh186cgYIwbAKCts8dovYsg7IGjGWXi7CZuSiD8vd0sfo0tt0wX135Lq5txMrvCxBHEaGZUGKjjF/Wzp+XxE60SJuykVuLu5fo8qN0nC9DW2WPx64wUemK1Dvb+vXLOkWKkJ2FWuY6vlyvWJ04Vx5//dEmWxWTt/f9Trgz1e3V4A9XZ3Yf0whpxPNLQ8sFYOnMiQgKEyKSunj58d/yy1a41HFxcXNDQ0EDKZ2EG+ty4uNhvy/PymlZUNbQDAJzVKsy1YiTqhkURYtPPqoZ2o5wrOUB6Yh2GoycOH2aell8lPqGFjRtj1URahYLhnlui8ebnZwAAP5wtRNKiiCGXUrIWAzk9jtq3SEoGOoXaK6cu6V1tCZFBI07BGAwPVydsWBSBHYeEQrRfHc3F0pkTZdOBl/TEegxVTxzeQJ028HEnzrB8scVrmR8djInjxqCsuhm9fVrsPnEZD6yKsfp1zUGtVjtsx1diZJy5pC/flDjd+nqybv4U7DlZgPauXtQ1d+JYRhlumS2Pe5P0RD7I45HFSnT19OFCgd69lzjd+k+4jDHctVwfQvnD2UK0dMhvLYogBrhS2yp2lXZSKxE/1XRLjZHi6qzGhkUR4viro7mUP0hch0MbqAsFNdDokthCx3oj2N/TJtedFzUeE8eNASCEuO85Ka+1KIIwxLBXU3xEEJxt1KJ9zbxweOhq8tU1dxoFMxEE4OgG6nKV+HpulO3KDzHGsHmZPi/qx7NFYgV1gpAb5/P1ejLPhnri6qxG0kL9LGpnSh76+ykwgdDjsAaKc44Ll/WtqhOmWbZPiSnmRweLEX3dvRr8cKbQxBEEYXtaOnpQWNEEQEjOnTXVtpUd1swLN4roMwzWIAiHNVBFlU1o1a39eLk7Y4qu6ritYIwZVZf4/lQhVZcgZEdGQbWYnBsR6gtPN9tGnLq5qLF2vr4n285jeRTeTYg4rIFKM5g9xUeMs1oPn8FYOCME43yFsPaO7l4cOFdicxkIYjDOX6MnUrA+cQqc1cK6V3lNC9IMXI7E6MZhDZTh+lN8hG3dewMolQqjSKU9pwqoNTwhG7TafqQXGLjBJdITTzdnrDLoCPBNSj7NoggADmqgWjp6UFQp+NUVjGFmuPX7ltyM5bMmis3amtq6cCRdXlnzxOiloKJRrFHp6+mKieO8JZPl9gVTodQl6l6+0oCc0nrJZCHkg0MaqOwSfQb41Am+kraXVquUuH2BvvbYrhOXKVKJkAWZxbXi67gpYyVxgw/g6+WK5QbV079JyZNMFkI+OKSByjSovTfQJE1KVs6ZJEYqVTe247RB3glBSEVWsf5BLk5CL8MAGxdPA4NgJDMKa1BS1SytQITkOKaBKjJ4MpSB4rk6q7F2nj5S6dsUilQipKW7V4P8Kw3iOEYGehLk54H5BmWWvj2eL6E0hBxwOANV3diO2uYOAELZlogJfhJLJLA2cQrUKqEAZ0lVs5ERJQhbk1NaLxZRnhDojTEe8qjEvmnJNPH1qawKscI6MTpxOAOVZfDDPz0sQDYVkr3dnXGrQTFMejokpCSrWF5ehgEmj/dBrE4eDk6NP0c58vj1tiAXDQxUrIwUDwCSFk6FQrcQnVVci8KKRoklIkYrhjN4Obj3DLljsT7B/fCFUjS3d0soDSElDmWgOOdG4alyCJAwJNDHHQti9BXVvz1BRWQJ29Pe1Yuy6hYAQhpG9ER/iSUyJmZyAMJ1lV/6NFr8cJrKhI1WHMpAXW1oR0uH8LTl5qLGxLHS5XXcjE0GT4dnL1Wisr5NQmmI0UhuWb1Y3mjS+DFihKlcYIzhjsX6tagfU4vEfC1idOFQBuqSQf5TVKg/FArp8jpuxsRx3pil67fDwbGLZlGEjTH0MkwPC5BQkpszLypY7H7d2d2Hg2lUJmw04lAGykjxJslT8QAYPR0ezShDQ2uXhNIQo41LpfoHuegwebn3BlAoGDYu0usJlQkbndjEQDHGHmOMpTHG0urq6kwfMAyE9Sf9uafLVPEA4UdhIPxdq+3H9xSpRMA2etLV04eSq83C9cAQJbP1J0OWzgw1KhN2lMqEjTpsYqA45+9xzhM45wkBAdaZ2dQ0dYgzEWe1CpOCxljlOpbgWh/7/tRiamhI2ERPcssa0K9LEg8d5y12tJUj15UJO0llwkYbDuPiyzVw70VN9BMLT8qVOZFBmKBraNjTRw0NCduQW2a4/iTf2dMAhmXCqhqoTNhoY9BfccbYAYPX26wvzvDJMVC8KDtQPMYY7jDImt97uhDdvRoJJSJGA4YGSs7uvQFcnamh4WjG1DTD0M+w2ZqCjJT8cn1dsahQ+SseACyKmYCAMW4AhNwUilQirIlG249CXRsawD4MFACsmz8FTmqhTFhZdbNRk0XCsTFloOziUaWts0fMJ1IoFDZv7z5clEqF0VrUrhOXKVKJsBrFV5vE+2usjzt8POVRf88UXu7OWJmgb2hIs6jRgykDNZkxtpsxtsfgtfhnCwHNIc9g9hQ+fgycnVQSSjM0ls8Ko4aGhE3ILdPrSaSdzJ4GuH2hcUNDw55vhONi6pd8g8HrN60pyEgwdO9Fhsqjerm5OKmV2LAoAtt/vAhAaNS2Ij5MNkVuCcfBnvXE39sNK2aF4WBaMQDg66N5sitlRlieQX8FOefHBv4A5ADIuWabLDB8MpxmZ4oHALclTIKnmzMAoK65EykXyyWWiHA0OOfILdcHSNjbDAoA7lgyTSy2nF1Si7wyagvv6JiK4mOMsZcZY/UA8gBcZozVMcZ+ZxvxTNOn0drlwq8hLk4qo3yPncfyxF49BGEJqhs70NrRA0CoUzkhwFNiiYbOWB93LJkZKo6/OJIjoTSELTDlR3oGwCIAczjnfpxzHwDzACxkjD1rbeHMofhqMzRaYeF3nK+HbBqvDZU188Lh7iIkTVY3ttMsirAohrONyFA/MCa/OpXmcOeSSLEtfGZRrZHbknA8TBmoBwFs4ZyL8c+c82IA9+vekxzDttURE3wllGRkuLmocftC/Szqa5pFERYk/4q+95g9usEHGO/vicVxE8TxF4dpFuXImDJQas75dY5eznkdAFnU6DdSPJm0dx8ua+eFi1nz1Y3tOEazKMJCGD7I2bueJC+LEmdRF4tqaC3KgTFloAYrECeL4nGXy+07QMIQd1cnbFgUIY6/PJIDDc2iiBHS1dOHKzWtAIQCsVND7NfTAADB18yidvxEsyhHxZSBimOMtTLG2nR/rQNjADG2EHAw6ls60dimLxAbGuglsUQjZ938KWIBz7rmThy+UCqtQITdU1DRJDYoDB3nDRc7yhO8GXctjzaK6MsqrjVxBGGPmAozV3LOvTjnnro/L4Ox5C4+wwTdqSG+si8Qaw6uzmpsNKgu8eWRXPT2UXUJYvjklRsHSDgCQX4eWDZrojj+7NAlqi7hgJgKM3dhjD3DGHtb16tGVo9el4386vbttjBk7bxwMRqxqa2LKp0TI+Ky0Tqt4+jJ5mVRRtUlzuVVSSwRYWlMTTk+BJAAIAvAWgD/bXWJhkB+uV7xIhzkyRAAnJ1U2LwsShx/k5KPDuoXRQwDzrmRgYqw8wAJQwJ93LFmbrg4/uxgNvWLcjBMGahozvn9nPO/A0gGsNgGMplFb58WJdXN4tiRngwB4NaESRjn6wEA6OjuxbfH8yWWiLBHKuvb0NEtPNx4ujljnK+7xBJZlk1LI+GsFhw7V+pacTSDalk6EqYMVN/AC865rJoVFV9tEvOExvt5iqWCHAWVUoEtt0wXx3tOFaKuuVNCiQh75Fr3nr0m6N4Mb3dno8jXzw5dor5qDoS5UXwDkXuxBlF9rbYQ8GYY5j9FhDrW7GmAhTEhCNe1DtFotfjsULbEEhH2hqGBmupgXoYBNiyKMOoIsPvkZYklIiyFuVF8A5F7KoPXksZ0GwZIRNh5XsfNYIzhoVWx4jjlYjkKKhoHOYIgjHGkBN2b4eKkwj0rosXxd8cvo6G1S0KJCEtht3HZlx2ogsRgTJ8UgLmR48XxP/dmUDgtYRad3Y6VoDsYK+LDEDrWGwDQ06fBJweyJJaIsAR2aaCuS9DV3ZiOyoOrY8Vw2oKKRiokS5hFQUWjwyXo3gyFgmHr2jhxnHKx3MjLQtgndmmgDNefpob4QqFwrIXfawny80CSQTuOj/ZnUdg5YZJ8B80TvBkxkwMxPzpYHP/j+wwKO7dz7NJAGdXfGwWKBwB3Lo0UF4Kb27vxOVVxJkxglP/kwO49Qx5cHQu1SglAiPTdf65YYomIkWCXBsqoxYYDJegOhquzGj8zcGH8eKYIxVebBjmCGM1cm6Br74WUzWWsjzs2LdGXCvvsUDaa2rollIgYCXZnoHr7tCiuahbHo2UGBQALpgcjNjwQAMDB8ddvz1PPKOKGVNQZJ+gG+XlILJHtuGPxNPHzdnb34f29GdIKRAwbmxgoXR2/NMZYWl1d3YjOVWSQoBvs73gJuoPBGMPP188SXRil1c3YRTkfDoMl9cQwQMCeO+gOB7VKiV8kxYvjM5cqcCanUkKJiOFiEwPFOX+Pc57AOU8ICAgY0bnyHKj/03AY7++Ju5br6/R9eSQXFXWS5kwTFsJaemLPnaaHS8zkQKyIDxPH/9iTjrbOHukEIoaF3bn48suNnwxHIxsWRiBs3BgAQJ9Gi7/sPEeuPsIIw/Wn0aonD62OFbsCNLd34x/fZ0grEDFk7MpAcc6NAyQcOEF3MJRKBZ66c46YG1VU2YSdKXkSS0XIhbbOHnFWrVAoMCV49M2gAMDD1cnI1Xcy6wpOZF2RUCJiqNiVgapu7EBrhzBNd3dxQkiAp8QSScfEcd5G5V2+OpKLvLL6QY4gRguGs6fJQWPgpFZKKI20zI0aj+WzwsTx33dfQG1Th3QCEUPCrgxUrsEPcIQDVmYeKhsXTRPX4fo5x5+/TkU7JfCOegz1ZJqDFlIeClvXxiFgjBsAIarvf79KhYZc4naBXRmonFK94kWH+UsoiTxQKBieSZ4LNxc1AKCuuRNvf5NGtfpGOTkGBipqIumJm4saz26eB4XugfbylQZ8epA6A9gDdmWgDJ8Mo0nxAAhdRf9t42xxfC7vKq1HjWJ6+7QorNQncEeHjSwa0FGYFuqHLbfq+6vtPnkZJ7MrJJSIMAe7MVCNrV2obmwHIOQ5DPRJIoDE6SG43aBW3+eHcpCWXyWhRIRUFFQ0GuUJeruPnjxBU9yxeBoSpgWJ479+k4ZSg6R/Qn7YjYEydFtMDfEVk1UJgftXxohPyxwc//PFWZRVt0gsFWFrLpXqE3xp9mQMYwxP3TkH43yFKhM9fRr88ZOTVApJxtiPgaL1p0FRKRV47p754mJwT58Gr318AvUt1CZ+NGHkBic9uQ53Vyf85r4FcHUW1m0bWrvwx09OoqunT2LJiBthNwaK1p9M4+3ujG33LxT7/jS0duHVD09QBv0oQaPtR365PsScAiRuTGigF3511zwwCEETxVeb8KfPTqNPo5VYMuJa7MJANbd3o7xGcFcpFIpRWeLIXCaO9cbzWxLFJN6Kula8+tEJ6h81CiisaERPnwYAEDDGTZxNE9cTHzEOjyXNEsdZxbX47y/OUvi5zLALA5VVVCu+jgjxdejOoJYgbspYPHXnHPEJsaiyCX/48DjlSDk4GQZ6EjM5UEJJ7IOVcybjnlv0kX3n8q7if8hIyQq7MFAZRTXi67gppHjmsChmAh7foC/zUlTZhJf+eQyNrV0SSkVYk0wjPRkroST2Q/LSSGxYGCGOz+ZW4o8fn0R3r0ZCqYgBZG+gOOfILNQ/GcaFk+KZy60Jk4xqkZXXtOC3/ziKK7VU/dzR6OjqRYGuxBEDQyzNoMyCMYYHVsUgycBIXSyqwcsfpFB0nwyQvYGqqGtDY5vw1O/mosYUyn8aEivnTMZTd84Rs+hrmzuw7b0juHC5WmLJCEtyqbQe/boKImFB3vCi/CezYYzhwVUxuGu5vrZlYWUjfvPuTyihPClJkb2ByjT0q08KFBf/CfNZOnMifnPfAjirhbW7rp4+/PHjk9jx0yX091NZJEfgYqHevTeT3HtDhjGGu1dE4+frZ4lrtw2tXXjh70fw0/kSKh8mEbL/tT9vUBFhoN05MXQSpgXhtZ8vg5+XKwAhmffro7l46Z/HxAodhH3COcf5y4Z6QgZquKyeF44XH9Cnami0Wrzz3Xm8+cVZSteQAFkbqLbOHmQV62dQCZFBg+xNmGJS0Bj81xO3YMYkvaHPK6/Hr94+hN0nL1PTQzulqLIJdc1CQrabi5oSdEdIfMQ4/NcTt2BCgJe47cylCjz1lwM4frGcZlM2RNYGKjX3quhXnxriC39vyusYKWM8XPDyw4tx1/JocV2qp0+DD/dl4rm//YQMA1cRYR+cvlQpvp4TOR4qcoOPmGB/T7z++ArcOnuSuK21owd//joVv/sgBcVXmwY5mrAUsr6TTxlUG14wI0RCSRwLhULwt//xseVGT4nlNS149cPjePmDFGSX1NGToh3AOSc9sRIuTio8sXE2tt2/EL6eruL2nNI6/PpvP+GNz89QvUsrI9uM17bOHmQW6wtfJk4nxbM0U0N88ea/34pdJy7j62O56O0TSr1kl9Qiu6QW4cE+WDd/ChKnh4zqrqxypvhqM2qbhQ6xrs5qxNE6rcVJmBaE6KdW4vPDl/DjmSLRq3PmUgXOXKpAbHgg1sybgtkR4yiIy8LI1kAdzShHf7+wJjI1xJfKtlgJlVKBO5dGYvmsifj8cA6OXCgVFbCosgl/2XkO7+/NQOL0ECycEYLpkwLIhSQjDp0vEV/PiQyiKv9Wws1Fja1rZ2LlnMn49EA2UvOuiu9lFtUis6gWPp6uWDgjBAtjQjA1hDp+WwJZGqjePi2+O54vjpfNnCihNKMDXy9X/NvG2di0ZBq+TcnH0YxyaLTCjKqzuw8/nS/BT+dL4OaiRmz4WMRODkB0WABCAjxJESWivqUTP10oFccr4sMkk2W0EBLghd/ctwDFV5uw81gezuZcBYfwQNfU1oXvTxfg+9MF8HZ3wcypYxE7ORCRE/0w1sed9GQYyNJAHTpfguZ2IYvbx9OVFM+GjPP1wBMbZ+Pe22bojFKpURh6Z3ef6NoAhCfLyUE+CBvnjQmBXhjv74Fxvh7w8XQhhbQyu07oIy8jJvhhxiTq/2QrJo/3wa+3JKKmqQMHzxXj8IUytHToK0+0dHTjWEYZjmWUAQC83J0RPl7Qk5AAvZ54ujmRngyC7AxUdkkdvjicI443Loqg9Q8J8HZ3xqYlkbhj8TRcvtKIE1lXcC7vqhjOPEBnd5+4ZmWISqmEn5cLfDxdMcbDGV7uzvB0dYK7qxPcnFVwdVbD2UkJZ7UKTioFnNRKqFRKqBQMKqUCSqUCCsagUDAoGKBgDIwxMCYkVTJAVOwB/ZZC0RkgybrD8YvlOHBO797bvCyKfugkYKyPO+5fGYMtt0xHVkkdTmZdQVp+FVo7jHOmWjt6kF5QjfQC4wouTmol/L3c4OPpAi93Z3i7O8PDzQnuLmq4u6jh4qyGs1oJZ7USTiqloCdKhaAjCgal7l+FTjcG9ESh0OkG5KEnCgOZhoJsDBTnHDtT8vD5oRxxyuzt7oLbEiaZOJKwJowxTAv1w7RQP2xdG4fy2lZkFtXiUkkd8q80XKeIA2i0WtQ0daCmqcPGEtuW2PBAvPzwEptdr7dPi3/9eBEHzhWL28KDfTBrKiXnSolSqcDMKWMxc8pY9PdzFF1twsWiGuSW1iP/SuNNGyL29mlxtaENVxvabCyxbVkzbwoeXT9zyMfZxEAxxh4D8BgAhIaG3nCfqoZ2fH00TzROXu7OeH7LfDhTaw3ZwBjDxLHemDjWG7cvmArOOeqaO1Fc1YzymhZU1LWhurEd1Q0d6Oim1h5DxRw9yStvMDJOQX4eeCZ5Ls2eZIRCwTA1xBdTQ3yBpcLD99WGdpRcbcaV2lZU1LXiakM7aps6qGq6CWzy6885fw/AewCQkJBww+Sa8f6e+Pn6mXjnu/OIDPXHr+6eJ5blIeQJYwyBPu4I9HHH/Ohgo/e6evrQ0NqFprZutLT3oKWjB+1dvejs7kNnTx+6ejTo7tWgt0+LXo0WvZp+aLX90Gj7oe3vh0bLoe3vR38/Rz/n4Bxi3cCBKEPOIT7QGGLL9C2lwnLuPXP0JDY8EBsWRmDXyctInB6Cf9s4G24uaovJQFgexhiC/T0R7O9ptJ1zjo5uvZ60dvSgtaMHbQZ60t2rRU+vBj19WlFX+vs5NKKu3FhPOLioB3LQk+E+P8lqerIiPgwuzmrMi6JseHvH1VmNkAA1QgwSgQnLcO9tMxAe4osF04Np5mTHMMbg4eoED1cnTBzrLbU4skRWBooxhoWUCU8Qg6JSKkhPiFEBTVMIgiAIWcJsXW+NMVYHoMzEbv4A6m0gjilIDmNIDmPMkWMi53zICUqkJ8OC5DDGnuS4oZ7Y3ECZA2MsjXOeQHKQHCSHfK9PcpAc1paDXHwEQRCELCEDRRAEQcgSuRqo96QWQAfJYQzJYYzUckh9/QFIDmNIDmOGLYcs16AIgiAIQq4zKIIgCGKUQwaKIAiCkCWSGSjG2GrGWD5jrJAx9sIN3meMsb/o3s9kjMVLJMd9uutnMsZOMcbirCGHObIY7DeHMaZljCVLJQdjbBljLIMxdokxdkwKORhj3oyxPYyxizo5fmYFGT5gjNUyxrJv8r5V71PSk6HJYbCfVXXEXFlIT8T3h3efcs5t/gdACaAIwGQATgAuAoi+Zp+1AH6E0NJkPoCzEsmxAICP7vUaa8hhriwG+x0G8AOAZIm+kzEAcgCE6saBEsnxIoA/6V4HAGgE4GRhOZYAiAeQfZP3rXafkp7IU0eG8J2QnozwPpVqBjUXQCHnvJhz3gvgcwAbrtlnA4CPuMAZAGMYY0G2loNzfopz3qQbngFgrSJo5nwnAPBLADsB1N7gPVvJcS+Abzjn5QDAObeGLObIwQF4MsYYAA8IimfR/gWc8xTdeW+GNe9T0pMhyqHD2jpiriykJ3qGdZ9KZaCCAVwxGFfotg11H1vIYcgjEJ4CrIFJWRhjwQDuAPCulWQwSw4AEQB8GGNHGWPnGWMPSiTH2wCiAFwFkAXgac55vxVkGQxr3qekJ0OUw0Y6YpYsID0xZFj3qVTVzG/UI+DaeHdz9rGFHMKOjC2HoHiLLCzDUGT5M4DfcM61zHptFsyRQwVgNoBbALgCOM0YO8M5v2xjOVYByACwAkA4gIOMseOc81YLymEKa96npCdDl+PPsL6OmCsL6YmeYd2nUhmoCgATDMYhEKz7UPexhRxgjMUCeB/AGs55g4VlGIosCQA+1ymeP4C1jDEN5/w7G8tRAaCec94BoIMxlgIgDoAlFc8cOX4G4HUuOLkLGWMlACIBpFpQDlNY8z4lPRm6HLbQEXNlIT3RM7z71NKLdmYuqKkAFAOYBP3C3vRr9lkH40W1VInkCAVQCGCB1N/JNftvh3WCJMz5TqIA/KTb1w1ANoAZEsjxNwC/170eC6ASgL8VvpMw3Hzx12r3KenJ0OW4Zn+r6MgQvhPSkxHep1a5kcz8MGshPEkUAfitbtvjAB7XvWYA/qp7PwtAgkRyvA+gCcIUOQNAmlTfyTX7WlP5TMoB4NcQIpSyATwj0f/NeAAHdPdHNoD7rSDDDgBVAPogPAU+Ysv7lPREnjpiriykJyO7T6nUEUEQBCFLqJIEQRAEIUvIQBEEQRCyhAwUQRAEIUvIQBEEQRCyhAwUQRAEIUvIQBEEQRCyhAwUQRAEIUvIQBEEQRCyhAwUQRAEIUvIQBEEQRCyhAwUQRAEIUts3m7D39+fh4WF2fqyBCEJ58+fr+ecBwz1ONITYjRxMz2xuYEKCwtDWlqarS9LEJLAGCsbznGkJ8Ro4mZ6Qi4+giAIQpZI1VGXsDKNrV04m3sVl680oLG1G4wBft6umDbBD/Oig+Ht7iy1iAQxIqob23EquwKl1S1oauuGs1oJf283xIYHImFaEJzUSqlFJEYIGSgHo6qhHZ8duoTT2RXguL7X19H0Mry3Ox1LZoZiyy3TETDGTQIpCWL4XKltxYf7MpFeUH3D9w+mFcPFSYUNiyKQtDACLk70M2ev0P+cg8A5x+6TBfj0UDa02v7B9wXHsYwynMquwMOrY7Fq7mQwxmwkKUEMD845vj6Why8P56DfRKPV7l4Nvjicg0NpJfjVXfMQOdHf7Ov09fWhoqIC3d3dIxWZuAYXFxeEhIRArVabtT8ZKAegp1eDP3+VitS8q0bbp4cFYF50MIL8PAAAlfVtOHOpEnnl9QCAPo0W//g+Hbnl9XjyjgSoVeQSIeRJT68Gf/kmDWcuVYjbGBjiI8ZhTmQQAn3c0dOnRVFlE05kXUF1YzsAoKG1Cy99kIKHV8diXeIUs65VUVEBT09PhIWF0YObBeGco6GhARUVFZg0aZJZx5CBsnO6evrwx09OIae0TtwWHuyDR9fNRMQEP6N94yPG4fYFU3GppA7v781AeU0LAOBE5hV0dPXh+S2J5LcnZEdvnxavf3YKmUW14rZpoX74xe3xmDjO22jfuVHjcfeKaBxJL8VH+7PQ3tWL/v5+fPBDBjq6e7F5WZRJo9Pd3U3GyQowxuDn54e6ujrTO+ugKD47prdPi1c/OmFknNYlTsEff778OuNkyPRJAfjTL1bgltn6p5j0gmr8v09PQmPCPUgQtkSr7cf/fHnWyDitnT8Fr25dep1xGkChYLhl9iS8+W+3Ykqwr7j9i8M5+OporlnXJeNkHYb6vZKBslM45/i/neeQX94gbntwVSy2rp0JldL0f6uTWoknNsRj8/JocVtmUS3e3XUB3IR/nyBsxWeHLuGcgev67hXReGTdTCjNuMcDxrjhla1LEBseKG774nAOjlwotYaohBUgA2WnfP5TjpE//qHVsdiwKGJI52CM4Z4V0bjLwEgdSS/FrhOXLSYnQQyXk9kV+O5EvjhOWhiBzcuihnQOZycVtt230MhIvbPrAi6VmO9mkgLGGB544AFxrNFoEBAQgPXr1w/rfGFhYaivr79u++7du/H6668PW05DVq9ejbi4OEyfPh2PP/44tFrtiM9JBsoOySiswc5jeeJ47fwpSFo4NONkyF3Lo7Bs1kRx/OnBbOSVXX8zE4StqGvuxN++Oy+O4yPG4cFVMcNyvTmplfj1PYkIHSu4BPv7+/G/X6WipaPHYvJaGnd3d2RnZ6OrqwsAcPDgQQQHB1v8OklJSXjhhRcscq4vv/wSFy9eRHZ2Nurq6vDVV1+N+JxkoOyMprZu/N/XqWKOU2x4IH62Jm5E52SM4YkNszEtVFi36ucc//PlWbR1yleBCceFc453vktDV08fAGCsjzueSZ47onUhNxc1fvvAQni6CQnqTW1d+PNXZ2Xtzl6zZg327t0LANixYwe2bNkivpeamooFCxZg1qxZWLBgAfLzhZmmVqvFc889h5iYGMTGxuKtt94Sj3nrrbcQHx+PmJgY5OUJD7jbt2/Hk08+CQB4+OGH8dRTT2HBggWYPHkyvv76a/HYN954A3PmzEFsbCxefvnlG8rr5eUFQJjt9fb2WmQdj6L47AjOOf6++wJadU9+3u4ueDp5LhQKC9wISgWe3TwP//HXQ+jo7kVDaxc++OEink6eO+JzE8RQOHCuWAyKYGB46s45cHd1GvF5/b3d8NSdc/DaxycACGuuP5wpGjT8/M6Xvr7peyNl56vJg75/zz334JVXXsH69euRmZmJrVu34vjx4wCAyMhIpKSkQKVS4dChQ3jxxRexc+dOvPfeeygpKUF6ejpUKhUaGxvF8/n7++PChQt455138Oabb+L999+/7ppVVVU4ceIE8vLykJSUhOTkZBw4cAAFBQVITU0F5xxJSUlISUnBkiVLrjt+1apVSE1NxZo1a5CcPPjnMweaQdkRJ7MqjBaMn06egzEeLhY7f8AYN/z7HbPFccrFcqTlV1ns/ARhipaOHnxyMFscb1gUMaQkW1PER4zDHYunieOPD2Than2bxc5vSWJjY1FaWoodO3Zg7dq1Ru+1tLRg8+bNmDFjBp599llcunQJAHDo0CE8/vjjUKmEuYevrz6KcdOmTQCA2bNno7S09IbX3LhxIxQKBaKjo1FTUwMAOHDgAA4cOIBZs2YhPj4eeXl5KCgouOHx+/fvR1VVFXp6enD48OERfX6ADJTd0NbZg398ny6OV86ZjLgpYy1+nXnRwVgUO0Ecv7vrAjq7+yx+HYK4EZ8cyBLvt3G+Hrh7RbSJI4bO3SuixfWoPo0Wf/32vGxdfUlJSXjuueeM3HsA8NJLL2H58uXIzs7Gnj17xKoXnPObutacnQX3plKphEajGXSfgXMN/Ltt2zZkZGQgIyMDhYWFeOSRR24qs4uLC5KSkrBr1y7zP+hNIBefnfDpwUto7+oFILgqHlwVY7VrPbpuJjKLatHa0YOmti58dTQXD62Otdr1CAIACisacdggBHzr2jirJI6rVUo8deccPP/uYfT39yOvvB5H0suwIj7sun1NueGszdatW+Ht7Y2YmBgcPXpU3N7S0iIGTWzfvl3cvnLlSrz77rtYtmyZ6OIznEUNh1WrVuGll17CfffdBw8PD1RWVkKtViMwUB8Z2d7ejra2NgQFBUGj0eCHH37A4sWLR3RdgGZQdkFhRSMOpZWI40fXz4Srs3m1rIaDp5uzUeDF96cLcaW21WrXIwjOOT7anyWO50SOx+xpQVa73qSgMdiwcKo4/nBfpiyDgkJCQvD0009ft/3555/Htm3bsHDhQqNw7kcffRShoaGIjY1FXFwcPvvssxHLsHLlStx7771ITExETEwMkpOT0dZm7Bbt6OhAUlKSeN3AwEA8/vjjI742s/XUNiEhgVMjNvPhnGPbe0dQUCEsds6OCMKLDyy0yXV/90GKWKUiNjwQv3toMWXYDxHG2HnOecJQjxttenLhcrUYvKBgDP/31EqM9/e06jV7ejV4+q0DqGvuBADcljAZj2+IR25uLqKihpZvRZjPjb7fm+kJzaBkzqlLlaJxUioV+NnakYWUmwtjDI+umwmFziBlFtUivaDGJtcmRhecc6PAiNvmTLa6cQKEJN5H1s0Ux4fSSlBW3WL16xLmQwZKxvRptPj0gN7tsX7+FLEyuS2YOM7bqF7fR/uz0N8vz8Vkwn45k1OJsupmAEJS7VCrRYyEhGlBmKkLNuLg+NePF212bcI0ZKBkzP7UYtQ0dQAA3F2csGlppM1luHtFNJzVQizNldoWHM0os7kMhOPCOceXR/QFXNfNnwIfT8ulTpiCMYaH1sSJnoKs4lr09GllG9Vn7wz1eyUDJVO6ezXYmaIvZ7R5eRQ8LJCsOFR8PF2wcbG+jNKXR3Ko4jlhMVJzr4ptX5zUStw+gpJdwyU00Au3zZksjivqO1FfX09GysIM9INycTH/AYTCzGXKD2cKxYoRfl6uWD13sokjrEfSwgj8cKYIbZ09qGvuxKG0EqyeFy6ZPIRjwDk3eghbMzcc3u7OgxxhPe5eEY2j6WXo6dPgi5MVGOvrfsPiqsTIGOioay5koGRIR1cvvjuuryi+eVmUpN1uXZxU2LRkGj7clwkA+PpYHlbEh1FzQ2JEZJfUoaiyCYCQm5Q0xGr8lsTb3RkbFkXgyyM56Oztxz8OluKvz66mLtMSQy4+GfJjahE6uoWk3LE+7lh+gwRCW7N6bjh8PF0BCIU2DxrkZRHEcDBs67J81kSLlu0aDkkLp8JLN4NraO3CofOlkspDkIGSHd29Guw5qa9zlbwsyqwGhNbGSa00qmH23fF89GlG3u+FGJ2UVbcgvaAagFAQdiTtYiyFq7Mam5boA5F2HstDbx/d41Ii/S8fYcS+s0ViSaOAMW5YEhcqsUR6bkuYBG934Sm3sa0LR9Ipoo8YHntO6R/C5kWPt2n6xGCsmjPZyFOw/1yxxBKNbshAyYjePi12G8yeNi2JlMXsaQAntdKoa+83KXnQUkQfMURaOnpwPPOKOJbD7GkAJ7USdxqkc3ybko+e3hsXViWsj01+/RhjjzHG0hhjaXV18m61LCVH0kvR0iFUJfbzcsVygy63cmHV3MliuHtdcydOZVeYOIIgjDlwrhgaXf248GAfREwYWTFTS3Pr7DD46mZRLR3dtN4qITYxUJzz9zjnCZzzhICAAFtc0u7QavuNFo1vXxghywgiFyeVUYO3b47nU74IYTYabT/2p+rdZrcnTpVdfUe1Sok7lhist564TGtREiEf/9Eo53ROpVg1wsPVCbclTDJxhHSsmRcuVpcor2nB+cvVEkvkGIwGT8OZnEo0tXUBAHw8XZE4w/ycGFty6+xJRmtRh87TLEoKyEDJAM45vjueL45XzwuHi5N8U9Q83ZyNDOhug5kfMXxGg6fBcPZ0W8IkWa2xGuKkVmKjwXrrd8fzqYKKBMjz7hhlZJfUoaSqGYDgXlg7f8rgB8iA2xdOhUIh3D6XSutQqKu4ThA3o6ymRWzfolAoZO0lAAQDapgXlXKxXGKJRh9koGTA7pP6GciK+DDJyr0MBX9vNyw0cM/sNggbJogbYTh7mhc1Hr5erhJKYxpnJxXWJ+qbGn6TkkfV/G0MGSiJKa9txYXL+oTF9Ynynz0NYBhyfjq7ArW6NTSCuJbuXg2OGVTCt5dajqvnToabi9C9uqqhHadzKiWWaHRBBkpi9hjMnuZEBtmkUZulmBQ0BjGTAwEA/Zxj7+lCiSUi5MqJzCvo1uUTjffzxPQwf4klMg93Vyesmas3pt8cy6OoVRtCBkpCWjp6kHLRIGFRwmKZw+X2BXoXyKHzJejs7pNQGkKuHEjTu/dWzp0su9DywVi3YKqY8lFa3YyMQuosbSvIQEnI/tQio4TFyFA/iSUaOvER4zDeT5j1dfdq8NOFUmkFImRH8dUmsWq5SqnEspnyKd9lDt7uxlGr36TkD7I3YUnIQElEn0aLfWf1T5VJCyLs6qlyAMYYbl+on0XtPV1AC8mEEYaVGBKnB8PTTf5BQNdy+wJ91GpOaR0uX2mQWKLRARkoiTiReUUsa+Tr6Yr504Mllmj4LI0LNSp/lJp3VWKJCLnQ3asxqrsn99DymxHo445FMfqoVcN+bYT1IAMlAZxzfG8QULBmfrhsExbNwdlJhVUGLbMpWIIY4HR2Bbp6hHXJ8X6eiLaT4IgbsdGg3czZ3EpcqW2VUJrRgf3+KtoxOaX1KK1uBiAk5trrU6Uhq+aFG7lAiq82SSwRIQcOGpQIumV2mF26sQeYONYbsyOCxPEuqqBidchAScD3Bkmty2ZOtEuf/LX4ebki0cBN+T3NokY9V2pbkV8urNUoFAosk2F1/qGyyaCIbEpmOepbOiWUxvEhA2Vjapo6cC6vShyvs6PEXFMYhpyfyLqC5vZuCaUhpOawQUTn3MggyVu6W4LIif6Ypou21Wr7yZ1tZQY1UIyxAwavt1lfHMfnxzOF4BCi3OLCx2JCoJfEElmOqSG+mBoi9PbRXtNWgRhdaLT9OGpQOWJFfJh0wlgYw7bw+1OLxQ7YhOUxNYMyLKm82ZqCjAa6evpw6HypOHak2dMA6w1mUftSi9CnoT46o5G0/Cq0dvQAEKJUZ00dJ7FElmN2xDhMCBAeLHv6NNiXWiSxRI6LKQNFCS0W5Eh6mVFEU3yE4yjtAPOjg8VupK0dPTiZRR13RyOHDR7Els+aCIXCfoMjroUxZtTQcO/pQmpoaCVMGajJjLHdjLE9Bq/FP1sI6ChwzvHDGePQcnuOaLoZKqXCqBDonlMFVLtslNHQ2iUWQAaAFbPDpBPGSiyMmQB/bzcAwoPYYaqgYhVMGagNAP4bwJsGrw3/CDM5f7kaVQ3tAAA3F7VD+eSvZeWcSUa1y3LL6iWWiLAlR9PLxHXW6WEBGOfrIbFElkelVCBpoUFDwxP50FJDQ4szqIHinB8b+AOQAyDnmm2Emew9rQ8tvyU+TNYdc0eKp5szlsbp661RpNPogXNuNJu4xQFnTwPcMjvMqILKyWxyZ1saU1F8jDH2MmOsHkAegMuMsTrG2O9sI55jUF7bisyiWgBCz6c1dtAxd6SsNQgAOZtzlXpFjRJySutR3aj3FCRODzFxhP3i4qQyCnSiVhyWx5SL7xkAiwDM4Zz7cc59AMwDsJAx9qy1hXMU9hok5s6NGo+xPu4SSmMbJo71Rmy40CuKw3j9jXBcDKvZL4qZACe1UjphbMDa+VPgrBa8IVfqWo1yHImRY8pAPQhgC+dcrFfCOS8GcL/uPcIErR09OHaxXByvX+D4s6cB1iUa9ooqFSMYCceko6sXpwzcXLc48DrrAB6uTlg1V1+H8psUmkVZElMGSs05v26Fm3NeB0BtHZEciwNpxWIu0OTxPoiaaL/FMofKbINeUV09fTh8oczEEYQ9czK7QrzXQ8d6IzzYR2KJbMPtC6ZCpRRmigUVjaI7nxg5pgzUYCnSlD5tgmt7Pt2+YKpDhpbfDMaYkY+eekU5NocMCsPeOnvSqLnXfb1cjYJBdh7Lk04YB8OUgYpjjLUyxtp0f60DYwAxthDQnjmReQVNbV0AAB9PVyyY4bgLxjdj2ayJYqRTTVMHzuZWSiwRYQ3KqlvErrlKpQJL4iZILJFt2bgoQqzmf6m0jlIrLISpMHMl59yLc+6p+/MyGJOLbxA459htEByx1s57Pg0Xl2t6Re0x+E4Ix8Fw9jQvyj675o6EQB93I6P85ZEcCaVxHEyFmbswxp5hjL3NGHuMMea4yTsW5mJRLcprWgAAzmoVVhr8SI82Vs8Lh1JnnPPLG6hdtoPR26c1KgzrCP3NhsOdSyLBILg1M4tqxVYjxPAx9Uj/IYAEAFkA1oKqR5jNrhP54mvDhL7RiK+XKxbH6p8uqdGbY3EmpxKd3UKEZuAYd8RMDjBxhGMy3t8Tiw1mUV8dzZVQGsfAlIGK5pzfzzn/O4BkAIttIJPdU1LVbJSYu3YUJOaaImmBvizM2ZyruFrfJqE0hCU5mGbQNTfBvrvmjpTkZVHiLCq9oJpmUSPElIESE1c45xory+IwfGcwe5o/PRhBfo5Xi2yoTBznLbZc4OC0FuUgVNa3Iae0DgCgYAwrZoVJK5DEBPt7YmGsPhjq88OXJJTG/jE3im8gci/WIKqv1RYC2hu1TR04ZdBi4o7F0wbZe3Sx0eC7OHyhjDruOgAHz+nTKGZPC4Kvl6uE0siDu5ZHG61FXSqpk1gi+8XcKL6ByD2VwWvHaQVrQXaduIx+XSb5jEmBoyZZ0Rymh/mL34dGq6UisnZOb58WR9L1wRGjORDIkGB/TyydpS+WvOOnS1RdYpjYJO5ZFwGYxhhLq6tz3KeJprZuo465m5bQ7MkQxpjRjPLHs0XooHbZdsvpSxViu/OAMW6YNXWsxBLJh83LosS8qNyyeqQX1EgskX1iEwPFOX+Pc57AOU8ICHDcCJ+9pwug0QqlXsKDfcRiqYSe+dHBCPbXlz/6kdpli9jbg9x+A/febQmTR3VwxLWM8/UwCrf/9GA2zaKGwejLHLUSbZ09+PGs/sd205JIUtgbcO0s6vtThejupfgbwL4e5EqqmsUINaVS4dANOIdL8tJIo8adJ7OoX9RQIQNlIb4/rf+hDQnwwryo8RJLJF8Wx4UiYIzQLrutswf7ztIsyt4wbJ8yPzoYPp4uEkojT3y9XHH7An1F/08OZqG3TyuhRPYHGSgL0N7Va7Tgv3lZFM2eBkGlVGDTkkhxvOvkZZpF2RHtXb04nnlFHK+dFy6hNPJm46IIo667P9LD2JAgA2UB9pwqEHsdBft7jsqisENlRXwY/HQhya0dPdifWmziCEIu/HS+VGyrETZuDKaF+kkskXxxd3XCXcujxfHXx3LR2tEjoUT2BRmoEdLa0YPvDZJOk5dFQaGg2ZMprp1FfXs8nxoa2gFabb+Re2/t/HDyFphg1dzJYrJ+Z3cfdvxEybvmQgZqhHx7PN9o7WlRzOhqMzASbpkdZrQWRdUl5M+Z3Kuob+kEAHi6OWNxbKiJIwiVUoEHV8WK44PnSlBa1SydQHYEGagR0NjaZeRTvueWaJo9DQG1Smnk/th9sgBtneT+kDN7TuoL/a6aOxlOaqWE0tgPcyKDEBcu5IlxcLy/N4PCzs2ADNQI+OJwjlE79/nRwRJLZH8sjQs1agv/TUq+iSMIqcgrq0dBRSMAIbR89VwKjjAXxhh+tjbOKHn3qEEVDuLGkIEaJmU1LfjJoGrEfbfNIF/8MFAqFbj3tunieO+ZQlQ3tksoEXEzvjNok7I4dgKFlg+RCYFeuD1R39ngw/1Z5DEwARmoYfLx/ixwCFP0mVPGYuYUKvMyXOZHByNighAJptX249ODtIgsN8prW3Eu76o43riIyngNh7tWRMPfW7/uun1fpsQSyRsyUMPgwuVqpBdUAxD6PRkugBJDhzGGh1bFiONT2VeQW1YvoUTEtXx3XO96nRM5HhMCqVb0cHBxUuGRdTPF8dH0Mly4XC2dQDKHDNQQ6dNo8cEPGeJ4efxETBznLZ1ADkLkRH8kTtfnj73/fQb6+2kRWQ5UNbTj+MVycUxFkEfG3KjxWDBDH+377q7zVDT5JpCBGiJ7ThWgqkFYI3FzUeP+lTEmjiDM5aHVsUa1yw6co+RdOfD1sVyjFjID7lhi+Dy6fiY83ZwBAA2tXfjnDxcllkiekIEaAtWN7fjySK44vmfFdHi7O0sokWMRMMYNdy7VJ+9+eigbja1dEkpEVDW0IyVDP3u6e0WUhNI4Dt7uzvj57bPE8bGMMpzMpmKy10IGykw45/j77gtiWHnoWG+snksN2izNhoURGOerz7r/594MaQUa5Xx++JI4e4qZHIjoMHlXWbcnFs4IwZI4faLzu7vOo6apQ0KJ5IdKagHshaPpZcgsqgUgBEY8kTQT5eVl6O6mtuWW5rGVYXjzmxx09vbjTE4lTl+qMFqfImxDUWUTThgUhb1nRfQgexPD4dF1M5FbVo+65k50dvfhv784g9ceXSa6ukc7ZKDMoLapA+8bPMmvS5wCtbYdnp6eCAsLo/wnC8I5R0NDA7beOglv/yBU6fj77nREhvpT3o0N4Zzjo/1Z4nhu5HhETvSXUCLHxN3VCb+6ax7+85/HoNX2o6iyCf/cexG/SJpFvysgF59J+vs53vomTay3N87XA1tunY7u7m74+fnRTWRhGGPw8/PDWG9nsdp5W2cP3vkujUrD2JBzeVXILhE8BgrGcP8qCgayFhET/PCQYa2+tGLso+r+AMhAmeTLo7nIKRXabysYw9PJc+DiJEw8yThZB8YYGGN4ctMccduFy9XYfZKKydqC7l6NUSrFbXMmI9jfUzqBRgFr54djUaw+9PyDvRmUHwUyUIOSUViDrw2i9jYtjaQQWxsSGx6I9YkGHUkPZCGPEnitzs5jeahrFiqWe7g6YcsttPZkbRhj+PeNCQgP9gEA9HOONz4/jctXGiSWTFrIQN2Eq/Vt+N8vz4rljGZMCsTdy+WlqIwxPPDAA+JYo9EgICAA69evH9b5wsLCUF9/vQHYvXs3Xn/99WHLOUBnZyfWrVuHyMhITJ8+HS+88ILJYx5YFYOpIb4ABpT2jPjjSVie4qtNRjX3HlwVI+brENbFSa3EC/cuEFvQ9PZp8drHJ1EyiltzkIG6AW2dPfjjJyfRrsvu9vF0xbN3zZVdKw13d3dkZ2ejq0vIFTp48CCCgy1fUT0pKcksY2IOzz33HPLy8pCeno6TJ0/ixx9/HHR/lVKB/7h7vtg2u7m9G3/85CQ1N7QCvX1a/OXrc+jv7wcATAv1w4r4MGmFGmX4ernipYcWiw8F7V29+P2/UkatkaIovmvo6unDax+fFKtFqFVK/ObeRIzxuHkE2Z0vfW01eXa+mjzo+2vWrMHevXuRnJyMHTt2YMuWLTh+/DgAIDU1Fc888wy6urrg6uqKf/3rX5g2bRq0Wi1+85vfYP/+/WCM4ec//zl++ctfAgDeeust7NmzB319ffjqq68QGRmJ7du3Iy0tDW+//TYefvhheHl5IS0tDdXV1fiv//ovJCcLMr7xxhv48ssv0dPTgzvuuAN/+MMfjGR1c3PD8uXLAQBOTk6Ij49HRYXp5MSAMW749ZZEvPLhcWi1/SivacHrn57Gbx9YSP2ILMinB7Nxpa4VgPA0/+QdCbTOKgHB/p546cFF+P32FHR296G9qxcv/fMYXrhvAWZMGl15aDSDMqC7V4P/98kpsecNAPzyzjmii0mO3HPPPfj888/R3d2NzMxMzJs3T3wvMjISKSkpSE9PxyuvvIIXX3wRAPDee++hpKQE6enpyMzMxH333Sce4+/vjwsXLuCJJ57Am2++ecNrVlVV4cSJE/j+++/FmdWBAwdQUFCA1NRUZGRk4Pz580hJSbmp3M3NzdizZw9uueUWsz7njEkBeDwpXhxnl9Tizc/PiInTxMg4mV2B70/rg1AeXBWL8RQYIRnhwT54+aHFcHNRAxAenF/58Pio6yFFBkpHe1cvXvnwOC7pIvYA4JF1M7FwhrwTRGNjY1FaWoodO3Zg7dq1Ru+1tLRg8+bNmDFjBp599llcuiS0sTh06BAef/xxqFTCBNrXV2+AN23aBACYPXs2SktLb3jNjRs3QqFQIDo6GjU1NQAEA3XgwAHMmjUL8fHxyMvLQ0HBjaPuNBoNtmzZgqeeegqTJ5tfjWNFfBjuvXWGOD5/uQqvfUzuvpFSVt2Cv36TJo4TpgVRlRQZMCXEF69uXQofTyHdQqvtx1vfnMM/92aMmgczcvFBCIj402enUaFzbwBCA8K186cMcpQeU244a5OUlITnnnsOR48eRUODPurnpZdewvLly/Htt9+itLQUy5YtAyAkYd7MdePsLPi+lUolNBrNoPsMnGvg323btuEXv/iFSXkfe+wxTJ06Fc8884w5H8+IO5dGoqdXg50peQCArOJa/Of7gvtjYHGZMJ+apg68+tEJ9PTp8/yeunMOufZkQljQGPzx58vw2scnxd+nH84UIqe0Hs9snuvwbU9G/QzqTE4lfvP3w0bGaevamdi0JHKQo+TF1q1b8bvf/Q4xMcbJlC0tLWLQxPbt28XtK1euxLvvvisaoMbGRoyUVatW4YMPPkB7u7B2V1lZidra2uv2+8///E+0tLTgz3/+87CvteXW6dhyq74Lb2l1M379t58ob2SIVDe24w//SkFTmxBk4+qsxvNbEuGuC0gh5EGgjzte/8VyzI0cL24rrW7Gf7xzCDt+uoSe3hs/SDoCo9ZAtXT04P++TsUbO06js1twEamUSjyTPBfrEs2bOcmFkJAQPP3009dtf/7557Ft2zYsXLgQWq3eJfDoo48iNDQUsbGxiIuLw2effTZiGVauXIl7770XiYmJiImJQXJyMtra2oz2qaiowGuvvYacnBzEx8dj5syZeP/994d8LcYYkpdG4YkNs6FUCrdwW2cPXvv4BN7ddYHaaJtB8dUm/PYfR8XipCqlEtvuW0C9zWSKq7Maz9+biK1rZ0KlFAKDtNp+fH00F//+5/04cK7YId1+zNblYxISEnhaWprpHa1EV08ffjxbhG9S8o3WLvy8XPH8lkRMMTMgIjc3F1FR1HrAWpj7/eaV1eONz8+guV1ftNfD1QnJy6JwW8IkseqHVDDGznPOE4Z6nLX0hHOOH88W4cN9WdDoHlrUKiWeu2c+EqYFWfx6hOUpq2nBu7suXJfE6+PpitXzJmPFrDD46sqE2Qs305NRYaA45yivbcWRC6U4fKEMHd3G3SuXxIXikXUzxVwbcyADZV2G8v22dPTgvd0XcCan0mi7p5szbp0dhmWzJiIkQBpfvZwMVH55A7bvyzT6YXNzUWPbfQuojYadwTnHT+dL8fnhHNFFOwADw4zJAZgfHYxZEeMw1sddIinN52Z64pBBEv39HDVNHSiuakZuaT3SC6pR3dh+3X7j/Tzx8JpYzKYnR7vG290Zz90zH2dyKvHRvizUNgtuq7bOHnx7PB/fHs9HsL8nZk0dh8iJfpgUNAZjfdxHRSBAfUsnzudX4Uh6mVH6BACEjRuDX909j+rs2SGMMdyaMAmLYidg39kifH+6UDRUHBxZxbXIKhbWgAPGuCFigh8mB41B6FhvBPl5IGCMG1RK+a/wyMpAnb5UgeZ24/UDzjkMJ3n9nKO/n0Pb348+TT/6NFp09mjQ3tWL1o4eNLR0oa6lc1B/7DhfD2xcFIHl8WEj+k8aLBqOGD7DmdUzxpA4PQSzI4Jw+EIpvjuRb1QSqbK+DZX1bWKuj1qlxFgfd/h6ucDL3RnuLk5wc1ZBrVJCrVJAqVBAoWBQGPz/MnZ9gWA/L1fMjRoPW3IorQR9WqHaw4B+DOhDd68GLR09qG/uRHlt63VP1wCgVCqQtGAq7loeTYnOdo6LkwobF0/DusQpOHOpEgfSSsTi1gPUNXeirrkTJ7P0vb0YGLw9nOHt4QJvdye4uzjB1VkFFycVnFRKqFQKqJQKKBVM1AXhOL0ODKiCOb+BoYFemD6MJGNZGajdJwusVhzRWa1CfMQ43DI7DHHhY0dctsjFxQUNDQ3UcsPCDPSDcnEZXu8nJ7USq+eF47aESUgvrMGRC6U4f7n6ugeWPo0WFXWtRtGbwyE2PNDmBurjA1liGa6hoFQqsChmAjYvi0KQn4cVJCOkQq1SYnFcKBbHhaK+pRNnc64ivaAa2SV1N3xY5+Bobu82Wru1JmvmTZGvgWKMPQbgMQAIDQ01sbdl8HJ3xsSx3pg2wQ9RYf6Inuhv0afFkJAQVFRUoK6uzvTOxJBwcXFBSMjIEqSVSgUSpgUhYVoQevu0yC6pQ25ZPS5faURZTYssI/2soSdOaiUiQ/2QMG08FsaEDFqyi3AM/L3dsC5xCtYlToFG24/SqmYUVjahtLoFlfVtqGpoR3Nbt1gIW87IKkhi14nLYtirIYbTSoVCmJ6qlAqoVAqoVQq4Oqnh7qKGl7szfD1dEDDGjXI5iEHp6OpFbXMnmtq60dLejc4eDbp6+9DX1w+NVvjrN3Avc35jdQ729xw0LcEaQRIf7ctEd5/+qVjBGJQKQSdcXVTwcHGCn7crxvl6INjfU3ZFjgnp0Wj7xXu/tbMXnT196OnVoKtHg16NFr2afvRfowf9YlK+QYK+mdebPilg0Ko8dhEksWFRhNQiEKMEd1cnTHJ1wiQ7jI95cHWs6Z0IYhBUSgUCxrjJvvqK/MM4CIIgiFEJGSiCIAhClth8DYoxVgfAVM14fwBy6O1NchhDchhjjhwTOedDDl8iPRkWJIcx9iTHDfXE5gbKHBhjacNZWCY5SI7RJIfU1yc5SA5ry0EuPoIgCEKWkIEiCIIgZIlcDdR7Ugugg+QwhuQwRmo5pL7+ACSHMSSHMcOWQ5ZrUARBEAQh1xkUQRAEMcohA0UQBEHIEskMFGNsNWMsnzFWyBh74QbvM8bYX3TvZzLG4iWS4z7d9TMZY6cYY3HWkMMcWQz2m8MY0zLGkqWSgzG2jDGWwRi7xBg7JoUcjDFvxtgexthFnRw/s4IMHzDGahlj2Td536r3KenJ0OQw2M+qOmKuLKQn4vvDu0+FfjK2/QOgBFAEYDIAJwAXAURfs89aAD9CqBU7H8BZieRYAMBH93qNNeQwVxaD/Q4D+AFAskTfyRgAOQBCdeNAieR4EcCfdK8DADQCcLKwHEsAxAPIvsn7VrtPSU/kqSND+E5IT0Z4n0o1g5oLoJBzXsw57wXwOYAN1+yzAcBHXOAMgDGMMUuX9jQpB+f8FOe8STc8A2BkfSBGIIuOXwLYCaBWQjnuBfAN57wcADjn1pDFHDk4AE/GGAPgAUHxNJYUgnOeojvvzbDmfUp6MkQ5dFhbR8yVhfREz7DuU6kMVDCAKwbjCt22oe5jCzkMeQTCU4A1MCkLYywYwB0A3rWSDGbJASACgA9j7Chj7Dxj7EGJ5HgbQBSAqwCyADzNOe+3giyDYc37lPRkiHLYSEfMkgWkJ4YM6z6Vqt3GjRrUXBvvbs4+tpBD2JGx5RAUb5GFZRiKLH8G8BvOuZZZr4uvOXKoAMwGcAsAVwCnGWNnOOeXbSzHKgAZAFYACAdwkDF2nHM+sja5Q8Oa9ynpydDl+DOsryPmykJ6omdY96lUBqoCwASDcQgE6z7UfWwhBxhjsQDeB7CGc26dnvTmyZIA4HOd4vkDWMsY03DOv7OxHBUA6jnnHQA6GGMpAOIAWFLxzJHjZwBe54KTu5AxVgIgEkCqBeUwhTXvU9KTocthCx0xVxbSEz3Du08tvWhn5oKaCkAxgEnQL+xNv2afdTBeVEuVSI5QAIUAFkj9nVyz/3ZYJ0jCnO8kCsBPun3dAGQDmCGBHH8D8Hvd67EAKgH4W+E7CcPNF3+tdp+Sngxdjmv2t4qODOE7IT0Z4X1qlRvJzA+zFsKTRBGA3+q2PQ7gcd1rBuCvuvezACRIJMf7AJogTJEzAKRJ9Z1cs681lc+kHAB+DSFCKRvAMxL934wHcEB3f2QDuN8KMuwAUAWgD8JT4CO2vE9JT+SpI+bKQnoysvuUSh0RBEEQsoQqSRAEQRCyhAwUQRAEIUvIQBEEQRCyhAwUQRAEIUvIQBEEQRCyhAzUDdBVQc5gjGUzxr5ijLkN4diHGWNvD/F67TfZ/gpj7Fbd66OMsQTd6x8YY2N0f/82lGuZkOMNXbXjN4Z4XAJj7C8juK74OQn7gfSE9MTaUJj5DWCMtXPOPXSvPwVwnnP+PwbvKznn2psc+zCEGP8nh3O9QfY5CuA5znmawbYwAN9zzmeYey0T12gFEMA577HE+QjHhvSE9MTa0AzKNMcBTNH1dTnCGPsMQBZjzIUx9i/GWBZjLF1Xg2yACYyxfboeLS8PbGSMfacrGnmJMfaY4UUYY//NGLvAGPuJMRag27ad3aCfDWOslDHmD+B1AOG6p9g3GGMfM8Y2GOz3KWMs6ZpjmW7fbJ3sd+u27wbgDuDswDaDY7J0T6GMMdYwUPRSd71bdd/N97ptv2dCb5ijjLFixthTuu1hjLFcxtg/dJ//AGPM9drPqftsf9B9F1mMsUjd9gDG2EHd9r8zxsp03wEhD0hPSE8sj7WyrO35D0C77l8VgF0AngCwDEAHgEm69/4DwL90ryMBlANwAfAwhIxqPwgFIrOhy5oG4Kv7d2C7n27MAdyne/07AG/rXm+HLhMewFGD85RCqDMWBoPSIgCWAvhO99obQAkA1TWf7U4AByH0kRmrkzvI8HPf4Pt4F0KpkhkAzgH4h257AYTy/csgPKECwO8BnALgrJOxAYBaJ6sGwEzdfl9Cl9F+zecsBfBL3et/A/C+7vXbALbpXq/WfWcWL9dCf6QnpCfy+aMZ1I1xZYxlAEiDcGP+U7c9lXNeonu9CMDHAMA5zwNQBqG8PgAc5Jw3cM67AHwDfWXnpxhjFyH0y5kAYKpuez+AL3SvP8EwK0Fzzo9BeIoNBLAFwE7O+bV9XxYB2ME513LOawAcAzDHxKmPQ2hItgRCXa8YJrQ1aOSc32hdYC/nvIdzXg+hJ89Y3fYSznmG7vV5CMp4I765wT6LIPS6Aed8H4SyOoS0kJ4YQ3piYaSqZi53ujjnMw03MKE6cofhpkGOv3ZhjzPGlgG4FUAi57yTCb5yFzOPHwofA7gPwD0Att7g/eH0IEgB8O8QCoL+FkK/nWQICnkjDH3zWujvs2u3u5o43vBYq/ZOIIYF6YkxpCcWhmZQwycFwg0OxlgEhJsyX/febYwxX53veCOAkxBcCU06pYuEUNF3AAWEGxkQunCeMFOGNgCe12zbDuAZAOCcX7qJ3HczxpQ6H/4SmCi7zzm/AsENMZVzXqyT7zncXPGswQkAdwEAY2wlAB8bXpsYPqQnpCfDhgzU8HkHgJIxlgXB7fAw10f1nIDwhJYBwX2QBmAfABVjLBPAqxDcFwN0AJjOGDsPoanYK+YIwIWeOyd1C7lv6LbVAMgF8K+bHPYtgEwIZfkPA3iec15txuXOQt/H5jiEbpjm/kBYgj8AWMkYuwBgDYT1izYbXp8YHqQnpCfDhsLMHQwm5KJkAYjnnLdILY+lYIw5A9ByzjWMsUQAf7vWvUQQ5kJ6Yh/QGpQDwYQkvg8A/I8jKZ2OUABfMsYUAHoB/FxieQg7hfTEfqAZFEEQBCFLaA2KIAiCkCVkoAiCIAhZQgaKIAiCkCVkoAiCIAhZQgaKIAiCkCX/Hy0mLa6vkKDsAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot(beliefs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are the actual probabilities, posterior means, and 90% credible intervals." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.834767Z", "iopub.status.busy": "2021-04-16T19:35:59.833729Z", "iopub.status.idle": "2021-04-16T19:35:59.838437Z", "shell.execute_reply": "2021-04-16T19:35:59.838980Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "import pandas as pd\n", "\n", "def summarize_beliefs(beliefs):\n", " \"\"\"Compute means and credible intervals.\n", " \n", " beliefs: sequence of Pmf\n", " \n", " returns: DataFrame\n", " \"\"\"\n", " columns = ['Actual P(win)', \n", " 'Posterior mean', \n", " 'Credible interval']\n", " \n", " df = pd.DataFrame(columns=columns)\n", " for i, b in enumerate(beliefs):\n", " mean = np.round(b.mean(), 3)\n", " ci = b.credible_interval(0.9)\n", " ci = np.round(ci, 3)\n", " df.loc[i] = actual_probs[i], mean, ci\n", " return df" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.866461Z", "iopub.status.busy": "2021-04-16T19:35:59.865346Z", "iopub.status.idle": "2021-04-16T19:35:59.891615Z", "shell.execute_reply": "2021-04-16T19:35:59.891015Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Actual P(win)Posterior meanCredible interval
00.10.250[0.08, 0.47]
10.20.250[0.08, 0.47]
20.30.500[0.27, 0.73]
30.40.417[0.2, 0.65]
\n", "
" ], "text/plain": [ " Actual P(win) Posterior mean Credible interval\n", "0 0.1 0.250 [0.08, 0.47]\n", "1 0.2 0.250 [0.08, 0.47]\n", "2 0.3 0.500 [0.27, 0.73]\n", "3 0.4 0.417 [0.2, 0.65]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "summarize_beliefs(beliefs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We expect the credible intervals to contain the actual probabilities most of the time." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Explore and Exploit\n", "\n", "Based on these posterior distributions, which machine do you think we should play next? One option would be to choose the machine with the highest posterior mean. \n", "\n", "That would not be a bad idea, but it has a drawback: since we have only played each machine a few times, the posterior distributions are wide and overlapping, which means we are not sure which machine is the best; if we focus on one machine too soon, we might choose the wrong machine and play it more than we should.\n", "\n", "To avoid that problem, we could go to the other extreme and play all machines equally until we are confident we have identified the best machine, and then play it exclusively.\n", "\n", "That's not a bad idea either, but it has a drawback: while we are gathering data, we are not making good use of it; until we're sure which machine is the best, we are playing the others more than we should." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Bayesian Bandits strategy avoids both drawbacks by gathering and using data at the same time. In other words, it balances exploration and exploitation.\n", "\n", "The kernel of the idea is called [Thompson sampling](https://en.wikipedia.org/wiki/Thompson_sampling): when we choose a machine, we choose at random so that the probability of choosing each machine is proportional to the probability that it is the best.\n", "\n", "Given the posterior distributions, we can compute the \"probability of superiority\" for each machine.\n", "\n", "Here's one way to do it. We can draw a sample of 1000 values from each posterior distribution, like this:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.897634Z", "iopub.status.busy": "2021-04-16T19:35:59.896107Z", "iopub.status.idle": "2021-04-16T19:35:59.904029Z", "shell.execute_reply": "2021-04-16T19:35:59.903164Z" } }, "outputs": [ { "data": { "text/plain": [ "(4, 1000)" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "samples = np.array([b.choice(1000) \n", " for b in beliefs])\n", "samples.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The result has 4 rows and 1000 columns. We can use `argmax` to find the index of the largest value in each column:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.909255Z", "iopub.status.busy": "2021-04-16T19:35:59.908170Z", "iopub.status.idle": "2021-04-16T19:35:59.916958Z", "shell.execute_reply": "2021-04-16T19:35:59.916095Z" } }, "outputs": [ { "data": { "text/plain": [ "(1000,)" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "indices = np.argmax(samples, axis=0)\n", "indices.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `Pmf` of these indices is the fraction of times each machine yielded the highest values." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.926458Z", "iopub.status.busy": "2021-04-16T19:35:59.925706Z", "iopub.status.idle": "2021-04-16T19:35:59.932359Z", "shell.execute_reply": "2021-04-16T19:35:59.931702Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
probs
00.048
10.043
20.625
30.284
\n", "
" ], "text/plain": [ "0 0.048\n", "1 0.043\n", "2 0.625\n", "3 0.284\n", "Name: , dtype: float64" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pmf = Pmf.from_seq(indices)\n", "pmf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These fractions approximate the probability of superiority for each machine. So we could choose the next machine by choosing a value from this `Pmf`." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.938638Z", "iopub.status.busy": "2021-04-16T19:35:59.936984Z", "iopub.status.idle": "2021-04-16T19:35:59.941814Z", "shell.execute_reply": "2021-04-16T19:35:59.942478Z" } }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pmf.choice()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But that's a lot of work to choose a single value, and it's not really necessary, because there's a shortcut.\n", "\n", "If we draw a single random value from each posterior distribution and select the machine that yields the highest value, it turns out that we'll select each machine in proportion to its probability of superiority.\n", "\n", "That's what the following function does." ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.949635Z", "iopub.status.busy": "2021-04-16T19:35:59.948833Z", "iopub.status.idle": "2021-04-16T19:35:59.950888Z", "shell.execute_reply": "2021-04-16T19:35:59.950296Z" } }, "outputs": [], "source": [ "def choose(beliefs):\n", " \"\"\"Use Thompson sampling to choose a machine.\n", " \n", " Draws a single sample from each distribution.\n", " \n", " returns: index of the machine that yielded the highest value\n", " \"\"\"\n", " ps = [b.choice() for b in beliefs]\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 yielded the highest value.\n", "\n", "Here's an example." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.958607Z", "iopub.status.busy": "2021-04-16T19:35:59.957868Z", "iopub.status.idle": "2021-04-16T19:35:59.960724Z", "shell.execute_reply": "2021-04-16T19:35:59.959178Z" } }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "choose(beliefs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Strategy\n", "\n", "Putting it all together, the following function chooses a machine, plays once, and updates `beliefs`:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.965882Z", "iopub.status.busy": "2021-04-16T19:35:59.965161Z", "iopub.status.idle": "2021-04-16T19:35:59.971103Z", "shell.execute_reply": "2021-04-16T19:35:59.970557Z" } }, "outputs": [], "source": [ "def choose_play_update(beliefs):\n", " \"\"\"Choose a machine, play it, and update beliefs.\"\"\"\n", " \n", " # choose a machine\n", " machine = choose(beliefs)\n", " \n", " # play it\n", " outcome = play(machine)\n", " \n", " # update beliefs\n", " update(beliefs[machine], outcome)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To test it out, let's start again with a fresh set of beliefs and an empty `Counter`." ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.976029Z", "iopub.status.busy": "2021-04-16T19:35:59.975106Z", "iopub.status.idle": "2021-04-16T19:35:59.978061Z", "shell.execute_reply": "2021-04-16T19:35:59.978970Z" } }, "outputs": [], "source": [ "beliefs = [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 `beliefs` gets updated:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:35:59.982092Z", "iopub.status.busy": "2021-04-16T19:35:59.981421Z", "iopub.status.idle": "2021-04-16T19:36:00.969027Z", "shell.execute_reply": "2021-04-16T19:36:00.969685Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "num_plays = 100\n", "\n", "for i in range(num_plays):\n", " choose_play_update(beliefs)\n", " \n", "plot(beliefs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following table summarizes the results." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:00.997808Z", "iopub.status.busy": "2021-04-16T19:36:00.997037Z", "iopub.status.idle": "2021-04-16T19:36:01.000101Z", "shell.execute_reply": "2021-04-16T19:36:01.000816Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Actual P(win)Posterior meanCredible interval
00.10.107[0.0, 0.31]
10.20.269[0.14, 0.42]
20.30.293[0.18, 0.41]
30.40.438[0.3, 0.58]
\n", "
" ], "text/plain": [ " Actual P(win) Posterior mean Credible interval\n", "0 0.1 0.107 [0.0, 0.31]\n", "1 0.2 0.269 [0.14, 0.42]\n", "2 0.3 0.293 [0.18, 0.41]\n", "3 0.4 0.438 [0.3, 0.58]" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "summarize_beliefs(beliefs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The credible intervals usually contain the actual probabilities of winning.\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", "More importantly, let's see how many times each machine got played. " ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.007207Z", "iopub.status.busy": "2021-04-16T19:36:01.006002Z", "iopub.status.idle": "2021-04-16T19:36:01.012730Z", "shell.execute_reply": "2021-04-16T19:36:01.011748Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "def summarize_counter(counter):\n", " \"\"\"Report the number of times each machine was played.\n", " \n", " counter: Collections.Counter\n", " \n", " returns: DataFrame\n", " \"\"\"\n", " index = range(4)\n", " columns = ['Actual P(win)', 'Times played']\n", " df = pd.DataFrame(index=index, columns=columns)\n", " for i, count in counter.items():\n", " df.loc[i] = actual_probs[i], count\n", " return df" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.028250Z", "iopub.status.busy": "2021-04-16T19:36:01.026782Z", "iopub.status.idle": "2021-04-16T19:36:01.031917Z", "shell.execute_reply": "2021-04-16T19:36:01.029480Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Actual P(win)Times played
00.17
10.224
20.339
30.430
\n", "
" ], "text/plain": [ " Actual P(win) Times played\n", "0 0.1 7\n", "1 0.2 24\n", "2 0.3 39\n", "3 0.4 30" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "summarize_counter(counter)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If things go according to plan, the machines with higher probabilities should get played more often." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Summary\n", "\n", "In this chapter we finally solved the Euro problem, determining whether the data support the hypothesis that the coin is fair or biased. We found that the answer depends on how we define \"biased\". And we summarized the results using a Bayes factor, which quantifies the strength of the evidence.\n", "\n", "But the answer wasn't satisfying because, in my opinion, the question wasn't interesting. Knowing whether the coin is biased is not useful unless it helps us make better predictions and better decisions.\n", "\n", "As an example of a more interesting question, we looked at the \"one-armed bandit\" problem and a strategy for solving it, the Bayesian bandit algorithm, which tries to balance exploration and exploitation, that is, gathering more information and making the best use of the information we have.\n", "\n", "As an exercise, you'll have a chance to explore adaptive strategies for standardized testing.\n", "\n", "Bayesian bandits and adaptive testing are examples of [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, often by choosing an action that minimizes the costs we expect on average (or maximizes a benefit).\n", "\n", "The strategy we used in <<_MaximizingExpectedGain>> to bid on *The Price is Right* is another example.\n", "\n", "These strategies demonstrate what I think is 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 make that knowledge actionable." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercises\n", "\n", "**Exercise:** Standardized tests like the [SAT](https://en.wikipedia.org/wiki/SAT) are often used as part of the admission process at colleges and universities.\n", "The goal of the SAT is to measure the academic preparation of the test-takers; if it is accurate, their scores should reflect their actual ability in the domain of the test.\n", "\n", "Until recently, tests like the SAT were taken with paper and pencil, but now students have the option of taking the test online. In the online format, it is possible for the test to be \"adaptive\", which means that it can [choose each question based on responses to previous questions](https://www.nytimes.com/2018/04/05/education/learning/tests-act-sat.html).\n", "\n", "If a student gets the first few questions right, the test can challenge them with harder questions. If they are struggling, it can give them easier questions.\n", "Adaptive testing has the potential to be more \"efficient\", meaning that with the same number of questions an adaptive test could measure the ability of a tester more precisely.\n", "\n", "To see whether this is true, we will develop a model of an adaptive test and quantify the precision of its measurements.\n", "\n", "Details of this exercise are in the notebook." ] }, { "cell_type": "markdown", "metadata": { "tags": [ "remove-cell" ] }, "source": [ "## The Model\n", "\n", "The model we'll use is based on [item response theory](https://en.wikipedia.org/wiki/Item_response_theory), which assumes that we can quantify the difficulty of each question and the ability of each test-taker, and that the probability of a correct response is a function of difficulty and ability.\n", "\n", "Specifically, a common assumption is that this function is a three-parameter logistic function:\n", "\n", "$$\\mathrm{p} = c + \\frac{1-c}{1 + e^{-a (\\theta-b)}}$$\n", "\n", "where $\\theta$ is the ability of the test-taker and $b$ is the difficulty of the question.\n", "\n", "$c$ is the lowest probability of getting a question right, supposing the test-taker with the lowest ability tries to answer the hardest question. On a multiple-choice test with four responses, $c$ might be 0.25, which is the probability of getting the right answer by guessing at random.\n", "\n", "$a$ controls the shape of the curve.\n", "\n", "The following function computes the probability of a correct answer, given `ability` and `difficulty`:" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.036525Z", "iopub.status.busy": "2021-04-16T19:36:01.035610Z", "iopub.status.idle": "2021-04-16T19:36:01.043010Z", "shell.execute_reply": "2021-04-16T19:36:01.042192Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "def prob_correct(ability, difficulty):\n", " \"\"\"Probability of a correct response.\"\"\"\n", " a = 100\n", " c = 0.25\n", " x = (ability - difficulty) / a\n", " p = c + (1-c) / (1 + np.exp(-x))\n", " return p" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "I chose `a` to make the range of scores comparable to the SAT, which reports scores from 200 to 800.\n", "\n", "Here's what the logistic curve looks like for a question with difficulty 500 and a range of abilities." ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.051026Z", "iopub.status.busy": "2021-04-16T19:36:01.049832Z", "iopub.status.idle": "2021-04-16T19:36:01.055461Z", "shell.execute_reply": "2021-04-16T19:36:01.054373Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "abilities = np.linspace(100, 900)\n", "diff = 500\n", "ps = prob_correct(abilities, diff)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.065949Z", "iopub.status.busy": "2021-04-16T19:36:01.064663Z", "iopub.status.idle": "2021-04-16T19:36:01.256592Z", "shell.execute_reply": "2021-04-16T19:36:01.257891Z" }, "tags": [ "hide-input", "hide-cell" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(abilities, ps)\n", "decorate(xlabel='Ability',\n", " ylabel='Probability correct',\n", " title='Probability of correct answer, difficulty=500',\n", " ylim=[0, 1.05])" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "Someone with `ability=900` is nearly certain to get the right answer.\n", "Someone with `ability=100` has about a 25% change of getting the right answer by guessing." ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "## Simulating the Test\n", "\n", "To simulate the test, we'll use the same structure we used for the bandit strategy:\n", "\n", "* A function called `play` that simulates a test-taker answering one question.\n", "\n", "* A function called `choose` that chooses the next question to pose.\n", "\n", "* A function called `update` that uses the outcome (a correct response or not) to update the estimate of the test-taker's ability.\n", "\n", "Here's `play`, which takes `ability` and `difficulty` as parameters." ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.265718Z", "iopub.status.busy": "2021-04-16T19:36:01.264868Z", "iopub.status.idle": "2021-04-16T19:36:01.267337Z", "shell.execute_reply": "2021-04-16T19:36:01.268087Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "def play(ability, difficulty):\n", " \"\"\"Simulate a test-taker answering a question.\"\"\"\n", " p = prob_correct(ability, difficulty)\n", " return np.random.random() < p" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "`play` uses `prob_correct` to compute the probability of a correct answer and `np.random.random` to generate a random value between 0 and 1. The return value is `True` for a correct response and `False` otherwise.\n", "\n", "As a test, let's simulate a test-taker with `ability=600` answering a question with `difficulty=500`. The probability of a correct response is about 80%." ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.276639Z", "iopub.status.busy": "2021-04-16T19:36:01.275174Z", "iopub.status.idle": "2021-04-16T19:36:01.278834Z", "shell.execute_reply": "2021-04-16T19:36:01.279603Z" }, "tags": [ "hide-cell" ] }, "outputs": [ { "data": { "text/plain": [ "0.7982939339725037" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prob_correct(600, 500)" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "Suppose this person takes a test with 51 questions, all with the same difficulty, `500`.\n", "We expect them to get about 80% of the questions correct.\n", "\n", "Here's the result of one simulation." ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.282857Z", "iopub.status.busy": "2021-04-16T19:36:01.282096Z", "iopub.status.idle": "2021-04-16T19:36:01.286226Z", "shell.execute_reply": "2021-04-16T19:36:01.287063Z" }, "tags": [ "remove-cell", "hide-cell" ] }, "outputs": [], "source": [ "np.random.seed(18)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.291285Z", "iopub.status.busy": "2021-04-16T19:36:01.290391Z", "iopub.status.idle": "2021-04-16T19:36:01.298808Z", "shell.execute_reply": "2021-04-16T19:36:01.299584Z" }, "tags": [ "hide-cell" ] }, "outputs": [ { "data": { "text/plain": [ "0.803921568627451" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "num_questions = 51\n", "outcomes = [play(600, 500) for _ in range(num_questions)]\n", "np.mean(outcomes)" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "We expect them to get about 80% of the questions right.\n", "\n", "Now let's suppose we don't know the test-taker's ability. We can use the data we just generated to estimate it.\n", "And that's what we'll do next." ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "## The Prior\n", "\n", "The SAT is designed so the distribution of scores is roughly normal, with mean 500 and standard deviation 100.\n", "So the lowest score, 200, is three standard deviations below the mean, and the highest score, 800, is three standard deviations above.\n", "\n", "We could use that distribution as a prior, but it would tend to cut off the low and high ends of the distribution.\n", "Instead, I'll inflate the standard deviation to 300, to leave open the possibility that `ability` can be less than 200 or more than 800.\n", "\n", "Here's a `Pmf` that represents the prior distribution." ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.306918Z", "iopub.status.busy": "2021-04-16T19:36:01.306067Z", "iopub.status.idle": "2021-04-16T19:36:01.319073Z", "shell.execute_reply": "2021-04-16T19:36:01.318203Z" }, "tags": [ "remove-output", "hide-cell" ] }, "outputs": [ { "data": { "text/plain": [ "0.04464186995102338" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.stats import norm\n", "\n", "mean = 500\n", "std = 300\n", "\n", "qs = np.linspace(0, 1000)\n", "ps = norm(mean, std).pdf(qs)\n", "\n", "prior = Pmf(ps, qs)\n", "prior.normalize()" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "And here's what it looks like." ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.327517Z", "iopub.status.busy": "2021-04-16T19:36:01.326687Z", "iopub.status.idle": "2021-04-16T19:36:01.602546Z", "shell.execute_reply": "2021-04-16T19:36:01.602989Z" }, "tags": [ "hide-input", "hide-cell" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "prior.plot(label='std=300', color='C5')\n", "\n", "decorate(xlabel='Ability',\n", " ylabel='PDF',\n", " title='Prior distribution of ability',\n", " ylim=[0, 0.032])" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "## The Update\n", "\n", "The following function takes a prior `Pmf` and the outcome of a single question, and updates the `Pmf` in place." ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.607271Z", "iopub.status.busy": "2021-04-16T19:36:01.606844Z", "iopub.status.idle": "2021-04-16T19:36:01.608679Z", "shell.execute_reply": "2021-04-16T19:36:01.609044Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "def update_ability(pmf, data):\n", " \"\"\"Update the distribution of ability.\"\"\"\n", " difficulty, outcome = data\n", " \n", " abilities = pmf.qs\n", " ps = prob_correct(abilities, difficulty)\n", " \n", " if outcome:\n", " pmf *= ps\n", " else:\n", " pmf *= 1 - ps\n", " \n", " pmf.normalize()" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "`data` is a tuple that contains the difficulty of a question and the outcome: `True` if the response was correct and `False` otherwise.\n", "\n", "As a test, let's do an update based on the outcomes we simulated previously, based on a person with `ability=600` answering 51 questions with `difficulty=500`." ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.654214Z", "iopub.status.busy": "2021-04-16T19:36:01.653478Z", "iopub.status.idle": "2021-04-16T19:36:01.656020Z", "shell.execute_reply": "2021-04-16T19:36:01.655560Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "actual_600 = prior.copy()\n", "\n", "for outcome in outcomes:\n", " data = (500, outcome)\n", " update_ability(actual_600, data)" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "Here's what the posterior distribution looks like." ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.678509Z", "iopub.status.busy": "2021-04-16T19:36:01.663304Z", "iopub.status.idle": "2021-04-16T19:36:01.832256Z", "shell.execute_reply": "2021-04-16T19:36:01.832886Z" }, "tags": [ "hide-cell" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "actual_600.plot(color='C4')\n", "\n", "decorate(xlabel='Ability',\n", " ylabel='PDF',\n", " title='Posterior distribution of ability')" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "The posterior mean is pretty close to the test-taker's actual ability, which is 600." ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.838050Z", "iopub.status.busy": "2021-04-16T19:36:01.837246Z", "iopub.status.idle": "2021-04-16T19:36:01.840157Z", "shell.execute_reply": "2021-04-16T19:36:01.840790Z" }, "tags": [ "hide-cell" ] }, "outputs": [ { "data": { "text/plain": [ "604.3325737356816" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "actual_600.mean()" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "If we run this simulation again, we'll get different results." ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "## Adaptation\n", "\n", "Now let's simulate an adaptive test.\n", "I'll use the following function to choose questions, starting with the simplest strategy: all questions have the same difficulty." ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.844976Z", "iopub.status.busy": "2021-04-16T19:36:01.844147Z", "iopub.status.idle": "2021-04-16T19:36:01.846868Z", "shell.execute_reply": "2021-04-16T19:36:01.846106Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "def choose(i, belief):\n", " \"\"\"Choose the difficulty of the next question.\"\"\"\n", " return 500" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "As parameters, `choose` takes `i`, which is the index of the question, and `belief`, which is a `Pmf` representing the posterior distribution of `ability`, based on responses to previous questions.\n", "\n", "This version of `choose` doesn't use these parameters; they are there so we can test other strategies (see the exercises at the end of the chapter).\n", "\n", "The following function simulates a person taking a test, given that we know their actual ability." ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:01.855382Z", "iopub.status.busy": "2021-04-16T19:36:01.854536Z", "iopub.status.idle": "2021-04-16T19:36:01.859080Z", "shell.execute_reply": "2021-04-16T19:36:01.859755Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "def simulate_test(actual_ability):\n", " \"\"\"Simulate a person taking a test.\"\"\"\n", " belief = prior.copy()\n", " trace = pd.DataFrame(columns=['difficulty', 'outcome'])\n", "\n", " for i in range(num_questions):\n", " difficulty = choose(i, belief)\n", " outcome = play(actual_ability, difficulty)\n", " data = (difficulty, outcome)\n", " update_ability(belief, data)\n", " trace.loc[i] = difficulty, outcome\n", " \n", " return belief, trace" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "The return values are a `Pmf` representing the posterior distribution of ability and a `DataFrame` containing the difficulty of the questions and the outcomes.\n", "\n", "Here's an example, again for a test-taker with `ability=600`." ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:02.065735Z", "iopub.status.busy": "2021-04-16T19:36:01.972864Z", "iopub.status.idle": "2021-04-16T19:36:02.073027Z", "shell.execute_reply": "2021-04-16T19:36:02.073660Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "belief, trace = simulate_test(600)" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "We can use the trace to see how many responses were correct." ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:02.078607Z", "iopub.status.busy": "2021-04-16T19:36:02.077821Z", "iopub.status.idle": "2021-04-16T19:36:02.080643Z", "shell.execute_reply": "2021-04-16T19:36:02.081214Z" }, "tags": [ "hide-cell" ] }, "outputs": [ { "data": { "text/plain": [ "42" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "trace['outcome'].sum()" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "And here's what the posterior looks like." ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:02.102082Z", "iopub.status.busy": "2021-04-16T19:36:02.100560Z", "iopub.status.idle": "2021-04-16T19:36:02.262629Z", "shell.execute_reply": "2021-04-16T19:36:02.262216Z" }, "tags": [ "hide-cell" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "belief.plot(color='C4', label='ability=600')\n", "\n", "decorate(xlabel='Ability',\n", " ylabel='PDF',\n", " title='Posterior distribution of ability')" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "Again, the posterior distribution represents a pretty good estimate of the test-taker's actual ability." ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "## Quantifying Precision\n", "\n", "To quantify the precision of the estimates, I'll use the standard deviation of the posterior distribution. The standard deviation measures the spread of the distribution, so higher value indicates more uncertainty about the ability of the test-taker.\n", "\n", "In the previous example, the standard deviation of the posterior distribution is about 40." ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:02.267364Z", "iopub.status.busy": "2021-04-16T19:36:02.266590Z", "iopub.status.idle": "2021-04-16T19:36:02.270685Z", "shell.execute_reply": "2021-04-16T19:36:02.271080Z" }, "tags": [ "hide-cell" ] }, "outputs": [ { "data": { "text/plain": [ "(618.6942050450824, 40.08554296596485)" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "belief.mean(), belief.std()" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "For an exam where all questions have the same difficulty, the precision of the estimate depends strongly on the ability of the test-taker. To show that, I'll loop through a range of abilities and simulate a test using the version of `choice` that always returns `difficulty=500`." ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:02.629755Z", "iopub.status.busy": "2021-04-16T19:36:02.453372Z", "iopub.status.idle": "2021-04-16T19:36:11.198947Z", "shell.execute_reply": "2021-04-16T19:36:11.198539Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "actual_abilities = np.linspace(200, 800)\n", "results = pd.DataFrame(columns=['ability', 'posterior_std'])\n", "series = pd.Series(index=actual_abilities, dtype=float, name='std')\n", "\n", "for actual_ability in actual_abilities:\n", " belief, trace = simulate_test(actual_ability)\n", " series[actual_ability] = belief.std()" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "The following plot shows the standard deviation of the posterior distribution for one simulation at each level of ability.\n", "\n", "The results are noisy, so I also plot a curve fitted to the data by [local regression](https://en.wikipedia.org/wiki/Local_regression)." ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:11.221079Z", "iopub.status.busy": "2021-04-16T19:36:11.215993Z", "iopub.status.idle": "2021-04-16T19:36:11.368244Z", "shell.execute_reply": "2021-04-16T19:36:11.367858Z" }, "tags": [ "hide-input", "hide-cell" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from utils import plot_series_lowess\n", "\n", "plot_series_lowess(series, 'C1')\n", "\n", "decorate(xlabel='Actual ability',\n", " ylabel='Standard deviation of posterior')" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "The test is most precise for people with ability between `500` and `600`, less precise for people at the high end of the range, and even worse for people at the low end.\n", "\n", "When all the questions have difficulty `500`, a person with `ability=800` has a high probability of getting them right. So when they do, we don't learn very much about them.\n", "\n", "If the test includes questions with a range of difficulty, it provides more information about people at the high and low ends of the range.\n", "\n", "As an exercise at the end of the chapter, you'll have a chance to try out other strategies, including adaptive strategies that choose each question based on previous outcomes." ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "## Discriminatory Power\n", "\n", "In the previous section we used the standard deviation of the posterior distribution to quantify the precision of the estimates. Another way to describe the performance of the test (as opposed to the performance of the test-takers) is to measure \"discriminatory power\", which is the ability of the test to distinguish correctly between test-takers with different ability.\n", "\n", "To measure discriminatory power, I'll simulate a person taking the test 100 times; after each simulation, I'll use the mean of the posterior distribution as their \"score\"." ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:11.372059Z", "iopub.status.busy": "2021-04-16T19:36:11.371637Z", "iopub.status.idle": "2021-04-16T19:36:11.374597Z", "shell.execute_reply": "2021-04-16T19:36:11.374249Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "def sample_posterior(actual_ability, iters):\n", " \"\"\"Simulate multiple tests and compute posterior means.\n", " \n", " actual_ability: number\n", " iters: number of simulated tests\n", " \n", " returns: array of scores\n", " \"\"\"\n", " scores = []\n", "\n", " for i in range(iters):\n", " belief, trace = simulate_test(actual_ability)\n", " score = belief.mean()\n", " scores.append(score)\n", " \n", " return np.array(scores)" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "Here are samples of scores for people with several levels of ability." ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:11.466656Z", "iopub.status.busy": "2021-04-16T19:36:11.457736Z", "iopub.status.idle": "2021-04-16T19:36:25.733528Z", "shell.execute_reply": "2021-04-16T19:36:25.733071Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "sample_500 = sample_posterior(500, iters=100)" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:25.831461Z", "iopub.status.busy": "2021-04-16T19:36:25.740146Z", "iopub.status.idle": "2021-04-16T19:36:40.662218Z", "shell.execute_reply": "2021-04-16T19:36:40.661661Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "sample_600 = sample_posterior(600, iters=100)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:40.901415Z", "iopub.status.busy": "2021-04-16T19:36:40.815282Z", "iopub.status.idle": "2021-04-16T19:36:55.401985Z", "shell.execute_reply": "2021-04-16T19:36:55.401400Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "sample_700 = sample_posterior(700, iters=100)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:36:55.608897Z", "iopub.status.busy": "2021-04-16T19:36:55.579517Z", "iopub.status.idle": "2021-04-16T19:37:09.906444Z", "shell.execute_reply": "2021-04-16T19:37:09.905877Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "sample_800 = sample_posterior(800, iters=100)" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "Here's what the distributions of scores look like." ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:37:09.914937Z", "iopub.status.busy": "2021-04-16T19:37:09.914449Z", "iopub.status.idle": "2021-04-16T19:37:09.916439Z", "shell.execute_reply": "2021-04-16T19:37:09.916075Z" }, "tags": [ "hide-cell" ] }, "outputs": [], "source": [ "from empiricaldist import Cdf\n", "\n", "cdf_500 = Cdf.from_seq(sample_500)\n", "cdf_600 = Cdf.from_seq(sample_600)\n", "cdf_700 = Cdf.from_seq(sample_700)\n", "cdf_800 = Cdf.from_seq(sample_800)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:37:09.950414Z", "iopub.status.busy": "2021-04-16T19:37:09.932705Z", "iopub.status.idle": "2021-04-16T19:37:10.124621Z", "shell.execute_reply": "2021-04-16T19:37:10.124994Z" }, "tags": [ "hide-cell" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "cdf_500.plot(label='ability=500', color='C1',\n", " linestyle='dashed')\n", "cdf_600.plot(label='ability=600', color='C3')\n", "cdf_700.plot(label='ability=700', color='C2',\n", " linestyle='dashed')\n", "cdf_800.plot(label='ability=800', color='C0')\n", "\n", "decorate(xlabel='Test score',\n", " ylabel='CDF',\n", " title='Sampling distribution of test scores')" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "On average, people with higher ability get higher scores, but anyone can have a bad day, or a good day, so there is some overlap between the distributions.\n", "\n", "For people with ability between `500` and `600`, where the precision of the test is highest, the discriminatory power of the test is also high.\n", "\n", "If people with abilities `500` and `600` take the test, it is almost certain that the person with higher ability will get a higher score." ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:37:10.128844Z", "iopub.status.busy": "2021-04-16T19:37:10.128345Z", "iopub.status.idle": "2021-04-16T19:37:10.130952Z", "shell.execute_reply": "2021-04-16T19:37:10.130569Z" }, "tags": [ "hide-cell" ] }, "outputs": [ { "data": { "text/plain": [ "0.98" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(sample_600 > sample_500)" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "Between people with abilities `600` and `700`, it is less certain." ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:37:10.134774Z", "iopub.status.busy": "2021-04-16T19:37:10.134201Z", "iopub.status.idle": "2021-04-16T19:37:10.136839Z", "shell.execute_reply": "2021-04-16T19:37:10.137320Z" }, "tags": [ "hide-cell" ] }, "outputs": [ { "data": { "text/plain": [ "0.95" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(sample_700 > sample_600)" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "And between people with abilities `700` and `800`, it is not certain at all." ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:37:10.141908Z", "iopub.status.busy": "2021-04-16T19:37:10.141293Z", "iopub.status.idle": "2021-04-16T19:37:10.144428Z", "shell.execute_reply": "2021-04-16T19:37:10.143952Z" }, "tags": [ "hide-cell" ] }, "outputs": [ { "data": { "text/plain": [ "0.85" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(sample_800 > sample_700)" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ "But remember that these results are based on a test where all questions are equally difficult.\n", "If you do the exercises at the end of the chapter, you'll see that the performance of the test is better if it includes questions with a range of difficulties, and even better if the test it is adaptive." ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-cell" ] }, "source": [ " Go back and modify `choose`, which is the function that chooses the difficulty of the next question.\n", "\n", "1. Write a version of `choose` that returns a range of difficulties by using `i` as an index into a sequence of difficulties.\n", "\n", "2. Write a version of `choose` that is adaptive, so it choose the difficulty of the next question based `belief`, which is the posterior distribution of the test-taker's ability, based on the outcome of previous responses.\n", "\n", "For both new versions, run the simulations again to quantify the precision of the test and its discriminatory power.\n", "\n", "For the first version of `choose`, what is the ideal distribution of difficulties?\n", "\n", "For the second version, what is the adaptive strategy that maximizes the precision of the test over the range of abilities?" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:37:10.149351Z", "iopub.status.busy": "2021-04-16T19:37:10.148492Z", "iopub.status.idle": "2021-04-16T19:37:10.150584Z", "shell.execute_reply": "2021-04-16T19:37:10.151025Z" } }, "outputs": [], "source": [ "# Solution\n", "\n", "# I don't know what the optimal distribution of questions\n", "# is, but my guess is that it would follow the distribution\n", "# of ability.\n", "\n", "# But as a simplification, I used a uniform distribution\n", "# from 200 to 800.\n", "\n", "# It works pretty well (and substantially better than the\n", "# test where all questions are equally difficult.)\n", "\n", "num_questions = 51\n", "difficulties = np.linspace(200, 800, num_questions)\n", "\n", "def choose(i, belief):\n", " \"\"\"Choose the difficulty of the next question.\n", " \n", " i: index from [0..num_questions-1]\n", " belief: Pmf representing current estimate of ability\n", " \n", " returns: difficulty\n", " \"\"\"\n", " return difficulties[i]" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "execution": { "iopub.execute_input": "2021-04-16T19:37:10.154839Z", "iopub.status.busy": "2021-04-16T19:37:10.154301Z", "iopub.status.idle": "2021-04-16T19:37:10.157011Z", "shell.execute_reply": "2021-04-16T19:37:10.156470Z" } }, "outputs": [], "source": [ "# Solution\n", "\n", "# I suspect that the optimal strategy is to choose\n", "# a question so that the test-taker has a 50% chance\n", "# of getting it right.\n", "\n", "# As rough approximation of that, I choose a question\n", "# with difficulty equal to the posterior mean of ability.\n", "\n", "# It works quite well (and substantially better than\n", "# the previous version).\n", "\n", "def choose(i, belief):\n", " \"\"\"Choose the difficulty of the next question.\n", " \n", " i: index from [0..num_questions-1]\n", " belief: Pmf representing current estimate of ability\n", " \n", " returns: difficulty\n", " \"\"\"\n", " return belief.mean()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.7" } }, "nbformat": 4, "nbformat_minor": 4 }