├── .gitignore ├── Gibbs-Sampling.ipynb ├── Importance-Sampling.ipynb ├── Inverse-Transform-Sampling.ipynb ├── Langevin-Monte-Carlo.ipynb ├── Metropolis-Hastings.ipynb ├── README.md └── Rejection-Sampling.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .ipynb* 3 | -------------------------------------------------------------------------------- /Gibbs-Sampling.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "%matplotlib inline\n", 10 | "from __future__ import print_function\n", 11 | "import numpy as np\n", 12 | "import matplotlib.pyplot as plt" 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "### Gibbs Sampling\n", 20 | "For a multivariate distribution, $P(X)$, $X = \\begin{bmatrix}x_1 \\\\x_2 \\end{bmatrix}$, Gibbs Sampling is performed as follows. It is assumed that it's difficult to sample from the joint distribution $P(x_1,x_2)$ but it's possible to sample from the conditional distributions $P(x_1|x_2)$ and $P(x_2|x_1)$.\n", 21 | "* Start at some $X^t = \\begin{bmatrix}x_1^0 \\\\x_2^0 \\end{bmatrix}$\n", 22 | "* Sample $x^{t+1}_1 \\sim P(x_1|x_2^t)$\n", 23 | "* Sample $x^{t+1}_2 \\sim P(x_2|x^{t+1}_1)$\n", 24 | "* $X^{t+1} = \\begin{bmatrix}x^{t+1}_1 \\\\x^{t+1}_2 \\end{bmatrix}$\n", 25 | "\n", 26 | "Remove the first few samples as burn-in values." 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "Let $$P(X) = P(x_1,x_2) = \\frac{1}{\\sqrt{|2\\pi\\Sigma|}}e^{-\\frac{1}{2}(X-\\mu)^T\\Sigma^{-1}(X-\\mu)}$$\n", 34 | "Where $\\mu = \\begin{bmatrix}0 \\\\0 \\end{bmatrix}$ and $\\Sigma = \\begin{bmatrix}1 & b \\\\b & 1 \\end{bmatrix}$ and $X = \\begin{bmatrix}x_1 \\\\x_2 \\end{bmatrix}$ and $b = 0.8$ \n", 35 | "The conditional probabilities are then given by\n", 36 | "$$P(x_1|x_2) = \\mathcal{N}(bx_2, 1-b^2)$$\n", 37 | "$$P(x_2|x_1) = \\mathcal{N}(bx_1, 1-b^2)$$" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 2, 43 | "metadata": {}, 44 | "outputs": [], 45 | "source": [ 46 | "import numpy.linalg as LA\n", 47 | "def multivariate_normal(X, mu=np.array([[0, 0]]), sig=np.array([[1, 0.8], [0.8, 1]])):\n", 48 | " sqrt_det_2pi_sig = np.sqrt(2 * np.pi * LA.det(sig))\n", 49 | " sig_inv = LA.inv(sig)\n", 50 | " X = X[:, None, :] - mu[None, :, :]\n", 51 | " return np.exp(-np.matmul(np.matmul(X, np.expand_dims(sig_inv, 0)), (X.transpose(0, 2, 1)))/2)/sqrt_det_2pi_sig" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": 3, 57 | "metadata": {}, 58 | "outputs": [], 59 | "source": [ 60 | "x = np.linspace(-3, 3, 1000)\n", 61 | "X = np.array(np.meshgrid(x, x)).transpose(1, 2, 0)\n", 62 | "X = np.reshape(X, [X.shape[0] * X.shape[1], -1])\n", 63 | "z = multivariate_normal(X)" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 4, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "data": { 73 | "image/png": "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\n", 74 | "text/plain": [ 75 | "
" 76 | ] 77 | }, 78 | "metadata": {}, 79 | "output_type": "display_data" 80 | } 81 | ], 82 | "source": [ 83 | "plt.imshow(z.squeeze().reshape([x.shape[0], -1]), extent=[-10, 10, -10, 10], cmap='hot', origin='lower')\n", 84 | "plt.contour(x, x, z.squeeze().reshape([x.shape[0], -1]), cmap='cool')\n", 85 | "plt.title('True Bivariate Distribution')\n", 86 | "plt.xlabel('$x_1$')\n", 87 | "plt.ylabel('$x_2$')\n", 88 | "plt.show()" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 5, 94 | "metadata": {}, 95 | "outputs": [], 96 | "source": [ 97 | "x0 = [0, 0]\n", 98 | "xt = x0\n", 99 | "b = 0.8\n", 100 | "samples = []\n", 101 | "for i in range(100000):\n", 102 | " x1_t = np.random.normal(b*xt[1], 1-b*b)\n", 103 | " x2_t = np.random.normal(b*x1_t, 1-b*b)\n", 104 | " xt = [x1_t, x2_t]\n", 105 | " samples.append(xt)\n", 106 | "burn_in = 1000\n", 107 | "samples = np.array(samples[burn_in:])" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 6, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "data": { 117 | "image/png": "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\n", 118 | "text/plain": [ 119 | "
" 120 | ] 121 | }, 122 | "metadata": {}, 123 | "output_type": "display_data" 124 | } 125 | ], 126 | "source": [ 127 | "im, x_, y_ = np.histogram2d(samples[:, 0], samples[:, 1], bins=100, normed=True)\n", 128 | "plt.imshow(im, extent=[-10, 10, -10, 10], cmap='hot', origin='lower', interpolation='nearest')\n", 129 | "plt.title('Empirical Bivariate Distribution')\n", 130 | "plt.xlabel('$x_1$')\n", 131 | "plt.ylabel('$x_2$')\n", 132 | "plt.show()" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": null, 138 | "metadata": {}, 139 | "outputs": [], 140 | "source": [] 141 | } 142 | ], 143 | "metadata": { 144 | "kernelspec": { 145 | "display_name": "Python 3", 146 | "language": "python", 147 | "name": "python3" 148 | }, 149 | "language_info": { 150 | "codemirror_mode": { 151 | "name": "ipython", 152 | "version": 3 153 | }, 154 | "file_extension": ".py", 155 | "mimetype": "text/x-python", 156 | "name": "python", 157 | "nbconvert_exporter": "python", 158 | "pygments_lexer": "ipython3", 159 | "version": "3.6.5" 160 | } 161 | }, 162 | "nbformat": 4, 163 | "nbformat_minor": 2 164 | } 165 | -------------------------------------------------------------------------------- /Importance-Sampling.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "%matplotlib inline\n", 10 | "from __future__ import print_function\n", 11 | "import numpy as np\n", 12 | "import matplotlib.pyplot as plt" 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "### Desired Distribution\n", 20 | "Let $P(x) = 3e^{-\\frac{x^2}{2}} + e^{-\\frac{(x-4)^2}{2}}$ be the distribution we want to sample from. Note that this is an unnormalized distribution with a normalizing constant $Z$ we can compute but let's keep it as it is. \n", 21 | "($Z \\approx 10.0261955464$) " 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 2, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "P = lambda x: 3 * np.exp(-x*x/2) + np.exp(-(x - 4)**2/2)\n", 31 | "Z = 10.0261955464" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 3, 37 | "metadata": {}, 38 | "outputs": [ 39 | { 40 | "data": { 41 | "image/png": "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\n", 42 | "text/plain": [ 43 | "
" 44 | ] 45 | }, 46 | "metadata": {}, 47 | "output_type": "display_data" 48 | } 49 | ], 50 | "source": [ 51 | "x_vals = np.linspace(-10, 10, 1000)\n", 52 | "y_vals = P(x_vals)\n", 53 | "plt.figure(1)\n", 54 | "plt.plot(x_vals, y_vals, 'r', label='P(x)')\n", 55 | "plt.legend(loc='upper right', shadow=True)\n", 56 | "plt.show()" 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "Let the functions that we want to approximate be $f(x) = x$ and $g(x) = \\sin(x)$. The two values for a unnormalized $P$ are as follows:\n", 64 | "* $\\mathbb{E}[x] \\approx 10.02686647165 $\n", 65 | "* $\\mathbb{E}[\\sin(x)] \\approx -1.15088010640 $" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 4, 71 | "metadata": {}, 72 | "outputs": [], 73 | "source": [ 74 | "f_x = lambda x: x\n", 75 | "g_x = lambda x: np.sin(x)\n", 76 | "true_expected_fx = 10.02686647165\n", 77 | "true_expected_gx = -1.15088010640" 78 | ] 79 | }, 80 | { 81 | "cell_type": "markdown", 82 | "metadata": {}, 83 | "source": [ 84 | "### Importance Sampling\n", 85 | "$$\\mathbb{E}_{x \\sim P}[f(x)] = \\mathbb{E}_{x \\sim Q}\\Big[f(x)\\frac{P(x)}{Q(x)}\\Big]$$\n", 86 | "Which means $\\mathbb{E}_{x \\sim P}[f(x)] \\approx \\frac{1}{n}\\sum_{i=1}^nf(x_i)\\frac{P(x_i)}{Q(x_i)}$ where $x_i$ are drawn from $Q$. This applies when $P$ and $Q$ are both normalized. For unnormalized case \n", 87 | "$$\\mathbb{E}_{x \\sim P}[f(x)] \\approx \\frac{\\sum_{i=1}^nf(x_i)\\frac{P(x_i)}{Q(x_i)}}{\\sum_{i=1}^n\\frac{P(x_i)}{Q(x_i)}}$$ \n", 88 | "Let the proposal distribution $Q(x)$ be a uniform distribution in $[-4,8]$. \n", 89 | "$Q(x) = \\frac{1}{8 + 4}$ for $x \\in [-4,8]$" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": 5, 95 | "metadata": {}, 96 | "outputs": [ 97 | { 98 | "data": { 99 | "image/png": "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\n", 100 | "text/plain": [ 101 | "
" 102 | ] 103 | }, 104 | "metadata": {}, 105 | "output_type": "display_data" 106 | } 107 | ], 108 | "source": [ 109 | "a, b = -4, 8\n", 110 | "uniform_prob = 1./(b - a)\n", 111 | "plt.figure(2)\n", 112 | "plt.plot(x_vals, y_vals, 'r', label='P(x)')\n", 113 | "plt.plot(x_vals, f_x(x_vals), 'b', label='x')\n", 114 | "plt.plot([-10, a, a, b, b, 10], [0, 0, uniform_prob, uniform_prob, 0, 0], 'g', label='Q(x)')\n", 115 | "plt.plot(x_vals, np.sin(x_vals), label='sin(x)')\n", 116 | "plt.xlim(-4, 10)\n", 117 | "plt.ylim(-1, 3.5)\n", 118 | "plt.legend(loc='upper right', shadow=True)\n", 119 | "plt.show()" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 6, 125 | "metadata": {}, 126 | "outputs": [ 127 | { 128 | "name": "stdout", 129 | "output_type": "stream", 130 | "text": [ 131 | "E[f(x)] = 9.96023, Error = 0.06664\n", 132 | "E[g(x)] = -1.19108, Error = 0.04020\n" 133 | ] 134 | } 135 | ], 136 | "source": [ 137 | "expected_f_x = 0.\n", 138 | "expected_g_x = 0.\n", 139 | "n_samples = 100000\n", 140 | "den = 0.\n", 141 | "for i in range(n_samples):\n", 142 | " sample = np.random.uniform(a, b)\n", 143 | " importance = P(sample) / uniform_prob\n", 144 | " den += importance\n", 145 | " expected_f_x += importance * f_x(sample)\n", 146 | " expected_g_x += importance * g_x(sample)\n", 147 | "expected_f_x /= den\n", 148 | "expected_g_x /= den\n", 149 | "expected_f_x *= Z\n", 150 | "expected_g_x *= Z\n", 151 | "print('E[f(x)] = %.5f, Error = %.5f' % (expected_f_x, abs(expected_f_x - true_expected_fx)))\n", 152 | "print('E[g(x)] = %.5f, Error = %.5f' % (expected_g_x, abs(expected_g_x - true_expected_gx)))" 153 | ] 154 | } 155 | ], 156 | "metadata": { 157 | "kernelspec": { 158 | "display_name": "Python 3", 159 | "language": "python", 160 | "name": "python3" 161 | }, 162 | "language_info": { 163 | "codemirror_mode": { 164 | "name": "ipython", 165 | "version": 3 166 | }, 167 | "file_extension": ".py", 168 | "mimetype": "text/x-python", 169 | "name": "python", 170 | "nbconvert_exporter": "python", 171 | "pygments_lexer": "ipython3", 172 | "version": "3.6.5" 173 | } 174 | }, 175 | "nbformat": 4, 176 | "nbformat_minor": 2 177 | } 178 | -------------------------------------------------------------------------------- /Inverse-Transform-Sampling.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "%matplotlib inline\n", 12 | "from __future__ import print_function\n", 13 | "import numpy as np\n", 14 | "import matplotlib.pyplot as plt" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "# Inverse Transform Sampling\n", 22 | "\n", 23 | "Inverse Transform Sampling is based on the [probability integral transform](https://en.wikipedia.org/wiki/Probability_integral_transform) which states that a random variable defined as $Y = F_X(X)$, where $F_X$ is the cumulative distribution function (CDF) of $X$, has the distribution $\\mathcal{U}[0,1]$. The inverse probability integral transform then states than a random variable $\\hat{X} = F_X^{-1}(Y)$ where $Y \\sim \\mathcal{U}[0,1]$ has the same probability distribution as $X$. This allows us to easily sample from probability distributions whose inverse of CDFs can be computed easily. " 24 | ] 25 | }, 26 | { 27 | "cell_type": "markdown", 28 | "metadata": {}, 29 | "source": [ 30 | "### Cauchy Distribution\n", 31 | "The PDF is given by\n", 32 | "$$Cauchy(x_o,\\gamma) = \\frac{1}{\\pi\\gamma\\Bigg[1+\\Big(\\frac{x-x_0}{\\gamma}\\Big)^2\\Bigg]}$$ \n", 33 | "and the CDF by\n", 34 | "$$P(X \\leq x) = \\frac{1}{2} + \\frac{1}{\\pi}\\tan^{-1}{\\Big(\\frac{x-x_0}{\\gamma}\\Big)}$$ \n", 35 | "For $Cauchy(0,1)$,\n", 36 | "$$F_X^{-1}(y) = \\tan{\\Bigg[\\pi\\Big(y-\\frac{1}{2}\\Big)\\Bigg]}$$" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 2, 42 | "metadata": { 43 | "collapsed": true 44 | }, 45 | "outputs": [], 46 | "source": [ 47 | "cauchy = lambda x: 1./np.pi/(1+x**2)" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": 3, 53 | "metadata": {}, 54 | "outputs": [ 55 | { 56 | "data": { 57 | "image/png": "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\nP6BcdgPers/nAAAAAElFTkSuQmCC\n", 58 | "text/plain": [ 59 | "" 60 | ] 61 | }, 62 | "metadata": {}, 63 | "output_type": "display_data" 64 | } 65 | ], 66 | "source": [ 67 | "xvals = np.linspace(-100, 100, 10000)\n", 68 | "plt.plot(xvals, cauchy(xvals), label='$Cauchy(0,1)$')\n", 69 | "plt.legend(loc='upper right', shadow=True)\n", 70 | "plt.show()" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 5, 76 | "metadata": {}, 77 | "outputs": [ 78 | { 79 | "data": { 80 | "image/png": "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\nRK5CYII=\n", 81 | "text/plain": [ 82 | "" 83 | ] 84 | }, 85 | "metadata": {}, 86 | "output_type": "display_data" 87 | } 88 | ], 89 | "source": [ 90 | "y = np.random.uniform(0, 1, 1000)\n", 91 | "x = np.tan(np.pi * (y - 0.5))\n", 92 | "plt.hist(x, normed=1, bins=1000, label='bins')\n", 93 | "plt.plot(xvals, cauchy(xvals), label='$Cauchy(0,1)$')\n", 94 | "plt.xlim(-100, 100)\n", 95 | "plt.legend(loc='upper right', shadow=True)\n", 96 | "plt.show()" 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": {}, 102 | "source": [ 103 | "### Exponential Distribution\n", 104 | "The PDF is given by\n", 105 | "$$Exp(\\lambda) = \\lambda e^{-\\lambda x}\\,\\,\\,\\forall\\,\\,x \\in [0,\\infty)$$ \n", 106 | "and the CDF by\n", 107 | "$$P(X \\leq x) = 1-e^{-\\lambda x}$$ \n", 108 | "For $Exp(1)$,\n", 109 | "$$F_X^{-1}(y) = -\\log_e{(1-y)}$$" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": 6, 115 | "metadata": { 116 | "collapsed": true 117 | }, 118 | "outputs": [], 119 | "source": [ 120 | "exponential = lambda x: np.exp(-x)" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 7, 126 | "metadata": {}, 127 | "outputs": [ 128 | { 129 | "data": { 130 | "image/png": "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\nJ3+bBnlmAAAAAElFTkSuQmCC\n", 131 | "text/plain": [ 132 | "" 133 | ] 134 | }, 135 | "metadata": {}, 136 | "output_type": "display_data" 137 | } 138 | ], 139 | "source": [ 140 | "xvals = np.linspace(0, 10, 100)\n", 141 | "plt.plot(xvals, exponential(xvals), label='$Exp(1)$')\n", 142 | "plt.legend(loc='upper right', shadow=True)\n", 143 | "plt.xlim(0, 10)\n", 144 | "plt.show()" 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": 8, 150 | "metadata": {}, 151 | "outputs": [ 152 | { 153 | "data": { 154 | "image/png": "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\n", 155 | "text/plain": [ 156 | "" 157 | ] 158 | }, 159 | "metadata": {}, 160 | "output_type": "display_data" 161 | } 162 | ], 163 | "source": [ 164 | "y = np.random.uniform(0, 1, 100000)\n", 165 | "x = -np.log((1 - y))\n", 166 | "plt.hist(x, normed=1, bins=100, label='bins')\n", 167 | "plt.plot(xvals, exponential(xvals), label='$Exp(1)$')\n", 168 | "plt.xlim(0, 10)\n", 169 | "plt.legend(loc='upper right', shadow=True)\n", 170 | "plt.show()" 171 | ] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "metadata": {}, 176 | "source": [ 177 | "### Gumbel Distribution\n", 178 | "The PDF is given by\n", 179 | "$$Gumbel(\\mu,\\beta) = \\frac{e^{-(z+e^{-z})}}{\\beta}$$ \n", 180 | "where $z = \\frac{x-\\mu}{\\beta}$ \n", 181 | "\n", 182 | "The CDF is given by\n", 183 | "$$P(X \\leq x) = e^{-e^{-(x-\\mu)/\\beta}}$$ \n", 184 | "For $Gumbel(0,1)$,\n", 185 | "$$F_X^{-1}(y) = -\\log_e(-\\log_e(y))$$" 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": 9, 191 | "metadata": { 192 | "collapsed": true 193 | }, 194 | "outputs": [], 195 | "source": [ 196 | "gumbel = lambda x: np.exp(-(x + np.exp(-x)))" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 10, 202 | "metadata": {}, 203 | "outputs": [ 204 | { 205 | "data": { 206 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD8CAYAAAB+UHOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xl8VPW9//HXZyaZhIQlLGFNQgJE\nJLIEDFsVl4sVtBWsrQJ1QaXX669aq73315/e/m4Xb3t/2vba28Xb6lVbtSCuVepaRWu1LhAwAQGR\nABESBMIWAmSf7++PGcIQg5lA4Exm3s+H85gz55zvmU9GMu+c7fs15xwiIpJ4fF4XICIi3lAAiIgk\nKAWAiEiCUgCIiCQoBYCISIJSAIiIJCgFgIhIglIAiIgkKAWAiEiCSvK6gNb69evncnNzvS5DRKRL\nWbFixS7nXGZH2sRcAOTm5lJcXOx1GSIiXYqZfdLRNjoEJCKSoBQAIiIJSgEgIpKgYu4cgIjEjoaG\nBjZu3MihQ4e8LkXC0tLSGD58OIFA4IS3pQAQkWPauHEjGRkZjBw5Ep9PBwy8FgwG2bFjBxs2bKCg\noAAzO6Ht6f+oiBzToUOHGDBggL78Y4TP52PAgAHU1tby7LPP0tDQcGLb66S6RCRO6cs/tvh8PsyM\n8vJyli1bdmLb6qSaOs32/XUs27yHpuag16WIiMSs9PR0qqqqTmgbMXcOoKqmnivue5eeqUlMOy2T\nBWfnMSGnt9dliYjEnBMd0z3m9gAKBvfkt1dOYObogby/aTdz7nuXxcu2eF2WiEjcibkA8Jtx0ZhB\n/PRr41j6nfOYMqwvtz+zmh8uWUOjDguJJKxXXnmFadOmUVRUxJgxY7j22mvZtWvXCW/3r3/9K1df\nfXWH2rz22mstbWprazn33HNpbm4G4OWXX2bkyJGMGDGCu+6663O3c/3119O/f39Gjx7dMq+hoYFz\nzjmHpqamDv4kHRdzARCpV1oyv792It84O48/vFPO9X9YTkOTQkAk0Tz55JN897vf5eGHH6a4uJiS\nkhLy8/Opq6s74W2XlJQwfvz4DrUpLS1l3LhxADz00ENcdtll+P1+mpubuemmm3jppZdYu3Ytjz32\nGGvXrj3mdq699lpefvnlo+YFAgGmT5/O448/3vEfpoNi7hxAa0l+H//3ywUM79+dO55ZzX+8uI4f\nzjrD67JEEs6P/ryGtdv2d+o2Cwb35AeXfP7v88GDB/nWt77F0qVLGTZsGAB+v5/vfe97AEyZMoXF\nixeTm5tLZWUls2fPbulQ8vLLL2fAgAGUlJSwdetWFi5cyP333897773HtGnTePDBByktLaVPnz5M\nnjyZqqoqHnroIc477zwANm/ezK233kplZSU+n49HH32UkSNHUlpayjXXXAPAwoULWbRoEQDLli1j\nxIgRLXXOnTuX5557joKCgjZ/tnPOOYfy8vLPzL/00ku54447uPLKKzv2gXZQTO8BRJo3KYcF4T2B\nP31Q4XU5InKKvPjii4wbN44zzvhsUDjn2LJlC0OHDgVg1apVjBkzpmX56tWrGTZsGG+//Tbz589n\nwYIF3H333Xz44Yc888wz1NfXU1JSQo8ePXj//ff53e9+x7/9278B0NjYyDe+8Q3uueceiouL+eEP\nf9hySOfwHkBDQwObNm3icBf2lZWVZGdnt7x/VlYWlZWVHf6ZR48ezfLlyzvcrqOi2gMws5nALwE/\n8IBz7q5Wy28EbgKagQPADc65tWaWC6wD1odXfc85d+PxFnv7RaezurKaO55ZzekDezJqUM/j3ZSI\ndFB7f6mfLGvWrDnqGPktt9zC66+/Tvfu3Xn00UfJy8truSM2MgDq6urYt28ft956KwDdunVjwYIF\nDBo0CAh1qeDz+di9ezf/+q//CkBhYWHLeYVnn32WNWvW8NWvfhWApqYmpk2bRmNjI/v37yczM5Nt\n27aRkZHRUltbV+Ucz926fr+fQCBATU0NPXr06HD7aLW7B2BmfuBe4CKgAJhnZq33ZxY558Y45wqB\nnwL3RCzb6JwrDD+O+8sfINnv4zdfH0+vbsnc+McVVNc2nsjmRKQL6Nat21Gvf/WrX/Hzn/+crKws\nVq9efdRf/MXFxYwdOxYIBceECRNabmQrLS1l8uTJAFRUVDB48GDWrVvHiBEjWvrVWblyZcux/dLS\nUn7yk59QUlJCSUkJH374Ib/97W9Zu3Yto0aNaqkt8jxEVlYWW7dubXl9+H2OR319PampqcfVNlrR\nHAKaBJQ55zY55xqAxcDsyBWcc5EHBtOBE7s49XP075HKf185gYq9tfz05Y9O1tuISIyYMWMGzzzz\nDNu2bQNCf2W/+uqrTJgwgT179rQExLp163jhhRdaAmH16tUtX+YQ2js4HA6lpaWMHTuW0tJSNm/e\n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\n", 207 | "text/plain": [ 208 | "" 209 | ] 210 | }, 211 | "metadata": {}, 212 | "output_type": "display_data" 213 | } 214 | ], 215 | "source": [ 216 | "xvals = np.linspace(0, 10, 100)\n", 217 | "plt.plot(xvals, gumbel(xvals), label='$Gumbel(0,1)$')\n", 218 | "plt.legend(loc='upper right', shadow=True)\n", 219 | "plt.xlim(0, 10)\n", 220 | "plt.show()" 221 | ] 222 | }, 223 | { 224 | "cell_type": "code", 225 | "execution_count": 11, 226 | "metadata": {}, 227 | "outputs": [ 228 | { 229 | "data": { 230 | "image/png": "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\nhGVipAxHiAAAAABJRU5ErkJggg==\n", 231 | "text/plain": [ 232 | "" 233 | ] 234 | }, 235 | "metadata": {}, 236 | "output_type": "display_data" 237 | } 238 | ], 239 | "source": [ 240 | "y = np.random.uniform(0, 1, 100000)\n", 241 | "x = -np.log(-np.log(y))\n", 242 | "plt.hist(x, normed=1, bins=100, label='bins')\n", 243 | "plt.plot(xvals, gumbel(xvals), label='$Gumbel(0,1)$')\n", 244 | "plt.xlim(0, 10)\n", 245 | "plt.legend(loc='upper right', shadow=True)\n", 246 | "plt.show()" 247 | ] 248 | }, 249 | { 250 | "cell_type": "code", 251 | "execution_count": null, 252 | "metadata": { 253 | "collapsed": true 254 | }, 255 | "outputs": [], 256 | "source": [] 257 | } 258 | ], 259 | "metadata": { 260 | "kernelspec": { 261 | "display_name": "Python 3", 262 | "language": "python", 263 | "name": "python3" 264 | }, 265 | "language_info": { 266 | "codemirror_mode": { 267 | "name": "ipython", 268 | "version": 3 269 | }, 270 | "file_extension": ".py", 271 | "mimetype": "text/x-python", 272 | "name": "python", 273 | "nbconvert_exporter": "python", 274 | "pygments_lexer": "ipython3", 275 | "version": "3.6.5" 276 | } 277 | }, 278 | "nbformat": 4, 279 | "nbformat_minor": 2 280 | } 281 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sampling Methods in Numpy 2 | 3 | This repository contains code for some basic sampling methods implemented using numpy. 4 | 5 | The following methods are implemented with examples 6 | 7 | * Importance Sampling (Univariate example) 8 | * Rejection Sampling (Univariate example) 9 | * Metropolis-Hastings (Univariate and Multivariate example) 10 | * Gibbs Sampling (Multivariate example) 11 | * Langevin Monte Carlo 12 | * Unadjusted Langevin Algorithm (ULA) - Pytorch 13 | * Metropolis-adjusted Langevin Algorithm (MALA) - Pytorch 14 | * Inverse Transform Sampling 15 | * Cauchy Distribution 16 | * Exponential Distribution 17 | * Gumbel Distribution 18 | 19 | 20 | -------------------------------------------------------------------------------- /Rejection-Sampling.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "%matplotlib inline\n", 10 | "from __future__ import print_function\n", 11 | "import numpy as np\n", 12 | "import matplotlib.pyplot as plt" 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "### Desired Distribution\n", 20 | "Let $P(x) = 3e^{-\\frac{x^2}{2}} + e^{-\\frac{(x-4)^2}{2}}$ be the distribution we want to sample from. Note that this is an unnormalized distribution with a normalizing constant $Z$ we can compute but let's keep it as it is. \n", 21 | "($Z \\approx 10.0261955464$)" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 2, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "P = lambda x: 3 * np.exp(-x*x/2) + np.exp(-(x - 4)**2/2)\n", 31 | "Z = 10.0261955464" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 3, 37 | "metadata": {}, 38 | "outputs": [ 39 | { 40 | "data": { 41 | "image/png": "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\n", 42 | "text/plain": [ 43 | "
" 44 | ] 45 | }, 46 | "metadata": {}, 47 | "output_type": "display_data" 48 | } 49 | ], 50 | "source": [ 51 | "x_vals = np.linspace(-10, 10, 1000)\n", 52 | "y_vals = P(x_vals)\n", 53 | "plt.figure(1)\n", 54 | "plt.plot(x_vals, y_vals, 'r', label='P(x)')\n", 55 | "plt.legend(loc='upper right', shadow=True)\n", 56 | "plt.show()" 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "Let the functions that we want to approximate be $f(x) = x$ and $g(x) = \\sin(x)$. The two values for a unnormalized $P$ are as follows:\n", 64 | "* $\\mathbb{E}[x] \\approx 10.02686647165 $\n", 65 | "* $\\mathbb{E}[\\sin(x)] \\approx -1.15088010640 $" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 4, 71 | "metadata": {}, 72 | "outputs": [], 73 | "source": [ 74 | "f_x = lambda x: x\n", 75 | "g_x = lambda x: np.sin(x)\n", 76 | "true_expected_fx = 10.02686647165\n", 77 | "true_expected_gx = -1.15088010640" 78 | ] 79 | }, 80 | { 81 | "cell_type": "markdown", 82 | "metadata": {}, 83 | "source": [ 84 | "### Rejection Sampling\n", 85 | "For a $cQ(x) > P(x)\\,\\,\\forall\\,\\,x \\in \\mathbb{R}$, the rejection sampling can be done as follows.\n", 86 | "* Sample $x_i \\sim Q(x)$\n", 87 | "* Sample $k_i \\sim\\mathit{Uniform}[0, cQ(x_i)]$\n", 88 | "* Accept $x_i$ if $k_i < P(x_i)$ \n", 89 | "Note: An accepted $x_i$ is automatically sampled from a normalized $P(x)$. \n", 90 | "In the following code $Q = \\mathcal{N}(1,4^2)$" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 5, 96 | "metadata": {}, 97 | "outputs": [ 98 | { 99 | "data": { 100 | "image/png": "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\n", 101 | "text/plain": [ 102 | "
" 103 | ] 104 | }, 105 | "metadata": {}, 106 | "output_type": "display_data" 107 | } 108 | ], 109 | "source": [ 110 | "cQ = lambda x: 4 * np.exp(-(x-1)**2/(2.*16))\n", 111 | "plt.figure(3)\n", 112 | "plt.plot(x_vals, y_vals, 'r', label='P(x)')\n", 113 | "plt.plot(x_vals, cQ(x_vals), 'g', label='cQ(x)')\n", 114 | "plt.legend(loc='upper right', shadow=True)\n", 115 | "plt.show()" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 6, 121 | "metadata": {}, 122 | "outputs": [ 123 | { 124 | "name": "stdout", 125 | "output_type": "stream", 126 | "text": [ 127 | "E[f(x)] = 9.99868, Error = 0.02819\n", 128 | "E[g(x)] = -1.19557, Error = 0.04469\n" 129 | ] 130 | } 131 | ], 132 | "source": [ 133 | "expected_f_x = 0.\n", 134 | "expected_g_x = 0.\n", 135 | "n_samples = 100000\n", 136 | "samples = []\n", 137 | "for i in range(n_samples):\n", 138 | " sample = np.random.normal(1, 4)\n", 139 | " P_x = P(sample)\n", 140 | " bent_coin = np.random.uniform(0, cQ(sample))\n", 141 | " if bent_coin < P_x:\n", 142 | " samples.append(sample)\n", 143 | "expected_f_x = np.mean(f_x(samples))\n", 144 | "expected_g_x = np.mean(g_x(samples))\n", 145 | "expected_f_x *= Z\n", 146 | "expected_g_x *= Z\n", 147 | "print('E[f(x)] = %.5f, Error = %.5f' % (expected_f_x, abs(expected_f_x - true_expected_fx)))\n", 148 | "print('E[g(x)] = %.5f, Error = %.5f' % (expected_g_x, abs(expected_g_x - true_expected_gx)))" 149 | ] 150 | }, 151 | { 152 | "cell_type": "markdown", 153 | "metadata": {}, 154 | "source": [ 155 | "Compute the histogram of samples from Rejection Sampling and compare it with normalized $P(x)$. It's clear that rejection sampling generates samples from underlying normalized $P(x)$." 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 7, 161 | "metadata": {}, 162 | "outputs": [ 163 | { 164 | "name": "stderr", 165 | "output_type": "stream", 166 | "text": [ 167 | "/home/abdul/miniconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py:6571: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg.\n", 168 | " warnings.warn(\"The 'normed' kwarg is deprecated, and has been \"\n" 169 | ] 170 | }, 171 | { 172 | "data": { 173 | "image/png": "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\n", 174 | "text/plain": [ 175 | "
" 176 | ] 177 | }, 178 | "metadata": {}, 179 | "output_type": "display_data" 180 | } 181 | ], 182 | "source": [ 183 | "plt.hist(samples, bins=50, histtype='bar', facecolor='g', alpha=0.75, normed=1, label='bins')\n", 184 | "plt.plot(x_vals, y_vals/Z, 'r', label='P(x)')\n", 185 | "plt.title('Rejection Sampling')\n", 186 | "plt.legend(loc='upper right', shadow=True)\n", 187 | "plt.show()" 188 | ] 189 | } 190 | ], 191 | "metadata": { 192 | "kernelspec": { 193 | "display_name": "Python 3", 194 | "language": "python", 195 | "name": "python3" 196 | }, 197 | "language_info": { 198 | "codemirror_mode": { 199 | "name": "ipython", 200 | "version": 3 201 | }, 202 | "file_extension": ".py", 203 | "mimetype": "text/x-python", 204 | "name": "python", 205 | "nbconvert_exporter": "python", 206 | "pygments_lexer": "ipython3", 207 | "version": "3.6.5" 208 | } 209 | }, 210 | "nbformat": 4, 211 | "nbformat_minor": 2 212 | } 213 | --------------------------------------------------------------------------------