From 81f46a8b7bda7eb20f629fa0950d8775a06a934e Mon Sep 17 00:00:00 2001 From: ritchie46 Date: Wed, 25 Sep 2019 11:58:47 +0200 Subject: [PATCH] add variational inference post notebook and rename the notebook of the chase the posterior blog post --- ...tion_inference_post_chase_posterior.ipynb} | 0 bayesian/variational_inference_post.ipynb | 387 ++++++++++++++++++ 2 files changed, 387 insertions(+) rename bayesian/{variation_inference_post.ipynb => variation_inference_post_chase_posterior.ipynb} (100%) create mode 100644 bayesian/variational_inference_post.ipynb diff --git a/bayesian/variation_inference_post.ipynb b/bayesian/variation_inference_post_chase_posterior.ipynb similarity index 100% rename from bayesian/variation_inference_post.ipynb rename to bayesian/variation_inference_post_chase_posterior.ipynb diff --git a/bayesian/variational_inference_post.ipynb b/bayesian/variational_inference_post.ipynb new file mode 100644 index 0000000..f0dbc1e --- /dev/null +++ b/bayesian/variational_inference_post.ipynb @@ -0,0 +1,387 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import numpy as np\n", + "import torch\n", + "from torch import nn\n", + "from sklearn import datasets\n", + "from torch.utils.data import DataLoader, TensorDataset\n", + "from sklearn.preprocessing import StandardScaler" + ] + }, + { + "cell_type": "code", + "execution_count": 394, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 394, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "w0 = 0.125\n", + "b0 = 5.\n", + "x_range = [-20, 60]\n", + "\n", + "def load_dataset(n=150, n_tst=150):\n", + " np.random.seed(43)\n", + " \n", + " def s(x):\n", + " g = (x - x_range[0]) / (x_range[1] - x_range[0])\n", + " return 3 * (0.25 + g**2.)\n", + " \n", + " x = (x_range[1] - x_range[0]) * np.random.rand(n) + x_range[0]\n", + " eps = np.random.randn(n) * s(x)\n", + " y = (w0 * x * (1. + np.sin(x)) + b0) + eps\n", + " y = (y - y.mean()) / y.std()\n", + " idx = np.argsort(x)\n", + " x = x[idx]\n", + " y = y[idx]\n", + " return y[:, None], x[:, None]\n", + "\n", + "Y, X = load_dataset()\n", + "\n", + "plt.figure(figsize=(16, 6))\n", + "plt.scatter(X, Y)" + ] + }, + { + "cell_type": "code", + "execution_count": 395, + "metadata": {}, + "outputs": [], + "source": [ + "X = torch.tensor(X, dtype=torch.float)\n", + "Y = torch.tensor(Y, dtype=torch.float)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 396, + "metadata": {}, + "outputs": [], + "source": [ + "class MaximumLikelihood(nn.Module):\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.out = nn.Sequential(\n", + " nn.Linear(1, 20),\n", + " nn.ReLU(),\n", + " nn.Linear(20, 1)\n", + " )\n", + " def forward(self, x):\n", + " return self.out(x)\n", + " \n", + "epochs = 200\n", + "m = MaximumLikelihood()\n", + "optim = torch.optim.Adam(m.parameters(), lr=0.01)\n", + "\n", + "for epoch in range(epochs):\n", + " optim.zero_grad()\n", + " y_pred = m(X)\n", + " loss = (0.5 * (y_pred - Y)**2).mean()\n", + " loss.backward()\n", + " optim.step()\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 397, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6AAAAFlCAYAAAD1f4WfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de3Cc2Xnf+d/pC9ANNNAgLg2C4HBIApwZjqDRaIS5SEOPZWkkUZZiWY7lUVLrcu2uw/VWokq01mbt9R9OtiqVrdokE682uxWW5dhJHLvsOIpvMe2xFIeekTUSRxpJ1EAmAWI4HAyIK9FAA91AX87+0Y0GGsQd3e+l+/upYgFovOw+3edF9/uc85znGGutAAAAAACotYDbDQAAAAAANAYCUAAAAACAIwhAAQAAAACOIAAFAAAAADiCABQAAAAA4AgCUAAAAACAI0JuPGh3d7c9ffq0Gw8NAAAAAKix1157bdZa27P1dlcC0NOnT+vatWtuPDQAAAAAoMaMMbe3u50UXAAAAACAIwhAAQAAAACOIAAFAAAAADiCABQAAAAA4AgCUAAAAACAIwhAAQAAAACOIAAFAAAAADiCABQAAAAA4AgCUAAAAACAIwhAAQAAAACOIAAFAAAAADgi5HYDAAAAAMCvRiaTunJ9ShMLafV3RHVxqFfn++JuN8uzmAEFAAAAgEMYmUzq8tVxJdNZ9cUjSqazunx1XCOTSbeb5lkEoAAAAABwCFeuTykeDSseDStgTPn7K9en3G6aZxGAAgAAAMAhTCyk1RapXNXYFglpYiHtUou8jwAUAAAAAA6hvyOqpUyu4ralTE79HVGXWuR9BKAAAAAAcAgXh3qVTGeVTGdVsLb8/cWhXreb5lkEoAAAAABwCOf74rr03BnFo2FNJjOKR8O69NwZquDugm1YAAAAAOCQzvfFCTgPgBlQAAAAAIAjCEABAAAAAI4gAAUAAAAAOIIAFAAAAADgCAJQAAAAAIAjCEABAAAAAI4gAAUAAAAAOIIAFAAAAADgCAJQAAAAAIAjCEABAAAAAI4gAAUAAAAAOIIAFAAAAADgCAJQAAAAAIAjCEABAAAAAI4gAAUAAAAAOOLIAagxJmKM+YYx5jvGmO8bY/5xNRoGAAAAAKgvoSrcx6qkD1lrU8aYsKSXjTF/Yq39ehXuGwAAAABQJ44cgFprraRU6cdw6Z896v0CAAAAAOpLVdaAGmOCxpjXJU1Lesla++o2x1wyxlwzxlybmZmpxsMCAAAAAHykKgGotTZvrX1c0klJTxljhrY55rK1dthaO9zT01ONhwUAAAAA+EhVq+Baaxck/YWki9W8XwAAAACA/1WjCm6PMaaj9H1U0vOSfnDU+wUAAAAA1JdqVMHtk/QbxpigigHt71hr/6gK9wsAAAAAqCPVqIL7XUnvrUJbAAAAAAB1rKprQAEAAAAA2AkBKAAAAADAEQSgAAAAAABHEIACAAAAABxBAAoAAAAAcAQBKAAAAADAEQSgAAAAAABHEIACAAAAABxBAAoAAAAAcAQBKAAAAADAEQSgAAAAAABHEIACAAAAABxBAAoAAAAAcAQBKAAAAADAESG3GwAAAACg/oxMJnXl+pQmFtLq74jq4lCvzvfF3W4WXMYMKAAAAICqGplM6vLVcSXTWfXFI0qms7p8dVwjk0m3mwaXEYACAAAAqKor16cUj4YVj4YVMKb8/ZXrU243DS4jBRcAAABAVU0spNUXj1Tc1hYJaWIh7VKL3EMqciVmQAEAAABUVX9HVEuZXMVtS5mc+juiLrXIHaQi348AFAAAAEBVXRzqVTKdVTKdVcHa8vcXh3rdbpqjSEW+HwEoAAAAgKo63xfXpefOKB4NazKZUTwa1qXnzjRc6unEQlptkcpVj42airyONaAAAAAAqu58X7zhAs6t+juiSqazikfD5dsaMRV5M2ZAAQAAAKAGSEW+HwEoAAAAANQAqcj3IwUXAAAAAGqEVORKzIACAAAAABxBAAoAAAAAcAQBKAAAAADAEawBBQAAQNWMTCZ15fqUJhbS6u+I6uJQL+vfAJQxAwoAAICqGJlM6vLVcSXTWfXFI0qms7p8dVwjk0m3mwbAIwhAAQAAUBVXrk8pHg0rHg0rYEz5+yvXp9xuGgCPIAAFAABAVUwspNUWqVzh1RYJaWIh7VKLAHgNASgAAACqor8jqqVMruK2pUxO/R1Rl1oEwGsIQAEAAFAVF4d6lUxnlUxnVbC2/P3FoV63mwbAI6iCCwAA4JJ6qxh7vi+uS8+dqXhOLzx50tfPCUB1EYACAAC4YL1ibDwarqgYe+m5M74O2M73xX3dfgC1RQouAACAC6gYC6AREYACAAC4gIqxABoRASgAAIALqBgLoBERgAIAALiAirEAGhEBKAAAgAvWK8bGo2FNJjOKR8O+L0AEAHuhCi4AAIBLqBgLoNEQgAIAAABwVL3tgYv9IwUXAAAAgGPW98BNprMVe+COTCbdbhocwAwoAAAAgJrZOts5u5Qp73srqfz1yvUpZkEbADOgAAAAAGpiu9nOvxyd02qucgsi9sBtHASgAAAAAGriyvWp8mxnwBjFo2EdawnrjXeWKo5jD9zGQQAKAAAAoOpGJpN66Y0pff3WrL5+a06zqYwk6Xxfm+6tsAduo2INKAAAAFAlB63uWq/VYNdTb8NBI9mAMtm8Xru9oPc92KFIOKQLg12KR8Pl5/3Ckyfr4nljb8Zae7Q7MOYBSf9W0nFJBUmXrbW/stv/GR4etteuXTvS4wIAAABesh50xaNhtUVCWsrklExndem5M9sGVwc93k9efOmGkums1nJ5feutBTWHArLWyhijsz2xuniO2J0x5jVr7fDW26uRgpuT9PPW2vOSnpH0d40xj1bhfgEAAADf2G69Yzwa1pXrU1U53k8mFtJqi4TU0xbRE6c61BwOKpu3WssXCD4b3JFTcK21k5ImS98vGWNGJPVLeuOo9w0AAID6VI+ppxMLafXFIxW37Vbd9aDH+0l/R1TJdFbxaFg9bRH1tEXKP/u9n3E0VS1CZIw5Lem9kl6t5v0CAACgfmy3Ncflq+MamUy63bQj6e+IailTub3IbtVdD3q8n1wc6i0XF6LQEDarWgBqjIlJ+j1J/8Bau7jN7y8ZY64ZY67NzMxU62EBAADgM/WaenrQoKueg7TzfXFdeu6M4tGwJpMZxaNhUm8hqQpFiCTJGBOW9EeS/tRa+y/2Op4iRAAAAI3rC7/7HfXFIwoYU76tYK0mkxn9s8+8x8WWHR1VcIGinYoQHXkNqDHGSPqSpJH9BJ8AAABobJvXB66rl9TT833xAwWQBz0e8LtqpOA+K+mnJX3IGPN66d+PVuF+AQAAUIfqOfUUwO6qUQX3ZUlmzwMBAAAAbawP3Jx6+sKTJ5kJBBrAkQNQAAAA4KBIPQUaU1W3YQEAAAAAYCcEoAAAAAAAR5CCCwAAAMAVbEPTeAhAAQAAADhuZDKpy1fHFY+G1RePKJnO6vLVcV167owvg1CC6f0hBRcAAACA465cn1I8GlY8GlbAmPL3V65Pud20A1sPppPpbEUwPTKZdLtpnkMACgAAAMBxEwtptUUqEzLbIiFNLKRdatHh1VMwXWuk4AIAAAA4kGqkm/Z3RJVMZxWPhsu3LWVy6u+IVru5NTexkFZfPFJxm1+D6VpjBhQAAABHNjKZ1Isv3dAXfvc7evGlG6Qe1rFqpZteHOpVMp1VMp1Vwdry9xeHemvU8trp74hqKZOruM2vwXStEYACAADgSFj/1liqlW56vi+uS8+dUTwa1mQyo3g07NsCRPUUTNcaKbgAAAA4ks0BiaTy1yvXp3wZTGB31Uw3Pd8Xr4tzZD2Y3pyW/MKTJ+viuVUbASgAAACOhPVvjaWe1m5WU70E07VGCi4AAACOhPVvjYV0UxwFM6AAAAA4kotDvbp8dVxSceZzKZNTMp3VC0+edLllqIVqp5tWo6Iu/MNYax1/0OHhYXvt2jXHHxcAAAC1QRCBw1gvYBWPhisGL/xajAgbjDGvWWuHt97ODCgAAACOjPVvOAwKWDUe1oACAAAAcMXEQlptkco5MQpY1TcCUAAAAACuoIBV4yEABQAAAOAKKuo2HgJQAAAAAK5Yr6gbj4Y1mcwoHg1TgKjOUYQIAAAAgGsoYNVYmAEFAAAAADiCABQAAAAA4AgCUAAAAACAI1gDCgAAXDcymdSV61OaWEirvyOqi0O9rAkDgDrEDCgAAHDVyGRSl6+OK5nOqi8eUTKd1eWr4xqZTLrdNABAlTEDCgAAXHXl+pTi0bDi0bAklb9euT7FLGidYaYbEudBo2MGFAAAuGpiIa22SOWYeFskpImFtEstQi0w0w2J8wAEoAAAwGX9HVEtZXIVty1lcurviLrUItTC5pnugDHl769cn3K7aXAQ5wEIQAEAgKsuDvUqmc4qmc6qYG35+4tDvW43DVXETDckzgMQgAIAAJed74vr0nNnFI+GNZnMKB4N69JzZ1gTVmeY6YbEeQCKEAEAAA843xevi4CT4io7uzjUq8tXxyUVZ7yWMjkl01m98ORJl1sGJ3EegBlQAACAKqC4yu6Y6YbEeQBmQAEAAKqC7WT2Vi8z3TgazoPGxgwoAABAFVBcBQD2RgAKAABQBRRXAYC9EYACAABUAdvJAMDeCEABAACqgOIqALA3ihABAABUCcVVAGB3zIACAAAAABxBAAoAAAAAcAQBKAAAAADAEawBBQAAQE2MTCZ15fqUJhbS6u+I6uJQL2tkURecPrfnl9c0mUzrXSf8//dDAAoAAOCQRgrIRiaTunx1XPFoWH3xiJLprC5fHacyMHyvVue2tVaTyYxGp1PFfzOp8vfzy2tqi4T03V/+qIwxVXw2ziMABQAAcECjBWRXrk8pHg0rHg1LUvnrletTdfl80TiOem7n8gXduZfWzamlcpA5Np3S2MyyUqu58nHxaFjnEjF99NFeDSZiGkjEZK3k8/iTABQAAMAJjRaQTSyk1RePVNzWFglpYiHtUouA6tjvuZ3J5jU+u6zR6ZRuloLM0emUxmeXtZYvlI/rbW/WuUSbfvJ9JzWQiGmwJ6bBREzdsSbfz3ZuhwAUAADAAY0WkPV3RJVMZ8uBtiQtZXLq74i62Crg6Lae26u5vO7Mp7WWK+if/smIxkoB5535FRVs8f8EjPRAZ4sGe2L64CM95SBzIBFTeyS8y6PVHwJQAABQc4209nEnjRaQXRzq1eWr45KKgfZSJqdkOqsXnjzpcsuAg7PWam55TTenUsoVCrp6c0bptbwWM1ktr+bLxzXdCOhMd6uGTsT1qcf7dS5RDDTPdLcqEg66+Ay8gwAUAADUVKOtfdxJowVk5/viuvTcmYqBhxeePNlQfQ7/KRSs3kmmNwoBbSoItLCSLR8XDQfVHg2pu7VZ7zkZ1fPnE/rgwwmd6mxRKMhOl7shAAUAADXVaGsfd9KIAdn5vnhdPz/4VzZf0O25lWIBoJlUuSDQ2PSy0tmNGc3O1iYN9sT08aG+8mzmYCKmvnikLtdnOqEqAagx5tckfVLStLV2qBr3CQAA6kOjrX3cDQEZ4Kz0Wl5jM8Ugc/OM5ptzy8rmbfm4E/GIBhIxffapTg0mYjqXaNNgIqbO1iYXW1+fqjUD+uuS/h9J/7ZK9wcAAOpEo619bBSs64WXJNPZUnC5VJE2+/a9tOymQkCnu1o1kIjp+Ud7KwoBxZpJDHVKVV5pa+1VY8zpatwXAACoL4229rERsK4XbrDWamZptRxc3pzaCDRnllbLxzWFAjrb3arHHzimn3zigXLa7OnuFjWHKATkNsdCfWPMJUmXJOnUqVNOPSwAAHBZI659rHf//q9u69ZMSmv5gtojYQ0mWhWPhhtuXS9qo1CwevteWqMzSxVpszenU1rK5MrHtTWHNJCI6Ycf6imlzRYDzZPHWhQMsD7TqxwLQK21lyVdlqTh4WG7x+EAAKCOsPaxfoxMJvWXo3PqiIbU1hxSJpvXa7cX9N5TcU0s5Pa+A6BkLVfQ7bll3dxScfbWbEqZbKF8XHesWYOJVn3q8ROltNk2neuNKdHWTCEgHyLZGQAAAPt25fqUjrUU1/MaY8p7G77xzpI++HDCzabBo1bWchqbXtbozFJF2uztuRXlCxvzUv0dUZ3rjekDA13ltNnBREwdLRQCqicEoAAAANi3iYW0zve16fU7SUlScyggWat76ZwuDvW63Dq46d7ymka3VJsdnU5VVLwOBYwe7GrRuURMHx86Xq42e7anVS1NhCaNoFrbsPyWpA9K6jbGvC3pl621X6rGfQMAAMA71qsaP3GqQ6Mzy0plcgoHjS4MdpFm3QCstZpaXNXN6cr1mWMzKc2m1srHRcIBDfTENHz6mD7bUywEdK43plOdrWoKBVx8BnBbtarg/q1q3A8AAAC8bb2qcTwa1tNnOstVjX/6/Q+63TRUUb5gdWd+pVz8Zz1tdmw6pdTqxlrf9khI53rb9OFHeivSZvs7ogpQCAjbYJ4bAAA4iv0j/Y2qxvVlNZfX+OzyfWmzt2aXtZbbKASUaGvWYCKmn3iiX+dKe2cOJmLqiVEICAdDAAoAABzD/pH+stNgAVWN/Se1mrsvyBybSen23LLW6wAZIz1wrEWDiZiee6inWHG2N6aBnpji0bC7TwB1gwAUAAA45sr1KcWj4fLF7PpX9o/0HgYL/GkutVqRNjtWKgo0mcyUjwkHjfriUTWFAnr4eJse7GzVJ99zXM+fP16uagzUCgEoAABwzMRCWn3xSMVtbZFQRZVMeAODBd5lrdU7ycym2cyNgkD3VrLl41qaghroiemZs5XbmqysZvVrr9xWPBpWWySkpUxOXxmZ0UBPjL5FzRGAAgAAx6xXUN2czreUyam/I+piq7AdBgvcl8sXdLtUCGh0ulgAaH2bk5W1fPm4Yy1hDSZiujh0XAM9MZ3rLW5t0tce2bYQ0Isv3WBwAa4hAAUAAI5Zr6AqqTzzkkxn9cKTJ11uGbZisMA5mWxet2aWdXN6qSLIfHN2RWv5jUJAx9sjOtcb008NP1CezTyXiKkr1nygx2NwAW4iAAUAAI6hgqp/MFhQfYuZ7H2FgEanU7pzb0W2VAgoYKRTncVCQB/atLXJQE+r2iLVKQTE4ALcRAAKAAAcRQVVf2Cw4HCstZopFQIa27R/5s2plKaXVsvHNQUDOtvTqnefjOvT7+3Xud5ioHm6q7XmhYAYXICbjF0fbnHQ8PCwvXbtmuOPCwAAABzG1i1pPvquhNojTZWzmaXU2WR6oxBQrDlU3DOzJ1aRNvtAZ4uC26zPdOv5sB8vqs0Y85q1dvi+2wlAAQAAgO1l8wV99QdT+tLLbyqbK2h5LafZ1JqS6azyhY3r6K7WJg2UgsvNFWePt0dkjHuBJuCWnQJQUnABAAD2gRmj+pZey5f3zFz/d3N6SbfnVpTbFGi2RULqbGnS8faI+uIR/dwHBzTYE9Ox1iYXWw/4BwEoAADAHkYmk7p8dVzxaFh98YiS6awuXx3XpefOEIT6zMLK2rZps2/f26gAGwwYPdjVosGemD72ruP65pvzOtPdqq7WZjWFApKkgrWaTGb05OlOt54K4EsEoAAAAHu4cn2KfRN9xFqr6aViIaCbU0vlIHN0elmzqY1CQM2hgM72xPTEqWMVW5uc7motB5pScd/MZDpbcRtVY4HDIQAFAADYA/smelO+YPX2vZVNKbOpcvXZpdVc+bi2SEiDiZh+5OGecrXZwZ429R+L7qsQEFVj4aZ6S/8nAAUAANgD+ya6azWX15uzK/elzd6aSWk1Vygf19PWrMGemH78vf0VFWd72pqPVAiILWnglnpM/ycABQAAnuLF0X5mwJyxvJrTWGnPzPUgc2w6pdvzK+WKs8YUBwTOJWK6MNi1UXG2p03xlvAej3B47F8LN9Rj+j8BKAAA8AyvjvYzA1Zd88trFZVm1wPNd5KZ8jGhgNHp7lY91NumTzzWp8FETAM9xX/RpqCLrQecU4/p/wSgAADAM7w82s8M2MHYUpXYrWmzo9MpzS+vlY+LhoMaSLTqqTOdm/bPbNODXS0KBwO7PAJQ/+ox/Z8AFAAAeEY9jvbXu1y+oDv30hXVZsemUxqbWVZqUyGgeDSsc4mYPvpob3E2MxHTYE9M/R1RBfZRCAhwipeWAdRj+j8BKAAA8Ix6HO2vF5lsXuOzy+Vqs2Ol2czx2WWt5TcKAfW2N2swEdNPvu9kOcgcTMTUHWs6UiEgwAleWwZQj+n/BKAAAMAz6nG032+WMtmKtNmxUsB5Z35FpTpAMkY61dmiwZ6YPvhwTzl1diARU3ukdoWAgFrz4jKAekv/JwAFAACeUY+j/V5krdXc8lq52uz6bObodEp3FzcKAYWDRme7Yxo6EdenHi9tbdIT09meVkXCFAJC/WEZQO0RgAIAAE+pt9F+NxUKVu8k0xszmptmNhdWsuXjWpuCGkjE9IGBLg32bqTNnupsUWhLIaCRyaT+v78Yq+r6OC+tuUNjYxlA7RGAAgBQY1xco9ay+YJuz60UCwDNpMoFgcaml5XO5svHdbY2abAnpo8PFbc1OVdKne2LR/a1PrMW6+O8tuYOjY1lALVHAAoAQA1xcY1qSq/lNTZTDDI3z2i+ObesbN6WjzsRj2ggEdNnn+osp80OJmLqijUf6fFrsT7Oi2vu0LhYBlB7BKAAANQQF9c4jGR6vRDQUkXa7Nv30rKlODNgpAe7WjXQE9Pzj/aWg8yBREyx5tpc4tVifRxr7uA1bi8DqPesGQJQAABqiItr7MRaq5ml1XJweXNqI9CcWVotH9cUCuhsd6vec7JDf/OJkzqXaNNgIqbT3S1qDlW/ENBuF7+1WB/HmjtgQyNkzRCAAgBQQ/V6cV3vI/TVVChYvX0vrdGZpYq02ZvTKS1lcuXj2ppDGkjE9MMP9ZTTZs/1xnTyWIuCAWf2z9zr4rcW6+O8uOaO8xtuaYSsGQJQAABqqFoX1166IK6HEfpavJ5ruYJuzy3r5paKs7dmU8pkC+XjumNNGkzE9KnHT5TSZoszmr3tzfsqBFRLe1381mJ9nNfW3NXD+Q3/aoSsGQJQAABqqBoX1167IPb7CP1RX8+VtZzGppc1OrNUkTZ7e25F+cJGIaD+jqgGEzG9f6CrXG12MBFTR0tTLZ/ekezn4rcW6+PcXnO3md/Pb/hbvWbNbEYACgBAjR314tprF8R+H6Hf7+t5b3lNo1uqzY5OpyqeZzBgdLqrRecSMX186Hhpa5M2ne1pVUuT/y6zGuHidy9+P7/hb15MSa82/70zAgAaipdST6vloM/JaxfEfg9SNr+e1lotr+Z1b2VN375zT7Op1fJemrOptfL/iYQDOtsd0/DpY/pszwPl2cwHu1rVFAocqT1eOscb4eJ3L34/v2vNS+drPfJaSnotGGvt3kdV2fDwsL127ZrjjwsA8JfNqZKbL4b9vBbrMM/pxZdu3HdBvP7z5z/ykFNNL/Njv+QLVnfmVzQ6ndK/eWVcdxczSq3mdG85q7X8xvrM9kioHFyuV5sdTMTU3xFVoAaFgLz4WjZ6gOHFPtncNjf7xsuvDbzHGPOatXZ46+3MgAIAPMtrqafVcJjn5LVZKS+P0K/m8hqfXb4vbfbW7LLWchuBZiQU0LHWJj18vE0tTUGFgwH9zx88qw8MdDtaCMiL57iX1mO6wavntxfWgnvxfIX/EIACADzLa6mn1XCY5+TFC2K3g5TUau6+IHNsJqXbc8tarwNkjHTyWFTnEm167qEeDfbENFCa0XxnYcUTs3z1eI7XA7fP7+14IfjjfEU1EIACAA7FiVSwelyLddDntPV1/h8vnPbchXEtzZXWZN7cFGSOTqc0mcyUjwkHjU53teqR4236G4/1lYPMs90xRZuC295vPOqNAKMez3HUhheCP85XVAMBKADgwJxKBfNa6mk1HOQ5eSHlzgnWWr2TzGyazVwqf39vJVs+rqUpqIGemJ4526X2SEhzy2vK5gs6l2jTJx477svXpB7PcdSGF4I/zldUA0WIAAAHVu2iOLvNprpddKMW9vucvFZ86Khy+YJulwoBjU6nNFbaP3N0OqWVtXz5uI6WcHnfzIGeUkGg3jb1tUcUCJhyYJ7PF3R3MaP55axCAaPPfXhAn3is38VneDj1eI6j+rxSAIjzFftFESIAQNVUMxVsr1k+L67FOqr9PicvpNwdRiab162ZZd2cXqoIMt+cXamoOHu8PaLBREw/NbyxrclgIqau1qZdCwFduT6lfL6gG9MpNYcC6mwNazGT0xe/OqazPTHfnS/1eI6j+ryyFpzzFUdFAAoAOLBqpoJ5obCGV3kh5W43i5nsfYWARqdTunNvResJVgEjneps0WAiph95JFHe2mSgp1VtkfB99zkymdS/+6vbu86uTCykdXcxo+ZQQJFwcY3nekou5w3qGcEf6gEBKADgwKq5Dsivs3xO8MJ6K2utZkqFgMbWg8yZlG5OpTS9tFo+rikY0NmeVr37ZFyffm9/KW02ptNdreUgcS/7XfPa3xHV628tqLN1I4BdzRXU1drEeYO6Rwps7fEa1xYBKADgwKqZCub1Wb6dOHGB4mTKXaFgNbGQrpzNLKXOJtMbhYBam4IaTMT0Q+d6KtJmHzgWVSgYOFIb9jsbfnGoV396/a4WMzm1R0JazRW0mivodFeL588bt3Fh7W+NUpjMTbzGtUcACgA4lGqlgnlhlu+gnLxAqXbKXTZf0O255eLWJlMbQeatmWWlsxuFgLpamzSQiOkTj/VpsKc4mzmYiOl4e2TX9ZlHsd/Z8PN9cX3uwwP64lfHNLe8pq7WJp3ualEgENDFod6atK0ecGHtfyxZqD1e49ojAAUAuGZ9NmYpk9XEQlrxaEiP9sVdKaxxEH64QEmv5ct7Zq7/uzm9pNtzK8oVNirg93dENZCI6ekzXRUzmp2tTY63+SCz4Z94rF9ne2LM5h2AH85b7I4lC7XHa1x7BKAAAFdsno0539denvn0QxDhpQuUhZW1bdNm37630ZZgwOjBUiGgj73reDnIHOiJqbXZO5cCB50NpyDLwXjpvMXh+HXJgp/wGteedz51APYBebQAACAASURBVAANxc+zMU5foFhrNb20WkqbXSoHmaPTy5pNbRQCag4FdLYnpveeOlaxtcmDXS1qDu2vEJCbvLLNRL3iwtr//LhkwW94jWuPABQAsKdaFC45yGyM1wqn1OoCJV+wevveyqaU2VS5+uzSaq58XFskVNzW5OGNQkDnEm3qPxZVMFCb9ZlOYVazdriw9j8GaWqP17j2jLV276OqbHh42F67ds3xxwUAHNzmVNnNF61HLVzy4ks37puNWf/58x95qOaPf1RHCYpXc3m9ObtyX9rsrZmUVnOF8nHdsWad27Quc/1foq25ZoWA4Bw3Bla8NpgDoH4ZY16z1g5vvZ0ZUADArmqVKrvf2RivpuruZ6ZueTWnsZnKarNj0yndnl9RflMhoJPHohpMxHRhcFMhoJ42xVvCu9w7/MytirTMMANwW1UCUGPMRUm/Iiko6Vettf9nNe4XAOC+WhUu2W+akx8Kp8wvr1VUml0PNN9JZsrHhAJGp7tb9VBvm3703X0VhYCiTd5fn4nq8urACgDU2pEDUGNMUNK/kvQRSW9L+qYx5g+stW8c9b4BAO6rZeGS/czGeKVwirVWk8nMfWmzo9MpzS+vlY+LhAMaTMT01JnOirTZB7taFQ4GHG0zvMsPAysAUAvVmAF9StKotfaWJBljflvSpyQRgAJAHXC7cInTj5/LF3TnXvq+2cyxmWWlNhUCikfDGkzE9NFHe4szmYmYBnti6u+IKuDzQkCoPa8MrACA06oRgPZLurPp57clPV2F+wUAX6j3oh5uVwSs1eNnsnmNzy6Xq82OlWYzx2eXtZbfKATU296swURMf/OJ/tJsZpsGEzF1x5ooBIRDc3tgBwDccuQquMaYz0j6mLX2Z0s//7Skp6y1n9ty3CVJlyTp1KlT77t9+/aRHhcAvMCrFVqxYSmTrUibHSsFnHfmV7ReB8gY6VRniwZ7YhuzmaV/7ZGNGap6H2yAszifAGfxN+esnargViMAfb+kf2St/Vjp51+UJGvtP93p/7ANC4B6sd+tROqZFz7QrbWaW14rV5tdn80cnU7p7uJGIaBw0OhMd2vFTOZgT0xne1oVCe9eCIjBBgDwL97DnVfLbVi+KemcMeaMpAlJn5X0t6twvwDgeY1eSMTprSQKBat3kumNGc1NM5sLK9nycS1NQQ0mYvrAQJcGErHyXpqnOlsU2qEQ0F6BNFVLAcC/eA/3jiMHoNbanDHm70n6UxW3Yfk1a+33j9wyAPCBRi8kUusP9JmlVX1tbFavjM7qjclFjU0vK53Nl39/rCWsc4k2fXxoY1uTc4mY+uKRA63P3E8g3eiDDY3CCzP6AKqP93DvqMo+oNba/yLpv1TjvgDATxq9kEi1P9BTqzl9Y3xOL9+c09fGZvWDu0uSioHtYyfj+uxTneW02cFETF2x5iM/B2l/gXSjDzY0Aqdn9IFqYNBkf3gP946qBKAA0KjcrhDrtqN+oGfzBb1+Z0GvjBZnOb/91oJyBaumUEBPne7UP7x4QhcGu/WuE3EFa7i1yX4C6UYcbPDDhW0120iKHvyGQZP9a8T3cK8iAAWAIzrfF2/YD/qDfqBba3VjKqWXSwHnq7fmtLyWlzHSu/vj+jvPndWFwW6978Fj9xUFqmUwtJ9AutEGG/xwYVvtNpKiB79h0GT/Gu093MsIQAEAh7afD/SJhXR5hvOV0TnNplYlSWe6W/XpJ/p1YbBbz5ztUkdL046PU+tgaL+BdCMNNvjhwrbabSRFD37DoMnBNNJ7uJcRgAIAdrXXzOPWD/TkSlZXrk/q5dFZfW10TrdmlyVJ3bEmPTvYXf53kIv6WgdDjIzfzw8XttVuIyl68BsGTeBHBKAAgAqbA86moNHU4qoe6GzZceYxk83rtdv3yrOc35tIqmCLW6E8c7ZLf/vpU7pwrlsP97YdqDLtZk4EQ4yMV/LDhW2128hABPyGQRP4EQEoAKBsa6rr1Rszmk2tanoxo5y1ao+E1dvWpN/42m092NWqV0Zn9c0357WaKygYMHrvAx363IfO6cK5br3nZIeaQtvvuXlQbgVDfijCUyt+uLCtRRsZiICfMGgCPzLWWscfdHh42F67ds3xxwUA7O7Fl25UBHp/+J0JzS2tKhQKqq05pHvpNS1lciqUPjoe7m3Ts4PdunCuS0+d6VKsuTbjmpsD482BRi0L4rjxmF7jhwDcD20EgEZkjHnNWju89XZmQAEAZeupritrOd2ZT+vu4qoy2bwKq3nNLa+pKRhQWySkrlizfvvvPKNEe2TvO60CN0b5/VCEZ78OG6T5YTbQD20EAGwgAAXgO8x4VN/yak7feHNeYzMpfWVkSvdWspKkgJGCxqi1KaDT3a0yktZyVic7o44Fn+ucDjT8UIRnP/ywnQoAoHEQgALwFS6mqyObL+i7by/o5ZtzemV0Vt96655yBatQ0OhYtElPnOrQYCKmH0wuai61ps5Yk/IFKRYJ6XRXs870xNx+CjXnhyI8+1FPM7kAAP8jAAXgK1xM726n2WFrrW5Op/TyzVl9bWxWX781r9RqTsZIQyfi+tkfOqsLg90aPn1M47Op8n0M9cfLVXA3r4O8ONRb9zPRfijCsx/1MpOLvdX73ySA+kAACsBX3LyY9vrF3dbZ4XcW0vqlL19XR0tY35tY1MzSqiTpdFeLfuzxE7ow2K33n+3SsdamivvZmuq69XmvB2D1PhNdL9Ul62UmF7sjOwTYv90+z73+WV8PCEAB+EqtLqb3+sDxw8Xd73/7HS2srGlsJqU78yvldZzRcFDPP9qrC4Nd+sBAtx7obDnQ/W639vLFl240xEx0PRS4qZeZXOyO7BBgf3b7PJfqf3DVCwhAAfhKLS6m9xNcevHibjWX12u37+mV0Vm9Mjqn1+8sSJJCAaP+Y1EN9cd18lhUa7mC/vlPPV7Vx260tE4/j4jXy0zuQfi5vw6r0f4mgcPa7fN8/WcvfdbXIwJQAL5Si4vp/QSXXri4KxSs3phc1Cujs3p5dFbffHNemWxBwYDR4w906KkznepsadJgIqZgwEiSkumsEm3Vr1bbSGmdfpj93ks9zOTuVz3012E00t8kcBR7fZ67/VnfCAhAAfhOtS+m9xNcunVx99bcil4endUro8XiQetptQ/1xvTZJ0/pwmC3nj7bqbZIuHzhnVrN1TzVspHSOr04+42dNWp/NdLfJHAUe32eM5BTewSgABrefoJLpy7u5lKr+trYXHmW8+17xSD4eHtEH3qkVxfOFddx9m6zB6eTqZaNlNbphdlv7F+j9lcj/U0CR7HX5zkDObVHAAqg4e0nuKzVxd3KWk7fGJ8vr+N8Y3Kx3I73n+3SpefO6gMD3RroaZUxZs/7czLVslHSOklt9JdG7q9G+ZsEjmKvz3MGcmrPWGsdf9Dh4WF77do1xx8XwME0UiEPp55rLl/QdyeSeuVmcYbzW2/dUzZv1RQM6H0PHtOzg116drBb7+6PKxQMVP3xcXCb1xRuHqCo9zWFfkV/AYA3GGNes9YO33c7AejOGuniG9iKi7jd7ff9wVqrsZmUXr45q5dH5/TqrTktreYkSe860a4Lg916drBbT57uVLQp6Hp7sT1eP3+hvwDAfQSgB8TFNxrdiy/duC+Nbf3nz3/kIRdb5r693h/uJjOllNriLOf00qok6VRni54d7NaFwW69f6BLna1NnmgvAABAte0UgLIGdAeNWkUPWHfUQh71PAOx9f0hEg7orfmsfuH3vqfltbxGp1OSpM7WJn1goJhS++xAt051tXiivbyfAQAAtxCA7qCRqujVc6BQD9zqn6MU8qj3ffjeml+RkfTGO4t6a35FU4sZWUlBY/TsuW791PBJPTvYrfPH2xUI7F04qNYa6f0MAAB4GwHoDhqlil69Bwp+52b/HGXbkXqbcSsUrEbuLpZSauf0tdFZ5QpWRlJve0RPnu5UZ2uTBhKt+l8/9ojbzb1Po7yfAQAA7yMA3UGjbOhcb4FCvXGzf46y7Ug9zLjdmV/Ry6U1nH81Nqf55TVJ0mAiph9993FNLa5qoCemrlhT+f3hk4/1udzq7TXK+xkA4HDIhoOTCEB3UI8bOm/35lIPgUI9c7t/9rOn3HbnlR9n3OaX1/S1seJenK+Mzuqt+RVJUm97sz74UE9xHedgt46X+mPr8/by+0M9vp9hb/u9oOTCE2hsZMPBaVTBbRA7VcFsCQcUDgWpdOpRXq9Eu9N59fz5Hv35yMy+q666cQGcXsvrm2/OlyvVfv+dRUlSW3NIT5/t0oXBLl04162BnpiMcX8dJ3AQ+618TIVkAF6/1oB/UQW3we2UyrmWyyuZzkoiNc+LvJ46udN5dWNqed8zbk6NvObyBX1vIqlXRmf1Z29M6fsTi8pbq4Ap7sf58x95SM+e69Zj/XGFgoGqPS7ghv2m77MMA4Db2VZoPASgDWKnN5fJZI7UPA/zeurkbh9a+0nflWp3AWyt1djMcnk/zr+6NaelTK78GI/0tWmgp1VtkbBW1vJ6/tGEZ15X4Kj2e0HJhScAPy6bgb8RgDYI3lz8a7+BnBuqcV5V8wJ4ejGjV8Zm9fLN4jrOu4sZSdLJY1F94t19enawW999e0HZvL0v1YgZH9ST/f5t8tmAesXa5v3zerYV6g8BaIPY6c3lydMdLDz3MDc+QA/ymNX40DrKBfBSJqtXb83r5dIs583plCSpoyWsZweKRYMuDHbrVFdL+f/8txszzPig7u33b5MLz8bQaMEYRXUOxuvZVqg/FCGqU9t92Ei677Yr16dYeO4RW/vsod7WAxXyqVYbDlqQZL3d47PL6mxt0vse7FBXrFmL6awW0znlrVWsOaRYJKS20tdYc0htkbBizSHdmFqseMzFdFZzy2v69HtP6Fhrs+ZTa5pbXtXc8prmUmuaX17TbGpVs6k13ZhaUr5g1RwK6KkznbpQqlT7aF+7AoHtCwdRbAGNgiq4kBqz0BTv84A3UISogew28rf1jfdLL7/pi9mger9A2q7PvviVMT18POZocZCt6zHbIyHdW1nTv/5vt/Th871azBSDyuLXrBYzOS2ms5pYSGu0NPv461872GO2NAUVCQdVsFar2YLW8gXlC1Z/9N3J+46NhoPqijWpq7VJx9ub9aFHitujPHHqmCLh4L4ejxkfNIr9pu97Oc0fR9eIhaZY2wx4GwFoHTrIh40f1v80QirNdn2WK1hNJjM63R0rH1frD9CJhbQ6omHdmknp7Xtpjc2ktFgq3POfX3+nfFw4aBSPhtUeCastGtaJjqh+/PETSrRH1B4pPo/2aEjxaFjBgFEqk9PSak6pTE6p0teNn7NKrea0mMkpEgqqO9akztbiv+5Yszpbm0pBZ7OiTRtB5vqgxH/61oRevTW/70EJUo0ANJJGDMb8cG0DNDIC0D34cebtIB82tZoNqubr1gijt9v1WWdrWHPLaxW3bfcBepTXulCwGp1J6bXb9/Ta7Xv685EpLawUt+UJGqPe9mY1hwKKR8N6+myXsvmCMtmCfu6Hz+jREx37f4JV7qajDkow4wOgUTRiMEamC+BtBKC78OvM20E+bGoxG1Tt160RRm+367Pj7REtlj40d/oA3em1fv58j25MLd8XlC6v5vSdOwt67fY9Xbt9T99+6155hrOztUmPHG/TUianU50tOt3Voq+NFbcuefpsp7pjzZKK62j+9PvT5QDUjUGaRhiUAIBqaMRgjEyXSn6cTEF9IwDdhV8vcg/6YVPt2aBqv26NMHq7XZ8FgwF97kMDFYHk1g/Q7V7r+dSqvvjVMT19plOtTUF9+617+sPvvCNjpPHZZRWsZIz0UKJNn3jshN734DG978FjOt3VImNMxQdVNm/19Nlj6o5tDABsDv7dGqTZbVCCD1oA2NCowRiZLkV+nUxBfSMA3YVfZ97c/rBZf91mljIanVlWKpNTrDmo9k0B5EE0wujtbn32iV3+3+Zz1FqreytZfXciqdnUqu7cW9Hyal6SFAoY9XVE9Pc+dE7ve/CYHn+goyKg39qW9XNlvZLgZpuDf7cGaXYalGgKGj5oAWALgrHG5dfJFNQ3AtBd+Hnmzc0Pm/6OqMZnUroxnVJzKKBYc7BYLTWT08hk8sDtcjugdspB+8xaq0gooG+Oz2tueU0TC2mtrBUDznDQ6Ex3q050RHUiHtWxlrCmllb1vxyw/Pxewb9bgzQ7taslHOCDFgCAEr9OpqC+EYDuohFm3mrh4lCvPv/bdyUjNYcCWs0VJEkP98YOHQgwelssGHRjekmv3prXq+NzevXWfLlIUUtTUA8ca1FXrEl3FzIa6m/TmZ628v9NprOHGjjZK/h3a5Bmp3Z96eU31RmrfFvjgxYA0Kj8PJmC+kUAuotGmXmrtvN9cT3QFVVyJaul1ZzaI2EN9bers7WZQOAACgWrH9xd0qvjc/r6rTl9Y3xe90oVavs7ovrhh3v0zNkudcea9PpbC3onmVF/R1QP9bbqz0dmdi1edBC7Bf9eG6ThgxYAgA1e+5wGJMlYax1/0OHhYXvt2jXHHxfOWV87uDkQWP/58wdMA20U+YLVyOSivn5rTq+Oz+sb4/Pl9ZcPdEb19JkuPXO2S0+f6dQDnS273peThXjcKPqzuajC5g/UR4636svfnlQ2X1BXa5P64hEFAgHWgAIAGhbF+eAWY8xr1trh+24nAEUt7BQgEAhsyOULemNyUa/emi/OcL45r6XSliinu1r09JkuPX22U0+f7dJieo0Pj022G+BYX3f8UCKmu4sZzS9nFQoYfe7DA/rEY/0uthYAAKDx7BSAkoJbR6o1wrXf+9ntONKX75fLF/S9iaReHZ/Xq7fm9M037ym1Wgw4z3a36pOP9ZVmOLt0fFPBAEqo32+7ogp3FzPK5gs60xPTmZ6YpOKs+42p5V0rCQMAAMA5BKC78FPKQrWClP3ez36Oa/TCQcmVrL47saDX31rQN2/f02tvzmu5VKV2MBHTpx4/oafPdumZM51KtBeDqZHJpH7rG29VnHOUUL/fdms955ez6mptqjiOAkQAAADeQgC6A7/NOlUrSNnv/TR6ULSUyepuMqN3khndTaY1mcxociGjycWNn9fTaSXpod6YfuKJk3rmbJeeOtOpnrbm++5zp3MutZrVI8fbK45dD6z8NEhSTdsVVQgFzH2zohQgQqNr1PcIAIB3EYDuwG8BVrX2edrv/dTrvlLWWi1mcrqbzGgymb4/yExmdDeZKafObtYda9aJjohOd7Xq/We71NcR1btOtOuxkx0VM3U72emcm1hIaymTu6+ya1PQ+GqQpJq2S/H+3IcHqlr9F/A7vw2kAgAaAwHoDvwWYFVr+4n93o9ftrvYPPp/Ih7RhXPdao+Gi7OVWwLL9YBzPU12nTFST6xZffGIBnpadWGwW33xiI7HIzrREdXx9oh62yNqCgWO1Nadzrn2SKhcDXdzYNUSDvhqkKTatkvxPtsTY90xUOK3gVQAQGMgAN2BXwIsqRhkzSxl9PLonI61hPXoiTY1h0KHmv3Z735RtdhXylqrbN4qk8trNVtQJpvXai6vTLZw39fi74pft7t9NZvX9FJGo9PLkqRMLq9UJqf/+6ujFY9pjJRoa9bxeFQP9bbpuYd61BePqC8eLQeZibajB5f7sdM5964T8fJa0M2B1ZdeflOdsco/YS8PkjjhIOuOSU1EvfPbQCoAoDEQgO7ALxv3bk6x+sBAp0Yml/TK6Lx+aLDrUGlW66mNf/K9u3prfkWJ9og+/d4TioRD+sHdxYogb6i/Xd8cv6frE6uKRUIaTLTqKyPT+uPv3q0MEEsBYSZXGSBuF0QWjrArUDhoFAkF1RwOqjkU0MpaTsYYNYcC6o4163RXq8JBo+5Ys372h86oLx5VT1uzwsHaBZcHCXJ2O+e2C6z8NEjiNaQmohHwHgEA8KIj7QNqjPmMpH8k6bykp6y1+9rc0y/7gHphhsRaq7V8oRyorW6Z7fvNV9/SYjqr5lBAuYJVrmCVyuQUDhoNn+4szybuPoO4/n0xMFzNFbSWLxy6zcZIkVBQkXBAzaWvkVJQ2BwOlr+PhIOKhAJqDgdKx2+6vfR/mzf938jW/7vp/ptDQQUDpqIdX/jd76gvHlHAbNxesFaTyYz+2Wfec+jnt1+H2Qv1IOcce60e3nb7iK7//PmPPORiy4Dq4T0CAOCmWu0Del3ST0j610e8H0/aOuuUL1itrOV2DeTWf7eaLVSkkmY23VY8pjL4W92aSrrp+MOOEbwyNqemYGCbIG4jcOuIhssBYPMOx+wW9G0NFCOhoMJBI2PM3g2sMbdH/w+z/uogKaTstXp4pCY2Ni8MLjqB9wgAgBcdKQC11o5I8kSwUQuv3Z7X//TvvlVKH80rmz/8bHHA6L4ZvPKMYCigjpamPYO/5vtmDoP6w9ffUSabV7wlrFDAKBQIaHktp87WJn3how8rEKjPvtkPt9OonQhyGn2v1cNye3AC7mm09GveIwAAXuPYGlBjzCVJlyTp1KlTTj3skXS1Nusjj/bePwtYTiVdnzncewYxFKjNrGCirUmXr44rHAyUg6zVXEF/4z19DR18Su6P/hPkeJfbgxNwD5VhAQBw155rQI0xfy7p+Da/+iVr7e+XjvkLSV+otzWgftEo6WR+w/orb+PvpjG5vTYcAIBGceg1oNba52vTJFRLPaVYHbQIj5cDCLdnYLG7evq7wf6RmQAAgLvYhgWecZC1WX5Zx0WQA3gL6dcAALjrSAGoMebTkr4oqUfSHxtjXrfWfqwqLUPDOcjaLK+v4/L67CywVaOcs2QmAADgrqNWwf2ypC9XqS2+0ygXbE45SNVYL2+j8cffndAXvzqmbL6grtYmZXN5Xb664rnZWWBdo52zZCYAAOCegNsN8Kv1FNBkOluRAjoymXS7ab7V3xHVUiZXcdtOa7MOcqyTRiaT+uJXxiRJXa1NWs0V9NdTKRUKBV25PuVq24DtcM4CAAAnEYAe0uYU0IAx5e+5YDu8i0O9SqazSqazKlhb/v7iUO+RjnXSletTyhWs2iMhGWPK2/dMJjOemJ0FtuKcBQAATiIAPaSJhbTaIpUZzF5JAfWr9bVZ8WhYk8mM4tHwjimABznWSRMLaXW2hrWaK5Rvaw4FNLe85vrsLLAdzlkAgF+MTCb14ks39IXf/Y5efOkGmYc+RRXcQ6KUf20cZG2WF9dx9XdEtZbN68Z0SlLxQn4xk1M4GHB9dhbYDucsAMAP/LIDAvbGDOgheTUFFO66ONSrYDCghxIxNYcCml/OSlb63IcGeHOEJ3HOAkDj8eNMIsvf6gczoIdEKf/9abRKwZvPi6ZwUO8fqP/nDH/jnAWAxuLXmUQv74CAgyEAPQIvpoB6iV/f4I6K8wJ+wzkLAI3D63up74Tlb/WDFFzUDKkSAAAA3uLXQposf6sfBKCoGb++wQEAANQrr+6lvhev7oCAgyMFFzWzn1SJRlsjCgAA4KaLQ726fHVcUnFiYCmTUzKd1QtPnnS5ZXtjyUh9YAYUNbNXqsT6GtFkOluxRtQPldgAAAD8iJlEuI0ZUNTMXpWC/boIHgAAwM+YSYSbCEBRU7u9wVFOGwAAAGgspODCNX5dBA8AAADgcAhA4RrKaQMAAACNhQAUrmERPAAAANBYWAMKV7EIHgAAAGgcBKAe5uc9Mv3cdgAAAAC1QQquR/l5j0w/tx0AAABA7RCAetTmPTIDxpS/v3J9yu2m7cnPbQcAAABQO6Tg1shRU1D9vEemn9sOAAAAoHaYAa2BaqSg+nmPTD+3HQAAAEDtEIDWQDVSUP28R6af2w4AgJ+NTCb14ks39IXf/Y5efOkG9RcAeA4BaA1MLKTVFqnMbj5oCqqf98j0c9sBAPArigAC8APWgNZAf0dUyXRW8Wi4fNthUlD9vEemn9sOAIAfbc7AklT+euX6FJ/JADyDGdAaIAUVAAA4rRoZWABQawSgNUAKKgAAcBpFAAH4ASm4NUIKKgAAcNLFoV5dvjouqTjzuZTJKZnO6oUnT7rcMgDYQADqkKPuCwoAALCb9QyszdcbLzx5kusNAJ5CAOqA9ap08Wi4oiodabkAAKCayMAC4HWsAXVANfYFBQAAAAC/IwB1AFXpAAAAAIAA1BFUpQMAAAAAAlBHsC8oAAAAABCAOoJ9QQEAAACAKriOoSodAAAAgEbHDCgAAAAAwBEEoAAAAAAARxCAAgAAAAAcQQAKAAAAAHAEASgAAAAAwBEEoAAAAAAARxCAAgAAAAAcQQAKAAAAAHAEASgAAAAAwBEEoAAAAAAARxCAAgAAAAAcYay1zj+oMTOSbjv+wPvTLWnW7UbgPvSL99An3kOfeBP94j30iTfRL95Dn3iPn/rkQWttz9YbXQlAvcwYc81aO+x2O1CJfvEe+sR76BNvol+8hz7xJvrFe+gT76mHPiEFFwAAAADgCAJQAAAAAIAjCEDvd9ntBmBb9Iv30CfeQ594E/3iPfSJN9Ev3kOfeI/v+4Q1oAAAAAAARzADCgAAAABwBAFoiTHm/zLG/MAY811jzJeNMR2bfveLxphRY8xfG2M+5mY7G4kx5jPGmO8bYwrGmOEtv6NPXGSMuVh67UeNMb/gdnsakTHm14wx08aY65tu6zTGvGSMuVn6eszNNjYaY8wDxpj/aowZKb13/f3S7fSLi4wxEWPMN4wx3yn1yz8u3U6/uMwYEzTGfNsY80eln+kTFxlj3jTGfM8Y87ox5lrpNvrEZcaYDmPMfyzFKSPGmPf7vV8IQDe8JGnIWvuYpBuSflGSjDGPSvqspHdJuijp/zXGBF1rZWO5LuknJF3dfCN94q7Sa/2vJH1c0qOS/lapT+CsX1fx/N/sFyR9xVp7TtJXSj/DOTlJP2+tPS/pGUl/t/S3Qb+4a1XSh6y175H0uKSLxphnRL94wd+XNLLpZ/rEfT9iDx2NcwAAA+JJREFUrX180zYf9In7fkXSFWvtI5Leo+LfjK/7hQC0xFr7Z9baXOnHr0s6Wfr+U5J+21q7aq0dlzQq6Sk32thorLUj1tq/3uZX9Im7npI0aq29Za1dk/TbKvYJHGStvSppfsvNn5L0G6Xvf0PSjzvaqAZnrZ201n6r9P2SihcJ/aJfXGWLUqUfw6V/VvSLq4wxJyV9QtKvbrqZPvEe+sRFxph2Sc9J+pIkWWvXrLUL8nm/EIBu73+Q9Cel7/sl3dn0u7dLt8E99Im7eP29q9daOykVgyFJCZfb07CMMaclvVfSq6JfXFdK9Xxd0rSkl6y19Iv7/qWkfyipsOk2+sRdVtKfGWNeM8ZcKt1Gn7jrrKQZSf+mlK7+q8aYVvm8X0JuN8BJxpg/l3R8m1/9krX290vH/JKKaVS/uf7ftjme0sFVsp8+2e6/bXMbfeIcXn9gF8aYmKTfk/QPrLWLxmz3JwMnWWvzkh4v1Xf4sjFmyO02NTJjzCclTVtrXzPGfNDt9qDsWWvtO8aYhKSXjDE/cLtBUEjSE5I+Z6191RjzK/JZuu12GioAtdY+v9vvjTE/I+mTkj5sN/aneVvSA5sOOynpndq0sPHs1Sc7oE/cxevvXVPGmD5r7aQxpk/F2R44yBgTVjH4/E1r7X8q3Uy/eIS1dsEY8xcqrp+mX9zzrKQfM8b8qKSIpHZjzL8XfeIqa+07pa/Txpgvq7jkhj5x19uS3i5lbUjSf1QxAPV1v5CCW2KMuSjpf5P0Y9balU2/+gNJnzXGNBtjzkg6J+kbbrQRZfSJu74p6Zwx5owxpknFglB/4HKbUPQHkn6m9P3PSNopiwA1YIpTnV+SNGKt/RebfkW/uMgY01Oa+ZQxJirpeUk/EP3iGmvtL1prT1prT6v4GfJVa+1/J/rENcaYVmNM2/r3kj6qYjFI+sRF1tq7ku4YYx4u3fRhSW/I5/1iNib6GpsxZlRSs6S50k1ft9b+XOl3v6TiutCciilVf7L9vaCajDGflvRFST2SFiS9bq39WOl39ImLSqPW/1JSUNKvWWv/ictNajjGmN+S9EFJ3ZKmJP2ypP8s6XcknZL0lqTPWGu3FipCjRhjLkj6S0nf08a6tv9dxXWg9ItLjDGPqVikI6jiwPvvWGv/D2NMl+gX15VScL9grf0kfeIeY8xZSV8u/RiS9B+stf+EPnGfMeZxFYt1NUm6Jem/V+m9TD7tFwJQAAAAAIAjSMEFAAAAADiCABQAAAAA4AgCUAAAAACAIwhAAQAAAACOIAAFAAAAADiCABQAAAAA4AgCUAAAAACAIwhAAQAAAACO+P8BAYKjKWoFg9IAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "with torch.no_grad():\n", + " plt.figure(figsize=(16, 6))\n", + " plt.plot(X, m(X))\n", + " plt.scatter(X, Y, alpha=0.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 398, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor(0.4997)\n" + ] + } + ], + "source": [ + "with torch.no_grad():\n", + " print(torch.abs(m(X) - Y).mean())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$ \\text{ELBO} = E_{\\theta \\sim Q}[\\log P(D|\\theta)] + D_{KL}(Q(\\theta)||P(\\theta)) $$\n", + "\n", + "$$ \\text{ELBO} = E_{\\theta \\sim Q}[\\log P(D|\\theta)] + \\int Q(\\theta) \\log \\frac{P(\\theta)}{Q(\\theta)}d\\theta $$" + ] + }, + { + "cell_type": "code", + "execution_count": 399, + "metadata": {}, + "outputs": [], + "source": [ + "def ll_gaussian(y, mu, log_var):\n", + " sigma = torch.exp(0.5 * log_var)\n", + " return -0.5 * torch.log(2 * np.pi * sigma**2) - (1 / (2 * sigma**2))* (y-mu)**2" + ] + }, + { + "cell_type": "code", + "execution_count": 451, + "metadata": {}, + "outputs": [], + "source": [ + "class VI(nn.Module):\n", + " def __init__(self):\n", + " super().__init__()\n", + " \n", + " self.q_mu = nn.Sequential(\n", + " nn.Linear(1, 20),\n", + " nn.ReLU(),\n", + " nn.Linear(20, 10),\n", + " nn.ReLU(),\n", + " nn.Linear(10, 1)\n", + " )\n", + " self.q_log_var = nn.Sequential(\n", + " nn.Linear(1, 20),\n", + " nn.ReLU(),\n", + " nn.Linear(20, 10),\n", + " nn.ReLU(),\n", + " nn.Linear(10, 1)\n", + " )\n", + " \n", + " def reparameterize(self, mu, log_var):\n", + " # std can not be negative, thats why we use log variance\n", + " sigma = torch.exp(0.5 * log_var) + 1e-5\n", + " eps = torch.randn_like(sigma)\n", + " return mu + sigma * eps\n", + " \n", + " def forward(self, x):\n", + " mu = self.q_mu(x)\n", + " log_var = self.q_log_var(x)\n", + " return self.reparameterize(mu, log_var), mu, log_var" + ] + }, + { + "cell_type": "code", + "execution_count": 452, + "metadata": {}, + "outputs": [], + "source": [ + "def elbo(y_pred, y, mu, log_var):\n", + " # likelihood of observing y given Variational mu and sigma\n", + " likelihood = ll_gaussian(y, mu, log_var)\n", + " \n", + " # prior probability of y_pred\n", + " log_prior = ll_gaussian(y_pred, 0, torch.log(torch.tensor(1.)))\n", + " \n", + " # variational probability of y_pred\n", + " log_p_q = ll_gaussian(y_pred, mu, log_var)\n", + " \n", + " # by taking the mean we approximate the expectation\n", + " return (likelihood + log_prior - log_p_q).mean()\n", + "\n", + "def det_loss(y_pred, y, mu, log_var):\n", + " return -elbo(y_pred, y, mu, log_var)\n", + "\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 453, + "metadata": {}, + "outputs": [], + "source": [ + "epochs = 1500\n", + "\n", + "m = VI()\n", + "optim = torch.optim.Adam(m.parameters(), lr=0.005)\n", + "\n", + "for epoch in range(epochs):\n", + " optim.zero_grad()\n", + " y_pred, mu, log_var = m(X)\n", + " loss = det_loss(y_pred, Y, mu, log_var)\n", + " loss.backward()\n", + " optim.step()" + ] + }, + { + "cell_type": "code", + "execution_count": 454, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor(0.5258)\n" + ] + } + ], + "source": [ + "with torch.no_grad():\n", + " print(torch.abs(m(X)[1] - Y).mean())" + ] + }, + { + "cell_type": "code", + "execution_count": 455, + "metadata": {}, + "outputs": [], + "source": [ + "# draw samples from Q(theta)\n", + "with torch.no_grad():\n", + " y_pred = torch.cat([m(X)[0] for _ in range(1000)], dim=1)\n", + " \n", + "# Get some quantiles\n", + "q1, mu, q2 = np.quantile(y_pred, [0.05, 0.5, 0.95], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 464, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 464, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6AAAAFlCAYAAAD1f4WfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3Tkd33v/+d3ujTqWm3vXntxA5fF2AZibIoNOLkOBEIcfAkQnIIJJDkOcbgnN4SbwDn+JaSY5OIQIHECBC7GITjggL3gGBbjdYF1k7dq+6prevmW3x8fdY369Hk9ztGRNBp95zO7I+n7+r4/n/fH8jwPERERERERkVLzVXoAIiIiIiIi0hgUQEVERERERKQsFEBFRERERESkLBRARUREREREpCwUQEVERERERKQsFEBFRERERESkLAKVeNA1a9Z427dvr8RDi4iIiIiISIk9+eSTg57n9cy+vSIBdPv27ezfv78SDy0iIiIiIiIlZllWX6HbNQVXREREREREykIBVERERERERMpCAVRERERERETKQgFUREREREREykIBVERERERERMpCAVRERERERETKQgFUREREREREykIBVERERERERMpCAVRERERERETKQgFUREREREREyiJQ6QGIiIiIiIjUgweePsXdD/VyejTNxo4m7rxxN7dcvqnSw6oqCqAiIiIiIiKr9MDTp7jr/gOk8w4Ap0bT3HX/AQCF0Gk0BVdERERERGSV7n6odzJ8TkjnHe5+qLdCI6pOCqAiIiIiIiKrdHo0vazbG5UCqIiIiIiIyCpt7Gha1u2NSgFURERERERkle68cTdNQf+M25qCfu68cXeFRlSd1IRIRERERERklSYaDakL7sIUQEVERERERIrglss3KXAuQlNwRUREREREpCwUQEVERERERKQsFEBFRERERESkLBRARUREREREpCwUQEVERERERKQsFEBFRERERESkLBRARUREREREpCwUQEVERERERKQsFEBFRERERESkLBRARUREREREpCwUQEVERERERKQsFEBFRERERESkLBRARUREREREpCwUQEVERERERKQsVh1ALcuKWJb1E8uyfmpZ1nOWZX28GAMTERERERGR+hIowjGywA2e5yUsywoCj1mW9W3P835chGOLiIiIiIhInVh1APU8zwMS458Gx9+81R5XRERERERE6ktR1oBaluW3LOsZoB/4rud5jxe4z+2WZe23LGv/wMBAMR5WREREREREakhRAqjneY7neZcBm4GrLMu6pMB97vU8b4/neXt6enqK8bAiIiIiIiJSQ4raBdfzvFHg+8BNxTyuiIiIiIiI1L5idMHtsSyrY/zjJuANwIurPa6IiIiIiIjUl2J0wd0A/JNlWX5MoP2q53nfKsJxRUREREREpI4Uowvuz4DLizAWERERERERqWNFXQMqIiIiIiIiMh8FUBERERERESkLBVAREREREREpCwVQERERERERKQsFUBERERERESkLBVAREREREREpCwVQERERERERKQsFUBERERERESkLBVAREREREREpCwVQERERERERKQsFUBERERERESkLBVAREREREREpCwVQERERERERKQsFUBERERERESmLQKUHICIiIiIi9euBp09x90O9nB5Ns7GjiTtv3M0tl2+q9LCkQhRARURERESkJB54+hR33X+AdN4B4NRomrvuPwCgENqgFEBFRERERKQk7n6odzJ8TkjnHe5+qLfhAqgqwYYCqIiIiIiIlMTp0fSybq9XqgRPURMiEREREREpiY0dTcu6vV4tVAluNAqgIiIiIiJSEnfeuJumoH/GbU1BP3feuLtCI6oMVYKnKICKiIiIiEhJ3HL5Jj75tkvZ1NGEBWzqaOKTb7u04aadqhI8RWtARURERESkZG65fFPDBc7Z7rxx94w1oNCYlWBQABURERERESmpiQCuLrgKoCIiIiIiIiWnSrChNaAiIiIiIiLlkB6Bc89BNlHpkVSMAqiIiIiISCkkhyB2ptKjkGoRPwsjx8DJwdAhSPRXekQVoSm4IiIiIiLFlkvC2AnAM4GjYytYVqVHJZXgeTB6HNLD02+E2CnzOunYBr5l1AXtLGBBIFTskZaFKqAiIiIiIsXk2KbShWc+Tw/D0GFwnYW+a/XSI5AaXvx+Uj6Obaqd6Xn+XzKjMNgL+czSjxk7zeRrqwapAioiIiIiRfXA06cat9un501Ns5wuF4fBg9C1sziVq4kw6/Ob9/mMqbJ5LiQHoHUDRNpW/ziyck7e/J872YXvZ2dg8CVTJW/qWPi+uaQJrW0bizfOMlMFVERERESK5oGnT3HX/Qc4NZrGA06Nprnr/gM88PSpSg+tPGKnTdgsxE6b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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(16, 6))\n", + "plt.scatter(X, Y)\n", + "plt.plot(X, mu)\n", + "plt.fill_between(X.flatten(), q1, q2, alpha=0.2)" + ] + }, + { + "cell_type": "code", + "execution_count": 300, + "metadata": {}, + "outputs": [], + "source": [ + "def det_loss(y, y_pred, mu, log_var): \n", + " reconstruction_error = (0.5 * (y - y_pred)**2).sum()\n", + " kl_divergence = (-0.5 * torch.sum(1 + log_var - mu**2 - log_var.exp()))\n", + "\n", + " return (reconstruction_error + kl_divergence).sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 422, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(0.5044, grad_fn=)" + ] + }, + "execution_count": 422, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}