Last active
January 1, 2019 23:46
-
-
Save akelleh/6ad00740e94029fa25fa953e567642da to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Let's see if we can do MCMC online, with a dynamics correction. The trick is to remember posteriors from the previous training run, and use those as priors at the next run. Then, we only have to train on the new batch of data at each step, so MCMC runs faster. It's still not performant enough for most real-time applications, but it's pretty quick!\n", | |
| "\n", | |
| "We'll also apply a dynamics correction, so we can shift the mean and variance back toward the prior after each update. That way, if the world changes (i.e. beta), our model can account for it! Inspired by https://github.com/ajtulloch/adpredictor" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import pymc3 as pm\n", | |
| "import pandas as pd\n", | |
| "import numpy as np" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Generate data from a toy model, which is just a 1-D linear model. Beta = 3." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 38, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def get_data():\n", | |
| " x = np.random.normal()\n", | |
| " y = np.random.normal(3. * x)\n", | |
| " return x, y\n", | |
| "\n", | |
| "\n", | |
| "def generate_data(N):\n", | |
| " for _ in range(N):\n", | |
| " yield get_data()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Now, train the model on the first batch of data using pretty bad priors to kick of the process. We'll save the posterior hyperparameters, so we can use those as the model's hyperparameters at the next time step! That's how we'll carry the learned information forward." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 66, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [sigma, beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 5655.44draws/s]\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "x = []\n", | |
| "y = []\n", | |
| "for i in range(50):\n", | |
| " xi, yi = get_data()\n", | |
| " x.append(xi)\n", | |
| " y.append(yi)\n", | |
| " \n", | |
| "parameter_prior_mu = 0\n", | |
| "parameter_prior_sd = 1\n", | |
| "\n", | |
| "with pm.Model() as model:\n", | |
| " beta = pm.Normal('beta', mu=parameter_prior_mu, sd=parameter_prior_sd)\n", | |
| " x = pm.Normal('x', mu=0, sd=1, observed=x)\n", | |
| " y = pm.Normal('y', mu=beta * x, sd=1, observed=y)\n", | |
| " trace = pm.sample()\n", | |
| " \n", | |
| "beta_mu = trace['beta'].mean()\n", | |
| "beta_sd = trace['beta'].std()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 69, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f5ee8117160>,\n", | |
| " <matplotlib.axes._subplots.AxesSubplot object at 0x7f5ee7c1b7b8>]],\n", | |
| " dtype=object)" | |
| ] | |
| }, | |
| "execution_count": 69, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAA08AAACICAYAAAA/O9CLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzsnXecXWWZx7/vufdOTWbSIQkhIQECEnoRgwhClN4UV0CaCgKyumsBcd1VV2XXsgr2QlFAQBEU6SW0QIBAEiCkkmSSKZlebz/tffaPc+6de6dlUiYT4P1+ks/cds55T7n3PL/3aUpEMBgMBoPBYDAYDAbD0FijPQCDwWAwGAwGg8FgeDdgxJPBYDAYDAaDwWAwDAMjngwGg8FgMBgMBoNhGBjxZDAYDAaDwWAwGAzDwIgng8FgMBgMBoPBYBgGRjwZDAaDwWAwGAwGwzAw4slgGAGUUpuVUgtGexwGg8FgMBRi7k8Gw45hxJPBsBthbmoGg8Fg2B0x9yeDIcCIJ4PBYDAYDAaDwWAYBkY8GQwjx9FKqdVKqS6l1B+VUmUASqkzlVJvKqW6lVIvK6UOCV+/C9gbeFgplVRKXR++/jelVLNSqkcptUgpddDo7ZLBYDAY3gOY+5PBsJ0Y8WQwjByfAU4B5gD7A/+plDocuB24CpgI/B54SClVKiKXAHXAWSIyRkR+HK7ncWA/YAqwHLh71+6GwWAwGN5jmPuTwbCdGPFkMIwcvxKRehHpBG4ELgS+APxeRJaIiC8idwA2cOxgKxGR20UkISI28F3gUKVU9S4Yv8FgMBjem5j7k8GwnRjxZDCMHPUFj2uBacBM4GthSES3UqobmBG+1w+lVEQp9UOl1EalVBzYHL41aQTHbTAYDIb3Nub+ZDBsJ9HRHoDB8B5mRsHjvYFGghvWjSJy4yDLSJ/nFwHnAAsIbkzVQBegdupIDQaDwfB+wtyfDIbtxHieDIaR41ql1F5KqQnAt4C/ArcAVyulPqgCKpVSZyilxobLtACzC9YxliBsogOoAP5nF47fYDAYDO9NzP3JYNhOjHgyGEaOe4CngBpgI/ADEVkKXAn8imCGbgNwecEy/0uQuNutlPo6cCdBSMUWYDXw6i4bvcFgMBjeq5j7k8GwnSiRvl5Yg8FgMBgMBoPBYDD0xXieDAaDwWAwGAwGg2EYGPFkMBgMBoPBYDAYDMPAiCeDwWAwGAwGg8FgGAZGPBkMBoPBYDAYDAbDMHhX9HmaNGmSzJo1a7SHYTAYDIYdZNmyZe0iMnm0x7EzMPcmg8FgeO8w3PvTu0I8zZo1i6VLl472MAwGg8Gwgyilakd7DDsLc28yGAyG9w7DvT+ZsD2DwWAwGAwGg8FgGAbvCs+TwfB+Q0RI2B5Z18fxNEopJlaWUBaLjPbQDAbD+xjbt1EoSiIloz0Ug8FgGBWMeDIYRgLfg9bVEG8ELwsVE2HyXBgzZcCPp2yPRe+08dKGdt5pSfBOS5KejNvvc2PLokwfV84HplZx3L6TOGHuZCaNKR3pvTEYDAYAnql9BoDTZ58+yiMxGAyG0cGIJ4NhZyECm16AZXfAO0+Am+7/mYn7waEXwJGfhcqJbGhNcMuiTTy8opG04zO2NMoBU8dyxiFTmTWxgvKSKKURC1+EjqRNW8KmtjPNovVt/P2NLQAcOmMcFxw9g3MPm055ifFMGQwGg8FgMIwURjwZDDuDxjfhiRug7pXAy3ToBTDzOJiwD0RKIdUGLSvhnSfh2e+jX7qJJ6o/zVcaPoIVLePsQ6dx7uHTOXrWeKKRraciai2sborz/LpWHlnRxDf//jY/feodrv3oHC4+diaxYazDYDAYDAaDwbBtGPFkMOwIng3Pfh9e+TVUTILT/w+OuBSivaF03dlu1kqSzRMmkzryPGomHEbV2uf5RPedvDRuISWfvIXqfQ/Zps1almLe9GrmTa/m2o/uy5JNnfx84Xr+++HV3LOkjh+dfwhH7D1+Z++twWAwGAwGw/saI54Mhu2luw7+ejE0vQVHXg4L/hvKxwHQnmnn4Y0P8+TmJ1ndsRpBipfdA/7MVCZozSlPXMgnD72SuR++AZTa5mEopTh29kSO/cJEFq5u4TsPreJTv3uF60+Zyxc+Mhu1Hes0GAwGg8FgMPRnxMSTUup24EygVUTmha9NAP4KzAI2A/8iIl0jNQaDYcRoWAr3Xhh4ni64Fw4IkqcbEg3c+vat/HPjP/G0xyGTDuGaw65hz5ID+NljPTR2wtUn7MPZR5azpms1L9U+ywMNz3NvzT2cVPs4Xz7lN8yZPG+7h7XgA3twzOwJ3PDACv738bVsaE1y43kHUxI1YXwGg8FgMIw0/3xzCwdNq2bfKWNGeyiGEWIkPU9/An4F3Fnw2g3AMyLyQ6XUDeHzb4zgGAyGnc/Kv8OD18CYPeDyR2DyXFztcueqO/ntW79FRDh/v/O58MALmV09m2W1XVxxx+tYqpK/XnkkR82aAMDciftz7r7n0pPp4t6nvswdncs5/9EL+eyBF3P1UV/Z7lLAVWUxfn3REdy0cD2/eGY9XWmXX3/mcEqjppiEwWAwjCbJxYvB8xhzwgmjPRTDCCASRJmsauwx4uk9zIhNR4vIIqCzz8vnAHeEj+8Azh2p7RsMI8Jrt8D9n4Vph8OVz8LkuazuWM1Fj17Ezctv5vjpx/PYJx7jW8d+i9nVs3l6dQsX3fIq1eUxHrhmfl44FVJdPp6rz7mLx476DqenM9yy9s9c/PC/UBev2+5hKqX46sf253vnHMTCNS1ce/dyXF/vyJ4bDAbD6CECPQ3B33cxflc3fiI52sMwjBDv8svTMEx2dSzPHiLSFD5uBvYY7INKqS8opZYqpZa2tbXtmtEZDEPx0k3w2Ndh/9PgkgeRioncvvJ2Lnr0IjoyHdx04k3c9NGb2KMyuKwXrm7hmj8v44CpVTxwzXxmTaoccvXjD/4Xbjzzbn7ZlaaxawP/8tAnWbxl8Q4N+dIPzeL7585j4ZpWbnjg7fysmMFgMLyr6NoMda9Cx8bRHolhKzxX9xzP1T032sMYFcwd9v3BqCVCSGDFDXqdicgfROQoETlq8uTJu3BkBkMfROCZ78PC78K8T8Kn7yKjhK88/xVuWnYTJ+19Eg+e+yALZi7IL/Li+ja+ePdyDppWxZ8/fwwTh9vIdu8PcuJnHudvccVemSTXLvwi9627b4eGf8mxM/nKgv15YHkDv3neGB6GdzdKqXKl1NzRHodhF+PZwd+B+ucZdisyXoaMlxntYRgMI8auFk8tSqmpAOHf1l28fYNh2xCBJ74JL4YlyD9xC11ukiueuoJn657luqOu46cn/JSqkqr8Iq9t6uTKO5cye3Ild3zuGMaWxbZtm5P3Z+pnn+IObwLHpdN8/9Xv8+PXf4yv/e3ejS+fvC9nHzqN/3tqHYveMZ5cw7sTpdRZwJvAE+Hzw5RSD43uqAw7mx67h/ZMe/GLKmeu7NjcfspN9V/3DmCvX4/X0bHT1jcQIoJdU4O47ohux7Dj6ILojrSbxtPeKI7GMFLsavH0EHBZ+Pgy4J+7ePsGw/DxPXjoX2HJb+HYL8JZv6A+2cglj1/Cus513HTiTVx60KVFpcDfqu/mc396nWnjyvnzFR9kXMX2FX2gaiqVn32cn1d8gIt6Ety1+i6uX3Q9ju9s1+qUUvzwkwczd4+xfPkvb1DfaWZvDe9KvgscA3QDiMibwD6jOaD3KyMZArx4y2Jea3qt+MXc7+wObveF+hf6r3sHyK57h9Qrr+609Q2E19ZGdvUasqtWjeh2diYiQnd6++5X72YKL8/n659nacvSkduW1ojz/jvGuwMjJp6UUvcCrwBzlVINSqnPAz8EPqaUWg8sCJ8bDLsfbhb+dhm88Wc44Rtwyv+wvnsDFz9+Md12N7d8/BZOnnly0SJrmuJcevtrjK+Mcc8VxzJpuKF6g1FWRfTi+/nmjNP4WkcXT9U+xbULryHlprZrdRUlUX5/yZFoLVx11zKy7vZ7sgyGUcIVkZ4+r7330gwy3VD/2laFwlACRkRw/ZHzVGjZ1QVocpNU773TvVXC86zfRYZyQ3eGF95pI2m/vzwvuZ6OWoL7a2emb920nUdm2TLiTz09YuvfFvx4fFAh59TVIb5PyvbY0JrYxSMbGUay2t6FIjJVRGIispeI3CYiHSJysojsJyILRGTkriqDYXuxE3DPp2DtI3Dqj+Cj/8H67g18/snPE1VR7jztTg6fcnjRIhtak1xy2xIqSiLcc8Wx7FldtnPGEonBub/h8iO+xPfbOni96TU+/9jFdGa376szc2IlN19wGKub4vzw8bU7Z4wGw65jlVLqIiCilNpPKfVL4OXRHtROp+7VoAm3PbihUdNdw+ObHmdzz+YB31/VsYqna58eMZGj2cXiKe952nXb1akUblMT4o/yRFNu3/WuE462t2P7nBNN9vtgki7tpvt9zzzZORMXcSfOs3XPYvt2v/fcliDzZXcoBJVc9CLJl/v/FLstLWRWvE127VoWb2hnVWMcx9vx73Ai647qfpvOmQZDIelOuONs2LwYzvs9HHs1G7o2cMVTVxC1otx2ym3Mrp5dtEh9Z5qLb10CwJ+v+CAzJlTs3DEpBSd+g3PP/iM3d6XY0LWey/75SRqTjdu1upMO2IPL58/iTy9v5rl1Ju3Q8K7iS8BBgA3cC8SBfx/VEY0kodHsNjXR88ij6ExvEn7ciQOQcAYWWLlWBzuSKzkUWzVctIYd9HwNKPyG2myqI/jtHqZRJb5PZuWq/h4d7cP6hWReeZ70suW4DQ0Dr6BuCbSN/CSUsnZOvtdw2dSe4omVzSSyO3b+fPHJ7gRDeSSIO3GWNi/tvcbcLDQsDc79NuD4Ds/XP8+ajjVA76Xny87xuNV015D1srSmh7hXe7uHd08n+0fF5PL0xHHy14Ls4HUcz7o8u7aV9a2jV/J/JJvkGgzvLjpr4J5PQ1ctXHA3zD2Nmu4aPv/U54moCLedchuzqmcVLdLUk+HCW14l4/r85QvHMmdyb1M8nUqReest7A0bsTduxK2vQ2dtxHEQzyNSVUVk4gSiEydRMnsfyg48kLK5c7EqBhFf+5/CiZMW8of7L+JfdSuX/P0sfv/xW9l3z8MH/vwQ3HDaAbyysYPr/raCJ/79+B0PMTQYdgEikga+Ff5/DxMaF6El5tTVA+AnEljl5cHjMCwo93cwRspDtFWP1qYXIN0BB5+/3dvwtNfbLFxtPWxv87qHWJ3YzMf2OIhY+bitr7+9HWfzZnQqReUHj+l9w01DthvZ8g5MPHTgcKR0J9JVC9m+UaTbSKod3AyMmzH4Z/Kep+JjLlqTfO45yg48kNi0aTs2jgJa49lgaLZfVPAo42V4rek1jpl6DOXR8gGXzV0XCtDi0Zaw2bOqjIilBvz8aLGibQVxO07cjjOubBy0rg7K4ZePh4lzhr0eVwfioG8REl/vHM9TzIqF6xv8ey6+j4ptY2GqnUW8CSmrHvz98JpVlpWfcNlRh1HWCY5FR9IZouHRyGLEk8EAwWzlXy8GBC59EGbOpzXdytULr0ahuO2U29inujgvvS1h85lbl9Cddrn7ig9y4NQq3MZG4k89RWrRItKvL83PuljV1ZTMnIlVUYE1phIVieLH49ir15Bqb0enwhkby6L0gLmMmT+fyvnzKT/ySKzSAmEzYTZHfG4Rf3z6m1zT+DiXPX4Jvz7oGg47+osFxsXWKYtFuPmCwzjnV4v5xv0ruPWyo4oKXxgMuyNKqecYwHoWkZNGYTgjT06gDGBt5IzUrYknX/sQGd7mtBZ8EWKRrQelbFU8pXe8Al2ReGLrBSM2p4M2kq6XIcbWxVNOFHl9e0kW7lvXZsQfwJh2UjtkBYrWgUep5vnghWGIJ+kTtieui85kSS9/g+qdKJ5y94K+HoL6RD0pN0V9op79x+8/4LK561FLkPdT25EiohQH7zWEgT0K5MRI/r6Xq+a4jZ6nvFjMHbPwkHk7yfNkheMa6nsuuRBL34VsHCon7pRtD4vaxRAZWEgDvYLfsiAcpt5J4XY76sHaEYYlnpRSB4vI2yM9GINhVFh+FzzyFRg/Cy76K0ycQ8JJcM3Ca+ixe/jTqX/qJ5w6kjYX37qEpu4sd152BPuseY26791P6qWXQITS/fZl/CWXUDl/PmVz9ycyadKg4kRE8Jqbya5ZQ3blKtKvv07HHXfScettqNJSKo46ijEf/ShjTz6J2NSpEC1h7mk/5c4NH+OqF6/nylW/4WerHuD4U34K04bvhTpwahXXnzqXHzy6hvuW1vPpo/fekaNoMOwKvl7wuAz4JLB7xKyMBH0ESuFvSK4E8kAiJutl84+3JefplZoO2pM25xw2fauf3RUFI9zC2fuccTvEdvNjGsQAlp5mossW4s07FhEpCoO0PZsep4fJ5ZPB98iur8dPZyFmIV0NwAF9NuZucw5SUaij1oFBObwFw7999n2EcrF2pLBhTpS4vs4b/Al7aC+Mr31c7VIW3Um5wjlS7RApgbIqxPNQ0V6TN/f9yV9jVvjeNpYW9xrfgJ4GmBxcHzlh4O+knKeIFcx8DFny3A/fq30ZUm1w0HlgDXPGZBvIfb+svkIzmwDGDriM5MST6r3WB/vatCayVJXFKIttZex9TamehuDF6q3/bu0shut5+o1SqhT4E3D3ANWODIZ3H04aHr8uqKg3+0T41J+gfDyu7/KV579CTXcNvz751xw48cCixTpTDp+5dQnJ+gbuqaih8rIfsKWjg+geezDpmqupPu88SmYMMYvYB6UUsalTiU2dytiTggl0nUqRXrqU5OLFpF5aTMsPfkDLD35A2bx5jF1wMmMXLGD6nFO4c+rhXPPIhXw508p37jmDc/deAB/+Kkw7bFjb/txx+7BwTQvfe3g18+dM2vn5WgbDTkRElvV5abFSaufVnd5d6Gcsh88LxFPOkBnIqHJ0b5hZLmyvLWHzVn03J86dTHQQz1J7sn9S+mD44vPk5ieZN2keju8wpWIKlbHKYS8/GIWirGjfhhG2l5+JHiRkKvXmYko3d8HYevRcjdi9+1vbVcOGxCZmj5vNnG7BaekK3nDT0PQ2ZI4MQrryA/UHHUlH0qapJ8u86X28LQVhd6J1Pxtw8B0rDuMsXMdIsLUjrYYYuRYdVnrU6ND7UhodWiQubVlKR6aD02efXvS6XVMDSlG6z3Z2Iwi9enrfM0g88yxlB30gvy43FDf5aywnNrYh3C6VTlNfsxIiLajJxXbCgOIp3ggllTBUmNsgDO15CvchE16z2hu+eGpeCfEtsP8pW/3oc3XP4YrLqbNODbcTjGmw/MfmniwqnqYMigTPQJ4nrYVXNnZQXR7jxLlTghdrXoDqvQYPo8ytpi5sFbADIcLbyrDEk4gcr5TaD/gcsCy8Wf1RRHaPGokGw7bSvh7uuyyIc/7I9XDiDWBFEBG+8/J3WNK0hBs/fCPzp88vWqw77fC1H/+DM199lJMalqOA8hNPZNynzmfM8cejIjtntseqrGTMCScw5oQTALBrNpF4ZiHJhc/QdvPPabv555TMnMmYBSfz2xO+zw1tf+C/1HJWtr/KN/5wArE5J8PxX4WZxw0ZzmdZip+cfyin3ryI6+9fwd1XfBBrN4tNNxhyKKUmFDy1gCOB3SseaGfSN2yvwOjoDY/qb0AXig4dGthdaYeU42F7elDxlPGTlEfGDPhev896GXzt83b722itqemp4eS9T976gluhMLfDHciQHcwdonXeKNPewCWT7ZYgPC/aFkejizxP2gu21WP3oNPh77hSIIL4Gvqu0y/wPPU5By9taKfE7uSgCXuhigSX5p2udQjCUbrPsRIZ/Lc6lyvSVywVeJ50JpPPh9tRej1P2+568sTDC4/LjAllJNMWtju0yOtsb4DK4rHrdJrs6qAIQ8n06aiSbeyZWHC+dDroa+g1N+fFU+57kRclea/l8D1PK1avJZ7I0F3iMKa5E0fqkSlTw/X2rsfTHlErGniGYJuM/Nz3e6gej/mwvXxu3DZ4JLeh4Em/in/5Y9f/OmlL2CzZ1EHpxlaOjmlKCq7VgZzH2XAfEtmC459qC/4PlYM2ShX3hp3zJCLrlVL/CSwFfgEcroIYgv8Qkb+P1AANhp2KCLx+Kzz1XxArh8/cD/styL/9x1V/5OGah7n2sGs5e87ZBYsJdYteZcmNN3N93QqktIwJF13ExMsvIzZ95F3FpbP3oXT2lUy68krcllaSzz1LYuEzdN55F9x2O1+vrKRp/6k8MWEL35p1MF9tXMGefzoD9joGPvwV2P/UQUNEZkyo4L/O/AA3/P1t7nxlM5cfZ3qOGnZblhHMNyqCcL1NwOdHdUQ7gLgOkk5gVffNUcgViqgjOqdXGxbmvOQE0kAz0oUCJPd+rq+b39fYSLZB6Via7C7eib/OzMp5wNZ/09rTSdKOT64PuOc5QeL6Dk4g5XJFMq7PSxtaOeugyZRGIwVG0iDGkpvOv6P1wB40LzSirbSNiCDZ3vDGnAHqahedDEWVioB4gXjqa1Rrd1CPEMDktleQ9eNRh3wqWK/v8mbja6TddG6QfdbnQ2RgkywvYvrmPBUapI6D29mJzmYpnTP8ggdDsS12adb1KYtF0FrnxVNlGZRHSklmBxckbnMzFS+8jH34PCgoZCsFFeREJHBc+G7gvRk/c+sDsoNqlEWCNF+woP/3KH9+BxHeAyFeBh9NR0ZT/vLbZGZHsRbsCRSLp/Q766iYvOd2FRnIh0EO5RHLhe3l8wJ3UXn4nOep8LrUPnRtpjUbzHMpz6PTcSjzPLBAuQ5pN01bVxv7jt83v1hOYOcLi/guWgRra7nYbmbo90eI4eY8HQJ8FjgDeBo4S0SWK6WmETTCNeLJsPsTb4QHvwg1z8G+C+DsX0HV1PzbixoWcfOymzl11qlcdchVQHBzSix8hi2/vwVWr2RmSSWZz3yOQ/71CqLjxw+2pREltscUxl9wAeMvuAA/Hie1eDGpV5cQffVVLntDAx20qxite85lQvkWYg9fRWyPScSO/SSxD55HZNIkouPHF83kffroGTyxqpkfPrGWj+w/mdmThzf7bDDsSkRku5S9UqoMWASUEtz37heR7/T5zEeAm4FDgAtE5P4dHO5Wyb78GO66txh75bf75URq2yFTs5pIl937XsGUbb5gxACzzH6mA7wMRMvzoWzZ0DjRhYaOSFAVr3QsycmB5Zr1E7itrXitbZTPO2jQsb+0oYnWbA9HzQyMpPJl64iv1lSfeUbxB5vfhskHDioM+pIzZlviWUp1hqbuDLMmjaFvBcL+C9poBC2C+P2NdfF9PNFgKZTvo0WjbRtVWoLYTr7cs+M7vSWX87kduiicy92yBXfFKmLlOfE1sGdFRMi6PkrBuq41tKfayAVG9y3+sHxzG00pOOOQqSQXLSK6556U7R8WZcjrRo3oINzQKi8v8jyJ65J+402AYYknnc2SWPgMFUcfTWyPKcVvOi4l9ZvQe2296AYEPXeeXdvKwdOrqRrj5a8xpYTSqEVHQc8oLZrGZCPTx0xHKYVurYdMJ1bdKjJHe/RkPPasLivurZU7581vB1VxYxUwZvKAY8kX4shVQSyt6i24Ea6nUIj0F0+9gnprKNH5sNjcLuYFfIGAyaxdg2zYRPVM8LUma3tUlETwtQzqBc6Rm/wY2vPUV9hvRxrotuTg5TecrwDR+1rdK5Bopseby6SxU/GVJpn1cB2XsrrVxNqaeaN6GkRtpo2ZRkUs+EbkPE857bSm7W02da3k1PHz+vVUys07CIAzOuXKhyuEfwncSuBlyss8EWkMvVEGw+6LCKx8AB79ajBzdcbP4KjPFc1I1XTX8I1F3+CACQfwveO+h2SzdP3jH3T+6Q7cujqaKyfy1DGf4tLvXsuBs0epNuYARKqqqDrtNKpOOw0ImuZtXrKQ55/6PWM3tTEnVcn4zgiyLguL7gbuzi9rjRlDZMIEolMmU7L3TL67xzR+0JTm23co7vjqKbtdaVnD+xel1CeGen8Y0Q82cJKIJJVSMeAlpdTjIvJqwWfqgMspLkoxokTGjMXxfSSdJhsrw7KgtO5FcDOhcR16R8rCRPoCb0XOQzOQ58ltfBOyLTBxv7y4ynmevEJDJ9eHyU5ghSX5tPikX3sdYEjx5OrQyBSh4uW3sXxgoKixtnXB3z0Pxk8mUdEoVtnghQHyVdBQbEmv5/ktjVw+6byte558m660TUfK4RinvwEsOcFUEsECtGODFqyyUnzbQfsuWIFhnS9NroJjIp4uCoVyGxtxW1uhzMsfg4EQgeXrGxij0nRXdhR9zvWyROjNEWvsSuBHg+d+PIEfTxSIp97wzeyqVTi1dVSd8vGiML5cZVcgGKvooMn6IPhdQX6MW1/XTzxF3llNaV0D/gEzYdLW89hyDXHbEjZjKnXeu6mUpjQawfY0WguWpdjQvYENXRuwWjrYY885bGzpJuv5RHyXd1oS1HZmOPvQacXFMHSfkDo3BRSLp5XtK9nUsJoP11cw9tgPkkx0k+hKM2PGHv3CIQvDWnvFU7g9b/h5f2gPXzTQm7/W6yQs/K76+X3Y0JpkrbSwz6RKNrWnOPvQaUNWus2tZyjPU/+wve3IhdMeWNsYGpk7ZgXXtXRvQUUi2K7PhJIImXSSlJtiU0cNsbZc42Sb0mhxAZzc5E7utcZE0J7h1VQdk7reKaru2JltJ+MlgdLeRuJDXOsjwXDF0xlARiT4lVZKWUCZiKRF5K4RG53BsKOkOwPRtOofQQjbeb/rFz/bY/fwpWe/REmkhJsP/S7J39xC/T334nd307H3fvz26EvpPPxD3PLZY9hr/O5dUCG2xxT2O/siZp35KW59+1a++NYfGF86iev3u4qPbNiM98Lt+D0J/IlH4E08Gr8nidvSTOqll/BaW/kawEuw/LGZzFjwEapPP52yQw81ZcwNo81ZQ7wnbCX6QYIp59wUZSz8L30+sxlAKbXLunpaY6sA8OPdPNUSvHZOpB23o4f0mloYHzra8qk1wQOvrQ2rsQ29x4SBw/bcdGDQaBe99hGY83GybmBcFHmecrPZSuHmZ86FXGSkiAz63XdzRSn/3l91AAAgAElEQVQ8H+V6KGsIcyLcTvL5F7DKShm7YMGgH82JwtzcTW854kEqzuUXzJIKjfhUdoBQHs9D0EhJBHyCxriie/vjeD6UBOJN50RlOBMvYcPfTO1inGw3UX9SUDAi724YeEwaUN21lKU3kB6fZWL1QWSVhYjGdrMUSkg1VJ5KaJwm7QRWQ5oyIoFnpjDnKVkwA7/x2cDzcvD5dGY7KY+WF/Vlsmtq8vlEA+USqbCQhq+G54nIXVJKKXzt4+c9T73FIhxfU2ZFSLmBV895822SZQ20pG3iGZdxFnRnnKAKopbikMTcBqJh244BBE5dvI5161uZ3D2RQ+obeKunncpUlr0Kz024Gle72J5PU0+Wvcf2EU/bEPKmtIePRklB0ezcZVrgKdXi59ebCK/RTe3BcUg5PmNKi787wbUpWKWl+e+3V/cqlO8Fk/YNh1kwzr5he9oLjtGah2GvowcPcywUWdsT6hce2yIR72lUJIJoj0hDLcp1aEjVMKG1AiVTGZNpo7snBeV7F4VP2nnPU7AP46OVNANZ0Wzs3sic6jn5yoPL25ZSk0iyV/Wp2HaGnkSWKRN3bbTMcMXTQmABvTefCuApYP6gSxgMo03NC/CPq4OEw5O/DfP/rV/oiKc9rnvhOqht4FeNxxG/8ULEdZH5x/PbKcfysJ7MpfNncdvpB269fOZuRMyKcc2h13DiXifynZe/w3Vv38hhkw/jG9+6i3krH4FXfgVV9XDZ72Hmh4AwQXftOu695UEqVr3JmL/cR9edd1Gy7xwmXn451eecM3qN+Azva0Tkszu6DqVUhCBnal/g1yKyZDvX8wXgCwB7771j5f2tsUF5Xx3vobDuRbamMXwkgeGcn872ERESr75KafMGqDwEvyqY0GlKNtGQbODoPY/G87KBYeNmgjC2jg1kvblAX89TKICsaN7g1aIDY1g02vXwIhpLWflmnTlcCQxY5fV6igZDZzMkHnmUtxq6qIhFOWqIY5L3BPSdyh8ivyhY0CFiKURFcAZoaht4nkBKopAB7TqgdV486GwWcvlbjh344ULPE74P2mN146u0OHEOtA9jgvZ7DdgBxJNgBYa03YOjfbSbZlLpeEqqZ7OxewN2n1wNKzRe+4VgFezzuo61YFkcPm4e+H6RAe2FniSgqHHv4oZXaI37XHromfn+Xfb6Dfn3B/pNV2HxjMHqAfbtr+N4Oa8BZP1s/lqKWEIsFE9+8yqYtHe/6pAqFKoiiu60DUQCz1VRGfZwe5GceBo4tE4iFknbRWfS2H6KSgjGUnDt+MkkTqaHmvYUKdujJxOuSw/tRezLG61vsMXekg/bk9z5C8cqaEoiJThONvCmWr37E/FS7Nn8PG2TjyWZndhPPCWeCmqxVZ95RrCsCJ5v01P/Cpt0khljZzA+0lsaPH8d5MN7/d4+a12bBhdPBQUg3NqNOB3p4mbRg+BrPxAyA3mefB+I4fsuEV/wcLDHlIPr4WmXsmwzdHfDnnsXXUc5z5Pnh+HIvkN1tJw5VbNYLkLSTVJdWh1urne51Vu68DvTjK3WAzq+R4rhBjiWiUh+WiN8vHtPwRvev3gOPP1tuPOcoCzoFQvh+K/1E04iwh/vvp7jf/ES//d7h9iTi4mcfhZ///LPOHPK2Syu2IvfXXIU3ztn3rtKOBVy4MQDufeMe/ne/O9Rn6jnwqev4JvlHlsuuCv4of3jafDc/4LWWBUVVBxxOOf+5D/46cf/lRsu/hGTvvc9VKyEpv/8L2rOPY/UK6+M9i4Z3ucopc5QSl2vlPp27v9wlhMRX0QOA/YCjlFKzdue7YvIH0TkKBE5avLkgfMuhotVVo6KRfF7uopel4Iqbn17A4njoJMt0F1HLJMKZupF80brG7Sl2xDPCUOJCGa90bha5dfjD+h5iuCERougQYQ36rt58Z0Wnql9hhcbXuw3dk8Xi6feHrbSL2wol0Pk+UL3VkKD+lYP9DSkbIdENhe2NJh4ymJFoggK6a4NevwU4vtBhb2SMDzRcRAtveJhzQYibcF58HJFA5SFilhBwQjfwQmNxZZEU3BuhvA8iYrgiUbcDHZYtrrMKs2LULuPAFChx00SfRr2Qt44VQXnzo/Hyb7d237T7+nfQcbVLm2JLFt64mxs6/VMFQqmwt5HeUIBpws9CiL5a6hvFb6c18DXLms61uTD9iwFkbBiIS2rYeOz+fCz2vhmGpNbUJIrZKIZ0/EGlm+HeWsDhO3lPGEFnidt2/ih101pjaBJ9LSxMr2SFr+b+s4UdthnSlyX5PMvkFn0EtoJw17znVtz4mlgL+IrGzvyx9DOpGhKNgXiSSRwveXEU16nBeIJHfa7KvAsltqBsKla/TKJ1UNXu/PFB/HQoqnJttGYbKQp1ZQ/RwA6kSheSHu8UPsMi3reCfLDBiPRlH+Yfvo+vNp1xcd9AFQ6S2r5suBz+ZDHQvEUVL1UookokIjCLSlBAE+ccJ/CUMT2NnoefRTtOHkB7urgOtO+jYVFVWngnY/bcfxw8ih/jJFgEgTwR6jn2WAMVzyllFJH5J4opY4ERqfEhcEwFMk2uPNsWPxzOPIyuOqFfj2PxPeJP/Ekb5xzCh++8XEObi6h8/xL+O01P+NUaz53NAiXzZ/Fc187kVPn7TlKO7LziFgRztvvPB79xKNccfAVPF37NGe99m1+dMz5dB78SXjhh3D/5UHfK2DimFJ+cv6hvNXp8YuSA9nn7w+w129+jTgOdZ/9HA3//hXcltbR3SnD+xKl1O+ATwNfIjDXPwUMo/RWLyLSDTwHnLrTB7itWFFiE8biNTf3y/HQuXAfAISWeJa1TT1INosO+7nEQg9BUXlvJ4mHpjtls6K+E09rnMIIn0LxlDNCrWh+HVp0vvxBTzIw8LMDzPT74hP10qi8lydXJavAqMp/2CUnenR0aO91TjzlDCRfCwvXNrFkUwftbpLXutbRkmrpv6BnoyIxLAnKsdNdV7xezwsMr1A8+WGlvZyQENFEugPj2M175CKoaCQIS9Jeb/GNbBLHyyKSa9wr6FSKnkceLfAACZ4nRPwsmfB4lKoSYuEknuNmA0GRO3riU5GqR9Y/E4SbA/b69bjNzQXpXr3nLr1seV5kK0sFRS/6YHs2Ayw6eNnvdGfg3Qzzp/xQUPfYPTy+6XHaM4EgLcrn6ejAeWsFACk3OKZaCxYWSukwdzbMgxJd5HlqSbeiwpAzRwvl6S1U96wNxjqQeMptt+B6TD73PMnnXwj2SwvKy2B31GOJJq7TNHWneW5dcL8SN6jgFs/aiOsTVTG8XC6R9mlzE2zO9hev8axLayLLyi096FSKLY8+QLShjQiB+LJ8jdY+y+u62NyRAvGJZdspiZSgtOS9RznRqURji0uieTM1S5fmw02za9eSXb26aNuB8AreT4aeIle7SPvGfL6P29KK19FBb9ieTyrdRtK3STspula+id/THUwsax30g9r4LGxZHnzcdkBBNh0nEx+6AEOkJ4m9pQE/Hu8VjPnfFEEcNzj/2sNSIErjKwUIXi7UNzyNbm0dCHitbZBupyzTGvYIE3zfIaIU5dFKIlaEuBvnyc1P8lbbW0XXcjQUv3p78rx2gOGG7f078DelVCPB2dmT4AZmMOw+NK2Av1wUzDh+8rZ+vRQS8RSNf70f5567iDZtoWec4r6PTeWh8mtJe2VMbNdcefxsLps/k6nVu9IBvGuojFXyb0f8GxfMvYDfvvVb7ll/P/+IlnP5kZ/g0uUPUtFVCxf+Baqm8tEDpnDl8ftwy4ubmD9nIqeddBKVxx1H5+230/77P5B+/XWm/+xnw3LxGww7kfkicohSaoWI/LdS6qfA41tbSCk1GXBFpFspVQ58DPjRSA92q0RixCaPx2lxiPZ04U2YhK81aGFVegtaMhw2aR8QoaErjV2d4sBsFh0aUTECw78w78l10/ii6Uy6UCp4onEK7IqiUuW+i5/Kklq2CW/+JACidjs4gWngeRlyUiezYgXEYkG9QsDSHtMTdeAFM9tWaLiJ79PtdPBK59scV7Uv1dFykuksy2szSCyGKjByVnesJmpFi5LB+3rIfK2xPYdKoMHuol15lKSa2KOyoHCPnYCeerQVJVU5A9v3wYpQn6jH0x7jotN55e1G9tEaiUUCr1GY15MTEq6vSeogcs93Q1GpLFQsCraLZBLBjDoKfI2nXUqkNDfovOfH2bABYtNQaFytifhZkiow0EutGL6KopSFbachvTm/C0r7xNw4WgVeLuwE2defg6rplB92aH47A6HKypGwDDuQrziX9bN58VSYulboecobvk4qMKjH75M/B7br05awyUiwbz128FcXVBdMvfIqXlsSJs8k67moGOxXdShtiWWIEiKWCnKCwnU6fmjAd2yE0iqscdPC1yUvTn0tqMKcp75No51U73sFHhjla8b2rMGKlMLYMnwsQPKTERHfo7YjRW13HHfCWEpKS3Fy+ULi83pi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\n", | |
| "text/plain": [ | |
| "<Figure size 864x144 with 2 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "pm.traceplot(trace)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 60, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "2.82860702294561" | |
| ] | |
| }, | |
| "execution_count": 60, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "beta_mu" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Now, we want to gatcher small batches of data (say, 100 points) and update the model with these batches. We don't want to have to re-train on old data points, and we don't want to have to train on an increasingly growing data set. We don't have to!\n", | |
| "\n", | |
| "The dynamics correction adjusts the hyperparameters back toward the values from the prior we started with. That incorporates a kind of \"forgetting\", so if the world changes, the model can adapt quickly." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 70, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "INFO (theano.gof.compilelock): Refreshing lock /home/akelleh/.theano/compiledir_Linux-4.15--generic-x86_64-with-Ubuntu-18.04-bionic-x86_64-3.6.6-64/lock_dir/lock\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 8880.81draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.053454970949981. stddev is 0.03973987065745886\n", | |
| "after dynamics, mean is 3.052919265939124. stddev is 0.0418858269772828\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7459.47draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.048594287797906. stddev is 0.04015923200119004\n", | |
| "after dynamics, mean is 3.0480480898012186. stddev is 0.04232775509017777\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7901.62draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.047618209780102. stddev is 0.038096180241445156\n", | |
| "after dynamics, mean is 3.0471268372335634. stddev is 0.040153662492752075\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7471.52draws/s]\n", | |
| "Auto-assigning NUTS sampler...\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.049095470409351. stddev is 0.03783759687113559\n", | |
| "after dynamics, mean is 3.048610509732998. stddev is 0.039881157159260834\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7473.20draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8837659016340619, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0279559253022192. stddev is 0.03731755398351496\n", | |
| "after dynamics, mean is 3.0274874721294305. stddev is 0.03933311281097138\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 8480.02draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8848219389866341, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.040714538676363. stddev is 0.034905193784378084\n", | |
| "after dynamics, mean is 3.04030295848994. stddev is 0.03679081465373769\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 8011.67draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0353504527168753. stddev is 0.035061528490238726\n", | |
| "after dynamics, mean is 3.0349359105578. stddev is 0.036955572295779976\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7970.02draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.045667078474604. stddev is 0.03536037336528721\n", | |
| "after dynamics, mean is 3.04524400746016. stddev is 0.03727051737182386\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7683.32draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.87886307401005, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0409465687452437. stddev is 0.035903428178477276\n", | |
| "after dynamics, mean is 3.0405110810204397. stddev is 0.03784282629622187\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 8668.13draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8790482982354095, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0289595408750447. stddev is 0.03502965328282971\n", | |
| "after dynamics, mean is 3.0285466232393787. stddev is 0.03692197975360412\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| " def apply_dynamics(posterior_mu, posterior_sd, prior_mu, prior_sd, epsilon=0.1):\n", | |
| " adjusted_variance = (posterior_sd * prior_sd) ** 2. / \\\n", | |
| " ((1.0 - epsilon) * prior_sd**2. +\n", | |
| " epsilon * posterior_sd ** 2.)\n", | |
| " adjusted_mean = adjusted_variance * (\n", | |
| " (1.0 - epsilon) * posterior_mu / posterior_sd ** 2. +\n", | |
| " epsilon * prior_mu / prior_sd ** 2.)\n", | |
| "\n", | |
| " return adjusted_mean, np.sqrt(adjusted_variance)\n", | |
| "\n", | |
| "\n", | |
| "batches = 10\n", | |
| "batch_size = 100\n", | |
| "for batch in range(batches):\n", | |
| " x_batch = []\n", | |
| " y_batch = []\n", | |
| " for xi, yi in generate_data(batch_size):\n", | |
| " x_batch.append(xi)\n", | |
| " y_batch.append(yi)\n", | |
| " with pm.Model() as model:\n", | |
| " beta = pm.Normal('beta', mu=beta_mu, sd=beta_sd)\n", | |
| " x = pm.Normal('x', mu=0, sd=1, observed=x_batch)\n", | |
| " y = pm.Normal('y', mu=beta * x, sd=1, observed=y_batch)\n", | |
| " trace = pm.sample()\n", | |
| " \n", | |
| " beta_mu = trace['beta'].mean()\n", | |
| " beta_sd = trace['beta'].std()\n", | |
| "\n", | |
| " print(\"mean is {}. stddev is {}\".format(beta_mu, beta_sd))\n", | |
| " beta_mu, beta_sd = apply_dynamics(beta_mu, beta_sd, parameter_prior_mu, parameter_prior_sd)\n", | |
| " print(\"after dynamics, mean is {}. stddev is {}\".format(beta_mu, beta_sd))\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "\n", | |
| "How bad is it? The posterior variances should decrease without the dynamics correction like $1/\\sqrt{N}$. Let's see how it compares." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 78, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "INFO (theano.gof.compilelock): Refreshing lock /home/akelleh/.theano/compiledir_Linux-4.15--generic-x86_64-with-Ubuntu-18.04-bionic-x86_64-3.6.6-64/lock_dir/lock\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 8060.00draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8819365653125937, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7722.36draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8875722379013747, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "The acceptance probability does not match the target. It is 0.8786981772567996, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0978448956341986. stddev is 0.08712304227728766\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7377.37draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.883853341198793, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.073595445041903. stddev is 0.06502291943483667\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7627.26draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0792598915797202. stddev is 0.053708331074624895\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7502.54draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.109806521475409. stddev is 0.04737354009513188\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7513.91draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8925263776307877, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.074426002545947. stddev is 0.04408508675694674\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7643.29draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.072258736919936. stddev is 0.04082190569412854\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7563.38draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.059100197616981. stddev is 0.037263151474141505\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7708.45draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0326486866503157. stddev is 0.034850653454787696\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 8003.59draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0030969622879424. stddev is 0.03247572577988825\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 8463.38draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8786672009219315, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.011665185873131. stddev is 0.030224481110303854\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "N = 50\n", | |
| "\n", | |
| "x = []\n", | |
| "y = []\n", | |
| "for i in range(N):\n", | |
| " xi, yi = get_data()\n", | |
| " x.append(xi)\n", | |
| " y.append(yi)\n", | |
| " \n", | |
| "parameter_prior_mu = 0\n", | |
| "parameter_prior_sd = 1\n", | |
| "\n", | |
| "with pm.Model() as model:\n", | |
| " beta = pm.Normal('beta', mu=parameter_prior_mu, sd=parameter_prior_sd)\n", | |
| " x = pm.Normal('x', mu=0, sd=1, observed=x)\n", | |
| " y = pm.Normal('y', mu=beta * x, sd=1, observed=y)\n", | |
| " trace = pm.sample()\n", | |
| " \n", | |
| "beta_mu = trace['beta'].mean()\n", | |
| "beta_sd = trace['beta'].std()\n", | |
| "\n", | |
| "\n", | |
| "betas = [beta_mu]\n", | |
| "variances = [beta_sd**2.]\n", | |
| "Ns = [N]\n", | |
| "expected_vars = [parameter_prior_sd**2./ np.sqrt(N)]\n", | |
| "\n", | |
| "batches = 10\n", | |
| "batch_size = 100\n", | |
| "for batch in range(batches):\n", | |
| " x_batch = []\n", | |
| " y_batch = []\n", | |
| " for xi, yi in generate_data(batch_size):\n", | |
| " x_batch.append(xi)\n", | |
| " y_batch.append(yi)\n", | |
| " with pm.Model() as model:\n", | |
| " beta = pm.Normal('beta', mu=beta_mu, sd=beta_sd)\n", | |
| " x = pm.Normal('x', mu=0, sd=1, observed=x_batch)\n", | |
| " y = pm.Normal('y', mu=beta * x, sd=1, observed=y_batch)\n", | |
| " trace = pm.sample()\n", | |
| " \n", | |
| " beta_mu = trace['beta'].mean()\n", | |
| " beta_sd = trace['beta'].std()\n", | |
| "\n", | |
| " betas.append(beta_mu)\n", | |
| " variances.append(beta_sd**2.)\n", | |
| " Ns.append( N + (batch+1)*batch_size)\n", | |
| " expected_vars.append(parameter_prior_sd**2. / np.sqrt(Ns[-1]))\n", | |
| " print(\"mean is {}. stddev is {}\".format(beta_mu, beta_sd))\n", | |
| " \n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 93, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "INFO (theano.gof.compilelock): Refreshing lock /home/akelleh/.theano/compiledir_Linux-4.15--generic-x86_64-with-Ubuntu-18.04-bionic-x86_64-3.6.6-64/lock_dir/lock\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7400.63draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.104672691628748. stddev is 0.2225481433348595\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7450.62draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8888517368030993, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7478.95draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.003328641749641. stddev is 0.15686252520724742\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7503.50draws/s]\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7916.13draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8888287061248509, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "The acceptance probability does not match the target. It is 0.8873024355582213, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.149859057283542. stddev is 0.1321950041134763\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7747.25draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8804837236434276, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 8737.66draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.893731802366368, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "The acceptance probability does not match the target. It is 0.896683830655603, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0837114051214187. stddev is 0.11457296455456885\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7907.50draws/s]\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7854.99draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8898292203217597, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.084813065588017. stddev is 0.10123663776510136\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7201.66draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8829888505132729, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7540.10draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8823576288430245, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "The acceptance probability does not match the target. It is 0.878892621323462, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.061054593890492. stddev is 0.09181683943190598\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7791.47draws/s]\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 8152.38draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8842403911583585, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "The acceptance probability does not match the target. It is 0.8797061253564031, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0478423643216828. stddev is 0.08462467428117593\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7229.62draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8814150559687265, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7813.77draws/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0492225191643305. stddev is 0.08142210479745383\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7362.88draws/s]\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7659.84draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8966364277221469, but should be close to 0.8. Try to increase the number of tuning steps.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.0581610994204396. stddev is 0.0756976874336479\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7942.67draws/s]\n", | |
| "The acceptance probability does not match the target. It is 0.8929763677027426, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "The acceptance probability does not match the target. It is 0.8836011362503814, but should be close to 0.8. Try to increase the number of tuning steps.\n", | |
| "Auto-assigning NUTS sampler...\n", | |
| "Initializing NUTS using jitter+adapt_diag...\n", | |
| "Multiprocess sampling (4 chains in 4 jobs)\n", | |
| "NUTS: [beta]\n", | |
| "Sampling 4 chains: 100%|██████████| 4000/4000 [00:00<00:00, 7812.79draws/s]" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "mean is 3.008154997317253. stddev is 0.07184543377033048\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "batched_data = []\n", | |
| "batches = 10\n", | |
| "batch_size = 20\n", | |
| "for batch in range(batches):\n", | |
| " x_batch = []\n", | |
| " y_batch = []\n", | |
| " for xi, yi in generate_data(batch_size):\n", | |
| " x_batch.append(xi)\n", | |
| " y_batch.append(yi)\n", | |
| " batched_data.append((x_batch, y_batch))\n", | |
| " \n", | |
| "parameter_prior_mu = 0\n", | |
| "parameter_prior_sd = 1\n", | |
| "\n", | |
| "batches = 10\n", | |
| "batch_size = 100\n", | |
| "for batch, batch_data in enumerate(batched_data):\n", | |
| " if batch == 0:\n", | |
| " x, y = batch_data\n", | |
| " x_running, y_running = batch_data\n", | |
| " with pm.Model() as model:\n", | |
| " beta = pm.Normal('beta', mu=parameter_prior_mu, sd=parameter_prior_sd)\n", | |
| " x = pm.Normal('x', mu=0, sd=1, observed=x)\n", | |
| " y = pm.Normal('y', mu=beta * x, sd=1, observed=y)\n", | |
| " trace = pm.sample()\n", | |
| "\n", | |
| " beta_mu = trace['beta'].mean()\n", | |
| " beta_sd = trace['beta'].std()\n", | |
| " \n", | |
| " betas = [beta_mu]\n", | |
| " mcmc_variances = [beta_sd**2.]\n", | |
| " mcmc_online_variances = [beta_sd**2.]\n", | |
| " Ns = [N]\n", | |
| " else:\n", | |
| "\n", | |
| " x_batch, y_batch = batch_data\n", | |
| " x_running, y_running = x_running + x_batch, y_running + y_batch\n", | |
| " with pm.Model() as model:\n", | |
| " beta = pm.Normal('beta', mu=beta_mu, sd=beta_sd)\n", | |
| " x = pm.Normal('x', mu=0, sd=1, observed=x_batch)\n", | |
| " y = pm.Normal('y', mu=beta * x, sd=1, observed=y_batch)\n", | |
| " trace = pm.sample()\n", | |
| "\n", | |
| " beta_mu = trace['beta'].mean()\n", | |
| " beta_sd = trace['beta'].std()\n", | |
| "\n", | |
| " mcmc_online_variances.append(beta_sd**2.)\n", | |
| " with pm.Model() as model:\n", | |
| " beta = pm.Normal('beta', mu=parameter_prior_mu, sd=parameter_prior_sd)\n", | |
| " x = pm.Normal('x', mu=0, sd=1, observed=x_running)\n", | |
| " y = pm.Normal('y', mu=beta * x, sd=1, observed=y_running)\n", | |
| " trace = pm.sample()\n", | |
| "\n", | |
| " beta_mu = trace['beta'].mean()\n", | |
| " beta_sd = trace['beta'].std()\n", | |
| "\n", | |
| " mcmc_variances.append(beta_sd**2.)\n", | |
| " Ns.append( N + (batch+1)*batch_size)\n", | |
| " print(\"mean is {}. stddev is {}\".format(beta_mu, beta_sd))\n", | |
| " \n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 92, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<matplotlib.axes._subplots.AxesSubplot at 0x7f5ee43ec780>" | |
| ] | |
| }, | |
| "execution_count": 92, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEMCAYAAADEXsFmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xl4VOX99/H3N5M9AbKxbwFBMGwCEVGsG1ZAreBCAWurFndcq3WpP9zq87RWf7a22lqXLrZ9EMUNW0VEtGqrSBBZQliCIAQIOwGyT+Z+/pijRgQTQpKTyXxe15WLOfe5z+F758B85ixzjjnnEBERifG7ABERaRkUCCIiAigQRETEo0AQERFAgSAiIh4FgoiIAAoEERHxKBBERARQIIiIiCfW7wIOR1ZWlsvOzva7DBGRiLJo0aIdzrn2dfWLqEDIzs4mLy/P7zJERCKKmX1en371OmRkZmPNbJWZFZrZHQeZn2BmM735C8ws22vPNLN3zGy/mT1Wq3+ymf3LzFaaWb6Z/bJ+wxIRkaZSZyCYWQB4HBgH5ABTzCzngG5Tgd3OuT7Ar4EHvfYKYDpw60FW/bBzrj8wFBhlZuMaNgQREWkM9dlDGAEUOuc+c85VAc8B4w/oMx74q/d6FjDazMw5V+qc+4BwMHzJOVfmnHvHe10FfAJ0O4JxiIjIEarPOYSuwMZa00XA8Yfq45wLmlkJkAnsqGvlZpYGfA94tD4Fi4gcTHV1NUVFRVRUVNTduZVKTEykW7duxMXFNWh5X08qm1ksMAP4rXPus0P0uRK4EqBHjx7NWJ2IRJKioiLatGlDdnY2ZuZ3Oc3OOcfOnTspKiqiV69eDVpHfQ4ZbQK615ru5rUdtI/3Jt8O2FmPdT8JrHHO/eZQHZxzTzrncp1zue3b13nVlIhEqYqKCjIzM6MyDADMjMzMzCPaQ6pPICwE+ppZLzOLByYDsw/oMxu4xHt9ITDf1fEoNjN7gHBw3HR4JYuIHFy0hsEXjnT8dR4y8s4JXAe8CQSAPznn8s3sfiDPOTcbeAb4m5kVArsIh8YXBa4H2gLxZjYBOBPYC9wFrAQ+8QbxmHPu6SMazUGEamrIe/Ux4lLSGDrmkroXEBGJUvU6h+Ccex14/YC2u2u9rgAmHmLZ7EOsttmiPH3F32gT3E3Fdy4gMTm1uf5aEZGI0urvZRQTCFB56j10YgdLX/qV3+WISBR65ZVXuOKKK5g0aRJz5871u5xDavWBADDwpO/xaeLxHFP4FHt3bfW7HBGJMhMmTOCpp57iiSeeYObMmX6Xc0hREQgAqec8QLIrZ9UL9/pdiohEqQceeIBp06b5XcYhRU0g9Bk4goVp4xiy+Xm2b1jldzki0kotWbKEk08+mZycHGJiYjAzpk+fzu233864ceMYNmyY3yUeUtQEAkCP839ODTFseukuv0sRkVaooqKCSZMm8fDDD7NixQruuusubr31VrKyspg3bx6zZs3iiSee8LvMQ4qo218fqS49+/B+58l8p/hZNi7/L90Hnuh3SSLSisybN49hw4YxYsQIAAYPHsycOXN46KGHuPHGG32urm5RFQgAAybeza7fvkzpv34GA96BKP8ii0hrdN9r+azYvLdR15nTpS33fG/At/ZZvnw5gwYN+nL6k08+adGHiA4UVYeMADIy27PsqKvoX76YNf99xe9yRKQVyczMZOnSpQCsXr2al156icmTJ9ex1FcuvfRSAKZPn94U5dUp6vYQAI6beAsbH/w78e/cixv5PSwQlb8GkVarrk/yTWXKlCnMnj2bgQMHkpWVxYwZM8jMzKSsrIyf/vSnJCQkkJyczDXXXMPFF1/Mueeey0cffcTMmTMpKysjJSWF4uJiiouLOe200742v7q6mnvuuYeysjJCoRC//e1vG73+qNtDAEhOSmbdkFvoGVxPwZtP+V2OiLQSqampvPbaayxfvpx33333y8NFjz/+OJdeeimPPPIIK1euZMmSJVx00UXcfPPNxMaGP5B+cXjp008/5bTTTvvG/CeffJLy8nLS0tIoKSlpkvqj9qPxCd+bSsGyJ2m/8CFqRl9CICHZ75JEpJXKz8/nlltuoaqqiuTkZJYsWcJ5550HfHVDuoULFzJ69Ghef/11nHPfmL948WIef/xxEhISmqzOqNxDAIiLDbBn1HTau53kv/xg3QuIiDTQxIkTueaaa7j++uu55ZZbKCws5Oijj2bHjh106tQJCIfGgAEDWLNmDatXr/7G/PHjx3PppZdy2223MWfOnCap0+q4S3WLkpub6/Ly8hptfc45Fv7iTHKqlhN78xIS23VotHWLSPMqKCjgmGOO8bsM3x3s92Bmi5xzuXUtG7V7CBDeFYsbcz9Jrpw1L9zj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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "pd.DataFrame({'$\\sigma^2_{online}$': mcmc_online_variances, \n", | |
| " '$N$': Ns, \n", | |
| " '$\\sigma^2_{batch}$': mcmc_variances}).plot(x='$N$', y=['$\\sigma^2_{online}$', '$\\sigma^2_{batch}$'])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Apparently not bad at all!" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "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.6.6" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 2 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment