Skip to content

Instantly share code, notes, and snippets.

@simeoncarstens
Last active July 7, 2020 15:06
Show Gist options
  • Save simeoncarstens/ab1a0bc6f00a4403783b0bfc860573d3 to your computer and use it in GitHub Desktop.
Save simeoncarstens/ab1a0bc6f00a4403783b0bfc860573d3 to your computer and use it in GitHub Desktop.
from numpy import sin, cos, arctan, sqrt, exp, random, pi, linspace
import matplotlib.pyplot as plt
def draw_sample(xold, sigma):
t = 3.0
vold = random.normal()
phi = arctan(-vold / xold * sigma)
A = vold * sigma * sqrt(xold ** 2 / sigma ** 2 / vold ** 2 + 1)
xnew = A * cos(t / sigma + phi)
vnew = -A / sigma * sin(t / sigma + phi)
E = lambda x: 0.5 * x ** 2 / sigma ** 2
K = lambda v: 0.5 * v ** 2
H = lambda x, v: E(x) + K(v)
p_acc = min(1, exp(-(H(xnew, vnew) - H(xold, vold))))
if random.random() < p_acc:
return xnew, True
else:
return xold, False
sigma = 2.0
samples = [2.0]
accepted = 0
n_samples = 100000
for _ in range(n_samples):
new_state, acc = draw_sample(samples[-1], sigma)
samples.append(new_state)
accepted += acc
fig, ax = plt.subplots()
ax.hist(samples, bins=40, density=True)
gaussian = lambda x: exp(-0.5 * x ** 2 / sigma ** 2) / sqrt(2 * pi * sigma ** 2)
xspace = linspace(-5, 5, 300)
ax.plot(xspace, list(map(gaussian, xspace)))
plt.show()
print("Acceptante rate:", accepted / n_samples)
#!/bin/bash
img_list=$(ls -v output*.png)
b=$(<$2)
while read strA <&3 && read strB <&4; do
rstring="..\/..\/img\/posts\/${strB}"
echo $rstring
sed -i "s/${strA}/${rstring}/g" $1
mv $strA $strB
# cp $strB ~/projects/tweag/www/app/assets/img/posts/
done 3<<<"$img_list" 4<<<"$b"
# cp $1 ~/projects/tweag/www/app/views/posts/
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introduction to MCMC, Part II: Gibbs sampling"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the [first blog post](https://www.tweag.io/posts/2019-10-25-mcmc-intro1.html) of this series, we discussed Markov chains and the most elementary [MCMC](https://en.wikipedia.org/wiki/Markov_chain_Monte_Carlo) method, the [Metropolis-Hastings algorithm](https://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm), and used it to sample from a univariate distribution.\n",
"In this episode, we discuss another famous MCMC sampling algorithm: the [Gibbs sampler](https://en.wikipedia.org/wiki/Gibbs_sampling).\n",
"It is very useful to sample from multivariate distributions:\n",
"it reduces the complex problem of sampling from a joint distribution to sampling from the full conditional (meaning, conditioned on all other variables) distribution of each variable. \n",
"That means that to sample from, say, $p(x,y)$, it is sufficient to be able to sample from $p(x|y)$ and $p(y|x)$, which might be considerably easier.\n",
"The problem of sampling from multivariate distributions often arises in Bayesian statistics, where inference of likely values for a parameter often entails sampling not only that parameter, but also additional parameters required by the statistical model."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Motivation\n",
"Why would splitting up sampling in this way be preferable?\n",
"Well, it might turn the problem of sampling from one untractable joint distribution into sampling from several well-known, tractable distributions.\n",
"If the latter (now conditional) distributions are still not tractable, at least you now can use different and well-suited samplers for each of them instead of sampling all variables with a one-size-fits-all sampler.\n",
"Take, for example, a bivariate normal distribution with density $p(x,y)$ that has very different variances for each variable:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"## this is copied and pasted from part I. This stuff and \n",
"\n",
"proposal = lambda x, stepsize: np.random.uniform(low=x - 0.5 * stepsize, high=x + 0.5 * stepsize, size=x.shape)\n",
"p_acc = lambda x_new, x_old, log_prob: min(1, np.exp(log_prob(x_new) - log_prob(x_old)))\n",
"\n",
"def sample_MH(x_old, log_prob, stepsize):\n",
" x_new = proposal(x_old, stepsize)\n",
" # here we determine whether we accept the new state or not:\n",
" # we draw a random number uniformly from [0,1] and compare\n",
" # it with the acceptance probability\n",
" accept = np.random.random() < p_acc(x_new, x_old, log_prob)\n",
" if accept:\n",
" return accept, x_new\n",
" else:\n",
" return accept, x_old\n",
" \n",
"def plot_samples(chain, log_prob, ax, orientation='vertical', normalize=True,\n",
" xlims=(-5, 5), legend=True):\n",
" from scipy.integrate import quad\n",
" \n",
" ax.hist(chain, bins=50, density=True, label=\"MCMC samples\",\n",
" orientation=orientation)\n",
" # we numerically calculate the normalization constant of our PDF\n",
" if normalize:\n",
" Z, _ = quad(lambda x: np.exp(log_prob(x)), -np.inf, np.inf)\n",
" else:\n",
" Z = 1.0\n",
" xses = np.linspace(xlims[0], xlims[1], 1000)\n",
" yses = [np.exp(log_prob(x)) / Z for x in xses]\n",
" if orientation == 'horizontal':\n",
" (yses, xses) = (xses, yses)\n",
" ax.plot(xses, yses, label=\"true distribution\")\n",
" if legend:\n",
" ax.legend(frameon=False)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib notebook\n",
"%matplotlib inline\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"plt.rcParams['figure.figsize'] = [10, 6]\n",
"\n",
"np.random.seed(42)\n",
"\n",
"def log_gaussian(x, mu, sigma):\n",
" # The np.sum() is for compatibility with sample_MH\n",
" return - 0.5 * np.sum((x - mu) ** 2) / sigma ** 2 \\\n",
" - np.log(np.sqrt(2 * np.pi * sigma ** 2))\n",
"\n",
"\n",
"class BivariateNormal(object):\n",
" n_variates = 2\n",
" \n",
" def __init__(self, mu1, mu2, sigma1, sigma2):\n",
" self.mu1, self.mu2 = mu1, mu2\n",
" self.sigma1, self.sigma2 = sigma1, sigma2\n",
" \n",
" def log_p_x(self, x):\n",
" return log_gaussian(x, self.mu1, self.sigma1)\n",
" \n",
" def log_p_y(self, x):\n",
" return log_gaussian(x, self.mu2, self.sigma2)\n",
" \n",
" def log_prob(self, x): \n",
" cov_matrix = np.array([[self.sigma1 ** 2, 0],\n",
" [0, self.sigma2 ** 2]])\n",
" inv_cov_matrix = np.linalg.inv(cov_matrix)\n",
" kernel = -0.5 * (x - self.mu1) @ inv_cov_matrix @ (x - self.mu2).T\n",
" normalization = np.log(np.sqrt((2 * np.pi) ** self.n_variates * np.linalg.det(cov_matrix)))\n",
" \n",
" return kernel - normalization \n",
"\n",
" \n",
"bivariate_normal = BivariateNormal(mu1=0.0, mu2=0.0, sigma1=1.0, sigma2=0.15)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `@` is a recent-ish addition to Python and denotes the matrix multiplication operator.\n",
"Let's plot this density:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x432 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from mpl_toolkits.axes_grid1 import make_axes_locatable\n",
"\n",
"fig, ax = plt.subplots()\n",
"xses = np.linspace(-2, 2, 200)\n",
"yses = np.linspace(-0.5, 0.5, 200)\n",
"log_density_values = [[bivariate_normal.log_prob(np.array((x, y))) for x in xses] for y in yses]\n",
"dx = (xses[1] - xses[0]) / 2\n",
"dy = (yses[1] - yses[0]) / 2\n",
"extent = [xses[0] - dx, xses[-1] + dx, yses[0] - dy, yses[-1] + dy]\n",
"im = ax.imshow(np.exp(log_density_values), extent=extent)\n",
"ax.set_xlabel('x')\n",
"ax.set_ylabel('y')\n",
"divider = make_axes_locatable(ax)\n",
"cax = divider.append_axes('right', size='5%', pad=0.05)\n",
"cb = fig.colorbar(im, cax=cax)\n",
"cb.set_label('probability density')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now you can try to sample from this using the previously discussed Metropolis-Hastings algorithm with a uniform proposal distribution.\n",
"Remember that in Metropolis-Hastings, a Markov chain is built by jumping a certain distance (\"step size\") away from the current state, and accepting or rejecting the new state according to an acceptance probability.\n",
"A small step size will explore the possible values for \\\\(x\\\\) very slowly, while a large step size will have very poor acceptance rates for \\\\(y\\\\).\n",
"The Gibbs sampler allows us to use separate Metropolis-Hastings samplers for $x$ and $y$ - each with an appropriate step size.\n",
"Note that we could also choose a bivariate proposal distribution in the Metropolis-Hastings algorithm such that its variance in $x$-direction is larger than its variance in the $y$-direction, but let's stick to this example for didactic purposes."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## The systematic scan Gibbs sampler \n",
"So how does Gibbs sampling work?\n",
"The basic idea is that given the joint distribution $p(x, y)$ and a state $(x_i, y_i)$ from that distribution, you obtain a new state as follows:\n",
"first, you sample a new value for one variable, say, $x_{i+1}$, from its distribution conditioned on $y_i$, that is, from $p(x|y_i)$. Then, you sample a new state for the second variable, $y_{i+1}$, from its distribution conditioned on the previously drawn state for $x$, that is, from $p(y|x_{i+1})$.\n",
"This two-step procedure can be summarized as follows: \n",
"$$\n",
"\\begin{align} x_{i+1} \\sim& \\ p(x|y_i) \\\\\n",
" y_{i+1} \\sim& \\ p(y|x_{i+1})\n",
"\\end{align}\n",
"$$\n",
"This is then iterated to build up the Markov chain.\n",
"For more than two variables, the procedure is analogous: you pick a fixed ordering and draw one variable after the other, each conditioned on, in general, a mix of old and new values for all other variables.[^1]\n",
"Fixing an ordering, like this, is called a _systematic scan_, an alternative is the _random scan_ where we'd randomly pick a new ordering at each iteration.\n",
"\n",
"Implementing this Gibbs sampler for the above example is extremely simple, because the two variables are independent ($p(x|y)=p(x)$ and $p(y|x)=p(y)$).\n",
"We sample each of them with a Metropolis-Hastings sampler, implemented in the <a href=\"https://www.tweag.io/posts/2019-10-25-mcmc-intro1.html\">first blog post</a> as the `sample_MH` function.\n",
"As a reminder, that function takes as arguments, in that order,\n",
"- the old state of a Markov chain (a one-dimensional `numpy` array),\n",
"- a function returning the logarithm of the probability density function (PDF) to sample from, \n",
"- a real number representing the step size for the uniform proposal distribution, from which a new state is proposed. \n",
"\n",
"We then use `sample_MH` in the following, short function which implements the systematic scan Gibbs sampler:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def sample_gibbs(old_state, bivariate_dist, stepsizes):\n",
" \"\"\"Draws a single sample using the systematic Gibbs sampling\n",
" transition kernel\n",
" \n",
" Arguments:\n",
" - old_state: the old (two-dimensional) state of a Markov chain\n",
" (a list containing two floats)\n",
" - bivariate_dist: an object representing a bivariate distribution\n",
" (in our case, an instance of BivariateNormal)\n",
" - stepsizes: a list of step sizes\n",
" \n",
" \"\"\"\n",
" x_old, y_old = old_state\n",
" \n",
" # for compatibility with sample_MH, change floats to one-dimensional\n",
" # numpy arrays of length one\n",
" x_old = np.array([x_old])\n",
" y_old = np.array([y_old])\n",
" \n",
" # draw new x conditioned on y\n",
" p_x_y = bivariate_dist.log_p_x\n",
" accept_x, x_new = sample_MH(x_old, p_x_y, stepsizes[0])\n",
" \n",
" # draw new y conditioned on x\n",
" p_y_x = bivariate_dist.log_p_y\n",
" accept_y, y_new = sample_MH(y_old, p_y_x, stepsizes[1])\n",
" \n",
" # Don't forget to turn the one-dimensional numpy arrays x_new, y_new\n",
" # of length one back into floats\n",
" \n",
" return (accept_x, accept_y), (x_new[0], y_new[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `sample_gibbs` function will yield one single sample from `bivariate_normal`.\n",
"As we did in the previous blog post for the Metropolis-Hastings algorithm, we now write a function that repeatedly runs `sample_gibbs` to build up a Markov chain and call it:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Acceptance rates: x: 0.462, y: 0.456\n"
]
}
],
"source": [
"def build_gibbs_chain(init, stepsizes, n_total, bivariate_dist):\n",
" \"\"\"Builds a Markov chain by performing repeated transitions using\n",
" the systematic Gibbs sampling transition kernel\n",
" \n",
" Arguments:\n",
" - init: an initial (two-dimensional) state for the Markov chain\n",
" (a list containing two floats)\n",
" - stepsizes: a list of step sizes of type float\n",
" - n_total: the total length of the Markov chain\n",
" - bivariate_dist: an object representing a bivariate distribution\n",
" (in our case, an instance of BivariateNormal)\n",
" \n",
" \"\"\"\n",
" init_x, init_k = init\n",
" chain = [init]\n",
" acceptances = []\n",
" \n",
" for _ in range(n_total):\n",
" accept, new_state = sample_gibbs(chain[-1], bivariate_dist, stepsizes)\n",
" chain.append(new_state) \n",
" acceptances.append(accept)\n",
" \n",
" acceptance_rates = np.mean(acceptances, 0)\n",
" print(\"Acceptance rates: x: {:.3f}, y: {:.3f}\".format(acceptance_rates[0],\n",
" acceptance_rates[1]))\n",
" \n",
" return chain \n",
"\n",
"stepsizes = (6.5, 1.0)\n",
"initial_state = [2.0, -1.0]\n",
"chain = build_gibbs_chain(initial_state, stepsizes, 100000, bivariate_normal)\n",
"chain = np.array(chain)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tada! \n",
"We used two very different step sizes and achieved very similar acceptance rates with both. \n",
"We now plot a 2D histogram of the samples (with the estimated probability density color-coded) and the marginal distributions:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x504 with 3 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def plot_samples_2D(chain, path_length, burnin, ax, lims=(-5, 5)):\n",
" chain = np.array(chain)\n",
" bins = np.linspace(lims[0], lims[1], 100)\n",
" ax.hist2d(*chain[burnin:].T, bins=100)\n",
" ax.plot(*chain[:path_length].T, marker='o', c='w', lw=0.4, \n",
" markersize=1, alpha=0.75)\n",
" ax.set_xlabel('x')\n",
" ax.set_ylabel('y')\n",
" ax.set_xlim(-3,3)\n",
" ax.set_ylim(-0.5, 0.5)\n",
" \n",
"def plot_bivariate_samples(chain, burnin, pdf):\n",
" fig = plt.figure(figsize=(12,7))\n",
" \n",
" ax_c = plt.subplot2grid((4, 4), (1, 0), rowspan=1, colspan=3)\n",
" plot_samples_2D(chain, 100, burnin, ax_c)\n",
" \n",
" ax_t = plt.subplot2grid((4, 4), (0, 0), rowspan=1, colspan=3, sharex=ax_c)\n",
" plot_samples(chain[:,0], pdf.log_p_x, ax_t, normalize=False)\n",
" plt.setp(ax_t.get_xticklabels(), visible=False)\n",
" ax_t.set_yticks(())\n",
" for spine in ('top', 'left', 'right'):\n",
" ax_t.spines[spine].set_visible(False)\n",
"\n",
" ax_r = plt.subplot2grid((4, 4), (1, 3), rowspan=1, colspan=1, sharey=ax_c)\n",
" plot_samples(chain[:,1], pdf.log_p_y, ax_r, orientation='horizontal',\n",
" normalize=False, legend=False)\n",
" plt.setp(ax_r.get_yticklabels(), visible=False)\n",
" ax_r.set_xticks(())\n",
" for spine in ('top', 'bottom', 'right'):\n",
" ax_r.spines[spine].set_visible(False)\n",
"\n",
" plt.show()\n",
" \n",
"plot_bivariate_samples(chain, burnin=200, pdf=bivariate_normal)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Looking at the path the Markov chain takes, we see several horizontal and vertical lines.\n",
"These are Gibbs sampling steps in which only one of the Metropolis-Hastings moves was accepted."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## A more complex example\n",
"The previous example was rather trivial in the sense that both variables were independent.\n",
"Let's discuss a more interesting example, which features both a discrete and a continuous variable.\n",
"We consider a mixture of two normal densities $p_\\mathcal{N}(x; \\mu, \\sigma)$ with relative weights $w_1$ and $w_2$.\n",
"The PDF we want to sample from is then\n",
"$$\n",
"p(x) = w_1p_\\mathcal{N}(x; \\mu_1, \\sigma_1) + w_2p_\\mathcal{N}(x; \\mu_2, \\sigma_2) \\ \\mbox .\n",
"$$\n",
"This probability density is just a weighted sum of normal densities.\n",
"Let's consider a concrete example, choosing the following mixture parameters:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"mix_params = dict(mu1=1.0, mu2=2.0, sigma1=0.5, sigma2=0.2, w1=0.3, w2=0.7)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How does it look like?\n",
"Well, it's a superposition of two normal distributions:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"xspace = np.linspace(-0.5, 3, 200)\n",
"\n",
"# densities of both components\n",
"first_component = [np.exp(log_gaussian(x, mix_params['mu1'], mix_params['sigma1']))\n",
" for x in xspace]\n",
"second_component = [np.exp(log_gaussian(x, mix_params['mu2'], mix_params['sigma2']))\n",
" for x in xspace]\n",
"\n",
"# apply component weights\n",
"first_component = mix_params['w1'] * np.array(first_component)\n",
"second_component = mix_params['w2'] * np.array(second_component)\n",
"\n",
"ax.plot(xspace, first_component, color='black')\n",
"ax.fill_between(xspace, first_component, alpha=0.6, label=\"1st component\")\n",
"ax.plot(xspace, second_component, color='black')\n",
"ax.fill_between(xspace, second_component, alpha=0.6, label=\"2nd component\")\n",
"ax.set_xlabel('x')\n",
"ax.set_yticks(())\n",
"ax.legend(frameon=False)\n",
"for spine in ('top', 'left', 'right'):\n",
" ax.spines[spine].set_visible(False)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Inspired by this figure, we can also make the mixture nature of that density more explicit by introducing an additional integer variable $ k \\in \\{1,2\\} $ which enumerates the mixture components.\n",
"This will allow us to highlight several features and properties of the Gibbs sampler and to introduce an important term in probability theory along the way.\n",
"Having introduced a second variable means that we can consider several probability distributions: \n",
"\n",
"- $p(x,k)$: the joint distribution of $x$ and $k$ tells us how probable it is to find a value for $x$ and a value for $k$ \"at the same time\" and is given by\n",
"$$\n",
"p(x|k) = w_kp_\\mathcal{N}(x; \\mu_k, \\sigma_k \\ \\mbox .\n",
"$$\n",
"- $p(x|k)$: the conditional distribution of $x$ given $k$ tells us the probability of $x$ for a certain $k$. For example, if $k=1$, what is $p(x|k)$? Setting $k=1$ means we're considering only the first mixture component, which is a normal distribution with mean $\\mu_1$ and standard deviation $\\sigma_1$ and thus $p(x|k=1)=p_\\mathcal{N}(x; \\mu_1, \\sigma_1)$. In general we then have\n",
"$$\n",
"p(x|k) = p_\\mathcal{N}(x; \\mu_k, \\sigma_k) \\ \\mbox .\n",
"$$\n",
"- $p(k|x)$: assuming a certain value $x$, this probability distribution tells us for each $k$ the probability with which you would draw $x$ from the mixture component with index $k$. This probability is non-trivial, as the mixture components overlap and each $x$ thus has a non-zero probability in each component. But [Bayes' theorem](https://en.wikipedia.org/wiki/Bayes%27_theorem) saves us and yields\n",
"$$\n",
"p(k|x) = \\frac{p(x|k) p(k)}{p(x)} \\ \\mbox .\n",
"$$\n",
"- $p(k)$: this is the probability of choosing a mixture component $k$ irrespective of $x$ and is given by the mixture weights $w_k$.\n",
"\n",
"The probability distributions $p(x)$ and $p(k)$ are related to the joint distribution $p(x,k)$ by a procedure called [*marginalization*](https://en.wikipedia.org/wiki/Marginal_distribution).\n",
"We marginalize $p(x,k)$ over, say, $k$, when we are only interested in the probability of $x$, independent of a specific value for $k$.\n",
"That means that the probability of $x$ is the sum of the probability of $x$ when $k=1$ plus the probability of $x$ when $k=2$, or, formally,\n",
"$$\n",
"p(x)=\\sum_{ k \\in \\{1, 2\\} } p(x,k) \\ \\mbox .\n",
"$$\n",
"\n",
"With these probability distributions, we have all the required ingredients for setting up a Gibbs sampler.\n",
"We can then sample from $p(x,k)$ and reconstruct $p(x)$ by marginalization.\n",
"As marginalization means \"not looking a variable\", obtaining samples from $p(x)$ given samples from $p(x,k)$ just amounts to discarding the sampled values for $k$.\n",
"\n",
"Let's first implement a Gaussian mixture with these conditional distributions:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"class GaussianMixture(object):\n",
" \n",
" def __init__(self, mu1, mu2, sigma1, sigma2, w1, w2):\n",
" self.mu1, self.mu2 = mu1, mu2\n",
" self.sigma1, self.sigma2 = sigma1, sigma2\n",
" self.w1, self.w2 = w1, w2\n",
" \n",
" def log_prob(self, x):\n",
" return np.logaddexp(np.log(self.w1) + log_gaussian(x, self.mu1, self.sigma1),\n",
" np.log(self.w2) + log_gaussian(x, self.mu2, self.sigma2))\n",
" \n",
" def log_p_x_k(self, x, k):\n",
" # logarithm of p(x|k)\n",
" mu = (self.mu1, self.mu2)[k]\n",
" sigma = (self.sigma1, self.sigma2)[k]\n",
" \n",
" return log_gaussian(x, mu, sigma)\n",
" \n",
" def p_k_x(self, k, x):\n",
" # p(k|x) using Bayes' theorem\n",
" mu = (self.mu1, self.mu2)[k]\n",
" sigma = (self.sigma1, self.sigma2)[k]\n",
" weight = (self.w1, self.w2)[k]\n",
" log_normalization = self.log_prob(x)\n",
"\n",
" return np.exp(log_gaussian(x, mu, sigma) + np.log(weight) - log_normalization)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The interesting point here (and, in fact, the reason I chose this example) is that $p(x|k)$ is a probability density for a *continuous* variable $x$, while $p(k|x)$ is a probability distribution for a *discrete* variable. This means we will have to choose two very different sampling methods.\n",
"While we could just use a built-in `numpy` function to draw from the normal distributions $p(x|k)$, we will use Metropolis-Hastings.\n",
"The freedom to do this really demonstrates the flexibility we have in choosing samplers for the conditional distributions.\n",
"\n",
"So we need to reimplement `sample_gibbs` and `build_gibbs_chain`, whose arguments are very similar to the previous implementation, but with a slight difference: the states now consist of a float for the continuous variabe and an integer for the mixture component, and instead of a list of stepsizes we just need one single stepsize, as we have only one variable to be sampled with Metropolis-Hastings."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Acceptance rate: x: 0.631\n",
"Average probability to change mode: 0.08629295966662387\n"
]
}
],
"source": [
"def sample_gibbs(old_state, mixture, stepsize):\n",
" \"\"\"Draws a single sample using the systematic Gibbs sampling\n",
" transition kernel\n",
" \n",
" Arguments:\n",
" - old_state: the old (two-dimensional) state of a Markov chain\n",
" (a list containing a float and an integer representing \n",
" the initial mixture component)\n",
" - mixture: an object representing a mixture of densities\n",
" (in our case, an instance of GaussianMixture)\n",
" - stepsize: a step size of type float \n",
" \n",
" \"\"\"\n",
" x_old, k_old = old_state\n",
" \n",
" # for compatibility with sample_MH, change floats to one-dimensional\n",
" # numpy arrays of length one\n",
" x_old = np.array([x_old])\n",
" \n",
" # draw new x conditioned on k\n",
" x_pdf = lambda x: mixture.log_p_x_k(x, k_old)\n",
" accept, x_new = sample_MH(x_old, x_pdf, stepsize)\n",
" \n",
" # ... turn the one-dimensional numpy arrays of length one back\n",
" # into floats\n",
" x_new = x_new[0]\n",
" \n",
" # draw new k conditioned on x \n",
" k_probabilities = (mixture.p_k_x(0, x_new), mixture.p_k_x(1, x_new))\n",
" jump_probability = k_probabilities[1 - k_old]\n",
" k_new = np.random.choice((0,1), p=k_probabilities)\n",
" \n",
" return accept, jump_probability, (x_new, k_new)\n",
"\n",
"\n",
"def build_gibbs_chain(init, stepsize, n_total, mixture):\n",
" \"\"\"Builds a Markov chain by performing repeated transitions using\n",
" the systematic Gibbs sampling transition kernel\n",
" \n",
" Arguments:\n",
" - init: an initial (two-dimensional) state of a Markov chain\n",
" (a list containing a one-dimensional numpy array\n",
" of length one and an integer representing the initial\n",
" mixture component)\n",
" - stepsize: a step size of type float\n",
" - n_total: the total length of the Markov chain\n",
" - mixture: an object representing a mixture of densities\n",
" (in our case, an instance of GaussianMixture)\n",
" \n",
" \"\"\"\n",
" init_x, init_k = init\n",
" chain = [init]\n",
" acceptances = []\n",
" jump_probabilities = []\n",
" \n",
" for _ in range(n_total):\n",
" accept, jump_probability, new_state = sample_gibbs(chain[-1], mixture, stepsize)\n",
" chain.append(new_state)\n",
" jump_probabilities.append(jump_probability)\n",
" acceptances.append(accept)\n",
" \n",
" acceptance_rates = np.mean(acceptances)\n",
" print(\"Acceptance rate: x: {:.3f}\".format(acceptance_rates))\n",
" print(\"Average probability to change mode: {}\".format(np.mean(jump_probabilities)))\n",
" \n",
" return chain\n",
"\n",
"mixture = GaussianMixture(**mix_params)\n",
"stepsize = 1.0\n",
"initial_state = [2.0, 1]\n",
"chain = build_gibbs_chain(initial_state, stepsize, 10000, mixture)\n",
"burnin = 1000\n",
"x_states = [state[0] for state in chain[burnin:]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plotting a histogram of our samples shows that the Gibbs sampler correctly reproduces the desired Gaussian mixture: "
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAFzCAYAAAA66dO+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deXxU9b3/8dd3JiHsi4Ql7IGwhB1BsApqte6K2tpfbfVn1drFLvZ6W3u5P70ut/5au9zWWuuli70/2+LSWqttcV8QFEUBWRK2JCSBsCaBAAGyzJzv74+TRCIkJCQz3zMz7+fjkcdM5pw585mTgbzzXc7XWGsRERERSWYh1wWIiIiIxJoCj4iIiCQ9BR4RERFJego8IiIikvQUeERERCTpKfCIiIhI0ks7yXbNWRcREZFEYVraoBYeERERSXoKPCIiIpL0FHhEREQk6SnwiIiISNJT4BEREZGkp8AjIiIiSU+BR0RERJKeAo+IiIgkvYQLPFVVVTz66KNxe71Ro0ZRUVEBwFlnndXqvj/4wQ9a3X7ZZZdRVVVFSUkJkydPblcdS5YsYfny5U3fL1y4kD/84Q/tOoaIiEiqMta2ejHlwF1puaSkhCuuuIK8vLzjtkUiEdLSTnbx6PYZNWoUK1euJDMz86T79uzZk+rq6uMet9ZirSUU8vNla++hJffddx89e/bku9/9btuLFxERSS3Jc6XlBQsWUFRUxPTp07nzzjtZsmQJ8+bNY/78+UycOPG41pOf/vSn3HfffQAUFRVxySWXMHPmTObNm8emTZuOO35lZSUXXXQRkyZN4tZbb+XYQNizZ08Adu3axTnnnMP06dOZPHkyy5YtY8GCBRw9epTp06dz/fXXU1JSwvjx47nxxhuZPHky27dvb9ZaFIlEuP7668nNzeXaa6/lyJEjQPMWpZUrV3LeeedRUlLCwoUL+fnPf8706dNZtmwZ9913Hz/96U8BWLNmDWeeeSZTp07lmmuuYf/+/QCcd955/Nu//RuzZ89m3LhxLFu2rJN/GiIiIomhY80hLy6A3es7qZQGg6fApQ+2uPnBBx8kLy+PNWvWAH5Xz+rVq8nLyyM7O5uSkpIWn/uVr3yFhQsXMnbsWFasWMHXv/513njjjWb73H///cydO5d77rmHxYsX89hjjx13nCeeeIKLL76Yu+66i2g0ypEjR5g3bx6PPPJIU10lJSUUFBTw+OOPc+aZZx53jM2bN/PYY49x9tlnc8stt/Doo4+22HozatQovva1rzVr4Xn99debtt9444388pe/5Nxzz+Wee+7h/vvv56GHHgL8YPX+++/zwgsvcP/99/Paa6+1eH5ERESSVef2/zgye/ZssrOzW92nurqa5cuX89nPfrbpsdra2uP2W7p0Kc8++ywAl19+Of369TtunzPOOINbbrmF+vp6rr76aqZPn37C1xw5cuQJww7A8OHDOfvsswG44YYbePjhh0+pu+rAgQNUVVVx7rnnAvDFL36x2Xv89Kc/DcDMmTNbDYMiIiLJrGOBp5WWmHjq0aNH0/20tDQ8z2v6vqamBgDP8+jbt29TC0xHnHPOOSxdupTFixdz00038a//+q/ceOONrdb1ccaYE35/bP2NtXdERkYGAOFwmEgk0uHjiYgEWnU5rHsaDu+FYbNh/KUQCruuSgIg4cbw9OrVi0OHDrW4fdCgQezdu5fKykpqa2v55z//CUDv3r3Jzs7mL3/5C+APJF67du1xzz/nnHN44oknAHjxxRebxsMcq7S0lEGDBvHlL3+ZW2+9ldWrVwOQnp5OfX19m97Htm3bePfddwG/i2zu3LmA3321atUqAP7617+e9H336dOHfv36NY3P+eMf/9jU2iMiklI2vwQPz4BX7oJ3H4Wnr4fHr4TDFa4rkwBIuMDTv39/zj77bCZPnsydd9553Pb09HTuueceZs+ezYUXXsiECROati1atIjHHnuMadOmMWnSJJ5//vnjnn/vvfeydOlSJk2axLPPPsuIESOO22fJkiVMmzaNGTNm8PTTT/Ptb38b8McITZ06leuvv/6k72P8+PH86le/Ijc3l/3793Pbbbc1vf63v/1tZs2aRTj80V8lV155JX/729+aBi0f6/HHH+fOO+9k6tSprFmzhnvuueekry8iklSKl/oBp/8Y+Mb7cNduuOpXsGMVLPos1B12XaE4lnDT0kVERJo5XAm/mg09MuFLr0DXPh9t2/QCPPUFmP0VuOzH7mqUeEmeaekiIiLNvPofUFMF1/6+edgBmHAZzPkqvP9rKFvppj4JBLXwiIhI4irfjPfIHH4TvZwHI1844S7dqeGtjDsoskO4ru5uTtQIUPLg5TEuVOJELTwiIpKElv6Uo3Th15Er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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"plot_samples(x_states, mixture.log_prob, ax, normalize=False, xlims=(-1,2.5))\n",
"for spine in ('top', 'left', 'right'):\n",
" ax.spines[spine].set_visible(False)\n",
"ax.set_yticks(())\n",
"ax.set_xlabel('x')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You might wonder why we're also printing the average probability for the chain to sample from the component it is currently *not* in.\n",
"If this probability is very low, the Markov chain will get stuck for some time in the current mode and thus will have difficulties exploring the distribution rapidly. \n",
"The quantity of interest here is $p(k|x)$: \n",
"it is the probability of a certain component $k$ given a certain value $x$ and can be very low if the components are more separated and $x$ is more likely to be in the component which is not $k$. \n",
"Let's explore this behavior by increasing the separation between the means of the mixture components:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Acceptance rate: x: 0.558\n",
"Average probability to change mode: 6.139534006013391e-06\n"
]
}
],
"source": [
"mixture = GaussianMixture(mu1=-1.0, mu2=2.0, sigma1=0.5, sigma2=0.2, w1=0.3, w2=0.7)\n",
"stepsize = 1.0\n",
"initial_state = [2.0, 1]\n",
"chain = build_gibbs_chain(initial_state, stepsize, 100000, mixture)\n",
"burnin = 10000\n",
"x_states = [state[0] for state in chain[burnin:]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's plot the samples and the true distribution and see how the Gibbs sampler performs in this case:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAFzCAYAAAA66dO+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deXxU9b3/8ff3TBaWsMoqCQSQBJIQgoCiyKLWuoBWq73V6rXotbvV2mpLr/eqtP4qtt7qr/X2R3uvvVXrVnevuLZKwYoiYAIJkCAQIMi+ryEz5/v742QiuyzJnGVez8djHiRzZuZ8wgDz5nO+i7HWCgAAIMocvwsAAABoaQQeAAAQeQQeAAAQeQQeAAAQeQQeAAAQeQQeAAAQeRmfc5w56wAAICzMkQ7Q4QEAAJFH4AEAAJFH4AEAAJFH4AEAAJFH4AEAAJFH4AEAAJFH4AEAAJFH4AEAAJEXusCzdetW/e53v0vZ+fLz87Vx40ZJ0tlnn33Ux/7iF7846vFLLrlEW7duVW1trUpKSo6rjunTp+v9999v+n7q1Kl67LHHjus1AABIV8baoy6mHLiVlmtrazVhwgRVVlYeciwejysj4/MWjz4++fn5mjNnjrp06fK5j83JydHOnTsPud9aK2utHMfLl0f7GY7knnvuUU5Ojm6//fZjLx4AgPQSnZWWJ02apKVLl6qsrEx33HGHpk+frtGjR+uyyy5TUVHRId2TBx54QPfcc48kaenSpbrooos0bNgwjR49WosXLz7k9Tdt2qQvfvGLKi4u1k033aT9A2FOTo4kac2aNRozZozKyspUUlKimTNnatKkSdqzZ4/Kysp07bXXqra2VoWFhbr++utVUlKiVatWHdAtisfjuvbaazVo0CBdddVV2r17t6QDO0pz5szRuHHjVFtbq6lTp+rBBx9UWVmZZs6cqXvuuUcPPPCAJKm8vFwjR45UaWmprrjiCm3ZskWSNG7cOP3kJz/RGWecoYKCAs2cObOZ3w0AAMLh5Nohr0+S1i5oplIa9RgsXTzliIenTJmiyspKlZeXS/Iu9cybN0+VlZXq27evamtrj/jcb37zm5o6daoGDBigDz/8UN/97nf1zjvvHPCYyZMn65xzztFdd92ladOm6ZFHHjnkdZ588kldeOGFuvPOO5VIJLR7926NHj1aDz/8cFNdtbW1WrJkiR599FGNHDnykNeorq7WI488olGjRunGG2/U7373uyN2b/Lz8/Xtb3/7gA7P3/72t6bj119/vX77299q7NixuuuuuzR58mQ99NBDkrxgNXv2bL322muaPHmy/vrXvx7x9wcAgKhq3us/PjnjjDPUt2/foz5m586dev/99/WVr3yl6b76+vpDHjdjxgy98MILkqTx48erU6dOhzxmxIgRuvHGG9XQ0KDLL79cZWVlhz1nnz59Dht2JCkvL0+jRo2SJF133XX6zW9+c0KXq7Zt26atW7dq7NixkqSvf/3rB/yMX/7ylyVJw4YNO2oYBAAgyk4u8BylE5NKbdu2bfo6IyNDrus2fb93715Jkuu66tixY1MH5mSMGTNGM2bM0LRp0zRx4kT98Ic/1PXXX3/Uug5mjDns9/vXn6z9ZGRnZ0uSYrGY4vH4Sb8eAABhFLoxPO3atdOOHTuOeLx79+5av369Nm3apPr6er366quSpPbt26tv37569tlnJXkDiSsqKg55/pgxY/Tkk09Kkl5//fWm8TD7W7Fihbp3765vfOMbuummmzRv3jxJUmZmphoaGo7p51i5cqVmzZolybtEds4550jyLl/NnTtXkvT8889/7s/doUMHderUqWl8zuOPP97U7QEAfL78SdMOuCGaQhd4TjnlFI0aNUolJSW64447DjmemZmpu+66S2eccYYuuOACDRw4sOnYE088oUceeURDhgxRcXGxXn755UOef/fdd2vGjBkqLi7WCy+8oN69ex/ymOnTp2vIkCEaOnSonnnmGd16662SvDFCpaWluvbaaz/35ygsLNR//ud/atCgQdqyZYu+853vNJ3/1ltv1fDhwxWLxZoef+mll+rFF19sGrS8v0cffVR33HGHSktLVV5errvuuutzzw8AQDoJ3bR0AACa08Fdndop432qBM0gOtPSAQAAjheBBwAARB6BBwAARB6BBwAARB6BBwAARB6BBwAARF4oA48xRtddd13T9/F4XF27dtWECROa7nv99dc1fPhwFRUVaejQofrRj34kydt13BijTz75pOmxDz30kIwxmjNnjiRvG4pvfetb6t+/v4YNG6Zx48bpww8/TNFPd3gTJ07Uc88952sNAACE1UnvpdXcq1Iey/oHbdu2VWVlpfbs2aPWrVvr7bffVq9evZqOV1ZW6uabb9a0adM0cOBAJRIJ/eEPf2g6PnjwYD399NP6t3/7N0nSs88+q+Li4qbjN910k/r27aslS5bIcRwtX75cCxcubMafEgAApFIoOzySdMkll2jaNC9sPfXUU7rmmmuajv3yl7/UnXfe2bTKciwWa1rJWJIuv/zyplWWly5dqg4dOqhLly5N33/44Ye699575Tjeb0/fvn01fvyBQSyRSGjixIkqKSnR4MGD9eCDD0qS/uu//ksjRozQkCFDdOWVV2r37t2SvA7Nd77zHY0cOVL9+vXT9OnTdeONN2rQoEGaOHFi0+vm5OTotttuU3Fxsc4//3xt2LDhkJ997ty5Gjt2rIYNG6YLL7xQa9askST95je/UVFRkUpLS3X11Vef+G8uAEQcW0mkn9AGnquvvlpPP/209u7dq/nz5+vMM89sOlZZWalhw4Yd8bnt27dXXl6eKisr9fTTT+urX/1q07GqqiqVlZUdsK3D4ZSXl2v16tWqrKzUggULdMMNN0jydif/6KOPVFFRoUGDBumRRx5pes6WLVs0a9YsPfjgg7rssst02223qaqqSgsWLGja1HTXrl0aPny4qqqqNHbsWE2ePPmA8zY0NOj73/++nnvuOc2dO1c33nij7rzzTknSlClT9PHHH2v+/PmaOnXqMf5OAgAQfaENPKWlpaqtrdVTTz2lSy655LifnwxML730kq644orjfn6/fv20bNkyff/739cbb7yh9u3bS/LC1ujRozV48GA98cQTqqqqanrOpZdeKmOMBg8erO7du2vw4MFyHEfFxcWqra2VJDmO0xTArrvuOr333nsHnLe6ulqVlZW64IILVFZWpnvvvVd1dXVNvyfXXnut/vznPysj46SvVgIAEBmhDTySdNlll+n2228/4HKWJBUXFzftOH4kEyZM0OOPP67evXs3hZXkcysqKpRIJI76/E6dOqmiokLjxo3T1KlTddNNN0nyLl09/PDDWrBgge6++27t3bu36TnZ2dmSvFCT/Dr5fTweP+x5jDlwWxBrrYqLi1VeXq7y8nItWLBAb731liRp2rRp+t73vqd58+ZpxIgRR3xNAADSTagDz4033qi7775bgwcPPuD+O+64Q7/4xS9UU1MjSXJd95BLPG3atNH999/fdDkoqX///ho+fLjuvvtuJTdWra2tbRovlLRx40a5rqsrr7xS9957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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"plot_samples(x_states, mixture.log_prob, ax, normalize=False, xlims=(-2,2.5))\n",
"for spine in ('top', 'left', 'right'):\n",
" ax.spines[spine].set_visible(False)\n",
"ax.set_yticks(())\n",
"ax.set_xlabel('x')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You should see the probability decrease significantly and perhaps one of the modes being strongly over- and the other undersampled. \n",
"The lesson here is that the Gibbs sampler might produce highly correlated samples.\n",
"Again&mdash;in the limit of many, many samples&mdash;the Gibbs sampler will reproduce the correct distribution, but you might have to wait a long time."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Conclusions\n",
"By now, I hope you have a basic understanding of why Gibbs sampling is an important MCMC technique, how it works and why it can produce highly correlated samples.\n",
"I encourage you again to download the <a href=\"https://github.com/tweag/blog-resources/blob/master/mcmc-intro/mcmc_introduction.ipynb\">full notebook</a> and play around with the code:\n",
"you could try using the `normal` function from the `numpy.random` module instead of Metropolis-Hastings in both examples or implement a *random* scan, in which the order in which you sample from the conditional distributions is chosen randomly. \n",
"\n",
"Or you could read about and implement the <a href=\"https://en.wikipedia.org/wiki/Gibbs_sampling#Collapsed_Gibbs_sampler\">collapsed Gibbs sampler</a>, which allows you to perfectly sample the Gaussian mixture example by sampling from $p(k)$ instead of $p(k|x)$. \n",
"Or you can just wait a little more for the next post in the series, which will be about Hybrid Monte Carlo (HMC), \n",
"a fancy Metropolis-Hastings variant which takes into account the derivative of the log-probability of interest to propose better, less correlated, states!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<hline>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. It's important to note, though, that the transition kernel given py the above procedure does _not_ define a detailed-balanced transition kernel for a Markov chain on the joint space of $x$ and $y$. One can show, though, that for each single variable, this procedure is a detailed-balanced transition kernel and the Gibbs sampler thus constitutes a composition of Metropolis-Hastings steps with acceptance probability 1. For details, see, for example, [this stats.stackexchange.com answer](https://stats.stackexchange.com/a/118453)."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
#!/usr/bin/env python3
import sys
from itertools import cycle
import re
with open(sys.argv[1]) as ipf:
lines = ipf.readlines()
# ## replace \{ with \\{ and \} with \\}
lines = [l.replace('\\{', r'\\{') for l in lines]
lines = [l.replace('\\}', r'\\}') for l in lines]
## replace \\ with \\\\
lines = [l.replace(r' \\', r' \\\\') for l in lines]
## replace ^* with ^\*
lines = [l.replace(r'^*', r'^\*') for l in lines]
## alternatingly replace $ with \\( and \\)
## if it's not part of $$
lines2 = []
for line in lines:
if '$$' in line:
lines2.append(line)
continue
else:
cycler = cycle((True, False))
matches = re.finditer('\$', line)
offset = 0
for match in matches:
replacement = '\\\(' if next(cycler) else '\\\)'
line = line[:match.start()+offset] + replacement + line[match.start()+1+offset:]
offset += 2
lines2.append(line)
with open(sys.argv[2]) as ipf:
header = ipf.readlines()
with open(sys.argv[3], 'w') as opf:
for line in header + lines2[2:]:
opf.write(line)
@MMesch
Copy link

MMesch commented Jul 19, 2019

Reads nicely @simeoncarstens !

Here are a few thoughts that I had while reading the beginning (will continue another day). Some of them are resolved by reading it several times, but maybe it is a good hint for where a reader might hang a bit:

A sufficient (but not neccessary), convenient condition for a Markov chain to have a distribution $p(x)$ as its invariant distribution is called detailed balance: $p(x)T(y|x) = p(y)T(x|y)$.

what is y in the equation?

A distribution $\pi$ of the state space of a Markov Chain

Calling the stationary distribution eigenvector \pi confuses me because I associate it so much with a number. But maybe it is the standard. In that case never mind ...

So all that is fun, but back to sampling arbitrary probability distributions. If we could design our transition kernel in such a way that the next state is already drawn from $\pi$, we would be done, as our Markov Chain would... well... immediately sample from $\pi$. Unfortunately, to do this, we need to be able to sample from $\pi$, which we can't. Otherwise you wouldn't be reading this, right?

I feel this is a nice paragraph but it could be easier to understand without prior knowledge: You don't really introduce what "design our transition kernel" means. Also, how can I "draw from \pi" I thought I only draw a new state based on the row in T of the previous step?

n $q(x_{i+1}^*|x_i)$, from

the ^* is difficult to see and read. Probably better if it has different support. Otherwise, can you use a different symbol?

probability $p_\mathrm{acc}(x_{i+1}=x_{i+1}^|x_{i+1}^, x_i)$

For this transition kernel to obey detailed balance, we need to choose $p_\mathrm{acc}$ correctly. One possibility is the Metropolis acceptance criterion:

how can we know when it is set correctly? Is this difficult to grasp intuitively?

@UnkindPartition
Copy link

UnkindPartition commented Jul 20, 2019

I don't think the method you use for the mixture of Gaussians can be called Gibbs sampling. As you say, in Gibbs sampling you'd have to draw from p(k|x), but it does not equal p(k) because k and x are not independent. You'd have to use the Bayes theorem to calculate p(k|x).

Your method is to draw hierarchically: first draw k from the marginal distribution, then draw x from the conditional distribution, whereas in Gibbs sampling you draw from both conditional distributions, each time using the value from the previous step.

Your method works, but it works for a different reason than the reason Gibbs sampling works. I don't think it has a name.

Edit: moreover, I think your method works well precisely because you are not using GIbbs sampling. If you did, you'd have the same problem of being stuck in one of the mixture components, because p(k|x) would very likely give you the same k as the one that generated that x.

@UnkindPartition
Copy link

Finished reading — very nice! I corrected a few typos here: https://gist.github.com/feuerbach/5ccaeee166b45be13a8e375f980f405a.

Maybe one day I'll make a similar post except everything is done in Stan :)

@simeoncarstens
Copy link
Author

Thanks for your feedback, @MMesch and @feuerbach! Highly appreciated!
For now I mostly worked on the MH part and put it into a separate notebook, where I addressed some of @MMesch's points.

@MMesch: I fear the \pi is indeed somewhat standard - as p often denotes other probabilities such as p_acc.

@feuerbach: This is very interesting - and you're right. The background to this example is that, a few years ago, I did something like that to sample from a different kind of mixture model and back then we used to call it Gibbs sampling. Looking this up, it seems like a very common method to sample from Gaussian (and other) mixture models (where you can easily marginalize out x to obtain p(k)). It seems to be called "Collapsed Gibbs sampling". I will rewrite this part to feature an actual Gibbs sampler. I just need to think of a nice, concise example where you can sample from the conditional distributions without resorting to MCMC. And as for being stuck in one of the mixture components: highly correlated samples often are a problem when using Gibbs sampling and I should discuss this.

I am also thinking of discussing how to assess convergence for MCMC methods, but this is a very difficult topic. It would make the series much more complete, but is also a really ugly rock to look under...

@simeoncarstens
Copy link
Author

simeoncarstens commented Jul 26, 2019

@feuerbach: Just FYI, I implemented the actual Gibbs sampler for this problem and it turns out that

you'd have the same problem of being stuck in one of the mixture components, because p(k|x) would very likely give you the same k as the one that generated that x.

is a slight understatement. If the sampler starts in the mode on the right, there's (on average) a ~1/1e6 chance for it to jump to the mode on the left. That was fun and very instructive and might even serve in a next version of that blog post / notebook as a negative example.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment