{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 10. Approximate Inference" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.animation as animation\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "%matplotlib inline\n", "\n", "from prml.rv import VariationalGaussianMixture\n", "from prml.preprocess import PolynomialFeature\n", "from prml.linear import (\n", " VariationalLinearRegression,\n", " VariationalLogisticRegression\n", ")\n", "\n", "np.random.seed(1234)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10.2 Illustration: Variational Mixture of Gaussians" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "x1 = np.random.normal(size=(100, 2))\n", "x1 += np.array([-5, -5])\n", "x2 = np.random.normal(size=(100, 2))\n", "x2 += np.array([5, -5])\n", "x3 = np.random.normal(size=(100, 2))\n", "x3 += np.array([0, 5])\n", "x_train = np.vstack((x1, x2, x3))\n", "\n", "x0, x1 = np.meshgrid(np.linspace(-10, 10, 100), np.linspace(-10, 10, 100))\n", "x = np.array([x0, x1]).reshape(2, -1).T" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "vgmm = VariationalGaussianMixture(n_components=6)\n", "vgmm.fit(x_train)\n", "\n", "plt.scatter(x_train[:, 0], x_train[:, 1], c=vgmm.classify(x_train))\n", "plt.contour(x0, x1, vgmm.pdf(x).reshape(100, 100))\n", "plt.xlim(-10, 10, 100)\n", "plt.ylim(-10, 10, 100)\n", "plt.gca().set_aspect('equal', adjustable='box')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vgmm = VariationalGaussianMixture(n_components=6)\n", "vgmm._init_params(x_train)\n", "params = np.hstack([param.flatten() for param in vgmm.get_params()])\n", "fig = plt.figure()\n", "colors = np.array([\"r\", \"orange\", \"y\", \"g\", \"b\", \"purple\"])\n", "frames = []\n", "for _ in range(100):\n", " plt.xlim(-10, 10)\n", " plt.ylim(-10, 10)\n", " plt.gca().set_aspect('equal', adjustable='box')\n", " r = vgmm._variational_expectation(x_train)\n", " imgs = [plt.scatter(x_train[:, 0], x_train[:, 1], c=colors[np.argmax(r, -1)])]\n", " for i in range(vgmm.n_components):\n", " if vgmm.component_size[i] > 1:\n", " imgs.append(plt.scatter(vgmm.mu[i, 0], vgmm.mu[i, 1], 100, colors[i], \"X\", lw=2, edgecolors=\"white\"))\n", " frames.append(imgs)\n", " vgmm._variational_maximization(x_train, r)\n", " new_params = np.hstack([param.flatten() for param in vgmm.get_params()])\n", " if np.allclose(new_params, params):\n", " break\n", " else:\n", " params = np.copy(new_params)\n", "plt.close()\n", "plt.rcParams['animation.html'] = 'html5'\n", "anim = animation.ArtistAnimation(fig, frames)\n", "anim" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10.3 Variational Linear Regression" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def create_toy_data(func, sample_size, std, domain=[0, 1]):\n", " x = np.linspace(domain[0], domain[1], sample_size)\n", " np.random.shuffle(x)\n", " t = func(x) + np.random.normal(scale=std, size=x.shape)\n", " return x, t\n", "\n", "def cubic(x):\n", " return x * (x - 5) * (x + 5)\n", "\n", "x_train, y_train = create_toy_data(cubic, 10, 10., [-5, 5])\n", "x = np.linspace(-5, 5, 100)\n", "y = cubic(x)\n", "\n", "feature = PolynomialFeature(degree=3)\n", "X_train = feature.transform(x_train)\n", "X = feature.transform(x)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD4CAYAAAAJmJb0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAgAElEQVR4nOyddZhU1RvHP2dmtpcO6RBpEAQkpFM6lZAGaVAESUVFfyIGCiKgNKh0GohIqZTSSkt3w7I9dX5/nJldYmN2d7Zmz+d59nFn7rnn3FmZ733ve94QUko0Go1G45kYUvsCNBqNRpN8aJHXaDQaD0aLvEaj0XgwWuQ1Go3Gg9Eir9FoNB6MKbUv4GFy5swpixQpktqXodFoNOmK/fv335ZS5orpWJoS+SJFirBv377UvgyNRqNJVwghLsR2TLtrNBqNxoPRIq/RaDQeTJpy12iSTnAwHDkCdjuULg3Zs6f2FWk0mtREi7yHcOsWvPsuLF0KxYuD0QjHj0ObNjBxIuj9bE1KY7FYuHz5MhEREal9KR6Dr68vBQoUwMvLy+VztMh7ANevQ+3a0Ly5suLz51fv374NM2bACy/A9u1QokSqXqYmg3H58mUyZcpEkSJFEEKk9uWke6SU3Llzh8uXL1O0aFGXz9Mi7wEMHAidO8MHHzz6fs6cyrrPkwe6doW//wb9XdOkFBEREVrg3YgQghw5cnDr1q0Enac3XtM5Fy7An3/CuHGxj+nXD+7eVSKv0aQkWuDdS2L+nlrk0zmbNkHLluDvH/sYgwE6dYING1LuujQaTdpAi3w6JzwcMmWKf1zmzKD3vzSajIcW+XTOM8/AgQPxj9u/H4oVS/7r0Wg0aQst8umcJk3g8mUl4rFx6RJs2aI2ZzUaDbzwwgvxjgkPD6du3brYbDYuXbpE/fr1KVOmDGXLlmXatGmJWtdsNlOnTh2sVmuizk8MWuTTOSaTiqrp1AnOn3/y+K1b0LYtvPmmctloNBrYtWtXvGPmz59P+/btMRqNmEwmpkyZwrFjx9izZw8zZszg2LFjCV7X29ubhg0bsnz58sRcdqLQIZTpFSlVWqtd0rOLxBZmp10zO82bQv0GAqNJsP0PwdJlgm7dDYwbI9D3dE1qMXzjcA5dP+TWOSvmqcjUplPjHBMaGkrHjh25fPkyNpuNCRMm0KlTJwIDAzly5AjNmjWjVq1a7Nq1i/z587N+/Xr8/PwA+P7771myZAkAefPmJW/evABkypSJ0qVLc+XKFXx8fKhevToBAQFkzZqVixcvki1bNg4ePEibNm0YP348jRs35u233yYoKIjp06fTtm1bxo0bR9euXd3694gNt4i8ECIrMBcoB0igD3ASWA4UAc4DHaWU99yxXoZESrDZwGIDiwWsNtSfWoVU9ekEbZqoCJqtG9Tw4sUlf/wMefIIuC9VmI2XEby81COAUYu+xrPZuHEj+fLl4+effwYgKCjokeP//fcfS5cuZc6cOXTs2JHVq1fTrVs3zGYzZ8+eJabS5+fPn+fgwYNUq1aNzJkzU6tWLUaMGEHt2rWpV68e06dPJ3PmzEycOJF33nmHmzdvcvDgQX744QcAypUrx969e5P9sztxlyU/DdgopXxJCOEN+APjgS1SyslCiLHAWGCMm9bLOFhtEGkGsxnsKE03GsBkfCKzKUdu6N4rjrnsUt0kzFZ1fzAK8PEBb5Oqg6DRJBPxWdzJRfny5Rk5ciRjxoyhZcuW1K5d+5HjRYsWpWLFigBUrlyZ8w6f5+3bt8maNesT84WEhNChQwemTp1KZof/8+jRo5QrVw6A48ePU7JkSQDq1KmDlJLPP/+c7du3Y3R8x4xGI97e3gQHB5PJldC4JJJkU04IkQWoA8wDkFKapZT3gTbAIsewRUDbpK6VYZBSCfv9YAgKVr8bjUqMvUzKIk9MkolBqJuDl0nNJYSKwXx4HSnd/3k0mlSiRIkSHDhwgPLly/P222/z/vvvP3Lcx8cn6nej0Ri1Iern5/dEzR2LxUKHDh3o2rUr7du3B9TmbEREBNmyZePSpUvkzJkTb29vAP7991+uXbuGt7f3E2IeGRmJr6+v2z9vTLjjeb0ocAtYIIQ4KISYK4QIAJ6SUl5zjLkOPOWGtTwbp7gHhUBIuHrP20uJcnJkDhoMynXj7aUs+5AwJfjhkcrfr9Gkc65evYq/vz/dunVj1KhRHHAl3hjIli0bNpstSuillPTt25fSpUszYsSIqHHHjh2jdOnSgLLinb9fu3aNrl27sn79egIDA9m4cWPUOXfu3CFnzpwJKjKWFNwh8iagEjBLSvkcEIpyzUQhpZQoGXkCIUR/IcQ+IcS+hNZk8CisVnjgEHeBw4WSgj5zo0GJvcEAYRFa7DUewb///kvVqlWpWLEiEydO5O2333b53CZNmrBjxw4Adu7cybfffsvWrVupWLEiFStWZMOGDY+4avz8/Dhw4ADHjh2jffv2TJkyhdKlSzNhwgQmTpwYNe+2bdto0aKFez9oHAiZxMdzIUQeYI+UsojjdW2UyD8D1JNSXhNC5AW2SylLxjVXlSpVZIZr/2e3Q3gERJiV0KYV37iUjs1dwN8XfLx1dTNNgnjYsk2PHDhwgC+++IJvv/3WrfO2b9+eyZMnUyKRZWFj+rsKIfZLKavEND7JpqKU8jpwSQjhFPCGwDHgB6Cn472ewPqkruVxWKzKNRNpVi6ZtCLwoATdeU2h4eo6LSmXwKHRpDaVKlWifv362Gw2t81pNptp27ZtogU+MbgrumYY8L0jsuYs0Bt1A1khhOgLXAA6ummt9I+UynoPj1QboYaU8c0lCoNQbhybTbmTfL3Bz1e5dTQaD6dPnz5unc/b25sePXq4dc74cIvISykPATE9KjR0x/wehd2uNjgt1uTbUE0OjEYl7JFWMIdAgJ8Sf41Gk6bR5lhKYrUpt4fVpgQyvQi8EyFUMpVBQHAohIbpjVmNJo2jRT6lMFtULLpAWfDpGYNBfYYICzwIjd6g1Wg0aQ4t8ilBpFlZviZj2tpcTQpCqDBPpLp5RUTqRCqNJg2Szk3KdEBEpIpOMZmUm8PTcPrqQ8OVRR/gl/7cUBqNB6Mt+eTEKfBeHirwTpzhlmaLisBxY8iZRpNW2L59Oy1btgTghx9+YPLkybGOvX//PjNnzox6ffXqVV566aVkv8aY0CKfXDws8BnBsnUKvV06Npd1TL0mfZCYOPjWrVszduzYWI8/LvL58uVj1apVibq+pKJFPjmINKe8wNvtjkqVqRztYjKqzF1nkpdGk4qcP3+eUqVK0bVrV0qXLs1LL71EWFgYRYoUYcyYMVSqVImVK1eyadMmatSoQaVKlXj55ZcJCQkBVKniUqVKUalSJdasWRM178KFCxk6dCgAN27coF27dlSoUIEKFSqwa9cuxo4dy5kzZ6hYsSKjRo3i/PnzUeUPIiIi6N27N+XLl+e5555j27ZtUXO2b9+epk2bUrx4cUaPHu2Wv4H2ybsbs0XFwZuSQeClhBPH4eAhOHoEjh6Fq1fg9m24ezda4IVQ3b3z5YO8+aBoEXi2AlSoCGXLQnJXvzMYwCTU38FuB1+fjPE0o4md4cPhkHubhlCxIkyNv4TxyZMnmTdvHjVr1qRPnz5RFnaOHDk4cOAAt2/fpn379mzevJmAgAA+/vhjPv/8c0aPHk2/fv3YunUrzzzzDJ06dYpx/tdee426deuydu1abDYbISEhTJ48mSNHjnDI8ZnPP9S2bcaMGQgh+Pfffzlx4gRNmjTh1KlTABw6dIiDBw/i4+NDyZIlGTZsGAULFkzSn0mLvDux2iDEEUXjLh98RARs/AU2bYItm+Gao7Cnjw+UKgUlSsALL0COnEq8bTblKrl/H65dhavXYM0amD8/+rwXakKjRqpBbMlS7rnOxzE43DdhEcqF4++rhV6TKhQsWJCaNWsC0K1bN7788kuAKNHes2cPx44dixpjNpupUaMGJ06coGjRohQvXjzq3NmzZz8x/9atW1m8eDGgyhVnyZKFe/di74+0Y8cOhg0bBkCpUqUoXLhwlMg3bNiQLFmyAFCmTBkuXLigRT7NYLOrMEmD0T0p///+C4sXwfLlcP8eZM0GDepDw0ZQrRo8XUw9LbiClHDxIhw+BLt2qZvFW+PVz7PPQucu8NLLkCdP0q/7YZx++ohIJfSBOvImw+KCxZ1ciMf+zTlfBwQEAKqMcOPGjVm6dOkj4w65+8nDBWKrb58UtE/eHUipLHhk0ssD//UXdGgPNWvAwgXQsCGsXQ/nzsPCxdC9B5Qo6brAgxLWwoWhdRuY/DHs3Q/HTsDHn4DJC8aPg9IloVdPcHdbMuGofWOxqL9Rau8ZaDIcFy9eZPfu3QAsWbKEWrVqPXK8evXq7Ny5k9OnTwOqL+ypU6coVaoU58+f58yZMwBP3AScNGzYkFmzZgFqEzcoKIhMmTIRHBwc4/jatWvz/fffA3Dq1CkuXrwY1U0qOdAin1SkVDXgrfaECe/jHD0CbVpD44ZwYD+8+x6c/A8WLFRCH0MSVaQ1khuhNzgfdIHjd05w8u4prgRf5UHkA+wyHjEtUAAGDYbtv8P+AzBkqLLwG9aHhg2Ue8idyU1eJtV6MESXQtCkLCVLlmTGjBmULl2ae/fuMWjQoEeO58qVi4ULF9KlSxeeffbZKFeNr68vs2fPpkWLFlSqVIncuXPHOP+0adPYtm0b5cuXp3Llyhw7dowcOXJQs2ZNypUrx6hRox4ZP3jwYOx2O+XLl6dTp04sXLjwEQve3SS5nrw7SZf15J2hkokt1hUUBB9Ngm++hsxZYORI6NMXAgOjhtjsNo7eOc6ea3/z17V9nLz3H+cfXOBqyDVkzL1Y8DH6UDRLYYpleZqS2YtTNU9lquV5nsKZCz3x+BpFSAh8/x18NR0uXIBq1WHCBKhTN3GfLSYsNtVbNlOArmTp4aSFevLnz5+nZcuWHDlyJFWvw50ktJ689sknBYs1OlQyMfz6KwwdDDdvQu/eMOFdyJEDgDBLGL+e38za0z/y09mN3ItUGzk5fLNTLmcZGhWqT9EshcnplwN/kz9+Jl8kkmBzCMHmEK6H3uBs0DnOBJ1j88VtfG6LBCB/YD6aFWlCi6dfpFGh+gR6R99MCAyEAQOhdx/47lv45GNo2QKaNYdJH0GxYkn6cwGqwJnFqvYvtNBrNMmOtuQTi92uYsENIuFCFR4OE96G2d+okMYZs6BSJQD+vXWEmYfn8O3xZYRaQsnum51WTzejUaH6VM/7PMWyPh27JR4LZpuZf28f5a9re9l26Q82XdjKA/MDfI2+tH2mJT3KvELjwg0wGR67WUVEwNezlNibzTDsNRg1Gvz9E/Z5Y8JiVfsXWug9lrRgyXsiCbXktcgnBudGq8WWcCv+v/+ge1c4dkz5xCe+j/TxYcvF7by/5yP+vLILX6MvnUu9RPfSnalToNaT4ptEzDYzO6/sZtV/61h6YhX3Iu+RNyAPgyq8ysBn+5LLP9ejJ1y/Du++A0uXQJGi8NVX7nHhaKH3aI4fP06pUqUSbJRoYkdKyYkTJ7TIJzuJ9cNv3Qq9eqhN1NlzoXFjdl3dw1s7JrL98p8UCMzP65UG07tsN3L45Uiea3+MSGskG879yjf/zOfXC5vxMfrQvXQXxlUdydNZiz46eMefMHQonD0DffrABx+qpKukoIXeYzl37hyZMmUiR44cWujdgJSSO3fuEBwcTNGij343tci7E6tNldZNaMmC2d/AmNFQsiQsW8HN3P6M/H083x1fxlP+uXmr2ij6le+NrymZs1Hj4PidE0w7OJNFR5dgsVvoVbYbb1cbTZEshaMHhYXBh/+DGV9B4SIwbz5UifHflutYrCqBLFOAjqP3ICwWC5cvXyYiIiK1L8Vj8PX1pUCBAnh5PWpgapF3F9JRfAvpel14KeGdCTBtKjRrjpwzl3kX1jD6jwmEWEIY+/wIxlQdQYBXQLJeekK4FnKdyXun8M0/87FLO8OeG8iEamPI6ps1etDuXfBqX5WB+9bbMPyNpNXKN1tVffpAfy30Gk0C0SLvLkLDVdEtV/3wdjuMHAHz5kLfV7n1/lh6bR7ChnO/Uid/Tb5uNI3SOZKprIAbuBx8hfd2T2L+kcXk8MvO/2q+w6vlemE0OMT8/n0Y/poqm9CgobLqcyTBzWSxgpeXzozVaBJIXCKvnaCuYrEqX7zJRWvVaoVBA5XAD3+DbcPbUmFJLbZc3M70+p+xvePGNC3wAAUy5Wdukxns77aDMtlLMXDz67ywrCH/3nLEHGfNCgsWwbQvlb++bm04eDDxC3qZVBRPWLjuMqXRuAkt8q4gpbLijUbXLEy7HYYMhqVLkG9P4OMWWWm4uhWZvTPx1yvbGfrcwHS1EfVc7gps77iRJc3ncy7oPJW+r8X4He8RYY1Qf4/efeDX39TnbtIIHCnbicLLBBFmCNd+XI3GHbhN5IUQRiHEQSHET47XRYUQfwkhTgshlgshvN21VooTHqEEzJW6NFLC2DGwdAnW8ePoU+EcY3e+S8eS7dnfbQcVcpVP/utNBoQQdCnVkeO99tOtdGc++vszqnxfm0M3/1EDKleGP3dA9eowaAC8927iyhc4i5qFRaonJ41GkyTcacm/Dhx/6PXHwBdSymeAe0BfN66VclhtEG523U3z8WT4ehbhA/rSsMjvLDz6He/VGM/S5gvT1OZqYsnhl4MFL37NL+3WcjfiHlWX1GXy31Ow2W2q3PGaddC3L3w+ReUDhIYmfBFnk3DnHohGo0k0bhF5IUQBoAUw1/FaAA0AZ7+rRUBbd6yVokgJoWGq1oor7pV5c2HSh4R16kDVMjv568Z+ljSfz7s1xqcr94wrNC3amH97/EWbYi0Yt+NdGq9uxfXQG2rj9POpqsLlzz9D82Zw62bCFxBCFXwLCVP7IRqNJlG4y5KfCowGnM/nOYD7Ukrnt/MykD+mE4UQ/YUQ+4QQ+27duuWmy3ETkWZlybsSGrh9G7w5kvCGdalc9RDnQi6xod1qupTq6N5rklLVrrdalfhZLI4fqwpDNFtjeG1V4+12t25o5vDLwYqW3zK/ySz2XNtLxW9rsPXidiXQgwbD0uWqk1WjRnD2bMIXMAj1BBUcqpuDazSJJMkiL4RoCdyUUu5PzPlSytlSyipSyiq5cuWK/4SUwm5XXY1cKR98+jT06IG5WFGeb3iGq5G32NRhPQ0K1XPTtUiHaFvUTccgwMdbxZRnDoQsmSBrJsieWf1kzaxeZw2EzAFqnI+3El+rLfom4IaSv0IIepfrzt+vbCebb1Yar27NpL8+RUoJzZrBjz9D0H1o1AAOHEj4AgaD+rwPdC16jSYxuMOSrwm0FkKcB5ah3DTTgKxCCKdCFgCuuGGtlMMZ3RFfG7/796HTy9gM0KhjONcMYWx9+WdeyFc9aetLqQTZbHH0SfVWgp4ts/qvv58qq2AyqScNg0GJuHAUTDMY1PteJjXO3+/R8/18QRJt7SdRQMvlLMveV/6gU4kOvLVzIh1/6k6IOQSqVoXfNquiZq1awM4dCZ/caAQkBIfp0EqNJoEkWeSllOOklAWklEWAzsBWKWVXYBvwkmNYT2B9UtdKMaxWFcYX32ar3Q79+yHPn6d3t8zs9wni0xJrecr6XOLXljLaveJlUoKcNZMS6YSWUogJp6/bzyfa2vf3Ves6nxQSKaSB3oF833w+n9WZxJrTP1BjaQPO3j8HxUvAps2QNy+0bwebNyd8cpNJuWxCdQy9RpMQkjNOfgwwQghxGuWjn5eMa7mPqJh4Q/yC+tV02PgL7zXKy3dZr/HCyWX8vboyvXvBoEFw6HAC17U4/Oc+3soFE+jvHmGPC6NRCX6WTOqGYjKq6poWa6LEVAjByCqvsbH9Oq6GXqfa0nrsvLIb8uWDXzZC8eLQ6WX48YeEX6vJqPZJdGilRuMyuqzB40SaVTs/73h88X/tQTZ9kQ1P56RVl5vMrrWEV6u3AlTS5m+/wRdT4d13oXatuKfCZldWqo+3cqMktU9sUrHZlJBGWECgxDURN5r/7p2mxdqXuBh8iQUvzlKb0Pfvw0sdYP8+WLgI2iQw6Mp5M3TuM2g0Gl3WwGWkdGy2xvNnuXMHevfiWuYAXulwg+kNP48SeABvb2jRAr74QpVhDw2LYz2zRf2eOVAJV2oLPCjrPsBfuXJ8vJSoJiK6pXi2Z9jdZQvV8lThlQ191IZsliywdh1UeV41Dl+3NmGTPhxa6YZO9hqNp5MGFCUNEWFWwhtXXXMpYegQbDeu0+rlB7QrO5Ahz/WLcWj5cioRdMOGGA7a7Uo8/XwgS2DiWwgmJ06xz5JJ/U2cm8AJIIdfDjZ1+IFupTvz1s6JDNs6EluAP6xZq4S+dy9YuyZh12UQ6tqCw9RTkEajiRUt8k7sdhVRE99m65Il8PNPjK1v52pAQ+a2mhzn8CZNYM/ux960WFVYpDNKJq0nSjlrvQf6R4dzJsDN52PyYVHT2YyqMpwZh2fT+eeeRPp5K6F/vir07QMbfk7YNTmfeEJC9UasRhMHadB8TCXCHZt5cQnu5cvYR4/kr6JerK5fmIaHF8Xbms/PX/nogWh/srdJWcjpqROScMTme5nUzTDCrKzpGNxLZjNs2wZnzijPSqXKULmSgU/q/I88AU8x8vdx3I24x/o2ywlctRpat4Ie3WH5SmjY0PVrMhmjm6kHpIObpUaTCqQjlUlGbLb4QybtduyDBxJhDuPVdkYWNl7K1dNZ4y2WePQIFCpEtMD7+kBgOm51ZzCoG1TmwOjP9JAl/eOPaj9i/XpV4cBigcmToWNH1dZ2ROVhLG46h98v76Dx6tbc87Ypi75kSXilc8Lj6KMibnSNG40mJtKp0riZsAj1l4jLEpw3F8P27bzR2M7YjtOpU6I05Z+FX2LytzuIiFR7jG3bOsQwwM9zLE4vk9pL8PaKyp5duw5mz4aZM9VPv34wZAisXAH9+8Nrr8PJU9C9TBdWtvyWAzcP0WBlC276WmHdeihYEF5+KWE16aOqVoZHb2JrNJootMg7s0rjqk9z5QrWCeP5tRjYe/ake5kuAAzoDzNmwv4YsvUjImH8OKhe1U7xwo6QP1+fZPoQqYTBoD5XoD9hwXbmfWNj+lcqFP5hhIDGjZXgf/GFeq9d8db82GYlJ+/9R90VTbnmZ4cffoLs2aFDO/jvP9evQzhq3ISE6Ro3Gs1jaJEPj4guCRALEW++htkSwbTuJfiywWdR75cpAx9NgjFj4PXhKopm++8waxa0aQ1ZM9sZP9ru+THdPt4s3RDIsxUFRfLFvinbojmcPQPnL6jXTYo05Nf267gUfIV6K5txNbOAtY7E6Lat4UoCKmE4a9wEh+kaNxrNQ2Rskbc6in7F4YuXP/+E78+/8mE9I5/2+A4/L79HjletqvzQDRvA73/A+nUQHg6zZkreGW/HO7uHC7yDv/YZKVT2obj6GITe2xueqwQnT0S/V7tATX5tv46rIdeot6IZV/IEwOq1KmmqXRu4d8/1izAaVUhlaISOuNFoHGRskQ+LiHsDNCSE0OGD+Dc35Bo9kbI5y8Q4zM8XWrdW/UK++AJGvCF5uoBVNaT29kqmi09bGAxgswsVEhrgF2uVS2l/8k9eM38Nfu2wjuthN5RFXzwPLF2myhN36QQRCWgF6O3oE6s3YjUaICOLvMWqarTEYcUHvTeGwBv3+KZPBV6r+ppr80al3ftlCAveSfXqjqQvIdTeQ+bA6HINDsIjYP9+KFP2yfNfyFedTe3Xcz30Bg1XteBG5VLw9TewaxcM6JcwF4yXo6uUbjai0WRgkQ+PUB2fYsF+8gQB8xazqIoXo4YuxSBc7O9qsSpr1tM2WeOhY0f466+HSsY7o28QUWK7ZjWULQv588U8R/V8Vfml/RouPrhMo1WtuN2iPkz6CNauhXFjXb8YIcDL2WxE++c1GZuMKfLOrkpxRNRcGdaDUJPE9N4HFM5cyMV5baruu2/GseCd+PursMmWLWH7dodL3GiEzAFYpJEf11hZtAhGvhn3PLXyv8CPbVdw+v5ZGq9qzf1Xu8PgITBrpvpxFedmus6I1WRwMmbGa3hknL74uz8sp+CeY8x8uSiDag9xbU6rVbl+0kOZgmSiY0fw8YFXX4XMmaF2bYiMNLDh5wAa1Qhj3iwLBQuaUKUtY6dBoXqsa7OMVutepsW6l9g0cS0Bly7C2DFQuDA0b+HaBTkzYsPCVQKXRpMByXilhq02CAqOfUPUYuFK+UKERYYg9/xFiadi3mx9BJujd2qWwPSbyepG7HbYsgWOHlVlDerWhfLlpBLbCLPLNfJXn1pHx5970LBQPX5svAif1m1Vz9hffoXnXGzMoksTazIAutTww4THHVFz5OMR5L8azIHXOrom8FKC3QaZ0lktmmTEYFDJT8OHw9ChUL48StT9/VTVTRcLnHUo0Zb5TWbx24WtdNk+GOvSJZAjB3R8CS5fdu1inBmxoWHqBq/RZDAylipFZbfG/LHDbl+jwPRF7CoVQLthLvp/nRutrjT8zug4hd7fz2Wh71m2K1/W/5S1p39k4L+TkCtWQVgYdO4IISGur2swKP+8TpTSZDAylshHRqqsyFhcBfvG9yRruB2fDz/B2+RCdIzFqtw+2g2QMPx8omPpXRD6Yc8N4p3qY5l3ZBFv3VsJCxbBkSPQ/1XXRdtoVGWSdaKUJoORcUTeZlfVCmOJqLl0ej+VV+9iZ40CVG7c07X5hPCcgmMpjW/ChP69Gm8x4Nk+fPT3Z3yR45QKrfzpJ3h/outrejkSpSJ1opQm45BxRD4y7nrxR8f0wtsGT3/qQr9xKVWSj/bDJw1fHxX14oLQCyGY0eALOhRvw4jfx7KkXk7o3Rs+nwLLlrm+pjNRSrcO1GQQMoZC2e2OevEx+8137VxGwy3n+KdZJfI+WzP++aw25XLQfvik4+vtstAbDUa+bzafugVq0WvTQLa91gZq1YJhQ1QqrSuIh1oHav+8JgOQZJEXQhQUQmwTQhwTQhwVQrzueD+7EOI3IcR/jv9mS/rlJhJnnfEYrHib3cadd0ZiMwjKfLwo/rlsNmW9+/m6+SIzML7eLrtufEw+rGu9jJ+GFn4AACAASURBVJLZitP2lx4c+Xw8PPWUajhy/bpr6xkNap3QcO2f13g87rDkrcBIKWUZoDowRAhRBhgLbJFSFge2OF6nPFKq5KdYImrWbZhCi71BnO/SDL9CReOfy2ZXdWm0H969JMBHn9U3K7+0X0tm70w0+b0P1+ZOg6Ag6PpKtFsuPrxM6uavC5lpPJwki7yU8pqU8oDj92DgOJAfaAM4TeNFQNukrpUozBb1WB6D7zzMEgaffUqkt4GS730V/1zaTZO8+Pq4HF5ZIFN+NrZfS5g1nCYn3yL0q6mw928YOcJ169zZUUoXMtN4MG71yQshigDPAX8BT0kprzkOXQeeiuWc/kKIfUKIfbdu3XLn5TxkxcccUfPdjx/S9mA4t7u2Q+TKHfdcNrsKv9RumuTFz8flhKmyOcuwptX3nLh3ijYswTZyJCxeBPPV5rnFCn/+CStWqJr/t24/NsHDHaW0f17jobhN5IUQgcBqYLiU8sHDx6SqnRDjN1ZKOVtKWUVKWSVXrlzuuhyFzabEOQZXzZ3wOwRMn4nVZKDgW5/EPY8zmibAX7tpUgI/X2XVuyD0DQrVY27jGWy5uJ1+z19DNmmCHD2KrR/tpmVLWLgIzpxVFYtffhneehsePPyv06D98xrPxi1+ByGEF0rgv5dSrnG8fUMIkVdKeU0IkRe46Y61EkSEI/kpBr7+YQJjDlq437MzPrljfMiIxmpTSU9e2k2TIggB/r5KdM2WeP/uPct25fyDC7y3exKlBr7JgANnqDSlK7PW7+DpmtF1jYNDVCHLAQNgzlwIDHAceNg/75exSkRrPB93RNcIYB5wXEr5+UOHfgCcWUU9gfVJXStB2O2xljC4FHyZPF9/hzQayDn2g7jnkVI9g/j7xT1O416ciWZeRpd85u9UH0e30p0Z889n9CjfmyymUJ5+t7tKfnKQKRBGjYJnnoFvFz82gfbPazwUd7hragLdgQZCiEOOn+bAZKCxEOI/oJHjdcoRaQFiLmEwa8NEuh+yE/FKJ8ibN+55LFYI8I01OkeTjAihXGRGQ7zJS0II5jaeQVFqsKHuB5yaNBL+/uuJZiNCQJ8+sG4dWCyPHdD+eY0HkmT/g5RyB7EXCG+Y1PkThZTKVRNDa7+LDy6Rc8FyjFKQ6c23457HZlebtro2TephMECmAHgQovZF4mj04mPyoeqxpVgqN6B25Ez+69+TLLNnQ5XnoUuXqHFFi4KfP1y+AkWLPLaWzar884F6/0XjGXimeeoMm4zhS/r5tg95db+diFbNVQOKuLDZlBWvv+ypi1Po7TJeK9vHkpMZFVdhtduoU+YvrDVfgNeHwT//PDLOaFRNxZ9Ax89rPAzPFPmImMMmLzy4iN/iJWSOhIA3x8c9h9WmvvA6Jj5t4GgliNWmxD4WSpSAW8dKsKrVtxx7cJrunbyQ2bNDt65w/z4A167DvbuQN5Zes9o/r/EkPE/krTb1E4MP/eMdHzF0j52IWjWgQoXY55AOi9FfW/FpCpNJuVGssYdWvvQyrF4N1XLW46sGU1h293emDa8Bly/BgP5gt7N0CTRrHkfKg/bPazwIzxP5SHOMwnzxwSXMy74nfzD4jhgT9xxWm/LDays+7eHjHWdWbMkSqmbZG8OhY8G+vP7cYN4IW83OoW3glw0c7PUFW7epApZxouPnNR6CZ4m83VEzPoYN1yl/T+WNnXbMpUtCwzj2g515WzpeOu3i661+YnGnjBkL5cpBu/YQuO0jnvVqQp0s69iUvy4V1k1kYe/t5MzhwjraP6/xADxL5M2OL/1jlvytsFucW7+AsrfAe/ibcbtgrDaVbRlHFIcmlXG2EfQ2xSj0RgO89poKkyxX1kgn6wJyG4rRp+8/WJ8pQs5RveHatRgmjgGnf17Xn9ekUzxH5J1hkzH44r88OIv+u8xYc+aADh3inkNKJfKatI0zht5gUFFQMZA1C3TuBOPfyMIfvVYQ5gcvdQQZGgK9e7om3Lr+vCad4zki76xT81i1yWBzMBs2z6Llf2B6tT94xxHz7qwyqbs9pQ8MBtWdy4XQyuLZnmFlq8Vs8LnA5z1KqGI2rrYO1PXnNekYz1Eziy3GlKzZ/yyg+45g7CYj9Okb+/nO8gXaik9fGI0qht5qi1eAGxaqz9R6H/NmnsP83awCTP0CNvzs2jpO/7zuD6tJZ3h0+EikNZJvdk7jwD9GDO06QJ48sQ+22MDPW1vx6REvk6pzExqufo9jz2VIxQH8c/sIdSwLuXquMNkHDoA/d8afGOdcJzRCbezryCtNOsGjFW3pyZU03n2DwHAbDBgY+0Ap1VOAtuLTL74+KuLGGrN/3okQgq8afM7zRWpQu9l1bFYL9Or5SCGzOE5Wrhvtn9ekIzxW5KWUTN07nZH7vZGVKsPzz8c+2GpTAqGt+PSNv5+ysuPZUPU2erO61fcEF8jFoA6+sH8fTIinjpGTKP98hPbPa9IFHqtq2y/9Qc69R3n6hhkxYGDsj/A6osZzEEJlxCLUJnwc5PbPzbrWy/iueBgrG+ZVhebXr3NtHS+Tsvy1f16TDvBYkf/iwAxeO+St6pa0axf7QGdcvLbiPYOoiJu4a9wAVHqqIvOazKBrjWucK54LhgyGc+dcWycqfj5u95BGk9p4pLL9d+80f/+zgRbHrIhXuoJvLEVKoiJqdClhj8JkUjH0LrQP7FKqI29Uf4P6zW8RabdArx4QGRn/GkKoG4qub6NxB1abMhqSAY8U+WkHZtL3kAGjzQ69esU+0GYDH5PObvVEfLyjG4LHw6Ra71H6uca80soMBw/C22+5tobRqAQ+TPvnNUkk0gzW5DEWPE7k70fcZ9GR73j9X39VqapEydgH22XsVr4m/ePvq9wq8WzEGg1GljSfzz/VivBNLT/45mvX/fMmo/qCav+8JrFI6drTYyLxOJFfcPQ7apwMI/eNEOjdJ/aBNht4ecVYzEzjISRgIzabbzbWtV7KuMYGjhQJQLrqnxdC++c1ScNijfffZ1LwKJG3SzuzDs9l3NFskD07tG4T+2CbXVeazAg4N2Jt9nhdKmVzlmFeyzm0ahNKuDUc2buX6/Hz2j+vSSwR5mQN/PAokd966Q8eXDpN3X8eQNdu4BOLiNvtKt5ZW/EZA5NJtXF0YSO2XfHW9Gg2lq6tLIgD++GdCa6tYTSqG4n2z2sSgs0OVkuy7gum+9zsAwdg5UowWmBj9rkMPOqPwRYW94ar1aaiL3TXp4yDj7dy0UValHslDt6tMZ62N/9h+vlfGDZzBtSuDS1axr+GlzG6n4HOu9DEQ2Qk/LzGwq7fBKfOAALylYLBg+HZZ923TrJb8kKIpkKIk0KI00KIse6a9/p1qF9fhcCbTJCz2GUOmH+m625fLuStTnjBEjGfKKUSd+90f3/TJARnDXqDIV7fuUEY+LbZHGZ3fJpD+U3YBg6AixddW0P75zUucOsW1Kwp+WNTJK3aGZg7F76cDvnzQ5MmMGWK+9ZKVpEXQhiBGUAzoAzQRQhRJqnz3r8PDRpA3bpw9ix88AHce2Y+Va9Iigfd5UCZbrz5Zix7GbqEQcZFCOWfl/GXJs7ik4WVHVbQs7MP4ZHB2Hr3BIvFtTUMBggJ1f55TYxICe3bQ4sXbXzxmaRuPQO5c0GRwjBhAuzbBzNnwqpV7lkvuZWuKnBaSnlWSmkGlgFx7Ia6xqxZUKkSvPeecmVZbBZmH57PhDMFwM+PVvPb8yAIdvz52InO5CcfnfyUYTEaVcVKF0oTl8pekv91W0CflnaMe/ciXa4/b1Thubq+jSYG/vwTbt+G98aaEQ4F/u/eaexSGQUFCsCMGTBpknv++SS3yOcHLj30+rLjvUQjJXz9NYwYEf3euhPruH//Ok323oXWbTBly0yXLjHcCW125abRyU8ZmwQkSrUq1pxy/d7i68ogpk2FTZtcW0PXt9HEwuLFMGiAHWE2g9FImCWMassbMHz76KgxTZrA3btw9GjS10t1n4UQor8QYp8QYt+tW7fiHf/ggfrwlSpFv1ezUE2WGzrhFRIGXbsCUKky/Hf6sZPtdr0hplH4uZYoBfB29TFsG9yMw0+B+dVecPWqa2s468/r/rCah7h2DUo/Y1GuPSFYfnI19yLv06F4tJPDYIBixdTeY1JJbpG/AhR86HUBx3tRSClnSymrSCmr5MqVK94JjUYVJPGwuzNfpny03n1HPefUqQuo79UjBrvd0RpQh01qIDpRShKv79wgDMxpPY9xrxbBEvaAiJ6vJKA/rK4/r3mUrFklEfei+1HPPDyHMtlLUSd/ragxUqqbQZYsSV8vuUV+L1BcCFFUCOENdAZ+SMqEgYFQqhT89ttDb16+DFu2QOcuURuq27dDpeceGmN1JD/psEmNE4NBtQ60xO+fz+yTman91/JGG198/9qHZdL7rq2h+8NqHqNrJxvbtiijc+/1/ey7cYDBz76KeEib9u5VIZaVKyd9vWQVeSmlFRgK/AocB1ZIKZPsZRo8WG1KRAU7/Pmn+sJ2fgVQLp1ly+Dll6MuBJDg7ZXUpTWehtdDiVLxUCJbcdq89R0LKoJxyufIbdtcX8NsUZmNmgxPkzqR3LxtYP16ZcUHeAXQvVTnqOOhofD66zB8uHuCAJPdJy+l3CClLCGlLCal/NAdc/bqBZkyKRG/fBno0gXOnoeiRTlzFgYPgQb1H0oosNnBx0uHTWpixtdHGQAuCH2Lp5ty6/2xnMgBYb26wI0brq3hjJ93YQ2NB2O3Y7Jb+GCSgenz7vLdkVW0KdCJzD6ZsVhVsEjNmlC2LAwd6p4lhUxDj5BVqlSR+/btc2ms2QxvvQXz56vOfuWLR2IOiuDEGRM9usMrrzzkmbFYIFNgvJmOmgyM3Q5BIWAQ8RoDUkpGzGrNpLe3EVa5Ajk2/uFaxJbdrgyOLJmi/LGaDEZ4pCp94W3igz+m886+cVTbsZsswWV5EGrAO3sAQ4YoAzYhnmUhxH4pZZUYj6VXkXcSEqKi2qwhkRTKHUHlaqZHtdzuKEyVJZP2x2vixmKFByHKGIjn30qwOZjPhj3HxKXXufvmULK/MznGcTduwupVsHGjSuIrmNdKzTpGWnYJoFBh/e8xQyEl3A8GowE7kpILnuMp/9z80fE3QoPtePka8M0ZkKip4xL5dG9OBAaq7LGOL0P1qjEY61ZH2KQWeE18eJlU6QMXXCqZvDPRY/KvrKzgRZYpXxG+/bcnxuzbryJ6Q0Phs8/g5w3w3ocmhM1Gx9YRbN6cHB9Ck2YxW5TRKQS/nNvE6ftnGFyhn9r/D0y+BnXpXuTjREoQesNVkwB8vV32zxfLVoxsXy/mdHYI79kFeetm1LFr12DsWPjoIxg1CkqUUF/k4s/AoGFG5nwZyeuDzJw9m5wfRpNmkFK5ahwh3F8c+Ip8AXl5uYSj//TaNY4NRvfj2SJvt6vGIHrDVeMqQqiyB0K4FNveqGwrdn80BP8HEZzt1DjqnFWroHkzeD6mB2ghKF/RxBv9wpj3jS5kliGw2lSCj8HAv7eOsOXidoY+NwAvoxfcvAED+sGM6cmytGern13qJt2ahGMwqEQpF+rbAPTsNJnvelWi2L4znJgwEIANG1SF1NjXEDRtbuDo37qQWYYgIjLK2Jx6YCZ+Jj8GlHd0rvv2WxUc0qdvsiztuSLv/HKadESNJhEkwD8vhOCVj3/h18pZeWbGEi5sXMbde5AvnipNeQsaCQuRyBCdKOXR2GxgtoLRwM2wm3x/Yjk9y7xCdr/s6tiC+SpTv3gs5dGTiOeKvLOksN5w1SSWBPjn/b0DKPPdb1zMZsCn30DyBJ7h5s24z7l5A6yYEBaLsvQ0nkmEGQQgBF8fnkekLZLXKw1WxzZvVr0K4upHnUQ8V+SlBG/tqtEkgQT65wvmL829b74ka6iVN+80YN2auOvPr/8BmryII1EqQles9ETsdiXyJiOR1khmHp5DsyJNKJW9pDo+by489ZRrnccSiWeKvN2uklN0wokmqSTQP1+5SS/+Hv4ytc/cIXx1c44fj3ncyVNqc7ZTR9RNxGSEkHD1+K7xHJw3biFYfGwJN8JuMqLyMPXexYvw60bo3kMFiCQTnqmCNrt21Wjch5cJ/F2rbwNQZ8J89tUqxshDu/nozYnMmaPavQHcug1z58GQITBuLBQt6jjJYACj0BUrPQm7XYVNehmx2W18sm8qlZ96joaF6qnjCxcojUpGVw14qsjrYmQad+ProxrOuFhiuMKSbVzN7cfkQ5/y34VNdOgA1apB+3aqRvjXX0PDho+dF9VRSm/EegRmh7tOCFb/t47T988w9vkRqtqk2QyLFyl/XcGCcc+TRDwv9MRmUxE1OjZe406EgAB/lZbu7E0QB15ZsxO4dDV+L7ag5YbODNtyiKcCCuHlFc8DppdRiUN4hIru0aRPnMlPRiNSSibv/ZwS2YrT7pnW6vjatXDzJvTrn+yX4nlKaLPrHq6a5MFZf95F/3y2KnW48/546pw288ugBlhFmGseRC+TEgi9EZt+iTQ7jAHBbxe2cvDmYUZXGY7RYFT/dmbOUGnQTzzOuR/PE3nQ1SY1yYeXyeX+sAD5B4/lUqu6vLrhOlM/a49LBQGFUE+joWG6dWB65LESBh/9/Rn5AvLSrbSjZvxfe+DgARg4KEU8Dp4l8ja78sVrV40mOUlAf1iEoOCcldwpkpt+03Yw9cfxrq1hEGAwqo1Ym96ITVdEWfEGdl/9i+2X/2RE5WH4mBz9pWfNhKxZocsrKXI5nqWGUmpXjSb5cfrnXegPC4C/PzlXbiDQbqLa2OmsOrLctXWcIcAhoXojNr0QZcUrb8K7uz8kl19OBlZwlCy4eBHWr4devSEgcWWFE4pnibzJoF01mpTBaFCJUi7650XJUphmfMMLl+H6yP7svb7ftXVMRlUuOyRMC316INKs/j8ZBDuv7Oa3C1sZ/fwbBHg5BH3ObGUkpMCGqxPPEnlvHRuvSUF8vFVopdW1BCavlzsR1q83Q3fbmPt+ay4HX3FtHW9TdMSNJu1it6vMZYcv/t3dH5LbPxeDKryqjoeGwqKF0Lp1sodNPozniLzJqL5wGk1K4u+rrHoXhd7/oymEVSrPZyuCGPZ1K0LMIa6t42WCsEhd4yYtExkdF//n5Z1subidMc+PiLbiFy1U7cEGu6l5q4t4jsh7maLuoBpNiiGEKnsgpWv+eW9v/L9fhXdAZj78+hS913THZnfhBiGEsuhDdTPwNEkMVvxT/rkZ+KzDF282w1fTVZfuatVS9NI8R+Q1mtTCaEyQf578+fFZvIRSdwQvTfuNN38f59o6zho3D0JdfnLQpBDhEVGVJrdf+oNtl/5gbNWR+Hv5q+MrV6rOT8NHpPilJUnkhRCfCiFOCCH+EUKsFUJkfejYOCHEaSHESSHEi0m/VI0mDZNA/zx162F47306HQVmzmTGoW9cOy+qxk2oDq1MK1htUZUmpZSM/mMCBQLzRzcFsdth2hdQtiw0aZLil5dUS/43oJyU8lngFDAOQAhRBugMlAWaAjOFENqXovFsEuif5/XhyJYt+ew3waoFb/LjmQ2unWd0fJWCdVepVEdKCA9XN18hWPXfWvbe2M8HNSfg5+UoS7HxFzhxQlnxqRAYkiSRl1JuklI6HYR7gAKO39sAy6SUkVLKc8BpoGpS1tJo0jxO/7xdqh8XxouvZyOeLsaqVUZGLOnBvusHXFvLZFQCr0MrUxero+uTyYjFZmH8jomUy1GG7qW7qONSwpQpULgwdOiQKpfoTp98H+AXx+/5gUsPHbvseO8JhBD9hRD7hBD7bjnrsWo06RWjEQIdbQNdEd/MmTEsW0426cvK5XY6rOzA+aALrq3lZVIio6tWpg7SUTHU8WQ1598FnL5/hsm131c1agB2/Al7/4ahw+JuRSplsu2QxjutEGKzEOJIDD9tHhrzFmAFvk/oBUgpZ0spq0gpq+TKlSuhp2s0aQ8fb/Dzdt1tU6IkhtlzqHjRzP/WBtF0dRvuhN9x7Vwvk0rACYvQQp/SRJhV1VujgWBzMBP3fETdArVoXvShLciPJkGePNCjZ9xz2e3gkzwh4PGmh0opG8V1XAjRC2gJNJTR1ZeuAA9H+xdwvKfRZAz8/cBiU0LvSmhvy1YwajTdP/2Ev/Oeo7V/JzZ3+DHarxsXXiYVP28Qqq6OJvmx2ZQv3pFh//Hez7kZdosf26xU9eIB/vgdduyAjz8Bvzj+P9ocneySKQQ8qdE1TYHRQGspZdhDh34AOgshfIQQRYHiwN9JWUujSVcIAZkS4J8HGP8WNHmRaRvAtGsPXX/p43oMvZcJQiN0slRKIKV6chIChODM/bN8um8a3Ut3oWreKtFjnFZ8fJ2fbDZV2TSZNmWT6gX6CsgE/CaEOCSE+BpASnkUWAEcAzYCQ6SUOrBXk7FIqH/eaIR58zE8/TS/rAtg374fGbZtpOvliZ3JUhG6Dn2yYraoH4ePfeTv4/EyeDG59vvRY/78A3buhBEjwTeOpyu7VJE5ydjJLknVvKSUz8Rx7EPgw6TMr9Gke3wcvvlIs2vF87JkgWXL8a9fj90/5qa4/1ye8s/NuzVcKFEcZdGHqcQcXZHV/TyW2brp/BbWn/mJybXeJ19gXjVGSpj0IeTNq6pNxoXVpkJvkzG0Ume8ajTJTULj54uXgHkLyHf2Ftu2F+a9XZOYdXiOa+c6G46EhOnOUsmBc4PbYMBis/D69lE8k7UYwysNiR6zbRvs2hW/Fe98QvNJ3n7UWuQ1muQmofVtAF58ETHxfartusB3R0owZMsIVpxc7dq5Bkf5g5Dw6GbSmqQTaY7KbAWYemAGJ+6e4ot6k6Mbgtjt8O4EKFTINSve1zvZmxzp4usaTUrgrG8TEgZewrXH89eHw/HjdF26hBO5StLtl1fJ5J2JZkVdSI03GNS3OzhMbQAno883Q2C3q/0OLyMIwbmg87y7+0NaF2tBi6JNo8etXgWHD8PsuXGHREqpms74Jr9LTVvyGk1K4axv42oVSSFg2pdQtRrvL7rAy2FFaf/DK/xxeYdr5xsMqpFOsHbdJAkpVeQSgMGAlJKBm1/HKIzMaPB5dMhkZCR88D48+yx07Bj3nDabctMYk7/aixZ5jSYl8U9Af1hQPt0lSxA5c7F4YRBVZV5arnvZ9fIHTqEPCddCn1gizapUsMNNs+TECjZd2MJHtd6jQKaHEvnnzYXz52HiB/G7YOwyxfpfaJHXaFKShPaHBcj9FCxfiTEklN9W+FFQZOXFNW05fOtf1843GBw+em3RJxirDcIcSU9CcCf8DsO3j6ZanucZVKFf9LigIPjkY6hXDxo0iH9Ob68U63+hRV6jSWmMBsgU4Hr9eYBy5WDBIryPneDvLcUINPjSaFVLjt057tr5Bkd4ZUiYTphyFbtdNVF3VJgEGLb1Te5HBjGn8fTo+jQAn30Kd+8qKz6+/Ra7VMlPKYQWeY0mNfAyKddNQro8vfgifPIpAZu3c+h4XUwGEw1WtuDk3VOunR8VRx8O4ZG61k1cOLNa7TLKb7785CqWnlzJO9XHUj5Xueix/52CmTOgew947rm457XZwMsQd7EyN6NFXqNJLXx91GN7QoS+/wAYNJhsC5ZyMOgV7NJO/ZXNEy70YeG6qFlcRJiVa8vhUrkSfJVBm9+gWp7nGVf1zehxUsKYMao2zbvvxj+vzR53HZtkQIu8RpNaCKHCKoVIWJenSR9B69bk+XAq+wJGYLVbqbeyGSfunnR9XWdRsxBdpvgJIs2P+OGllPTdNJgIWwSLm83GZHjICt/4C2z+DcaOV3sncWFzFKtL4V7UWuQ1mtTEYFBx7LYE+OeNRpgzD6pWo9DIifxVZBJ2aafeimYcv3Mi1tPu3IUff4IVK+CPPwUWgxdYLLrD1MNYbaoshMkY5VufeXg2v17YzGd1PqREtuLRYyMilBVfsiQMGBD/3Da7qk6awt2htMhrNKmNyaQiblwtZAbqkX/ZcihYiKIDxrCrwlcIIai7oukTUTfBwfDOO6ox0c6dcOYsLP4WWraEFWtNSIsNgkJ0c3CbTd3wDMaoEMj9Nw4y4vdxNC/64qPRNABTv4Dz5+DjT8ErnmQzm00lUqWwFQ8gXKpwl0JUqVJF7tu3L7UvQ6NJHULDINLiWiEzJxcuQOOGYDBwdtVc6u3uT7A5hF/araF6vqqEhUG//io4Z+gQyJQp+tTTZ+Ct8dCwIfTvawObzLjZsXY7PAhRoa0OIb4fcZ9K39fCardysNtOcvjliB5/8gTUfEH1AVi4KP75zRbIHJiw/7cJQAixX0pZJaZj2pLXaNIK/n6OQmYJ2IgtXBjWrIPQUJ7u+To7Gy8nh292Gq1uxdaL2/nuOyhUEMaOeVTgAZ4pBjNnwcqVcP6y0ZEdGwrhGWxD1m6HB6HqMzsEXkpJ718Hcin4MstbLHpU4O12GDYM/APgk0/inz8VrXjQIq/RpB2EgMCAhCVKgTLTl6+AS5co2Os1drRYQ5HMhWi+tgOzdq6nT9/Y3cA5skPbtrBqFcpF4WVSUTchYRnDT2+3R+9JPBTW+Pn+6aw78xOf1P4fNfJVe/ScBfNhz2746KP4N1shOqImhX3xTrTIazRpicQkSgG8UBMWLYbDh8jTdxi/t1pH2SwVOPRsN7aEzo3z1Nq14fAhxwshosM6g0IS9lSR3nBa8Db7I26UX85tYvSfb9P+mdaPlhAGuHoV3pmgMltf6Rr/Gs7s1mRy07iCFnmNJq3hZVKhlQnZiAVo1hxmz4EdO8jRbxjf11jDU3dfZNCW4by763+xdpgymmLoUOgIHyQoxDMTp2w2hw/+UYE/evsYnX7uybM5y7G42Zzo4mOg/gZDh6gb39Qv47fMnaWlU7nvri41rNGkRXy8lRAldCP25Y4QGgqvDaO431DKXvuWekNH8P6eyZx/cJHZjaZH1z53sHcvlCwRRxCwiQAAFVFJREFUw1xGgyqHEBauQi0D/FKkamKyY7WqypzwiIvmdvhtWq3vSICXPz+0XUGAV8Cj582ZrWLiP5sCTz8d/zo2m/r/mEq+eCda5DWatIgQaiPWaleilJA0+F69ISQU4/ixzChn4oeTcyhbrzDv7Pof54MusKb1kqiNxLAw5Y//5OM4rsPbS7kd7gcroffxTjX/cpKJNKsoJoNR3cQchFpCabO+M9dCrvN7x40UzFTg0fNOnYS334JGjVW4UnxImeI1amJDi7xGk1YRQoU0BoUov7ExAd7VoUPBaqHUOxO4ftPApTxz+Lbp0/T9bSA1ljZkfZtl5DWVYuxYqPo8lCkTz3wmI0iDqqtutqgbUCpbqAnCWYsmIjLaFeXAbDPz0o/d2HPtb1a0WEzVvI9FIprN0O9V8PNX4Uiu3OCsNlW2Ig08+WifvEaTlnFmxNptMTjO42H4G/DeROrdXMEzUwawfFQHBomfuB50n4oL61NrwAZKloS33nZxPiHA26RuOEEhqtBZeojAsTr87zEIvM1uo8fGfmw8/xvfNPqSDiXaPnn+pA/h4EH48kvIkyf+9Zz7F2nAigc3ibwQYqQQQgohcjpeCyHEl0KI00KIf4QQldyxjkaTIXFmxFoTuBELqpn0hHeocWEZ3/n2oYzpeYbLP8nnVYyjVTsSUn0yQiRQqE1GFfcdYVYunIg0ujErpbq2B8Hqd2+vRwTeLu0M2vI6y0+u5pPa/+PV8r2enOOXDfD5FOjZC9rEcAOICYtVVRhN5t6trpJkd40QoiDQBLj40NvNgOKOn2rALMd/NRpNYvDxVlZzWETCM1JHjQZvb7JMeJv+3pGwcBHjDL/Rf/Mw3tn1P/Zc28uipt+Q0y+n63M6rXq7jC5d7O/7hJCmGharui6b7QnrHcBqt9J302AWH1vCW9VGMer54U/Oce4c9O8HFSvCp5+5tq7d4VbzSf7era7ijlvNF8BoVAqHkzbAYqnYA2QVQuR1w1oaTcbF1we8vRNWmtjJ68OVUP38E3TuhJ/ZzuKmc5jR4HM2X9zGc9/WZOeV3Qmf1+DYmDUIlUDltOxTy41jddSfeRCiXsdw0zHbzLyyoTeLjy3hgxcm8MEL7zw5T3g49Oimzl38nWrD6Or6AamX+BQTSRJ5IUQb4IqU8vBjh/IDlx56fdnxXkxz9BdC7BNC7Lt161ZSLkej8WyEgMBElD5wMmAgfDUDtm2FNq0R9+4xuGJ/dnfeirfRm7ormvLBnslY7YmY22BwiL1BPW3cD1ZRLIlxMSUUKdWN70EoBAVHJyDFsFEdYg6h3Q9dWHlqLVPqfsTb1cc8GgvvnO+N4XD4MMyeC0WKuHYdVpt6uknBhiCuEK/ICyE2CyGOxPDTBhgPxHAbdB0p5WwpZRUpZZVcuXIlZSqNxvMRQmXEIpQrIqH06KlKUB46CE2bwJUrVHqqIge67aBTyQ68s+t/1F7ehNP3ziTu+pxtBk1GFYUTFKIEPyzcvYIvpRLVcMcN5UGI2pyOo3fqpeDL1FremF/Pb+abRl8yovKwmOf+7FNY8j2MGw9Nm7p+PXaZKqWE4yNekZdSNpJSlnv8BzgLFAUOCyHOAwWAA0KIPMAVoOBD0xRwvKfRaJKKwVH6wCYT5xZp3QbWrIUrV1QFy2NHyeKThe+bz2dp8wWcuHuKCt/WYNqBGdjsiSw/LISyaJ2unAizEuJ7D5TFHRGprG+b3TXht9uVqJst0W6hoGC1F+B8iogjXPHva/uouqQu54Iu8HO71fR/tk/MA1ethA/eh06dYey4/7d379FRV9cCx797ZjJJyIuKispDEh4VKKJCqWKFioI8wrPFN2pFvQpSaEGXtNprrVprvRUrqCBX3sXSypuiQQXxWnmJ4OWhiIIIIkaoEAiQzMzpH2dGIiRkMo/M5Df7s9asRX4ZZs4P1tpzZp9z9g7/fn1+yPQmxZbJk8Ws1HAw0Hc0xnwtIn2Ae4He2AXXvxhjOlX3GlpqWKkaKPfZwFnJwmJYNm6EwT+1J6Kmz4Ru3QDYXbKHu5aNYOnOIjqd05EXu4/nwoo9TaMROuofMCdW8QT7QSAC4rJTzwCAOfF8Y8CIfa6ITcWEcc/GGCZsmMjolb+mUfZ5LB7wd9o0aF35k1evgsI+0KEDLFgE6WFugQzdT/2chM3iE1Fq+J/Ymf524EVgWJzeR6nUlRZBs5GK2reHN1dA06bw04G2uiLQOKcRSwa+wl97v8SOgzvpMOvH/GrFA3xz7JvoxyxiZ7tpHpu/9nqCH1LBUBSasQcqFGhzu21TjtBzK3RtOp39R/czcOENjFg+hu5Nu7HmxhVVB/gPPoDBP4NGjWHW7PADfChtlJ18aZoQbRqiVF139Jhd7Ix0Rl9SArfdCsuK7OLs43/4ttPR/qP7Gft//83k/59Gg8wz+H3nh7ij3W3f7XOaZIwxzN++iHvfHE3x0a95ssujjLx42KkLrCEfboVePe0OmleLbI3+cJX77L97Tlb1z40jbRqilJNlpENGhFsrwXYT+dscuHcETHwB+hXCV/sAaJDZgEndx7P+5ndo26A197wxirbTfshft86JPF8fR7sOfU7/BdcxaNGNnJnZgFU3LGfUJcOrDvCffAL9+tr1g0VLahbgQyeQ62VGP/A40iCvVF0XKmbmTYOyCAO9x2Nn8JNfgvXroWsXWL36219fdPaFLB+8lHn9ZpPhTuempbfTbnonZmyZTZm/LEY3ErkDRw/wwNu/pfXUDryxawV/6vIY6256m0saXlT1X9q6Bfr0srVpFi6CFi1q9qY+X7AyZ3KH0eQenVIqPCKQXc+WG4h0Rg9w7bWw7A2brunZwx7pD+7gEREGtOjL+0P+xZzC6bjExS2v3sn5k1vz6Ko/su/IvhjdTPiKS4v53buPk/+/P+DJtU8zoEUhm29dy5iOI0lzn+Zk8Jo1cM01dhvq4n9C6+oqtJ3E57MfqnWgH67m5JVykira2dXYwYMwcgTMnQtXdoOJk04pzmWMoeizNxi3fgKv7lyGW9z0bNadW9rcQN+C3mSmxSeNYYzh3b2reX7jZOZsm0uZv4wBzQt5pPODtAtnF9CyZTDkJmh4DsxfAPn5NRtAwNgPh7ycpJnFny4nr0FeKaeppDF1RIyBaVPh/vtsmd2nnoKfDa50cfejA9uYunkWM7bOZs/hL8j0ZNKtSVf6FFxD96bdaF6/oOq8eBiO+47z7t7VzN++mHnbF7Gr5HNyvDnc2uZGhrW/k9YNLgjvfiaMt3Xh27a1DdAbhtGj9WRl5fZbUxLVp9Egr1Sq8fttoBeiP6Dz8Ta4+25Yuwb694f/+XOVDaz9AT8rdq9kwfYlLNnxGp8e3AFAg4wz6HRORy46+0Ka5+VTkNeMxjmNyPHmkOPNxuvyctR3lFLfUb45/g07D+5ix6GdfHTgY1btXcv7xRsp85eR7k6nx/lXMbBFXwa3Gki2Nzu8eygtta37/vF36NsXXphkF5xrqtxnU1lJtmVSg7xSqSiWgd7vh/HPwqO/t1sNH3wI7rjztK9rjOGjf2/j7d3/YvWX61i9dy0f/ntbjWrjZHoy6djwYi4790dcdl4nrm56ZfiBPWTzJtv0Y/NmeOi3tvxyJGWAQ6dz87KTpoxwiAZ5pVKV32/rx7hcsckff/wxjBlti5y1bw9/fBI6Xx72X/cFfOwu2cMnBz9l7+F9lJSXUFJ2mDJ/GfXS6pHpySDXm8v5uU3Iz23Gudnn4JIIx+33wzPj4LFHoX59eH4i9OgR2WuFiqDlZSddATLQIK9Uagt1RopVoDcG5s+DsQ/AF1/ANT3h4YehbYxKH8TC+vVw3xibYhowAJ4eBw1O1MvfuhX+8YrdRSkuaNcOBg+G5lX15w61PEySbk8n08NQSqUyjxtys+2CbCSVK08mAgMHwfoN8PDvYNW70PkyuO0W2yYvkfbuhbv/C37SBXbusPv+p834NsD7A/D44zBmDDRuDA8+CGPHwvfqw7B74NnxlVSIKA9ul8xInoXWmtCZvFKp4tsZvcS2WuKBA/CXZ2Dyi3DoEHTtCsOGQ/cetZfa2LHDrhnMnGE/yIbfC6PHQG7ud5727Hj4YCOMe8aW/anom4MwfBj07AVDbg5e9PttIbUkzMNXpOkapZQVy8XYkx08aLdcThhvZ9QNG8KNN8F119nDRrHejVJeDm++CbNmwMKF9n6uvwHG3Ffp3vdDh6BvP3jlFTizQeUv+dkuGDoUliyBdI8Bvw9yc6LbiloLNF2jlLLcbsjNsrNTX4xrz+TlwS9GwqYtMPtluKSDneFf+iNo387uty8qsjP/SB04YFsY/nIUtGphSyWveOvE+054rsrDTUXLbFapqgAPcH5T+H4rWLnSBMsW1Ev6AF+d5FsmVkrFlzuYoy85cqKKYiylpUGfQvvYt88G5aVLYeoUeOF5+5yWLaH9Rba1Xn4+nNfIBtR6WTaoHj5iq2Pu3w+ffgLbt8OWzXYbpDGQmQm9etsyDFd3t71vq/Hll9A8jPI0BQWGkv0+25g8iQ48RUqDvFKpyO2yM/qSUlvUzBunUNCwIdw+1D6OHIH31sHatcHHGpg3t/rFYBFo0gRatoIBA+GKK+y3hHBrvgdl1QvvS4T/uB+f22urezqABnmlUpUrGOgPl9otgpHWow9XVhZ06WofIeXlsHs3fLnX9oEtPWKvZefYXHheHjTLtzP3KHXpCsOG2cxOVV9eSg/5WbrMw8zhyXWiNRoa5JVKZaHqlaXHbN/VeAf6k6Wl2XRNTYuERaB5ARTkw9Sp9gDsyUyZj4mTXZzXKpNGjZ0R4EGDvFJKxOaf3S44fNSWK07i7YLReOQRuPMu2xNlyBDb+RDg0499TJ/hYsnKLIped9a9a5BXStlAn5FuF2VLjthyunV8V0llzjoLpkyx2+mHDrVZoKwMH6XHXHTomsUby10nb62v83SfvFLqu/x+uyDrD9hZvUNy0ycrK4PivT5wuTi7eRZp6XV3Bn+6ffI6k1dKfVdoL33pMTheVvt5+lrixUejpm67JuHQ9BRokFdKVcblsv1LPW6768Xliv0J2UQJVZT0ptkA78APsIqiDvIiMgIYDviBJcaY+4PXxwJDg9d/YYx5Ldr3UkrVolCe3uOx2yzLfTboRxEUDx2CxYvtNnm/H/ILYNAge9K0VoQCfIbXVpV0eICHKMsaiMiVQH+gvTGmLfBU8Hob4HqgLdATeE5EHDINUCrFeNy2QFeG1wZIfyCilykqso2ltmyFwkIYfK3dQXnHUPjDExG/bPj8ASj3228oWc6fwYdEO5O/B3jCGHMcwBjzVfB6f+Dl4PUdIrId6AS8G+X7KaUSQcTOfL1pdptlDQ9PvfOO7Ro46UVoWaG0wBU/hp//HH71Sxj3NIweHYexG2Pr9IhAXlZSNv2Ip2hXG1oBV4jIahF5S0R+GLzeCPi8wvN2B6+dQkTuEpF1IrKuuLg4yuEopeLK47Gz+nqZdlbv81VSgP27jIHnnrO121tWUjsmK9gjfPFi2PfVqb+PSiBwIv+epF2d4q3aIC8ir4vIpkoe/bHfBM4ALgXuA+ZIDVuyG2MmGWM6GmM6nnXWWRHdhFKqFonYDkn1c2zQLPedtqLlhx/B4cNweeeqXzInxzaYWrgwRmMM5d79Abu46vAdNKdT7ceaMebqqn4nIvcAc43dbL9GRALAmcAeoEmFpzYOXlNKOYXbDTlZdjZfesymcNyn7sLZ/TlccEH1MbZNa3hvfQzG5fPbGXxGuv0wStHgHhLt3c8HrgQQkVaAF/gaWAhcLyLpIpIPtATWRPleSqlk5PHYYJ+bDS63DfYV0jheLxwprf5ljpRGUdk3lHcPfdDk5dgF1hQP8BB9kH8JKBCRTcDLwK3G2gzMAbYArwLDjTEx7lCglEoaInYhNjfLBti0tG+D7sXtA2zaVH2Z36LX4LLTpHQqFUrLhLZ35mXbDxsHlmSIVFSrEMaYMuDmKn73GPBYNK+vlKqDPMFTpMFFz9y04wzsU87MKTBipAtxu07ZlfPWW1D8tS0VX61AwObajbEz9Qyv/QrglMNaMZZ6S81Kqdrhctngm+7ltlEBBvXz83VJGffc4efcsw1gKD0GS5e6mDJdeOIJ8Ahg5MSOHWPsI2AAATE2JZThtd8WojyclQo0yCul4i7vey7mLXHx8MNptLvCcEFLQ/1cPzs+CdCta4BxzwRoURCwvWcDARu4XQLiAk9wMdflsvl2zbPXiFahVErVqtJS2LDBrs22bAnnnpvoEdV9WoVSKZU06tWDzjVdYFUR0+89SinlYBrklVLKwTTIK6WUg2mQV0opB9Mgr5RSDqZBXimlHEyDvFJKOVhSHYYSkWLgs0SPIwJnYqtvphK9Z+dLtfuFunvP5xtjKm3IkVRBvq4SkXVVnTZzKr1n50u1+wVn3rOma5RSysE0yCullINpkI+NSYkeQALoPTtfqt0vOPCeNSevlFIOpjN5pZRyMA3ySinlYBrkY0xERouIEZEzEz2WeBKRP4nIhyLygYjME5H6iR5TvIhITxH5SES2i8gDiR5PvIlIExFZLiJbRGSziIxM9Jhqi4i4ReR9EVmc6LHEigb5GBKRJkAPYFeix1ILlgE/MMZcCGwDxiZ4PHEhIm5gAtALaAPcICJtEjuquPMBo40xbYBLgeEpcM8hI4GtiR5ELGmQj62ngfuxnSodzRhTZIzxBX9cBTRO5HjiqBOw3RjzqTGmDHgZ6J/gMcWVMWavMWZ98M8l2KDXKLGjij8RaQz0ASYneiyxpEE+RkSkP7DHGLMx0WNJgNuBpYkeRJw0Aj6v8PNuUiDghYhIM+BiYHViR1IrxmEnaYFEDySWtMdrDYjI68A5lfzqN8Cvsakaxzjd/RpjFgSf8xvs1/tZtTk2FX8ikg28AowyxhxK9HjiSUQKga+MMe+JyE8SPZ5Y0iBfA8aYqyu7LiLtgHxgo4iATV2sF5FOxpgva3GIMVXV/YaIyG1AIXCVce6Biz1Akwo/Nw5eczQRScMG+FnGmLmJHk8tuBzoJyK9gQwgV0RmGmNuTvC4oqaHoeJARHYCHY0xdbGaXVhEpCfwZ6CrMaY40eOJFxHxYBeWr8IG97XAjcaYzQkdWByJnalMAw4YY0Ylejy1LTiTH2OMKUz0WGJBc/IqUuOBHGCZiGwQkRcSPaB4CC4u3wu8hl2AnOPkAB90OTAE6Bb8v90QnOGqOkhn8kop5WA6k1dKKQfTIK+UUg6mQV4ppRxMg7xSSjmYBnmllHIwDfJKKeVgGuSVUsrB/gPyPu6JoSKGwQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "vlr = VariationalLinearRegression(beta=0.01)\n", "vlr.fit(X_train, y_train)\n", "y_mean, y_std = vlr.predict(X, return_std=True)\n", "plt.scatter(x_train, y_train, s=100, facecolor=\"none\", edgecolor=\"b\")\n", "plt.plot(x, y, c=\"g\", label=\"$\\sin(2\\pi x)$\")\n", "plt.plot(x, y_mean, c=\"r\", label=\"prediction\") \n", "plt.fill_between(x, y_mean - y_std, y_mean + y_std, alpha=0.2, color=\"pink\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10.6 Variational Logistic Regression" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def create_toy_data(add_outliers=False, add_class=False):\n", " x0 = np.random.normal(size=50).reshape(-1, 2) - 3.\n", " x1 = np.random.normal(size=50).reshape(-1, 2) + 3.\n", " return np.concatenate([x0, x1]), np.concatenate([np.zeros(25), np.ones(25)]).astype(np.int)\n", "x_train, y_train = create_toy_data()\n", "x0, x1 = np.meshgrid(np.linspace(-7, 7, 100), np.linspace(-7, 7, 100))\n", "x = np.array([x0, x1]).reshape(2, -1).T\n", "feature = PolynomialFeature(degree=1)\n", "X_train = feature.transform(x_train)\n", "X = feature.transform(x)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "vlr = VariationalLogisticRegression()\n", "vlr.fit(X_train, y_train)\n", "y = vlr.proba(X).reshape(100, 100)\n", "\n", "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n", "plt.contourf(x0, x1, y, np.array([0., 0.01, 0.1, 0.25, 0.5, 0.75, 0.9, 0.99, 1.]), alpha=0.2)\n", "plt.colorbar()\n", "plt.xlim(-7, 7)\n", "plt.ylim(-7, 7)\n", "plt.gca().set_aspect('equal', adjustable='box')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "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": 1 }