Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save kylemcdonald/fba529f03bb699a379602812b4ec8d03 to your computer and use it in GitHub Desktop.
Save kylemcdonald/fba529f03bb699a379602812b4ec8d03 to your computer and use it in GitHub Desktop.
Fast generation of random numbers given a probability distribution.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is an example of building a lookup table for sampling from a probability distribution. First we set up Python from drawing graphics and using numpy."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"from matplotlib import pyplot as plt\n",
"import numpy as np"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then we create a probability density function, which has a domain from 0 to 1 and sums to 1."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def curve(x):\n",
" return 1-np.cos((x*(2*np.pi)**2)**.5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we sample a bunch of points from the curve and draw it."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nQug0kkmlFnkzqwDcD3QG9gPONrNmxRz6rnPu4MLHv8oaaOZMaNmyrL9bRFLVogWMHu1XrZwxI3Qa\nyZRUruRbA5875xY659YDI4FTijmuTP2iombNggMPTMcziUhpjjwShg71Y+i//DJ0GsmEVIp8feDr\nLb7/pvDXimpnZjPN7FUza17WQLNmwQEHlPV3i8j2Ou006N8fOnf2I28kWdJ143Ua0NA5t9bMjgNe\nApoWd+DAgQN/+zovL4+8vLzfvl+2DH791d94FZHoXHYZLFkCxx8PEydqHfrQ8vPzyc/PT8tzlTqE\n0szaAgOdc10Kv+8LOOfcbdv4PV8BhzjnVhT59W0OoXzrLbjxRkjTn01EtoNzcMUVMHu2H31TrVro\nRLJJpteumQr8wcwamVkVoCswtkiAXbf4ujX+zWMF20mtGpFwzOC++2DPPeHUU2HdutCJJB1KLfLO\nuQLgCmA8MAcY6Zyba2a9zOySwsPOMLNPzGwGcA9wVlnCqMiLhFWhAjz2mN8Y/Oyz/eREyW6xmvF6\nyCF+f8rWrSOLJCLFWLcOTjkFdtkFhg/3xV/CKU+7JjZFfsMGf7Pnu++gevXIIolICdauhS5dYP/9\nYcgQ386RMBKxnvznn/tRNSrwIvFQrRq88gpMnQp9+vgbs5J9YlPk1Y8XiZ+aNf1ImwkT/MqVKvTZ\nJzYLlKnIi8RT3bq+yHfq5L+/7Ta1brKJruRFpFSbCr2u6LOPiryIpESFPjvFosivWuU3Mthrr9BJ\nRGRb6tTZXOh1MzY7xKLIz57th2lpLK5I/G0q9BMnwlVXab/YuItFWVWrRiS71Knj15qaPh0uuEAz\nY+NMRV5EyqR2bXjjDfjvf+Gss7TWTVzFosjPnu13qRGR7FK9OowtXK7w5JNhzZqweWRrwYu8czBn\nDuy3X+gkIlIWVavCc8/5TcE7d4YffgidSLYUvMgvXgy//70fniUi2alSJb965cEHQ4cOfgMSiYfg\nRV5X8SLJUKEC3HsvnHkmHHYYzJ0bOpFADJY1UJEXSQ4z+Mc/oEEDyMuD55+H9u1Dp8ptupIXkbQ7\n91x48km/Sfjzz4dOk9tU5EUkI449FsaP9xOm7r03dJrcFXTTEOegVi1YuBB23DGyGCISoYUL4fjj\n/Q3Ze++FypVDJ8o+WbtpyNdf+70kVeBFkqtRI5gyBRYt8jtNrVgROlFuCVrk1aoRyQ01a8KYMX6I\n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\nSgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d12cf90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"n_samples = 1024\n",
"x = np.linspace(0, 1, n_samples)\n",
"y = curve(x)\n",
"plt.plot(x, y)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One technique for sampling from the curve requires building a cumulative sum after normalizing the data:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d1a9ad0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"y /= n_samples\n",
"cumulative = np.cumsum(y)\n",
"plt.plot(x, cumulative)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then we can loop through the cumulative sum looking for which index corresponds to our sample."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d3d4a90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"random_weights = np.random.random(10000)\n",
"indices = []\n",
"for random_weight in random_weights:\n",
" index = 0\n",
" while index < n_samples and random_weight > cumulative[index]:\n",
" index += 1\n",
" start = index\n",
" end = index + 1\n",
" rand = np.random.uniform(start, end)\n",
" indices.append(index)\n",
"plt.hist(indices, bins=n_samples/2, histtype='step')\n",
"plt.xlim([0,n_samples])\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we need to take a lot of samples, the loop can be slow. So instead we can precompute the inverse of the cumulative sum:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d47c210>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"inv_cumulative = []\n",
"for weight in np.linspace(0, 1, n_samples):\n",
" index = 0\n",
" while index < n_samples and weight > cumulative[index]:\n",
" index += 1\n",
" inv_cumulative.append(index)\n",
"plt.plot(x, inv_cumulative)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Even better is to compute this from scratch, since re-using the cumulative sum can create sampling artifacts:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nRURi7P8BzM1S/ClAnrIAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d513bd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"total = 0\n",
"position = 0\n",
"step_size = 1./(n_samples*10)\n",
"inv_cumulative = []\n",
"for target in np.linspace(0, 1, n_samples):\n",
" while target > total:\n",
" position += step_size\n",
" total += curve(position) * step_size\n",
" inv_cumulative.append(position)\n",
"plt.plot(x, inv_cumulative)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Or better again, we can compute it directly by taking the integral of our original function and solving for `x`, but if the probability distribution is not already represented symbolically this won't be possible.\n",
"\n",
"Once we have the evenly-spaced inverse cumulative lookup table we can sample it directly without a loop."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d62e390>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"lookups = np.random.randint(0, n_samples, 10000)\n",
"sampled = []\n",
"for lookup in lookups:\n",
" start = inv_cumulative[lookup]\n",
" end = inv_cumulative[lookup+1] if lookup+1 < n_samples else 1\n",
" rand = np.random.uniform(start, end)\n",
" sampled.append(rand)\n",
"plt.hist(sampled, bins=n_samples/2, histtype='step')\n",
"plt.xlim([0,1])\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment