Files
2026-07-13 13:30:25 +08:00

559 lines
109 KiB
Plaintext
Executable File

{
"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": [
"<Figure size 432x288 with 1 Axes>"
]
},
"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": [
"<video width=\"432\" height=\"288\" controls autoplay loop>\n",
" <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAA4qG1kYXQAAAKtBgX//6ncRem9\n",
"5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTUyIHIyODUxIGJhMjQ4OTkgLSBILjI2NC9NUEVHLTQg\n",
"QVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDE3IC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcv\n",
"eDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MSByZWY9MyBkZWJsb2NrPTE6MDowIGFuYWx5c2U9\n",
"MHgzOjB4MTEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVm\n",
"PTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6\n",
"b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9NiBsb29r\n",
"YWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFj\n",
"ZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJh\n",
"bWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdl\n",
"aWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49NSBzY2VuZWN1dD00MCBpbnRyYV9yZWZyZXNo\n",
"PTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFw\n",
"bWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAHH5liIQA\n",
"E//+97GPgU3IAA2XOop6H+EVsfSQUXqx2aBk6gAAAwAAiYGOFk1v/CH1/gAT8NL6b4COhp23maaj\n",
"r325G0cLkwb9TxoyjCX1zGMN22VFsUS2UtOQ+PPrzAUI1ZdK8o+8FzxfKD2UXdrJKq9WAAHuA4Do\n",
"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\n",
"\">\n",
" Your browser does not support the video tag.\n",
"</video>"
],
"text/plain": [
"<matplotlib.animation.ArtistAnimation at 0x293f7de7eb8>"
]
},
"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": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"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": "iVBORw0KGgoAAAANSUhEUgAAATYAAAD8CAYAAAD9uIjPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJztnXeYnGXV/z9ndsqWJGSTgJQkBNIghFAMCUiTHgQTpCgoAiIgAiIKIoiCb9RXBX4vvggqkSK+ohiREumhqSAlgVBSCCmEJARI77szOzvn98fzTDI7OzM7u/PUmftzXXMxT73vkM13z7lPuUVVMRgMhmoi4vcEDAaDwWmMsBkMhqrDCJvBYKg6jLAZDIaqwwibwWCoOoywGQyGqsMIm8FgcB0RuVtEVorI7CLXRURuFZGFIvK2iByYc+1cEVlgf84tZzwjbAaDwQv+AEwocf1EYLj9uQj4LYCI9ANuAMYD44AbRKS5q8GMsBkMBtdR1X8Ba0vcMgn4o1q8AvQVkV2AE4DpqrpWVdcB0yktkABEnZh0d2nu3093HTzI9XHaNQlAIhJzfazStBKVuM9zcAj7/6lIwueJGErx+htzV6vqjpW8Y8IJh+nq1evKHW8O0JpzaoqqTunGcLsBy3KOl9vnip0viS/CtuvgQUx97glPxtrQtgSAPXtX9HdcEe3p+QD0Twz2bQ6Okl5EIjbc71kYShCJ7/tBpe9YvXodM175a7njtarq2AqGkwLntMT50vOpYCKhYIfYEL+nQF10pN9TMBiCznIg140bCKwocb4kVS9sYInb4k2r/J4Ga5JL/Z6CYyTbFvg9BUN1MQ04x46OHgxsUNWPgKeA40Wk2Q4aHG+fK0lNCFsWP8Uta7VVhbhFh/o9A0PIEJG/AC8DI0VkuYh8XUQuFpGL7VseBxYDC4HfA5cAqOpa4CfADPsz2T5XEl/W2Pxgh9gQNrQtYfGmVb6tt9VFR25bbzMYaglVPauL6wpcWuTa3cDd3Rmvpiy27Hqb325pVVhtGHfUEFxqStjAf3GrmkCCcUcNAabmhA2CIW7VYrUZDEGkJoUNgpEGEnpxiw417qghkNSssIG/aSBV45IaDAGkpoUti5/BhNBbbQZDAKl5YfNzva0qctuMO2oIII4Im4j0FZEHRORdEZknIoc48V6vCIK4GQwG53DKYvtf4ElV3QvYD5jn0Hs9w+9IaaitNkxOmyFYVCxsItIHOAK4C0BVU6q6vtL3+oFfkdLQW20mp80QMJyw2PYEVgH3iMgsEblTRJrybxKRi0RkpojMXLXS/4L0YvgVKTW5bQaDczghbFHgQOC3qnoAsAW4Jv8mVZ2iqmNVdWyf5mYWfdJlHauvGJe0m5gggiFAOCFsy4HlqvqqffwAltAVJRGxau+DKm5+rbeF3iU1GAJCxcKmqh8Dy0Qk+6/yGGBuV88NbdqRoU07suiTtYEUOD/FLbRWGyaIYAgGTkVFvwXcJyJvA/sD/13ug0ObrBZCRtw6EkpxM0EEQ0BwRNhU9U17/WyMqp5i7yZTNkbcOmJc0u1oZhOafAFNPo9mNvo9HUNICEzlQRjEzWvCarU55Y5mkv9C112Abr4D3TwFXXchmdYXHHm3oboJjLBB8MXND6stlOLmANq+BjbfDqSwdnVrtb5v+S3avtrfyRkCT6CEDYItbmBc0nKp2GpLvVzkgkLqpcrebfAFEZkgIvNFZKGIdEoJE5HdReRZEXlbRF4QkYE5134pIrPtz5e6GitwwgbBjZj6FUwIndXmRBBB24D2Ahcy9jVDmBCROuB24ERgFHCWiIzKu+1mrN3gxwCTgZ/bz56ElUK2PzAe+J5d8VSUQApbliBab16LW5hd0oqstsRYCu81FIX4QT1/r8EvxgELVXWxqqaA+4FJefeMAp61vz+fc30U8E9VTavqFuAtYEKpwQItbGDEDULqklZotUndIKg/GUhg/ZhGrO/1E5Do7g5M0NAVqkmSbQvK+pTBbsCynOPl9rlc3gJOs79/AegtIv3t8yeKSKOIDACOouMmyp0IxfZ7Q5t2ZNGWVSz6ZC1DP9XP7+kA/mzntya5lP6JwZ6MFQQiTWej8XFo6l+gIInDkNhefk+rdpBEd35BDRCRmTnHU1R1Su7bCjyjecdXAbeJyHnAv4APgbSqPi0iBwH/wapLfxlIl5pMKIQNgi1uXpDdkzRU4manfiRiw3v8ComNQGIjHJyUwSVWq+rYEteX09HKGgisyL1BVVcApwKISC/gNFXdYF/7GfAz+9qfgZJmYuBd0VyCGFTwMg0klC6pwWAxAxguInuISBw4E5iWe4OIDBCRrCZdi71JsojU2S4pIjIGGAM8XWqwUAlbliCuu3kZKQ1VIMF0/TAAqpoGLgOewmpEO1VV54jIZBGZaN/2WWC+iLwHfArbQgNiwL9FZC4wBTjbfl9RQuOK5hMk19TL9basS2owhA1VfRx4PO/c9TnfH8DqDpT/XCtWZLRsQmmxZQmS5eZlpDR0HUCM1WbwmFALG9SuuEHIXFKDwUNCL2xQm+IWusRdY7UZPCS0a2z5bBc3S1D8XHfzKg2kGtfbNDUL3fonaP8I6nZGGs9G4iUbMlc+Ztu7aOuTkNmMJA6GxJGIxFwd0+AuVWGx5RIU683LNJBqsdo0OQPd9EtoXwy0QPv76KYb0eRrrk0p0zIN3fhjSP0L0q+jW+5EN/wANfWooabqhA1qS9xC55JSvIZUt/4BSObfbZ93Hs1shq332WNmk+CT0L4Mkv92ZUyDN1SlsEFwxA28W28LBaVKdDIfFTn/Mar51TcO0DaPwqsxSbRo2yRDGKhaYYNgiJuXkdLQW23SXPhm6YtIoVLDCok00rlcEUAg0tv58QyeUdXCBrUjbqFySYtZbQ1nYHXzyCUBDV90aR57gTQUuBBHEiW74hgCTtULGwSjxtRLcQsL+Vab1J8AjV8BmrBcxCZo/LJ13gVE6pA+N4D0BxqARiAOjV81hfchp2rSPcrB7zIsL0qvrKqE+cHvABIdCulFHU6JCNLwebT+JNCtIA1YjVfdQ6KDoXkKpN+FzFaI7Y1Emlwd0+A+jllsdgX+LBF51Kl3uoHfrqlXO16FxSUttNYmEkEivVwXtQ7jxUYhibFG1KoEJ13Rb2NV7QeeIIibcUm3YyoSDE7jiLDZu8mcBNzpxPu8oBbELSxWm8HgNE5ZbL8CrgYyxW4QkYtEZKaIzFy31v/cMghGUMHtNJBQiBvGajM4S8XCJiInAytV9fVS96nqFFUdq6pjm/sFo7V3Fr+sN7cjpaFJAbGtNrfFTds/JrPlD2Q2/twqpcpsdXU8g384YbEdCkwUkSVYW2odLSJ/cuC9nlLt4hZ4XHZJNTUbXX8FtD4Gba/B1j+j6y9H29cXvl/b0ORraPIFs/N8CKlY2FT1WlUdqKpDsPqYP6eqZ1c8Mx+oZnELvNVm44bVpqro5luxakKzHaWToOvRlqmd708vRNeej27+X3TzHej6S8hs+bPj8zK4R00k6HaHahU3qGGXNLMGrM2O8miH1Muobt9xXjWNbvgpsBnYCrQCbdA6DU295ey8DK7hqLCp6guqenJX96VSaZYuCa55X43iFrb1NkeRBEXjWroBXXs+mWw3j/S7QKrAjUm0dbrzc6shRGSCiMwXkYUick2B67uLyLMi8raIvGBnW2SvnSsiC+zPuV2N5YvFlohaBQ9Ll6wOrMD5FTH1QtwCTze77aqm0eRMtPUZtH1F5xvaPyj1NLARNt+Ots0BTVF4b19AW9HMBqvdkaFbiJVtfTtwItbGLGeJSP4GLTcDf1TVMcBk4Of2s/2AG4DxwDjgBpFiHRMsfCupGrqjFRldtGotS5esZvCQAX5NpSR+lGG52YHXyZIrbV8O7UshsgsS3cOB2XWknM2WtX05uuGHtiBlAEUThyNNlyIiaPtadONP6WLjcKy+bw8hva8E2gtcj0P7EnTdBda40eFIryuQup26/wcLCWlNOWnhjwMWqupiABG5H5gEzM25ZxTwHfv788DD9vcTgOmqutZ+djowAfhLscF8X2PLClzQrTfw1jV1O4G3kh9Y1TZLLNZfBZtvhw3XWl1nnUyfKGO9TVXRjT8H3Qi0YAUHUpB80eqIC2jyOUqkV3YkPQfd8juoPxmry0i2pCsBtIOuwRLINKTn2512uxLMMFNPXXRkWR9gQDZP1f5clPey3YBlOcfL7XO5vAWcZn//AtDb3ii5nGc74LuwgSVuuQIXRKpJ3Cpeb2v5C7S9gxVZ3Gr9N70QtjpceFJC3FTb7X0KPqFzT7WkdQ0gPR8ot813qyWIrY9C/TGWwCWOhvhhdHZuMtafPVUyfbOWWJ3NU7U/U/KuF/Lv8//irgKOFJFZwJHAh1i/Scp5tgOBELYsWYELqvXmV1AhcOttrc/QeYG9DZIvolqmdVQuBYIJlsX4Q9h6L4XdRkDbLGuqbXYPBk1C6zNI/eeJ9PoWRBro3LIcIA0Zb/a1qAKWA4NyjgcCHRZEVXWFqp6qqgcA19nnNpTzbD6BErYsQXZPvRY3t4MJPbLatFDUECyRcVjYbHKtNm19EtLvU1hsAGKWlZVeXMGIEUi/A4BERwD1he+JDqtgjJpiBjBcRPYQkThWzuu03BtEZICIZDXpWuBu+/tTwPEi0mwHDY63zxUlkMIGwXZPvY6Yup3j1m1xi42h4I9OdBgiLsSj8l3S5D8pLmoAaagbBBXNRbAaTwLxgyHSH8jdki9uiVpYIs0+o9Zi5GVYgjQPmKqqc0RksohMtG/7LDBfRN4DPgX8zH52LfATLHGcAUzOBhKKEVhhyxJk99RL680tcevRelvT+SB2t1kAYlaL7aZvODq3DuSKW5eCpbD192hkCEjP+6tpbH8ARGLIDr+A+gkg/UAGQP0XkD7Xu7MXQ5Wiqo+r6ghVHaqqWdG6XlWn2d8fUNXh9j0XqGoy59m7VXWY/bmnq7ECL2xZguqe1qK4Sd3O0Pc2aDgdYgdBwyToeysS3dPReXXCFrdUdAyd90bII/MJbLkdel0G9KKjtVUO7bBpMqqtAEikF5Gm84n0u4tIv98TaToTy6MyBJHQCBsE1z2tJnErF4nsgDSegfT5AdL4FSTiUR5idCjEPk0qOpIuxS31T9h0C/S9CXpdDtF96BxgK9alNwXpBejWoqlShgATKmHLEkT3tFrELfAlV4DEhiONZ5Nquhiih1DcGmsHtkLr40QSh0GkL53TNgTqhlI4oyAFrc87OHODV4RS2LIEzT31MqjgZkAhDOJGdChStxuphkmQOILiRTRpaHvbKoNKvUbnnLY0ltVWbK2s3Bw4Q5AItbBBMN1Tr6w3N8QtNMXyYImbRGhLnAB9fkpRt1IG2NUJRa5n1kJ0BJ3FLQKxTzs3X4NnhF7YsgTRegMjbq5jBxTaiEB0NJ0ttwTSeApEdqKwsEUgtg/S6xKs9I7EtueQPkjTeS5N3OAmVSNsEDzrzWtxc5Iwiluq/gu2uMXYtgFy0wVIbLSVX9d0Dh0DDhGgHmk8E6kbhDT/BhrOhPhR0HgO0vd2pC6YzRkMpanKDZO3dQ6xxc3PziFedQex6kqXOLoRc110JO3p+Y69z1WiQ5H0Itoav0w8Yruedbsisj2wEKk/Ho0MQFv+Du1rIDYKafyilb4CSKSPZd0ZQk9VCluWoTv229YWCfwTuLCLWyh2loftlpu9w3xCOkdLJX4gEj/Q02kZvKeqXNFCBMU99Spi6lZHkFC4pFk82vXKEFyqXtiyBCX3zat1t5oNJmQx4lbT1IywZQmK9QbuiVvNR0qz5IibEbjaouaEDYJhvRlx84joUGO91SA1KWxZ/M59M+LmLKopNPUmmnoL1byKAWO91RQVC5uIDBKR50VknojMEZFvOzExr/A7uGDEzRk0NRPWnQebb4LNN8K6r6GpvO65xnqrGZyw2NLAlaq6N3AwcGmBbbUCj5/Wm9sR02oXN82shk03g7ZY+xDoVtAtsPlnhbfKM9Zb1VOxsKnqR6r6hv19E1Z3zJI7yASVarbeqlrcWl+kYEtyBVKvFH7Gtt40vYjWtZeSWXMGmbUXkGl5EtWS+4QYQoCja2wiMgQ4AHi1wLWLsltzrVu3xslhHcfP4EJYxc1NNLMRTf4bTb1CTlPVHDZTuAtHu72LVpH3ts2HLXdDZjkpTZHKrIKtf7AqEwyhxjFhE5FewN+BK1R1Y/51VZ2S3Zqrubm/U8O6il/uaRjFzS2rTVuegnUXwpbfwuZb7bWzdzreFDsApFDTyQjE9iv+8pY/k793QkpbSLVM7Rx8MFSMiEwQkfkislBErilw/RYRedP+vCci63Outedcm5b/bD6OCJtYBXl/B+5T1Qe7ur8t2cayBR85MbTr+OWeGnEDTS+FrfcAKXv9zP5s/m8007r9xugoiB5IhwJ3qYfEkUh09+IDpIvMVzMkU7PM+puDiEgdcDtwItaO72flr8Wr6ndUdX9V3R/4NZCrJS3Za6o6kS6ouFZUrN0s7gLmqer/lPNMPB5l8OD+LM0Rt0HDd6l0Kq7iR93pdnGzBMjJOtMdYkPY0LaExZtWOVZb6nhdafJ5rNhUPgJtMyFxmHUkgva+CtpesTve1kH9sV33UqvbFdLrO5+XiLUTV/uybeKWiA2v6I8SRpKZNid/+Y0DFqrqYgARuR+YBMwtcv9ZwA09HcyJIvhDga8C74jIm/a5H6jq4109OHiw5ZIuXbpmmwUXZIHb1jXEFjiviurdKqIPvLhpC4U3RM5A3lqbSATin7E+5dJwFmz6KR3d0QQkTrY2aslu1pxeVJMCVyeJ7rTEGiAiM3OOp+TtBr8bsCzneDkwvtCLRGR3YA/guZzT9fb708AvVPXhUpOpWNhU9UWK91UuizAKnB/WW9jEDahM4OIHQ/IFOu0hqgrxEmtnZSLx0Zalt+Uua1craYT6U6Dh1I435uxGn+ue1pLIlcFqVR1b4nohjSgWfj4TeEBVc3+rDVbVFSKyJ/CciLyjqouKDRaotkVZgQMC76b6Yb2FTdza0/NZk1zac3GL7We5k+k3QFuxloRj0HCGY7tiSXwsxMdi7edb1/U+oTVuxVXAcmBQzvFAYEWRe88ELs09oaor7P8uFpEXsLIvigpbYEuqBg/uv03oli34KLDBBq8jp24FFYKY5yYi0PtK6HWl1dU2cRz0mYw0nubYHLePFe3e5sd5VQwm2bdLZgDDRWQPsTZkPRPoFN0UkZFAM/ByzrlmESvsLSIDsJa/iq3NAQEWtixhEDivI6e1JW4RJD4W6X050utiJDbCsbk5QlbgjMiVRC2T+DLgKawk/qmqOkdEJotIbpTzLOB+7ZglvTcwU0TeAp7HWmMrKWziR5b1vvuM0Qf//I8eP7906fYE36C5qYtWbRcbL9zTRVucj5gCbGhzthNvtsV4KDrxOkF6u5fkh6saie/7ehdrXl2yzwH76dTnnijr3tH9dqt4PCcJvMVWiCBbcdVkvQXJcgsdOZZcrhVnLDlvCKWwZQm6wIE3a29ui5tTAldz4pbFuKueE2phyxJUgfPSegvLulvNilsWI3KeUBXCliXIAgfuW29G3IKJZlrRzLrOXUNyRc64rI4SqDw2pwhiPpxXeW9hyXXbLm7VG1TQTCts+Y3dOklAeqO9LrZy5wqRkwicmyeXxeTLlU9VWWyFCJoV54X15lbjyiCmgwSazTfbotaGVci/BjbdjKYXdv1snjUHdLLojFVXnKoXtixBEjiv1t7ccE2NuJWHZlZD2zt07hOXgq0lyxwLky90RcTOYFEzwpYlaAIH7ltvYMTNc9pXgxRa6VHIFKsk6iYlhK7WqTlhyxIUgfPCeguTuGX7uoVe4OoGghZquVQHMZe2BMkTuVqmZoUtS5AEDoy4QXVYbxLpBfUn0aH5JRGrAWbDKX5Nq2aoyqhoTwhC66RtkVOX2iG50bhyu7gtAQhWd5ACqGYgPd/qFhLdC4k0OPbuTjR+Fep2gZZHQDdBdF9oOtuxziSG4hhhyyMoAudmWogbKSFutz6CylNCNL0ENv4EaAEEtB1tuhCpP6biuRZCRKD+OOtj8JSad0WL4beL6nZgISyuaXbdDSpzTVXTsPHHoGu37z9KErb8Hk2/78xkDYHBCFsX+ClwbgcWwiJu4MC6W9tsIFXoArRO7/G8DMHECFuZ+C1wYMStoqipFtgRHoAMZDrtFmkIOUbYuolfAufmJs5hEjfoofUW26dI+kU9JAruKWIIMUbYeoifAgfOW29ulGHtEBvieOujLLniVo7ASaQZGk6n496jCYjuDvFDHJ2bwX+MsFVIvsB5gXFNLbobWJDGL0LvH0DsUIjtD40XQJ+fIAUrBAxhxqmd4EtuXV8LZAXOK+vNuKbb6Y71JvExSJ+rkD43IPXHIhJzfD6GwnSlEyJynoisEpE37c8FOdfOFZEF9ufcrsaqWNjK2bq+lvBD4MAd1xTCJW7VULFQrXRDJ/6qqvvbnzvtZ/th7Qo/HmtH+RtEpLnUeE5YbNu2rlfVFJDdur6m8XL9Lazi5qbAVUW9aXVRiU6cAExX1bWqug6YDkwo9YATiwtlbV0vIhcBFwHsustuDgwbfLysYnCrHMutKgXA8UqFXJyuWqhFkm3p7vxSGyAiM3OOp6jqlJzjsnQCOE1EjgDeA76jqsuKPFtSRJwQtrK2rrf/kFPA2n7PgXFDQ77AuVmi5UY5lhs1puBOGVYuWdfUjZrTWiARiW77uy+D1V1sv1eOTvwD+IuqJkXkYuBe4Ogyn+2AE65od7aur2m8Wn8Lq2vqFt1NDTG4Qpc6oaprVDVpH/4e+HS5z+bjhLCVtXW9YTterL+5FTV1S9zcynfLkh9cMALnOV3qhIjkujITsXaMB2v3+ONFpNkOGhxvnytKxcJWbOv6St9b7XiV/+aG9RaW3bAKYaKn/lBMJ0RksohMtG+7XETmiMhbwOXAefaza4GfYInjDGCyfa4o0mlLMA/Yd58x+uCf/+H5uEFl6dI12767tf62aJX1c+BkG6RFW5xdc8uyoW0J4Fxvt1K0p6tzl6yGxH6vd7Hm1SX7jNlPpz72dFn3jh68c8XjOYmpPAgAXlhvbllu2TIsJ3E7JSQX455WJ6aWJEBsi566lBriakqICxFTcDclJEt+9BSqz4KrNYzFFkDCar1BONfdspj1t+rBCFtAcTs1JKzi5qXAGfc0vBhhCzhuWm9hEzcvrTcwAhdmjLCFADettzCJG3jrmmYxAYbwYYIHDrNq+Rqm3jSN+a8toC5ax/iTPs0XLj+RRGOi64fzWDJnGU/c9SyfLFnF4L12Y8IFx5CORh0vy3IjqOBWGRa4t+VfKUyAIVwYi81Btmzcyk3n3cbcl+eTTreTbE3xn2kzuP3b93T7XXNfWcCvLr6D2f+ex8plq3n9mbe56dzb0M0txnqz8ct6MxZc8DHC5iAvT5tJqrWN3KTndFuaZe9+yAdzl3frXX+98WHrXfaxqpJsTfH3Xz0KuLf2ZsStPIzABRsjbA6y9N0PSSXbOp0XET5+f2XZ72lLpVmzfE3Ba0tzBNKIm4UXtabFMAIXTIywOcjAEbsQS3RuNa2qfGpI+etAddG6gu8BaNqhqcOxW4GFsIkb+Ge9gRG4oOGLsKVaUiyd96EfQ7vKoZPGEYtHkZz2UdFYlF2H7czuowaVeLIjkYhw+OkHE6/vKG7x+jjHnnNEwWfcsN7CKm5+WW9gBC4o+CJssfoYg4bvzNJ5Hxb8hJWmHRq5+g+XMfKgYYgIsXiUcScewLduvwAp1CqvBJMuncBBJ+xPLB6lvqmeWDzGkV/8DJ/94qFFn3FL3LLtjxx7pwtb/eXjp/UGRuD8xpfuHqNH7asP/t8jBa8tW/Bxp3OD9w5fK/Hs/9buClo+Wze2sO6TDfTfrZn6MlNG3OoWEqYOIVmynULAm7SQYmS7iIA3aSK13t0jcHlsg4bv3OlcISsu6GJXqaBlaezTQGOfhm4941Yrcrfajju9p0IuXhbTlyJrvQGsSVZnq6QgEYrgwaDhO3f4AFXjvrqJWXfbjtf1pqXIL9UybqrzhELY8jFCVz5G3LbjR71pKcw6nHuEUtjyMUJXmjCJmxuNK/MJkvUGRuDcoCqELZ+uhK4WcSPfzc3dsNyMmELwrDeofoETkQkiMl9EForINQWuf1dE5orI2yLyrIjsnnOtXUTetD9dbhZVlcKWjxG57ThtvYVpq79CBE3coDoFTkTqgNuBE4FRwFkiMirvtlnAWFUdAzwA3JhzrUVV97c/E+mCmhC2XIzIGXHLx++k3mJkBa5KAg3jgIWqulhVU8D9wKTcG1T1eVXdah++grV/aI8IXLqHl+Smlixb8HEHcXMrnaQtlebVR19n1nPv0NinkcNPP5gRB+7pylilGDy4v6PpIG6kgoD76SC55O5MD/7mveXjR9ukVCrdnV9WA0RkZs7xFFWdknO8G7As53g5ML7E+74OPJFzXG+/Pw38QlUfLjWZioRNRG4CPg+kgEXA11R1fSXv9AsvRK4tleZ/LvgdH7//CcnWFADv/Hsen7vwGI4/57OOjNEdjLh1Jih5b8XwUuAS0eg2a7wMVneRoFsos7NgdYCInA2MBY7MOT1YVVeIyJ7AcyLyjqouKjZYpa7odGC07RO/B1xb4fsCQTF3tVJef/qtDqIGkGpN8dgd09myYWuJJ90jTG6pF0GFLEGLnOYTwnW45UBuwfRAYEX+TSJyLHAdMFFVk9nzqrrC/u9i4AXggFKDVSRsqvq0vcMzVOgTBxUnBe7N52d3ELUsdbEoC2e93+P3VkpYxA28W3eDYEZO8wnROtwMYLiI7CEiceBMoEN0U0QOAO7AErWVOeebRSRhfx8AHArMLTWYk8GD8+noE3dARC4SkZkiMnPdOvd/KJ0m14rracChV3MTUqjWSqGhd/fKppzGiFtxgm69Zcm14oKGbQBdBjwFzAOmquocEZksItko501AL+BveWkdewMzReQt4HmsNbaSwtZlEbyIPAN0LuCE61T1Efue67B84lO1jKr6UkXwYSK3YL+cdbgP5i7nlm/8jlRrx2aUOwzow88eu5ZIxP8gdbaA3unieSfX3La/YEbMAAAZgklEQVS91+UC+kJki+qDtvaWzy6NIyouSh89ej998IEny7p35N67BqoIvst/Sap6rKqOLvDJitq5wMnAV8oRtWqiu27q7qMGctp3Pk88EaO+qZ76hgTNO/Xl8tsvCISogXtVCtVguUF4rLdap9Ko6ATg+8CROfknNUdW3HKjqcUsuMNPHc9BE/Zn8VsfUN+UYMjowUQiDrUCcQino6VgR0wdjpaCtxHTLEGPnBoqX2O7DegNTLd94t85MKfQUq4FV9+YYNQhI9hzzO6BE7UsYbPcvIyYZglqYq+h8qjoMFUdlFPqcLFTEwsz+QIXVsIkbuCPawrBLMuqdYKxsFOl5EdRS5Fpz9CWSpe8xw+MuJWHsd6ChRE2DyjlnrZsbuWeH93PFYf9iO8c9kNuPPc2lr3XKW/RV4y4lY8JLgQDI2weUcw9ve3yu5n17Duk02kyqiyZu4xbLryD9as2+jXVgri1h2m1iptxT/3FCFsJMu3tzHjqTX5/9R/5v/+ayuK3P6j4nbni9toTb7JiwUek2zq6oOlUmvt++ncev/NZFs5aQlCSaMKUxAveNa4shrHe/KOmu3uUItPezq2X3skHc5eTakmBCK8/8zYnXXgcx51zZNcvKEFW3Oa9sqDg9XQ6zbxX3mPuf+Yzvf4FRhw0lG/cdA6ROv9/D4WlcL7DGE07sugT75N5waSG+IX//1ICwMyn3+InX/ofvnfMf3H75Xfz4YKPePO52dtFDUCVttY2Hr3jaTat3ezIuPseNoL29kzBa5lMBkVJtqZ4b8YiXntiliNjOkHWcnMKty038Nc1BRNc8JqaF7Zn7/sXf/rJA3y8+BO2btzK3Jfnc/PXf8PL/5i5XdRyqIvWseD1ot1SusUue3yKkQfuQbQLSyzZmuI/02Y4MqZTZNuMO0UtiBsY99QralrY2lJpHrtjOm15HTdSrW18snR1wYJ1Eahvqu/2WPNefY87rrqXWy66g3/+7T+0Ja0xL7zxqxzz5cPo1StBNBotWlpVsHg+D1VY/PYH/GfaTJbMWebJ2pwRt+5jggvuU9NrbOs/WV+4050qyZYU0XiUtmTHgvW6aB0jxw3r8t2rV6zhiTufZcHM98lkMmxau3lbkOCDecv4z8MzuOqeS4jFY0y8ZAITL5lAJtPO90/8OVs3dqxOS9TH+cykg0qO17K5lVsvuZOP3/9k27ndRuzCt379dRJl7iDfXVwrvfJizc3jMqxCBLljb9ipaYutd//eZIqsce28+06cesVJRONR6psS1DclaOrbyGW//jp10bqS712zYi0/P/tWXn1sFms+Wsu6T9Z3iHy2tbaxctlqZj75VofnIpE6Lr7xbOL1MWKJGJFIhER9nL0PGcFBE/YvOebf/t8/+HDBCpKtqW2fpfM+5KFbi3aScoSwbO3XaQyfyrDyMdabO9S0xVbfmGDc5w5kxhOzOlhmsfoYJ15wNHuNG87Y4/dj4az3iTfEGfHpPYnUlRY1gCfuepbklhSaKSyaAKmWFG//aw6HTOzY6WXofkP472nX8MYzb7Pi/VWMPfEA9hg9mFKeqCq89vgbZPLGS7elee3xNzjzmlO6nHMlhNVyg2BZbwCLNy0BjPVWKTVtsQF86epJHDJxLNFEjGgsSu9+vfjKD09jr3HDAWjs08iYI/dhr3HDyxI1gAVvLC4pagASidC7X6+C1xp6N3DoF8ZzxndPJhqtY9m7pcuxFry+qJOoZUm3tZc150oJq+UGwVh3y2KCC85Q0xYbQDQW5UtXn8KpV5xM6+ZWevVtRCrsjdZ3p76sXl76H0k0Vsfhpx3c5bsGDd95WzukYq2QnvvLi0Wf32OMuzsZ5ZK13Jyk1iw3MLlvTlDzFluWWNyy1ioVNYATzvsssfp4p/MSiVDflCDeEOdL3z+FQSPL2/2qq04hG0vk1R1xetfi6SROp4FAbVpuYKy3SjDC5gKjDhnJ6d89mfpe9SQa4kRjUfY7ah+u+N2FfOPmc/nl0z/ikM93r4tyKXEbc/jexOKdje94IsboQ/fq2R+iQoy4OUN+cCHMAiciE0RkvogsFJFrClw/QkTeEJG0iJyed+1cEVlgf87taqyad0XLZfZL7/Lo755mzYp17Dp0ZyZdNoE9x+xe9P7DvjCeg0/+NKs/XEvv5iaadmiqeA7F3NIjzvgMLz38GhvXbNrW+iheH+eUb53oWqpHKdwIJoC3bingWxlWIcLunopIHXA7cBzWVnwzRGRa3qYsS4HzgKvynu0H3IC1r4oCr9vPris2nrHYymDG029y5zV/Ytm7H7J141YWzlrMrZf8ftuWeW2pNmY8OYtpv3nSirCmrAhrNBZl5yE7OSJqWXI3ds7S2Luea++7ghO/fgxDRg9mvyP34ZJffY3PfvEzjo3bXdzqBuKV5QbBs94g1O7pOGChqi5W1RRwPzAp9wZVXaKqbwP5kbATgOmqutYWs+nAhFKDGYutC1SVh371GG15O0u1Jdt46NePc+Evz+amr91Oy8YWki0pEg1xHr7tCb73h0vpu+MORd+7fuUG3nxhNpqBMUfsTf9dy7cKss0rc622xt71TDj/aCacf3T3/5Au4UYwAbZbbl4QpKBCFq+st7ZkW3d+MQ0QkZk5x1NUdUrO8W7Aspzj5cD4Mt9d6NmSC9RG2Log1ZIqWvS+YuHHTL3pETas2rQtvSPZkiKVTDP1pke46MZzCj738rQZ3P/Lh0EhoxkevvUxJl46gWO+ckTZ8yokbkFk8OD+LHXYJQX3NocpOFYAxQ3cz32Lx6PdaXiwuovt9wplYpZb9NftZ40r2gUtW1qL5q/tMKAPs198t1POmmYyzP73vILPrF+1gft/8RDpVJp0W5pMOkO6rZ2Hf/0En3ywsuAzpQjLngpOu6TgbhfeTmMF0C3NEhL3dDkwKOd4IFBuq+huP2uErQT/+O1T3DDpRlQ7J79G41FOuvDYgr9KoHjR+tsvzCWd7pw0m2nP8PS9/+zW/MKyYYxb621ZjLiFojRrBjBcRPYQkThwJjCti2eyPAUcLyLNItIMHG+fK4oRtiK88+95PPeXF0m3pWkvlL2vyoiDhrL/UaOJRDv+b4xEI+x/1OiC792wamNRI/r9HnTorXVx8zKYAMGpMS1GrsAFCVVNA5dhCdI8YKqqzhGRySIyEUBEDhKR5cAZwB0iMsd+di3wEyxxnAFMts8VxRFhE5GrRERFxP0FD4/459/+U7Af23aEfz/4Cmd8bxL9d+lHojFOpC5CojFO/136ccb3JhV8auDI4mtNWza18M6/5pLJdK8MqlCkNIg43aAyi9fiBsG23oKKqj6uqiNUdaiq/sw+d72qTrO/z1DVgarapKr9VXWfnGfvtrf7HKaq93Q1VsXBAxEZhJWbsrTSdwWJls2tJa+n29KsWPgxvfo2cf0D32XOS+/x8fsr2XmPndjn0BFEIta6XHu6ndkvvsvKpavZddjOjBw3jEg0Qibd2b3dvG4z9/zwL/T9VF+uuuubNPZpLHu+YQkmAI7nt4F3OW4dxgxoUMHgTFT0FuBq4BEH3hUYDjxmXz5876NO/diyRBMxhuxj1WFGInXse/je7Hv43h3u2bB6Izef/xu2bNhCWzJNLB6leZdmPnfhsTx59/Ok89+tVlR15dLV3HrZnXzxqknsse/gsppMZgm6uLmVvAtG3AzbqcgVtX3jD1X1rTLuvUhEZorIzHXrgm++H3bqeHYc1J94Q4GaTxES9TEOPaV088c///eDrF+5geTWFJn2DMmWFKuWrWbtR+u5+OZz2OvgEQWf00yGZfM+5NeX3ckdV/2xbNe01tfbwLilBosuhU1EnhGR2QU+k4DrgOvLGUhVp6jqWFUd29wc/N9siYYEV997GWdc+XlGH743A0fsSn2vemL1ccZ8dhRX//GykhUFmfZ25v5nfqdGlu1t7bwx/S32PngEl/7qvJJF96mWFPNnLOTVR8vfyKXW19vAP3ELclCh1ujSFVXVYwudF5F9gT2At2xXaSDwhoiMU9WPHZ2lT8TiMT4zaRyfmTSuR88X23NAM9aFSF0de48fxrxXFxbt35ZqSfHyP2Z0akhZilpfbwN/3FIwrmlQ6LErqqrvqOpOqjpEVYdgJdEdWC2iVg6b1m7itcffYNazb5NsSXa4FqmrY+RBQztZZJFohP1yUkG+fN1p9Onfi1h9rOg4WsauLKnWFA/d+jjfP34yVx39Yx77/XTmvVp439Kg4HZ+W9Zy8xrjmvqPyWPrIc/f/yI//PwvuP8XD/GnyQ9w7Qk/5d3XFna45yvXnUbv5iYS9jpdoiFO8059OfWKk7bd0/ypvvzXw1dz1rVfKLieF2+I85mJpdfyVJXbL7+bF/76EpvXbaFlUwtz/jWXe2/4K6nWwsGPoOCmSwreVid0GNeIm684Jmy25eb9T5APfLjgIx657UnSqTTJlhStW5MkW1JMuereDpZbv12amfzI1Xzp+6cw4WtHc/aPTuf6B66kd3PHluCxeIzxn/s0l/366yQa4pb1JrJtn4XxJx1Ycj5LZi9l6bsfkk5t3zAm056hdeNWnr73BUf/7G7gRnPKfIy41RamCL4HvPLY64X3EhCY89J8Djx2zLZTsUSc8Sd9uqz3Dt1vCD999Fpen/42m9dvYfiBezJ0/yFdpnssf++jbet2uaRaUqxY9IlZb/NpvQ3MmptfGGHrAamWwjtQqVI0761cGvs0lrUXQi4DBvYjUtdZ/GL1MYbtO6jAE8HDzfw28F/cIFiNK6sds8bWA/Y/anTB9bBMe4a9Dx7eo3eu+2Q9U296hJ+deQu/u/JeFnejbnSvg4bRp38fInU5f51iNbrMurFBz20Db9bbwB+3FIxr6iVG2HrAXuOHM/qwvbaJm4gQS8SYeMkJ9Onfp9vvW71iDT8761e8+OArrFj0Me/8ey63Xvp73pjeZd6zNX4kwpV3XsyoQ0YQqYsQqYuw+6hBXHmnVZYVlty2LG6utxlxqw2MK9oDRITzf/Zl5r3yHrOem028PsbBJ3+67F2n8nnsjmdo3ZLc7t6qtVv8X298mP2PGb2t7rQUvfv15pu3fI22VBuZ9gyJho57HYQlt81tlxT8dUvBrLt5gRG2HiIijDpkJKMOGVnxu+bPKJygm2xtY93HG7rVNjwWL54PB+7WkiZbUrw+/W2Wv7eC3Ybtwtjjx/RoMxm3Worn4mV78YLjG3FzFeOKBoBiO8Jre4bGPg2OjeOmS7pu5QZ+fOpN/O2mR3jhry/xwP+bxvWn3Mjaj9b36H1epID4leO2bXzjlrqGEbYAcOxXj+wUjIjG6hh9xCgaejknbFncCCRMvfERNq3dTLLV6mGXbE2xZcNW7r/x4YreWwviZmpMnccIWwAYe/x+HHfOkcQSMeqbEkTjUUaOG8ZXrz/D8bHcstrmvDSfTJ47nclkmPfy/KI1s13hdpQ0Fz/FDYz15jRmjS0AiAifu+BYjv7y4XyyZCU7DOhD3506bt2XaW9nzkvzWb9yA0NGD2bQXpWtkzm91hapE0h3Pi9S2e9Ot3a5ysXvYMK2eZh1N8cwFluAqG9MsPuoQZ1EbfWKNfzo87/gnh/9hQd+9Sj/78Lf8tvv3EN7gU1hysENq+3A4/YjGu34ezIareOAY/elG30yi+KFSwrGcnMTEZkgIvNFZKGIXFPgekJE/mpff1VEhtjn+4vI8yKyWURuK2csI2wh4O4f/IUNqzeR3JoinUzT1trG/BmLeP7+Fyt6r5Nrbad/9/N8asiO1DckiMai1Dck2HHQAL74vYkVv9srl9SIm3uISB1wO3AiMAo4S0RG5d32dWCdqg7D6sz9S/t8K/Aj4KpyxzOuaMDZuGYjH773UafWRW3JNl566DWOPfvIHr130PCdWbbAuQ5Tjb3rufa+b/PezEV8/P5KPjVkR0YeNIxIxAFzDW9cUgiWWwpVVYY1DlioqosBROR+YBIwN+eeScCP7e8PALeJiKjqFuBFERlW7mBG2AJOezoDRcShYCF+N3FyrS0SEfYaN4y9xpX989dt3EzczeJ3jlsufq67pVpSTlr1uwHLco6XA+OL3aOqaRHZAPQHum1CG2ELOH132oG+O/Vh9bKOCavRWJSxJ+xX0budttrcxovE3SxDd+zHIp+ttm1z8UncYvWx7qzHDhCRmTnHU1R1Ss5xod/O+fHycu4pC7PGFnBEhPN/ehb1jQmiCauqINEQZ8DAfhx/3lGOjBGGAvksXiTu5uL3eluWEKy7rc7uaWJ/puRdXw7ktpoZCKwodo+IRIEdgB79gY2whYDdRw3ixw9dzcnfOI7DTz+Ys647jWvv+zYNTfUVvztsBfJZvBC3oAQTsoRA3EoxAxguInuISBw4E5iWd8804Fz7++nAc1pOX/wCGFc0JPTu14vjvtqzQEE5hKFAPovnLmkAggnb5hPSXDd7zewy4CmgDrhbVeeIyGRgpr0b/F3A/4nIQixL7czs8yKyBOgDxEXkFOB4VZ2bP04WI2yG0K21gXdRUgimuEH4Iqaq+jjweN6563O+twIFy23sDaPKxriihm2Eaa0ti1frbUFzSyH0rqmrGGEzAOFca/OylhT8286vFEbcCmOEzdCBsFltXkdJ/e4GUggjbp2pWNhE5Ft2/dccEbnRiUkZ/CGMVlsWL8UNguWSghG3fCoSNhE5CqsMYoyq7gPc7MisDIZu4JdLasQtuFRqsX0T+IWqJgFUdWXlUzL4TdjcUfDHJYVgiltW4GqZSoVtBHC43WLknyJyULEbReQiEZkpIjPXrTO/UYJKmN1R8NYlDaq4GcoQNhF5RkRmF/hMwsqDawYOBr4HTJUi25ar6pRsuUVzc/CiS4aOhNVq8xojbsGkS2FT1WNVdXSBzyNYtV0PqsVrQAbwP4PRUBHGauseQUwDqXUqdUUfBo4GEJERQJwetBgxGJwia7X5IW7GagsOlQrb3cCeIjIbuB84t6dFq4Zgkd1gOYz44ZJmMeIWDCoSNlVNqerZtmt6oKo+59TEDIZK8cslNeLmP6bywFASY7V1DyNuwcAIm6EoYQ8ieJ3blsWIm/8YYTNUPUbcag8jbIYuCas7Cv4GEkwaiH8YYTOUJOzuKPjnkoJJA/ELI2yGmsEvcQPjknqNETZDl4Q5py1LEFxSI27eYYTNUFP46ZJCbYubiEywezcuFJFrClxPiMhf7euvisiQnGvX2ufni8gJXY1lhM1QNsZqq4xaFjcRqQNuB04ERgFniciovNu+DqxT1WHALcAv7WdHYe1YtQ8wAfiN/b6iGGEzlEU1BBHA30AC1HSkdBywUFUXq2oKqwRzUt49k4B77e8PAMfY3YImAferalJV3wcW2u8rii/b782ZN3v1yLFDP+jh4wPwt9Dez/HN2Gbsctm90sHnzJv91MixQ8vt1lMvIjNzjqfk7Qa/G7As53g5MD7vHdvusfch3QD0t8+/kvdsyU1wfRE2Ve1xi08RmamqY52cT1jGN2Obsb1EVSc4+LpCfRrzG2YUu6ecZztgXFGDweAFy4FBOccDgRXF7hGRKLAD1o7w5TzbASNsBoPBC2YAw0VkDxGJYwUDpuXdMw041/5+OvCc3QZtGnCmHTXdAxgOvFZqMF9c0QqZ0vUtVTu+GduMHUrsNbPLgKeAOuBuVZ0jIpOBmao6DbgL+D8RWYhlqZ1pPztHRKYCc4E0cKmqtpcaT0xfSIPBUG0YV9RgMFQdRtgMBkPVEVphE5Fv2eUVc0TkRh/Gv0pEVEQ825VLRG4SkXdF5G0ReUhE+nowZskyGBfHHSQiz4vIPPvv+NtejZ0zhzoRmSUij3o8bl8RecD+u54nIod4OX41EEphE5GjsLKRx6jqPsDNHo8/CDgOWOrluMB0YLSqjgHeA651c7Ayy2DcIg1cqap7Y+1be6mHY2f5NjDP4zEB/hd4UlX3AvbzaQ6hJpTCBnwT+IWqJgFUdaXH498CXE0XSYJOo6pPq2raPnwFK5/HTcopg3EFVf1IVd+wv2/C+sddMtvcSURkIHAScKdXY9rj9gGOwIoQZjdMWu/lHKqBsArbCOBwuwPAP0XkIK8GFpGJwIeq+pZXYxbhfOAJl8coVAbjmbhksbs8HAC86uGwv8L65ZXxcEyAPYFVwD22G3yniDR5PIfQE9g8NhF5BihUeX0d1rybsVyUg4CpIrKnU3uadjH2D4DjnRinu2Or6iP2PddhuWr3uTWP7HQKnPPUShWRXsDfgStUdaNHY54MrFTV10Xks16MmUMUOBD4lqq+KiL/C1wD/MjjeYSawAqbqh5b7JqIfBN40Bay10Qkg1UwvMrNsUVkX2AP4C2r6QADgTdEZJyqfuzm2DlzOBc4GTjGg82pu13K4iQiEsMStftU9UGvxgUOBSaKyOeAeqCPiPxJVc/2YOzlwHJVzVqnD2AJm6EbhNUVfRg4GkBERgBxPOjAoKrvqOpOqjpEVYdg/RAe6JSodYWITAC+D0xU1a0eDFlOGYwr2O1q7gLmqer/eDFmFlW9VlUH2n/HZ2KV9nghatg/S8tEZKR96hisjHtDNwisxdYFdwN3i8hsIAWc64H1EgRuAxLAdNtifEVVL3ZrsGJlMG6Nl8ehwFeBd0TkTfvcD1T1cY/G95NvAffZv0wWA1/zeT6hw5RUGQyGqiOsrqjBYDAUxQibwWCoOoywGQyGqsMIm8FgqDqMsBkMhqrDCJvBYKg6jLAZDIaq4/8DfJoY2W2/79AAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"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.0"
}
},
"nbformat": 4,
"nbformat_minor": 1
}