Skip to content

Instantly share code, notes, and snippets.

@bmabey
Created October 30, 2014 02:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bmabey/ffac118bc5f3e86ca02d to your computer and use it in GitHub Desktop.
Save bmabey/ffac118bc5f3e86ca02d to your computer and use it in GitHub Desktop.
A tutorial/lab for learning about bayesian updating using IPython Notebook
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:33ce23bbc3717f2743d6e8f4736e84434946200f398564a519a8a1ff54593b1a"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"# run this first!\n",
"from IPython.core.display import HTML\n",
"\n",
"def css_styling():\n",
" styles = open(\"styles/custom.css\", \"r\").read()\n",
" return HTML(styles)\n",
"\n",
"css_styling()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<style>\n",
" @font-face {\n",
" font-family: \"Computer Modern\";\n",
" src: url('http://9dbb143991406a7c655e-aa5fcb0a5a4ec34cff238a2d56ca4144.r56.cf5.rackcdn.com/cmunss.otf');\n",
" }\n",
" @font-face {\n",
" font-family: \"Computer Modern\";\n",
" font-weight: bold;\n",
" src: url('http://9dbb143991406a7c655e-aa5fcb0a5a4ec34cff238a2d56ca4144.r56.cf5.rackcdn.com/cmunsx.otf');\n",
" }\n",
" @font-face {\n",
" font-family: \"Computer Modern\";\n",
" font-style: oblique;\n",
" src: url('http://9dbb143991406a7c655e-aa5fcb0a5a4ec34cff238a2d56ca4144.r56.cf5.rackcdn.com/cmunsi.otf');\n",
" }\n",
" @font-face {\n",
" font-family: \"Computer Modern\";\n",
" font-weight: bold;\n",
" font-style: oblique;\n",
" src: url('http://9dbb143991406a7c655e-aa5fcb0a5a4ec34cff238a2d56ca4144.r56.cf5.rackcdn.com/cmunso.otf');\n",
" }\n",
" div.cell{\n",
" width:800px;\n",
" margin-left:16% !important;\n",
" margin-right:auto;\n",
" }\n",
" h1 {\n",
" font-family: Helvetica, serif;\n",
" }\n",
" h4{\n",
" margin-top:12px;\n",
" margin-bottom: 3px;\n",
" }\n",
" div.text_cell_render{\n",
" font-family: Computer Modern, \"Helvetica Neue\", Arial, Helvetica, Geneva, sans-serif;\n",
" line-height: 145%;\n",
" font-size: 130%;\n",
" width:800px;\n",
" margin-left:auto;\n",
" margin-right:auto;\n",
" }\n",
"\n",
" div.problem {\n",
" background-color: #BBCFBD;\n",
" padding: 25px;\n",
" }\n",
"\n",
" /* .problem pre, .problem code { */\n",
" /* background-color: #BBCFBD; */\n",
" /* padding: 25px; */\n",
" /* } */\n",
"\n",
" .CodeMirror{\n",
" font-family: \"Source Code Pro\", source-code-pro,Consolas, monospace;\n",
" }\n",
" .prompt{\n",
" display: None;\n",
" }\n",
" .text_cell_render h5 {\n",
" font-weight: 300;\n",
" font-size: 22pt;\n",
" color: #4057A1;\n",
" font-style: italic;\n",
" margin-bottom: .5em;\n",
" margin-top: 0.5em;\n",
" display: block;\n",
" }\n",
"\n",
" .warning{\n",
" color: rgb( 240, 20, 20 )\n",
" }\n",
"</style>\n",
"<script>\n",
" MathJax.Hub.Config({\n",
" TeX: {\n",
" extensions: [\"AMSmath.js\"]\n",
" },\n",
" tex2jax: {\n",
" inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n",
" displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n",
" },\n",
" displayAlign: 'center', // Change this to 'center' to center equations.\n",
" \"HTML-CSS\": {\n",
" styles: {'.MathJax_Display': {\"margin\": 4}}\n",
" }\n",
" });\n",
"</script>\n"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 82,
"text": [
"<IPython.core.display.HTML at 0x115ff16d0>"
]
}
],
"prompt_number": 82
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# you will probably need to `pip install seaborn` before running this\n",
"%matplotlib inline\n",
"import math \n",
"\n",
"import numpy as np\n",
"import numpy.random as rand\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import scipy as sp\n",
"import seaborn\n",
"\n",
"\n",
"from IPython.html.widgets import interact, interactive, fixed"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 145
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bayesian Updates\n",
"\n",
"All of us are Bayesians, whether we would like to admit it or not. Each of us subconsciously computes probabilities of different outcomes every day. At any given point in time, we have a belief (a *prior*) of how probable any given outcome is, though we may not be able to quantize it. If it occurs or not (our data), we update our belief accordingly (once again, subconsciously). Essentially, this updated belief is called our *posterior*.\n",
"\n",
"As mathematicians and statisticians, we would like to quantify this notion, and it all follows from Bayes Rule:\n",
"\\begin{equation*}\n",
"\\mathbb{P}(H | D) = \\frac{\\mathbb{P}(D | H)\\mathbb{P}(H)}{\\mathbb{P}(D)}\n",
"\\end{equation*}\n",
"\n",
"Where $H$ is short for *hypothesis* and $D$ for *data*. $\\mathbb{P}(H)$ is our *prior* belief in our hypothesis and $\\mathbb{P}(H | D)$ is our *posterior* updated belief that has incorporated the data. $\\mathbb{P}(D | H)$ is the *likelihood* of that data occuring given the hypothesis while $\\mathbb{P}(D)$ is the probability of the data occuring regardless of the hypothesis."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Beta-Binomial Model\n",
"\n",
"Let us suppose we are going to run a medical trial on a given treatment, where we consider each sample to be a Bernoulli random variable, i.e. success or failure, with parameter $\\theta$. Recall that the parameter of a Bernoulli distribution, $\\theta$, is the probability of success for a sample. Note that the sum of $n$ Bernoulli($\\theta$) random variables is itself a random variable from a Binomial distribution with parameters $n$ and $\\theta$, the same parameter for probability of success. The frequentist approach is to suppose there is no prior knowledge about the chance of success of the treatment. However, we often have some prior knowledge about similar treatments which we can carry over, giving us a *prior* on our parameter $\\theta$. This prior essentially relates our belief about the true, unknown value of $\\theta$, including its expected value, variance, etc.\n",
"\n",
"Let us suppose that our prior is a beta distribution over $\\theta$ with parameters $\\alpha$ and $\\beta$, i.e. \n",
"\\begin{equation*}\n",
"\\mathbb{P}(\\theta) = \\frac{\\theta^{\\alpha - 1}(1 - \\theta)^{\\beta - 1}}{B(\\alpha,\\beta)}\n",
"\\end{equation*}\n",
"where $B(\\alpha,\\beta)$ is the Beta function, such that \n",
"\\begin{equation*}\n",
"\\int_0^1 \\theta^{\\alpha - 1}(1 - \\theta)^{\\beta - 1} d\\theta = B(\\alpha,\\beta) = \\frac{\\Gamma(\\alpha)\\Gamma(\\beta)}{\\Gamma(\\alpha +\\beta)}\n",
"\\end{equation*}\n",
"\n",
" Given a sequence of successes or failures $\\mathbf{y} = y_{1},\\cdots,y_{n}$, where there are $\\sum_{i=1}^n y_i = n_{1}$ successes and $(n - \\sum_{i=1}^n y_i) = n_{2}$ failures, we can compute our *posterior* distribution of $\\theta$, given the data $\\mathbf{y}$, as follows:\n",
"\n",
"\\begin{align*}\n",
"\\mathbb{P}(\\theta | \\mathbf{y}) & = \\frac{\\mathbb{P}(\\mathbf{y} | \\theta)\\mathbb{P}(\\theta)}{\\mathbb{P}(\\mathbf{y})} \\\\\n",
"& = \\frac{\\mathbb{P}(\\mathbf{y} | \\theta)\\mathbb{P}(\\theta)}{\\int_{0}^{1} \\mathbb{P}(\\mathbf{y} | \\theta)\\mathbb{P}(\\theta) d\\theta} \\\\\n",
"& = \\frac{{n_{1} + n_{2} \\choose n_{1}} \\theta^{n_{1}}(1-\\theta)^{n_{2}} \\frac{\\theta^{\\alpha - 1}(1 - \\theta)^{\\beta - 1}}{B(\\alpha,\\beta)}}{\\int_{0}^{1} {n_{1} + n_{2} \\choose n_{1}} \\theta^{n_{1}}(1-\\theta)^{n_{2}} \\frac{\\theta^{\\alpha - 1}(1 - \\theta)^{\\beta - 1}}{B(\\alpha,\\beta)} d\\theta} \\\\\n",
"& = \\frac{ \\theta^{n_{1} + \\alpha - 1}(1-\\theta)^{n_{2} + \\beta - 1}}{\\int_{0}^{1} \\theta^{n_{1} + \\alpha - 1}(1-\\theta)^{n_{2} + \\beta - 1} d\\theta} \\\\\n",
"& = \\frac{\\frac{1}{B(n_{1} + \\alpha - 1, n_{2} + \\beta - 1)}}{\\frac{1}{B(n_{1} + \\alpha - 1, n_{2} + \\beta - 1)}} \\frac{ \\theta^{n_{1} + \\alpha - 1}(1-\\theta)^{n_{2} + \\beta - 1}}{\\int_{0}^{1} \\theta^{n_{1} + \\alpha - 1}(1-\\theta)^{n_{2} + \\beta - 1} d\\theta} \\\\\n",
"& = \\frac{ \\theta^{n_{1} + \\alpha - 1}(1-\\theta)^{n_{2} + \\beta - 1}}{B(n_{1} + \\alpha - 1, n_{2} + \\beta - 1)}\n",
"\\end{align*}\n",
"\n",
"This is simply the density of the Beta distribution over $\\theta$ with parameters $\\alpha + n_{1} - 1$ and $\\beta + n_{2} - 1$. Notice that both the prior and posterior are Beta distributions. When the prior and posterior distributions are from the same family, we call the prior \"conjugate\" to the distribution of the data. \n",
"\n",
"Python has the Beta density built in. Given parameters $\\alpha$ and $\\beta$, we can evaluate and plot the density for many values of $\\theta$:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#Evaluate this code cell to get an interactive plot of beta!\n",
"def gen_plot(success=8, failure=5):\n",
" alpha = success\n",
" beta = failure\n",
" fig = plt.figure(figsize=(8, 6))\n",
" x = np.linspace(0, 1, 100)\n",
" ax = fig.add_subplot(111, xlabel='Chance of success (of the treatment)', \n",
" ylabel='Probability of hypothesis', \n",
" title=r'Posterior probability distribution of $\\theta$')\n",
" ax.plot(x, sp.stats.beta(alpha, beta).pdf(x), linewidth=3.)\n",
" ax.set_xticklabels(['0%', '20%', '40%', '60%', '80%', '100%']);\n",
"\n",
"\n",
"interactive(gen_plot, success=(0,100), failure=(0,100))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x115f52810>"
]
}
],
"prompt_number": 28
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For now, let us suppose that we can assume a true value for one of the two parameters. Supposing first that we know the true variance $\\sigma^{2}$ for the distribution of scores, the posterior distribution of $\\mu$ given the data $\\mathbf{y}$ is\n",
"$$\\mu | \\mathbf{y} \\sim N\\left(\\frac{\\frac{\\mu_{0}\\sigma^{2}}{n} + \\overline{\\mathbf{y}}\\sigma_{0}^{2}}{\\frac{\\sigma^{2}}{n} + \\sigma_{0}^{2}}, \\left(\\frac{n}{\\sigma^{2}} + \\frac{1}{\\sigma_{0}^{2}}\\right)^{-1}\\right),$$\n",
"where $\\overline{\\mathbf{y}}$ is the average of the data points in $\\mathbf{y}$. Now, if we know the true mean $\\mu$ for the score distribution, the posterior distribution of $\\sigma^{2}$ given the data $\\mathbf{y}$ is $$\\sigma^{2} | \\mathbf{y} \\sim IG \\left(\\alpha + \\frac{n}{2}, \\beta + \\frac{\\sum_{i=1}^{n} (y_{i} - \\mu)^{2}}{2}\\right).$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class='problem'>\n",
"<legend>Problem 1</legend>\n",
"Lets translate some of this math into code! Complete the function `bernoulli_posterior`. This function accepts a data set of i.i.d. Bernoulli random variables, `data`, and parameters $\\alpha$ and $\\beta$ (for a beta prior over $\\theta$) and returns the values of the distribtuion at the optionaly provided `x` range.\n",
"\n",
"We will be testing this function with the data in the file *trial.csv*:\n",
"</div>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"trial = np.fromfile('data/trial.csv', dtype=int, sep='\\n')\n",
"trial"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 25,
"text": [
"array([0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1])"
]
}
],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def bernoulli_posterior(data, alpha, beta, x=np.arange(0, 1.01, step=.01)):\n",
" # CODE HERE\n",
" # y = ....\n",
" return x, y"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 63
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Run the following code cell to test your code:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"## Test for Problem 1\n",
"from numpy.testing import assert_array_almost_equal\n",
"\n",
"\n",
"small_x = np.array([0., 0.4, 0.8])\n",
"x_res, y_res = bernoulli_posterior(trial, 5, 10, x=small_x)\n",
"assert_array_almost_equal(x_res, small_x)\n",
"assert_array_almost_equal(y_res, np.array([0., 4.11392265e+00, 5.87174591e-04]))\n",
"\n",
"def sol(alpha, beta):\n",
" return np.fromfile('data/solutions/bernoulli_posterior_%d_%d.csv' % (alpha, beta),sep='\\n')\n",
"\n",
"assert_array_almost_equal(bernoulli_posterior(trial, 5, 10)[1], sol(5, 10))\n",
"assert_array_almost_equal(bernoulli_posterior(trial, 20, 34)[1], sol(20, 34))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 83
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Using the completed `bernoulli_posterior` function we can plot the posterior and play around with the prior parameters, $\\alpha$ and $\\beta$.\n",
"\n",
"How does your belief about the treatment success rate ($\\theta$) change?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#Evaluate this code cell to get an interactive plot of beta!\n",
"def plot_bernoulli_posterior(alpha=5, beta=10, data=trial):\n",
" fig = plt.figure(figsize=(8, 6))\n",
" x, y = bernoulli_posterior(data, alpha, beta, x=np.linspace(0, 1, 100))\n",
" ax = fig.add_subplot(111, xlabel='Chance of success (of the treatment)', \n",
" ylabel='Probability of hypothesis', \n",
" title=r'Posterior probability distribution of $\\theta$')\n",
" ax.plot(x, y, linewidth=3.)\n",
" ax.set_xticklabels(['0%', '20%', '40%', '60%', '80%', '100%']);\n",
"\n",
"actual_data = trial\n",
"interactive(plot_bernoulli_posterior, alpha=(0,100), beta=(0,100), data=fixed(trial))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n94m6aJGQQCH7mR+0gPO/EEi6+xlmdhbwceClCzifiMis6m3wGwT7mq9Y0s6O8LXv2jfCAau0kGe9\nyLc2+37A5wlq1TcB73f3vXM5ubv/1MyuDu8eBPTOM04RkYJlJPM6mJaW1r20bSqZ9+wdVjKvI/nm\nmV8OPAC8B2gD/mM+F3D3STO7Avgc8N35nENEZC7qsWYO0L1kut98l/rN60q+ZvZ17n4JgJn9Frhr\nvhdx9wvM7H3AH83sSHfP+Snr7u6c7yVkDlTO8VMZx2+mMh4cHqdvMFgJramxgSMOXUVjQ+2uyx51\n0H5L4Y4nARgYnVzw51Cf4+qRL5mPpW+4+7iZzXmxXzN7PbC/u3+SYCR8Mvwvp56e/rleQuaou7tT\n5RwzlXH88pXxI1v7pm6vWtbOnt0DpQqr7BY1T/9o2bK9b0GfQ32Oq0u+ZF6Mn7I/AK4wsxuAZuCd\n7q4dAEQkNtvraIOVbCuXaHpavcqXzI8ys0cj99dF7qfc/eDZTh42p79qIQGKiMxFvfaXQ+Zc8137\nRkilUiRqeOtXmZYvmVvJohARKZLoHPO1dTSSHWBRWxMdbU0MjkwwPpFk3+AYSxe3zn6gVL0Zk7m7\nP1bCOEREiqKea+YAK5e2M7g96Ovu2TusZF4nCtkCVUSkKiRTKXZEN1ips5o5aFnXeqVkLiI1Y8++\nEcYnggkznYua6WhrLnNEpZexr7k2XKkbSuYiUjPqvYkdVDOvV0rmIlIztimZZybzfaqZ1wslcxGp\nGfW6JnvUyqXRfc1VM68XSuYiUjPqcevTbCu62khPLd/bPzo1hkBqm5K5iNQM9ZkH69Ev7wymo6WA\n3X1qaq8HSuYiUhNGxybp7Q9Wi25sSGT0HdcbDYKrP0rmIlITorXylUvbaWqs36+3lUrmdad+P+0i\nUlOe6JneHW2/lR1ljKT8NNe8/iiZi0hNeHzndDLfv7vOk7lq5nVHyVxEakK0Zn7AqsVljKT8Muea\nK5nXAyVzEakJT0Rr5nWezLP7zFOpVBmjkVJQMheRqrdvcIy+oXEAWpob6nokO0DXomZamoOv9+HR\nSQZHJsockcRNyVxEql60iX3/7sU0pFdNqVOJRILuJdM/aHapqb3mKZmLSNXLaGLvru8m9rTMQXAa\n0V7rlMxFpOpFk3m9D35Li67RvrN3KM8zpRYomYtI1Xu8R9PSsq2NLGe7bbeSea1TMheRqjaZTLJ1\n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\n",
"text": [
"<matplotlib.figure.Figure at 0x115e4b090>"
]
}
],
"prompt_number": 84
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In addition to the $\\alpha$ and $\\beta$ parameters now try adjusting the counts of the actual successes and failures. What you'll notice is that the prior parameters and the actual counts have the same effect. This is why the $\\alpha$ and $\\beta$ are called *pseudocounts*."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def plot_bernoulli_posterior_with_actual_counts(alpha=5, beta=5, actual_successes=5, actual_failures=5):\n",
" data = np.concatenate([np.ones(actual_successes), np.zeros(actual_failures)])\n",
" plot_bernoulli_posterior(alpha,beta,data)\n",
" \n",
"interactive(plot_bernoulli_posterior_with_actual_counts, \n",
" alpha=(0,100), beta=(0,100), \n",
" actual_successes=(0,100), actual_failures=(0,100))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x115fdb090>"
]
}
],
"prompt_number": 85
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extending the model to the Multinomial\n",
"\n",
"Let's now suppose that we run a fruit stand, selling apples, bananas, mangos, oranges, and watermelons. We assume that when a person comes and buys fruit, he selects one piece of fruit. This can be modeled as a draw from a categorical distribution with parameter $\\theta$. The Categorical distribution is a discrete probability distribution over the $k$ possible events, the multiple-event version of the Bernoulli distribution. The combination/mutual occurence of $n$ Categorical variables is called a Multinomial variable with probability mass function:\n",
"\n",
"\\begin{align}\n",
"f(x_1,\\ldots,x_k;n,p_1,\\ldots,p_k) & {} = \\Pr(X_1 = x_1\\mbox{ and }\\dots\\mbox{ and }X_k = x_k) \\\\ \\\\\n",
"& {} = \\begin{cases} { \\displaystyle {n! \\over x_1!\\cdots x_k!}p_1^{x_1}\\cdots p_k^{x_k}}, \\quad &\n",
"\\mbox{when } \\sum_{i=1}^k x_i=n \\\\ \\\\\n",
"0 & \\mbox{otherwise,} \\end{cases}\n",
"\\end{align}\n",
"\n",
"for non-negative integers $x_1, ..., x_k$.\n",
"\n",
"The probability mass function can also be expressed using the [gamma function](https://en.wikipedia.org/wiki/Gamma_function) as:\n",
"\n",
"$f(x_1,\\dots, x_{k}; p_1,\\ldots, p_k) = \\frac{\\Gamma(\\sum_i x_i + 1)}{\\prod_i \\Gamma(x_i+1)} \\prod_{i=1}^k p_i^{x_i}.$\n",
"\n",
"Thus, in our five kinds of fruit example $\\theta$ is a vector of length five, with non-negative entries summing to $1$, each entry being the probability of selecting the corresponding fruit.\n",
"\n",
"If we know $\\theta$ we can use `numpy.random.choice` or `numpy.random.multinomial` to draw samples:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fruits_pmf = {'Apple': 0.2, 'Banana': 0.3, 'Mango': 0.1, 'Orange': 0.3, 'Watermelon': 0.1}\n",
"fruits = fruits_pmf.keys()\n",
"theta = fruits_pmf.values()\n",
"\n",
"categorical_draw = rand.choice(fruits, 1, p=theta)[0]\n",
"print('A single categorical draw: ' + categorical_draw)\n",
"\n",
"many_draws = dict(zip(fruits, rand.multinomial(20, theta)))\n",
"print('20 draws: %s' % many_draws)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"A single categorical draw: Mango\n",
"20 draws: {'Orange': 5, 'Mango': 2, 'Watermelon': 1, 'Apple': 4, 'Banana': 8}\n"
]
}
],
"prompt_number": 95
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the case we don't know what $\\theta$ is, but we have some prior belief of the populace's fruit preferences, which we represent as a [Dirichlet](https://en.wikipedia.org/wiki/Dirichlet_distribution) prior over $\\theta$ with parameter vector $\\alpha$, that is, $$\\mathbb{P}(\\theta) = \\frac{1}{B(\\alpha)} \\prod_{i=1}^{5} \\theta_{i}^{\\alpha_{i} - 1}$$ where $B(\\alpha)$ is the multinomial Beta function, $$B(\\alpha) = \\frac{\\prod_{i=1}^{5} \\Gamma(\\alpha_{i})}{\\Gamma(\\sum_{i=1}^{5} \\alpha_{i})}.$$ Given a sequence of fruit selections $\\mathbf{y} = y_{1}, \\cdots, y_{n}$ from $n$ people, where each $$y_{i} \\in \\{\\text{Apple, Banana, Mango, Orange, Watermelon}\\},$$ we let\n",
"\\begin{align*}\n",
"n_{1} & = |\\{1 \\leq i \\leq n | y_{i} = \\text{Apple}\\}| \\\\\n",
"n_{2} & = |\\{1 \\leq i \\leq n | y_{i} = \\text{Banana}\\}| \\\\\n",
"\\vdots & = \\; \\; \\; \\; \\; \\; \\; \\; \\; \\; \\; \\; \\; \\; \\; \\; \\; \\; \\vdots \\\\\n",
"n_{5} & = |\\{1 \\leq i \\leq n | y_{i} = \\text{Watermelon}\\}|\n",
"\\end{align*}\n",
"\n",
"Given this new data of people's purchases, we can compute our posterior distribution of $\\theta$ as follows:\n",
"\\begin{align*}\n",
"\\mathbb{P}(\\theta | \\mathbf{y}) & = \\frac{\\mathbb{P}(\\mathbf{y} | \\theta) \\mathbb{P}(\\theta)}{\\int \\mathbb{P}(\\mathbf{y} | \\theta) \\mathbb{P}(\\theta) d\\theta} \\\\\n",
"& = \\frac{\\prod_{i=1}^{5} \\theta_{i}^{n_{i}} \\frac{1}{B(\\alpha)} \\prod_{i=1}^{5} \\theta_{i}^{\\alpha_{i}-1}}{\\int \\cdots \\int \\prod_{i=1}^{5} \\theta_{i}^{n_{i}} \\frac{1}{B(\\alpha)} \\prod_{i=1}^{5} \\theta_{i}^{\\alpha_{i}-1} d\\theta_{1}\\cdots d\\theta_{5}} \\\\\n",
"& = \\frac{\\prod_{i=1}^{5} \\theta_{i}^{n_{i} + \\alpha_{i} - 1}}{\\int \\cdots \\int \\prod_{i=1}^{5} \\theta_{i}^{n_{i} + \\alpha_{i} - 1} d\\theta_{1} \\cdots d\\theta_{5}} \\\\\n",
"& = \\frac{\\frac{1}{B(n + \\alpha)}}{\\frac{1}{B(n+\\alpha)}} \\frac{\\prod_{i=1}^{5} \\theta_{i}^{n_{i} + \\alpha_{i} - 1}}{\\int \\cdots \\int \\prod_{i=1}^{5} \\theta_{i}^{n_{i} + \\alpha_{i} - 1} d\\theta_{1} \\cdots d\\theta_{5}} \\\\\n",
"& = \\frac{\\prod_{i=1}^{5} \\theta_{i}^{n_{i} + \\alpha_{i} - 1}}{B(n + \\alpha)}\n",
"\\end{align*}\n",
"where $$n = \\left( \\begin{array}{ccccc} n_{1} & n_{2} & n_{3} & n_{4} & n_{5} \\end{array} \\right).$$\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class=\"problem\">\n",
"<legend>Problem 2</legend>\n",
"Write a multinomial Beta function that accepts a vector of nonnegative reals of arbitrary length. For reference the defintion of the multinomial beta is: $$B(\\alpha) = \\frac{\\prod_{i=1}^{n} \\Gamma(\\alpha_{i})}{\\Gamma(\\sum_{i=1}^{n} \\alpha_{i})}.$$\n",
"\n",
"\n",
"<p/>\n",
"*Hint: You can use `math.gamma`*\n",
"</div>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def multinomial_beta(alpha):\n",
" # CODE HERE\n",
" # return ...\n",
"\n",
"alpha = [0.5, 0.5]\n",
"multinomial_beta(alpha) "
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 140,
"text": [
"3.1415926535897927"
]
}
],
"prompt_number": 140
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Verify your solution by running this test:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"## Test for Problem 2\n",
"from numpy.testing import assert_almost_equal\n",
"\n",
"assert_almost_equal(multinomial_beta([0.5, 0.5]), math.pi)\n",
"assert_almost_equal(multinomial_beta([0.3, 0.1, 0.1, 0.2, 0.3]), 3718.5352344)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 268
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class=\"problem\">\n",
"<legend>Problem 3</legend>\n",
"Write a function that accepts a data set of i.i.d. draws from a Categorical($\\theta$) distribution, a parameter vector $\\alpha$ for the Dirichlet prior over $\\theta$, and a set of unique categories (in our example, fruits). Have this function return the Dirichlet parameter for the posterior distribution of $\\theta$. \n",
"</div>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fruit = pd.read_csv('data/fruit.csv', header=None)[0].values\n",
"fruit"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 176,
"text": [
"array(['Mango', 'Apple', 'Mango', 'Watermelon', 'Apple', 'Orange', 'Apple',\n",
" 'Banana', 'Apple', 'Orange', 'Mango', 'Mango', 'Watermelon',\n",
" 'Orange', 'Apple', 'Apple', 'Mango', 'Apple', 'Mango', 'Banana',\n",
" 'Mango', 'Mango', 'Apple', 'Orange', 'Apple', 'Apple', 'Banana',\n",
" 'Apple', 'Mango', 'Orange', 'Mango', 'Apple', 'Mango', 'Mango',\n",
" 'Watermelon', 'Orange', 'Apple', 'Mango', 'Mango', 'Apple'], dtype=object)"
]
}
],
"prompt_number": 176
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def multinomial_posterior(data, prior):\n",
" # CODE HERE\n",
" # return ...\n",
"\n",
"def counts_dict_to_vector(counts):\n",
" return pd.Series(counts).sort_index().values\n",
"\n",
"prior_counts = {'Apple': 5, 'Banana': 3, 'Mango': 4, 'Orange': 2, 'Watermelon': 1}\n",
"alpha = counts_dict_to_vector(prior_counts)\n",
"multinomial_posterior(fruit, alpha)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 225,
"text": [
"array([19, 6, 18, 8, 4])"
]
}
],
"prompt_number": 225
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"## Test for Problem 3\n",
"from numpy.testing import assert_array_almost_equal\n",
"\n",
"assert_array_almost_equal(multinomial_posterior(['Foo','Foo','Bar'], \n",
" counts_dict_to_vector({'Bar': 5, 'Foo': 2})),\n",
" [6, 4])\n",
" \n",
"\n",
"fruit = pd.read_csv('data/fruit.csv', header=None)[0].values\n",
"prior_counts = {'Apple': 5, 'Banana': 3, 'Mango': 4, 'Orange': 2, 'Watermelon': 1}\n",
"\n",
"\n",
"assert_array_almost_equal(multinomial_posterior(fruit, \n",
" counts_dict_to_vector(prior_counts)),\n",
" [19, 6, 18, 8, 4])\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 228
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now suppose that we have a set of exam scores $\\mathbf{y} = y_{1}, \\cdots, y_{n}$ from the university's calculus final. Historically, we know how people have scored on the exam, giving us information to make a prior on the distribution of scores. We also know that the scores should be Normally distributed, $X_i \\sim N(\\mu,\\sigma^2)$, $i=1,...,n$. Here we are encountering something new: a prior for a distribution with two parameters instead of one. What we do is place a prior on each parameter. We let $\\mu \\sim N(\\mu_{0}, \\sigma_{0}^{2})$ and $\\sigma^{2} \\sim IG(\\alpha, \\beta)$ be priors for our mean and variance, respectively, where $IG$ is the [Inverse Gamma](https://en.wikipedia.org/wiki/Inverse-gamma_distribution) distribution, with probability density function:\n",
"\n",
"$$\\mathbb{P}(\\sigma^{2}) = \\frac{\\beta^{\\alpha}}{\\Gamma(\\alpha)}(\\sigma^{2})^{-\\alpha - 1}e^{-\\frac{\\beta}{\\sigma^{2}}}\\text{; } \\alpha,\\beta,\\sigma^2 >0.$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class='problem'>\n",
"<legend>Problem 4</legend>\n",
"Write your own function to compute an Inverse Gamma probability density function given parameters $\\alpha$ and $\\beta$. It should be able to compute the density at an array of values. Call it *invgammapdf*.\n",
"<p/>\n",
"Your function should handle the case where $x$ is a scalar or an array. The function may be useful `np.isscalar`.\n",
"</div>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def invgammapdf(x, alpha, beta):\n",
" # CODE HERE\n",
" # return ..."
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 232
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"invgammapdf(5, 10, 20)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 233,
"text": [
"0.010584953352840239"
]
}
],
"prompt_number": 233
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Writing `invgammapdf` is to provide practice writing these type of functions. Normally, you would just use [scipy.stats.invgamma](http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.invgamma.html). This is what is used to test your version below:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"## Test for Problem 4\n",
"from numpy.testing import assert_array_almost_equal, assert_almost_equal\n",
"\n",
"\n",
"assert_almost_equal(invgammapdf(5, 10, 20), stats.invgamma.pdf(5, 10, scale=20))\n",
"\n",
"x = rand.randint(0,1000,50)\n",
"assert_array_almost_equal(invgammapdf(x, 33, 5), stats.invgamma.pdf(x, 33, scale=5))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 246
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's look at how to plot each of these prior distributions:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from scipy.stats import norm\n",
"def plot_priors(mu_0=74., sigma2_0 = 25., alpha=2., beta = 25.):\n",
" x = np.arange(0, 100.1, step=0.1)\n",
" y = norm.pdf(x, loc=mu_0, scale=5)\n",
" plt.plot(x, y)\n",
" plt.title('$\\mu \\sim N(%d, %d)$' % (mu_0, sigma2_0))\n",
" plt.show()\n",
"\n",
" x = np.arange(0.1, 100.1, step=0.1)\n",
" y = invgammapdf(x, alpha=alpha, beta=beta)\n",
" plt.title('$\\sigma^2 \\sim IG(%d, %d)$' % (alpha,beta))\n",
" plt.plot(x, y)\n",
" plt.show()\n",
" \n",
"\n",
"plot_priors()\n",
"#interactive(plot_priors, mu_0=(0,100), sigma2_0=(1,40), alpha=(0,30), beta=(10,40))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x11837df10>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x11850cdd0>"
]
}
],
"prompt_number": 267
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For now, let us suppose that we can assume a true value for one of the two parameters. Supposing first that we know the true variance $\\sigma^{2}$ for the distribution of scores, the posterior distribution of $\\mu$ given the data $\\mathbf{y}$ is\n",
"$$\\mu | \\mathbf{y} \\sim N\\left(\\frac{\\frac{\\mu_{0}\\sigma^{2}}{n} + \\overline{\\mathbf{y}}\\sigma_{0}^{2}}{\\frac{\\sigma^{2}}{n} + \\sigma_{0}^{2}}, \\left(\\frac{n}{\\sigma^{2}} + \\frac{1}{\\sigma_{0}^{2}}\\right)^{-1}\\right),$$\n",
"where $\\overline{\\mathbf{y}}$ is the average of the data points in $\\mathbf{y}$. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class='problem'>\n",
"<legend>Problem 5</legend>\n",
"Write a function that accepts a data set of real numbers, a prior ($\\mu_{0}$ and $\\sigma_{0}^{2}$) for the mean $\\mu$ of a normal distribution, and the true variance $\\sigma^{2}$ of the distribution, and returns the updated posterior parameters for $\\mu$. Test it on the data in the file *examscores.csv* with prior $\\mu_{0} = 74, \\sigma_{0}^{2} = 25$ and true variance $\\sigma^{2} = 36$.\n",
"</div>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"df = pd.read_csv('data/examscores.csv', header=None, names=['score'])\n",
"examscores = df['score'].values\n",
"#print(examscores)\n",
"#df.describe()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 285
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def mean_posterior(data, prior, variance):\n",
" mu_0, sigma2_0 = prior\n",
" # CODE HERE\n",
" # posterior_mean = ...\n",
" # posterior_variance = ...\n",
" return posterior_mean, posterior_variance\n",
"\n",
"mean_posterior(examscores, (74, 25), 36)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 307,
"text": [
"(67.447837150127228, 1.1450381679389312)"
]
}
],
"prompt_number": 307
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Test for Problem 5\n",
"assert_array_almost_equal(mean_posterior(examscores, (74, 25), 36), (67.4478371, 1.1450381))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 292
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets use your `mean_posterior` function to plot the posterier and see how it changes as you adjust the priors:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print('The mean and std of the data is: %s, %s' % (examscores.mean(), examscores.std()))\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The mean and std of the data is: 67.1333333333, 15.0615035401\n"
]
}
],
"prompt_number": 304
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def plot_mean_variance(data, mu_0=74, sigma2_0=25, true_variance=36):\n",
" posterior_mean, posterior_variance = mean_posterior(data, (mu_0, sigma2_0), true_variance)\n",
" x = np.arange(0, 100.1, step=0.1)\n",
" y = norm.pdf(x, loc=posterior_mean, scale=np.sqrt(posterior_variance))\n",
" plt.plot(x, y)\n",
" plt.show()\n",
" \n",
"interactive(plot_mean_variance, data=fixed(examscores), mu_0=(0,99), sigma2_0=(1,50), true_variance=(5,50))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x11800eb10>"
]
}
],
"prompt_number": 306
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"Now, if we know the true mean $\\mu$ for the score distribution, the posterior distribution of $\\sigma^{2}$ given the data $\\mathbf{y}$ is $$\\sigma^{2} | \\mathbf{y} \\sim IG \\left(\\alpha + \\frac{n}{2}, \\beta + \\frac{\\sum_{i=1}^{n} (y_{i} - \\mu)^{2}}{2}\\right).$$\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class='problem'>\n",
"<legend>Problem 6</legend>\n",
"Write a function that accepts a dataset of real numbers, a prior ($\\alpha$ and $\\beta$) for the variance $\\sigma^{2}$ of a normal distribution, and the true mean $\\mu$ of the distribution, and returns the updated posterior parameters for $\\sigma^{2}$. Test it on the data in the file *examscores.csv* with prior $\\alpha=2, \\beta = 25$ and true mean $\\mu = 62$.\n",
"</div>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def variance_posterior(data, prior, mean):\n",
" alpha, beta = prior\n",
" # CODE HERE\n",
" # posterior_alpha = ...\n",
" # posterior_beta = ...\n",
" return posterior_alpha, posterior_beta\n",
"\n",
"variance_posterior(examscores, (2., 25.), 62)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 308,
"text": [
"(17.0, 3823.0)"
]
}
],
"prompt_number": 308
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Test for Problem 5\n",
"assert_array_almost_equal(variance_posterior(examscores, (2, 25), 62), (17, 3823))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 310
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the final part of this lab write the code needed to plot the variance."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# code goes here to plot variance_posterior"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 311
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"What if we can't assume a true value for either of the parameters? This is where Gibbs sampling comes in as you will see in the next lab. :)"
]
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment