aboutsummaryrefslogtreecommitdiff
path: root/logistic_regression_notebook.ipynb
diff options
context:
space:
mode:
Diffstat (limited to 'logistic_regression_notebook.ipynb')
-rw-r--r--logistic_regression_notebook.ipynb706
1 files changed, 0 insertions, 706 deletions
diff --git a/logistic_regression_notebook.ipynb b/logistic_regression_notebook.ipynb
deleted file mode 100644
index b56ea55..0000000
--- a/logistic_regression_notebook.ipynb
+++ /dev/null
@@ -1,706 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Logistic Regression\n",
- "\n",
- "Logistic regression is a *binary classification algorithm*."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Text(0.5, 1.0, 'Data')"
- ]
- },
- "execution_count": 1,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "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": [
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "%matplotlib inline\n",
- "from sklearn.datasets import make_blobs\n",
- "from sklearn.model_selection import train_test_split\n",
- "\n",
- "\n",
- "# create linearly separable data\n",
- "sep = False\n",
- "while not sep:\n",
- " X, Y = make_blobs(n_samples=200, n_features\n",
- " =1, centers=2, cluster_std=0.5, center_box=(0, 10))\n",
- " sep = True\n",
- " for x_1 in X[Y == 1]:\n",
- " for x_0 in X[Y == 0]:\n",
- " if Y[X.argmin()] == 0 and x_0 > x_1:\n",
- " sep = False\n",
- " elif x_0 < x_1:\n",
- " sep = False\n",
- " \n",
- "X = np.hstack([X, np.ones((X.shape[0], 1))])\n",
- "\n",
- " \n",
- "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33)\n",
- "\n",
- "plt.scatter(X[:, 0], Y, s=10, c='b')\n",
- "plt.xlabel('feature')\n",
- "plt.ylabel('groups')\n",
- "plt.yticks([0, 1])\n",
- "plt.title('Data')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Binary target\n",
- "\n",
- "### Sigmoid function\n",
- "\n",
- "We have to fit a **model** trough our data. \n",
- "The *sigmoid* (also called *logistic*) function is used:\n",
- "$$\\boxed{\n",
- "\\sigma(x) = \\frac{1}{1 + e^{-x}}\n",
- "}$$\n",
- "\n",
- "It produce an 'S' shape like function that stays between 0 and 1"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "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": [
- "def sigmoid(x):\n",
- " return 1 / (1 + np.exp(-x))\n",
- "\n",
- "xs_sig = np.linspace(-7, 7, 100)\n",
- "ys_sig = sigmoid(xs_sig)\n",
- "plt.plot(xs_sig, ys_sig, label=r'$\\sigma(x) = {\\frac{1}{1 + e^{-x}}}$')\n",
- "plt.yticks([0, 0.5, 1])\n",
- "plt.xlim([-7, 7])\n",
- "plt.legend()\n",
- "plt.grid()\n",
- "plt.title('Sigmoid function')\n",
- "plt.show()"
- ]
- },
- {
- "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": [
- "# helper function for approximation\n",
- "def sigmoid_mu_s(x, mu, s):\n",
- " return 1 / (1 + np.exp(-(x + mu) / s))\n",
- "\n",
- "plt.scatter(X[:, 0], Y, s=10, c='b', alpha=0.5)\n",
- "sig_x = np.linspace(X[:, 0].min(), X[:, 0].max(), 100)\n",
- "y_flip = 1 if Y[X[:, 0].argmin()] == 0 else -1\n",
- "sig_y = sigmoid_mu_s(sig_x, -X[:, 0].mean(), y_flip * 0.5)\n",
- "plt.plot(sig_x, sig_y, c='r')\n",
- "plt.yticks([0, 0.5, 1])\n",
- "plt.grid(axis='y')\n",
- "plt.title('Approximation')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Hypothesis and Prediction\n",
- "\n",
- "We can tweak the sigmoid function by passing the dot product of $x$ (vector of feature) and $\\theta$ (the vector of weights).\n",
- "\n",
- "$$h(x) = \\sigma(x \\cdot \\theta) = \\sigma(\\theta_0 x_0 + \\theta_1 x_1 + \\cdots + \\theta_n x_n)$$\n",
- "$x_0$ being equal to 1. \n",
- "$\\theta$ is not a parameter of $h$ because it's considered as a constant.\n",
- "\n",
- "$h$ is our hypothesis function. It return a probability of an $x$ to belong to one of the group. \n",
- "To predict some new $x$ we input it to $h$ with the weights and see if the returned value if above or below 0.5.\n",
- "\n",
- "$$\n",
- "\\text{prediction} =\n",
- " \\begin{cases} \n",
- " 1, & h(x) \\ge 0.5 \\\\\n",
- " 0, & h(x) \\lt 0.5\n",
- " \\end{cases}\n",
- "$$\n",
- "\n",
- "This is equivalent to:\n",
- "\n",
- "$$\n",
- "\\text{prediction} =\n",
- " \\begin{cases} \n",
- " 1, & x \\cdot \\theta \\ge 0 \\\\\n",
- " 0, & x \\cdot \\theta \\lt 0\n",
- " \\end{cases}\n",
- "$$\n",
- "\n",
- "Indeed, in the sigmoid funcion: \n",
- "* $x$ is *above* 0 then $e^{-x}$ tend to be small, $\\frac{1}{1 + \\text{small number}} \\approx 1$. \n",
- "* $x$ is *below* 0 then $e^{-x}$ tend to be big, $\\frac{1}{1 + \\text{big number}} \\approx 0$. \n",
- "\n",
- "Therefore, a prediction can be visualized by projecting $x$ onto $\\theta$. \n",
- "It will be more relevant the more the two vectors go in the same direction\n",
- "(or opposite direction for negative projection),\n",
- "for exemple if $x \\cdot \\theta = 0$ then $x$ is perpendicular to $\\theta$,\n",
- "$h(x) = 0.5$ right in the middle of the sigmoid function,\n",
- "the prediction become more irelevant as $x \\cdot \\theta$ tend to 0."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "def hypothesis(x, theta):\n",
- " # suppose that x_0 = 1 and isn't mentionned\n",
- " return sigmoid(x.dot(theta))\n",
- "\n",
- "\n",
- "def predict(x, theta):\n",
- " return int(hypothesis(x, theta) >= 0.5) # a bit more clear\n",
- " # or\n",
- " return int(x.dot(theta) >= 0)\n",
- " # there is a nice vector interpretation for this one\n",
- " # and it probably compute faster"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Cost function\n",
- "\n",
- "We have to evaluate our model by introducing a cost function, this one is called the *logloss*\n",
- "\n",
- "For a single $x$:\n",
- "$$\n",
- "j(h(x), y) = \n",
- " \\begin{cases} \n",
- " -\\ln(h(x)), & y = 1 \\\\\n",
- " -\\ln(1 - h(x)), & y = 0 \n",
- " \\end{cases}\n",
- "$$\n",
- "It can be rewritten as a single continuous function:\n",
- "$$ j(h(x), y) = -y \\ln(h(x)) - (1 - y) \\ln(1 - h(x))$$\n",
- "\n",
- "Even if it may seem more complicated at first sight, it's just a switch with the values of $y$. \n",
- "- if $y = 1$ then $- (1 - y) \\ln(1 - h(x)) = 0$ and the $-\\ln(h(x))$ stays.\n",
- "- if $y = 0$ then $-y \\ln(h(x)) = 0$ and the $-\\ln(1 - h(x))$ stays."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "image/png": "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9OkDHtcfX19flixZwquvvtrvazGKuU0fubTIBbB7927mzp3b93rbtm0sWbJkWOdasGABkZGRjiqtX8XFxUycOJG77rqL7OxsLrroItrb2/vef/HFF7nyyiv7Xufn51NZWcmCBQtISUnh008/7fe4xYsX88knnwDw85//nO9+19iq9KqrruLFF1/sO+7U12KUcmAfudMmBIHc7HQ1D7yzh73lzQ4956SEUO6/PPvsx0yaRFFREVarFYvFwg9/+EMeeeSRk4654IILaGlpOe1nH374YZYuXerQmgfj4MGDvPzyyzz11FOsWLGCN954g5tvvpmuri6KiopITU3tOzY/P5+bbrqJNWvW8NZbb/Hiiy+yYMGC04574IEH+J//+R+qq6vZvn07b7/9NgA5OTls3ry577hTX4tRyoFdK04Ncn8fi8zsFHh5eZGdnc2ePXs4ePAgY8eOZcaMGScds3btWqddf+nSpVRWVgInr0f+61//+qQW84nS0tKYNm0aALm5uRQXFwNQW1tLeHh433Hd3d3U1dVx33339b0ODw8/7Tgw/prQWvPII4+Ql5fX1+VisVjw9fXtm3V66msxSjlwHLm0yD3IQC1nZ5o9ezbr16/nL3/5S7993M5skfd2dcDgp+j7+R3/k9disfR1rQQEBJw0I3Lfvn1MnTq17/8cdu7cSU5OzmnHAezatYuKigqioqJOq6GzsxN/f/8zvhajkNv0kcvwQ2E3e/Zsfv7zn3P11VeTmJh42vtr165lx44dpz0GG+JLliyhrKzM0WWfJiIiAqvV2hfS+fn5TJ16fE25nTt3MmXKlNOOq6io4KabbmLlypUEBwef9H9mdXV1REdH9y1gdeprMUq5zzhyudkpDBMmTMDPz4+f/vSn53SeG2+8kTlz5lBQUEBSUhLPPPMMNpuNwsJCp98E7XXRRRexbt06wAjyKVOm9L23e/fuvqGRvccdO3aMa665ht///vdMnDiRX/ziFzzwwAN9P7N69Wouu+yyM74Wo5DNCtYuh7XI0Vo7/JGZmam11vqhD/frtP98V9tsNi3MsXfvXrNL0Fprfc899+jnnnvOKefetWuXvvfeewd1bHNz8zlfb+vWrfrmm2922HFXX321LigoOONrZ3GVz4ZH6mzT+v5Qrdf+oe9bwBY9zMx1eovcpqHbOvC+oGJ0OnToEBMmTKC9vZ3bbrvNKdfIyck5bRSMM82YMYPFixefdaLPYI/r6uriqquuIjMzs9/XYpTqcdzuQODkm53hgUYfX8OxLuJC5caNJ0pPT2f//v1ml+Fwd955p0OO8/X15dZbbz3jazFKHaszngMiHHI6p7bIEyMCAChtaB/gSCGE8CCNR43n8GSHnM6pQZ4QbgR5WaMEuRBC9GkqMZ7DkhxyOue2yO1BXi5BLoQQxzWVgrJASIJDTufUIA/x9yHU35sy6VoRQojjGksgNAEsjrlN6dQgB0iMCJSuFSGEOFFTCYQ5pn8cRiLIw/2la0UIIU7UVOKw/nEYkSAPkK4VIYToZbNCc7nDRqzAiHStBNDS2UNTe7ezLyWEEK6vpQJsPe7VtZIgI1eEA3344YdkZWWRkZHBgw8+6PDzD2erN0dtP3emLeP6u2Z/TtwmTraMc2FNpcazOwV57xBE6V4R58pqtXLPPffwwQcfsHfvXl5++WX27t074nWcuoWbo7afO9OWcf1dsz8nbhMnW8a5sEb7GHJ361oBmRTkyRy11dumTZvIyMhg3Lhx+Pr6csMNN7By5UpHlgoMfas3R20/d6Yt4/q75mC2jZMt41xUk31WpwNvdjp1rRWA6CA/fL29JMhdwQf/CZW7HHvOMZPhkrN3cThqq7eysjKSk4+3YpKSkti4caMDfonTDWWrN0fpb8u4pUuX9nvNwWwbJ1vGuajGEgiMAt8gh53S6UHu5aVICPOXIPdgo3mrt6Fe/0QnXv9MW8ad6ZqD3TZOtoxzQU2lDm2NwwgEORjdK9JH7gIGaDk7kyO2ektMTKSkpKTvvdLS0n53GzqVM7d6G4wTr38mZ9oy7kzXHOy2cbJlnAtqKoGoDIee0ul95GAfSy4tco/miK3eZs2axcGDBzl8+DBdXV288sorXHHFFYB5W705ypm2jOvvmoPdNk62jHNBWhtdK+EpDj3tiAR5QngANS2dsn+nB3PEVm/e3t489thjLFu2jIkTJ7JixQqys7NN3eoN+t9+bqjOtmXcidccyrZxsmWcC2pvgO42h3etOHWrt16vbT6qx/70XX24ptWRmyWJQXCV7bw8cas3RxrOtnEDbRnnKp8Nj1K+w9jibc/K097CVbd66yVDED2XJ2/1NtLXPHGbONkyzkU5YQw5DOFmp1LKAmwByrTWy4dykaTwQEAmBXkiT9/qbSSveeI2cbJlnIvq21DCvD7y7wP7hnORMWH+KCUtciGEh2sqBe8ACHTs/ZxBBblSKgm4DHh6OBfx9fYiNsRPglwI4dkajxrdKko59LSD7Vr5I/AT4IwDcJVSdwN3A8TExJCXl3fS+yFe3ew5XE5eXsPwKhXDEhYWRnNzM8rBHxx3ZbVa+x2v7mm01nR0dJz271Q414zSvfR4h7DTwf/dBwxypdRyoFprvVUptehMx2mtnwSeBMjKytKLFp186Ovl29hV1sSp3xfO1TvmOioqSsKcwU8IGs201tTV1REeHn7GRbqEk2xugrR5Ds/BwbTI5wFXKKUuBfyBUKXUP7XWNw/lQokRAXy8pwqbTePlJYEyUpKSkigtLaWmpsbsUlxCR0eHzHQE/P39SUpy8FhmcXbd7dBW4/ARKzCIINda/wz4GYC9Rf6joYY4QFJ4AF1WGzWtncSFyj+kkeLj40NaWprZZbiMvLw8aYUKc/StQ+7YESswQjM7QcaSCyE8XJNzxpDDEINca5031DHkvRJkgwkhhCfrnQzk6On5jGCLPCUyEKWgsLp1pC4phBCuo/YAePtDSILDTz1iQR7o6016TDC7y5pG6pJCCOE6yndAXA5YHL96+IgFOcDkxDB2SZALITyNzQYV+ZAwzSmnH9Egz0kMo7qlk+pmx67lLIQQLq2+CLpaIH4UBPnkxDAAaZULITxLxQ7jeTS0yLMTQlFKglwI4WHKt4PFD2ImOOX0IxrkQX7ejIsOkhueQgjPUpEPY3LA4pxt90Y0yEFueAohPEzvjU4n9Y+DCUGekxhGVXMn1S1yw1MI4QEaDkNns9P6x8GkFjkg3StCCM9Qvt14Hk0t8uzEMOOGZ2nzSF9aCCFGXsUO40Zn7ESnXWLEgzzYz5u06CDpJxdCeIbyHRCX7bQbnWBCkIPRvSJdK0KIUc9mg4qdTu0fBxODvLK5g5qWTjMuL4QQI6PhMHQ2ObV/HEwK8hy54SmE8AS9NzpHY4s8OyEUkBmeQohRrmIHWHwhxnk3OsGkIA/x92Gc3PAUQox2vTc6vX2dehlTghxgekoEm4vrsdq0WSUIIYTzdHdA6RZImuX0S5kW5Asyo2k81i2tciHE6HT0S+hph/QlTr+UaUE+PyMapWDNgRqzShBCCOc5tAq8fCB1vtMvZVqQRwX7kZMQJkEuhBidCj+DlNngF+z0S5kW5GB0r2wvaaS5o9vMMoQQwrGaK6B6D2Q4v1sFzA7y8TFYbZovCmvNLEMIIRzr0GfG8wj0j4PJQT5jbATBft58fkCCXAgxihxaBUGxEJczIpczNch9LF7MTY9izYEatJZhiEKIUcBmhUOrjW4Vr5GJWFODHGBBZgxlje0U1baZXYoQQpy7ih3QXj9i3SrgAkG+MDMGkGGIQohRovAzQEH64hG7pOlBnhwZSFp0kAS5EGJ0OLQK4qdCUPSIXdL0IAdYMD6aDUX1dPZYzS5FCCGGr6MJSjaN2LDDXi4R5IsmxNLebWWtjF4RQrizAx+BtsL4i0b0si4R5PMzookM8uXfO8rMLkUIIYZv52sQlgxJ543oZV0iyH0sXlw2OZ5P91XR2tljdjlCCDF0rTXGRKDJ143YsMNeLhHkAFdNT6Cj28ZHuyvNLkUIIYZuz1tGt8rkFSN+aZcJ8hkpESRHBkj3ihDCPe16zZjJGTdpxC89YJArpfyVUpuUUvlKqT1KqQecUYhSiiunJrK+sJbqlg5nXEIIIZyjvghKN8Pk6025/GBa5J3AV7TWU4FpwMVKqdnOKOaq6QnYNLybX+GM0wshhHPseh1QRv+4CQYMcm1otb/0sT+csjBKRmwI2QmhrJTuFSGEu9DaGK0ydh6EJZlSgvdgDlJKWYCtQAbwuNZ6Yz/H3A3cDRATE0NeXt6wCsoJ6ebVgi5eee8zxgS5TBe+GCVaW1uH/dkUoj/BLYXMrDtIQdRFVJj02RpUkGutrcA0pVQ48JZSKkdrvfuUY54EngTIysrSixYtGlZBE6Z38NqDqyj1TuSGRVnDOocQZ5KXl8dwP5tC9Ov998HLh6yrf0xWQIQpJQypyau1bgRWAxc7pxwYE+bPV7JieXnTUZmyL4RwbZ0tsOMlmHQlmBTiMLhRKzH2ljhKqQDgQmC/M4u6fV4qdW1dvCM3PYUQrmzHS9DVArO/bWoZg2mRxwOrlVI7gc3AJ1rrd51Z1PyMaMbHBvP39YdlwwkhhGuy2WDj3yBxJiTNNLWUwYxa2am1nq61nqK1ztFa/9LZRSmluH1eKnvKm9lc3ODsywkhxNAVfgL1h0xvjYMLzew81TXTkwgL8OHv6w+bXYoQQpxuw18hJN7oHzeZywZ5gK+FG85L5qM9lZQ2HDO7HCGEOK56PxSthllfB4uP2dW4bpAD3DonFaUUL3x5xOxShBDiuI1PgMUPcu8wuxLAxYM8MTyAi7PH8NKmozS1d5tdjhBCQEsV5L8CU64f0e3czsalgxzgPxan09LRwzNri8wuRQghYN0fwNoF839odiV9XD7IsxPCuCRnDM+uL6ahrcvscoQQnqy5HLY8C1NvhKh0s6vp4/JBDnDvhZm0dfXwpLTKhRBmWvt7Y/OIhT82u5KTuEWQZ8aFcPmUBJ5bX0xta6fZ5QghPFHjUdj6D5h+C0Skml3NSdwiyAG+v3Q8nT1Wnsg7ZHYpQghPtOYhUAoW/MjsSk7jNkGeHhPM1dOTeGHDEaqaZQchIcQIqi+C7S9C7u2mrTl+Nm4T5AA/WDoereG3Hzp1zS4hhDjZx78Abz+XGqlyIrcK8uTIQL5xQRpvbitj65F6s8sRQniCwlWw/12jSyU03uxq+uVWQQ5wz+IMxoT6c//be7DaZGVEIYQT9XTBBz+FyHEw5ztmV3NGbhfkQX7e/NdlE9ld1syrm0vMLkcIMZptfALqDsLFDxpdKy7K7YIc4PIp8ZyXFslDH+2n8ZhMEhJCOEFLJXz+Wxi/DDKXmV3NWbllkCul+N/Ls2lq7+ahjwrMLkcIMRp9/AtjKv7F/2d2JQNyyyAHmJQQyu1z03hx41G+OFRrdjlCiNGk4APY9RrMv9elpuKfidsGOcCPl2WRGhXIT17fSVtnj9nlCCFGg2P18M73IS4HLnC9yT/9cesgD/C18ND1UylrbOfBD2RsuRDCAT78GbTVwlV/AW9fs6sZFLcOcoBZqZHcMTeNFzYckS4WIcS5KfgAdr4CF9wH8VPNrmbQ3D7I4eQuluYO2YBCCDEMbXXHu1QWuNbqhgMZFUEe4Gvh9yumUtHUwc/e3IXWMlFICDEENhu89U1ob4Cr/uo2XSq9RkWQA+SOjeS+izJ5b2cFL206anY5Qgh38uWfofATWPYbiJ9idjVDNmqCHOBbC9JZkBnDA+/sZW95s9nlCCHcQckm+PQBmHQlzPqG2dUMy6gKci8vxSMrphIe4MN3XtpGqwxJFEKczbF6eP1OY2naK/5srDfuhkZVkANEB/vx6I3TKa5r48f/yscmC2sJIfpj7YE3vmFMxb/+7+AfZnZFwzbqghxg9rgo/uvSiXywu5JHPztodjlCCFf06f1waBVc9ntIzDW7mnPibXYBzvL1+Wnsr2zhj58eJCsuhEsmu+Y6wkIIE2x/Eb58DM77JuTeZnY152xUtsjBWFjr11fnMCMlnB++ls+e8iazSxJCuIKSTfDuD2DcImOUyigwaoMcwM/bwhO35BIe6MPXn9tCeWO72SUJIcxUdwhe+RqEJsJ1fwfL6OiUGNVBDhAb4s8zt82irbOH257dJOuXC+GpWqvhn9eAzQo3/QsCI82uyGFGfZCDseTt327N5UjdMb7xjy10dFvNLkkIMZI6W+DF64wwv+lfED3e7IocyiOCHGBuejSPfHUqW4828N2Xt9NjtZldkhBiJPR0wqs3Q+VuuP4fkDTT7IoczmOCHGD5lATuXz6JT/ZW8aN/5cvmzUKMdtZu+NcdUJRnTPjJvMjsipxidPT0D8Ht89Jo67Ly0EcFeFu8+N21U/Dycs/ZXEKIs7D2wBtfh4L34NKHYfpNZlfkNAMGuVIqGXgeiAM08KTW+k/OLsyZ7lmcQY9V84dPD+DtpfjN1ZMlzIUYTWxWeOtu2LvSGGJ43l1mV+RUg2mR9wD3aa23KaVCgK1KqU+01nudXJtTfW9JBt1WG4+tLkQp+NVVk7FImAvh/qzd8O9vw+43YOkDMOcesytyugGDXGtdAVTYv25RSu0DEgG3DnKlFPddlIlG8/jqQxzrsvLw9VPxsXjUbQMhRpfuDmMRrIL3YMn9MP8HZlc0IobUR66USgWmAxv7ee9u4G6AmJgY8vLyzr26ETDLD64b78PrO8o5Wl7Ft6f64WuRlvlo1dra6jafTTE0XtYOcnb/hsiGfA5m3E2ZdQZ4yP/WarC76SilgoHPgV9rrd8827FZWVm6oKDAAeWNnH98Ucz9b+9hXkYUT9ycS4i/j9klCSfIy8tj0aJFZpchHO1YPbx8A5Ruhisec8sbm0qprVrrYY2NHFQ/glLKB3gDeHGgEHdXt81N5ffXT2VDUT0r/raBquYOs0sSQgxGQzE8cxGUbzem3bthiJ+rAYNcKaWAZ4B9WutHnF+Sea7NTeLZ22dxtK6Nqx9fz4GqFrNLEkKcTfl2ePpCaKuGW/4N2VeZXZEpBtMinwfcAnxFKbXD/rjUyXWZZmFmDK9+cw7dNs21f/2C9YW1ZpckhOhPwYfw98vA2w/u/BhS55ldkWkGDHKt9TqttdJaT9FaT7M/3h+J4sySkxjGm9+eS3yYP7c+u4nnvyw2uyQhRC+tYd0fjT7x6Az4+icQO8HsqkwlY+3OIDkykDe+PZdFmTH8z8o9/Pdbu+iW9VmEMFd3B7z1LWN3n+yr4I4PIVQ2jZEgP4sQfx+evHUm31qYzosbj3LTUxupbpGboEKYorEEnrsUdr4Ci39u3Nj0DTS7KpcgQT4Ai5fiPy+ZwJ9umMbOskYue3Qdmw7Xm12WEJ6lcBX8bQHUHICv/hMW/thtd7x3BgnyQbpyWiL/vmcewX7e3PjUBp5eW8Rgx+ALIYbJZoPPH4J/XgshY+DuPJh4udlVuRwJ8iGYMCaUld+Zx9KJsfzqvX3c9fwW6ttkxyEhnKKlCv55Naz+FUy+Dr7xqXFzU5xGgnyIQv19eOLmXO6/fBJrDtRy6Z/WsqGozuyyhBhdCj+FJ+bB0Y1w+aNwzVPgG2R2VS5LgnwYlFLcMS+NN/9jLgG+Fr721AYe+mg/XT0yqkWIc9LdAR/+l9GVEhRjdKXk3ib94QOQID8HOYlhvPvd+Vw7I4nHVx/i6r/IbFAhhq0iH55cCBseh1l3wV2fefz48MGSID9HQX7ePHT9VP52Sy4VTR0s//M6nl5bJNvICTFY1m5Y8xA8tQTaG+HmN+Cyh8EnwOzK3IbHbfXmLMuyxzAjJYKfvbmTX723j/d3VfC766aSERtsdmlCuK7KXbDyHqM1nn01XPYIBEaaXZXbkRa5A8WE+PHUrTP541enUVTbxqWPruUveYUyI1SIU/V0wur/gycXQXM5rHgern9OQnyYpEXuYEoprpqeyLyMaP5n5W5+92EBb+8o5/+umcz0lAizyxPCfMXr4d0fQO0BmPJVuPhBCfBzJC1yJ4kJ8eOvN+fyt1tyaTzWzTV//YJf/Hs3zR3dZpcmhDmO1RvdKM9dCj0dcNPrcM2TEuIOIC1yJ1uWPYZ5GdE8/FEB//iymA92V/KzSyZwzYxElAypEp7AZoVt/4BVv4SOZpj3A1j4U1knxYGkRT4Cgv28+d8rsnn7nvkkRQRw37/yuf6JL9lT3mR2aUI4V+kWeHoJvHsvxE6Cb62FCx+QEHcwCfIRNDnJWOf8d9dOoai2jeV/XsfP3txJTUun2aUJ4VjN5fDmN40Qb66Aa56G29+DuGyzKxuVpGtlhHl5KVbMSmZZ9hge/ewg//iimHfyK/jOVzK4fW4q/j4Ws0sUYvi62uCLx2D9H8HWA/Pvhfk/BP9Qsysb1STITRIW6MMvlk/ipvNT+M37+3jwg/288OURfrQskyunJuLlJf3nwo1Ye2DHi7D6N9BaCZOuhAt/CRGpZlfmEaRrxWTjYoJ5+rZZvPSN84kI8uHeV/NZ/ud1fH6gRpbJFa5Pa9j/vrHA1Tvfg/BkY9eeFc9LiI8gCXIXMTcjmrfvmc+fbphGc0c3tz27iRue3MDWI7KJhXBRh9fAMxfCKzeCtcsI769/AmPnmF2Zx5GuFRfi5aW4cloiF+eM4ZVNJfz5s0Ku/euXLM6K4YcXZjE5KczsEoWAkk2w+tdQlAchCXD5n2DaTWDxMbsyjyVB7oL8vC66VWsAABYnSURBVC3cNjeV62cm8ff1xTy5pojLH1vH0olx/GDpeHISJdCFCUq3GH3gh1ZBYBRc9GuY9Q3w8Te7Mo8nQe7CAn29uWdxBrfMGctz64t5em0Ry/9cxdKJsXznK+OZlhxudonCExz5AtY8fDzAlz4A590lGz24EAlyNxDq78P3lozn9nmpPLe+mGfXH+aqx9dzwfho7lmcwflpkTJLVDiW1lC02gjwI+uNTR6W/q+xTrifrOjpaiTI3UhvoN85P40XNxzhqbVF3PDkBqanhPOthelcODFOhi2Kc2Ozwt6VsO4PULnT6AO/+Lcw41aZjenCJMjdULCfN99cmM5tc1P515YSnlxbxDdf2Ep6TBB3XTCOq6YnysQiMTRdx4xx4F8+Dg2HISoDrvizsTqht5/Z1YkBKGeMVc7KytIFBQUOP6/oX4/Vxvu7K3ki7xB7K5qJDvbl1jmp3Dx7LJFBvmaX51Ly8vJYtGiR2WW4jpYq2PwUbH4G2ushMddY1GrCZeAljYGRpJTaqrWeOZyflRb5KOBt8eKKqQlcPiWeLw/V8dTaIh755ACPry7kqmmJ3DE/lQljZIq0OEH5dtjwBOx+w5hKP+EymPMdSJktGx27IQnyUUQpxdyMaOZmRHOwqoW/f1HMm9tKeXVLCXPTo7h1TipLJ8bibZF5YB7J2g373oZNT8HRL8E3GGbeAed9E6IzzK5OnAPpWhnlGo918fKmEl74spjypg4Swvy5afZYVsxMJibE8/o+PbJrpbkctj0PW/5urIMSkWqMPplxC/jLnARXcS5dKxLkHqLHamPV/mqe/7KY9YV1+FgUy7LHcPPssR41fNFjgtxmg8N5Rt93wQegrZBxIZx3N2QsBS/5q8zVSB+5GJC3xYtl2WNYlj2GwupWXtp4lNe3lvDuzgrGxQRx46wUrpmRSFSw57XSR5WWKtjxT9j2gjH6JCAS5twDubdDVLrZ1QknkRa5B2vvsvLuznJe3nSUbUcb8bEoLsoew1dnJjMvIxrLKByTPipb5NYeY9bltufhwIfGzcux8yH3NmM5WRk+6BakRS6GJcDXwvUzk7l+ZjIFlS28svkob20v472dFSSGB3BtbhLXzUgiJUomgrik2kKj9b3jZaPvOzAaZn8bZtwG0ePNrk6MoAFb5EqpZ4HlQLXWOmcwJ5UWufvq7LHyyd4qXttSytqDNWgN56VGcm1uIpdOjifE371XuHP7Fnl7I+x5E3a8BKWbQVlg/EUw/WbIXCYrELoxp97sVEotAFqB5yXIPUt5YztvbS/jja2lFNW24e/jxYWTxnD19AQuGB+DjxsOY3TLIO/pgsJPIP8Vo+vE2gUxE2Ha12DKCggZY3aFwgGc2rWitV6jlEodzsmFe0sID+CexRn8x6J0th1t5K3tpby7s4J38suJCvJl+ZR4rpiWyIyUcI8Z9TJibDZjrPeuf8Hef0N7g9F1MvNOY9p8wnSZuCP6DOpmpz3I3z1bi1wpdTdwN0BMTEzua6+95qAShSvpsWl21lj5oryHHTVWemwQE6A4P96b8+O9SQpWLh3qra2tBAe76Op9WhPcWkRs9Vpiq9fi31mL1cuP2ujzqYpbSEPENLSX3NYarRYvXuzcceSDCfITSdeKZ2jp6OajPVWs3FHGF4fqsNo0GbHBLJ8Sz/Ip8WTEhphd4mlcrmtFa6jaY7S6d78J9YfAyxvSvwKTV0DWJbJsrIeQUSvCFCH+PlyXm8R1uUnUtXbywe5K3skv50+rDvLHTw+SGRfMpZPjuXRyPONjg126pT6itIaq3cZysXv+DXUHQXlB6gUw7/sw8XIIjDS7SuFGJMiFQ0QF+3Hz7LHcPHss1c0dfLC7kvd2VfSF+riYIC7NiefinDFkJ4R6XqhrDWXbjLVO9q40JusoL0idD3P+AyZcDsExZlcp3NRgRq28DCwCooEq4H6t9TNn+xnpWhG9qps7+GhPJR/srmRDUR02DYnhAfZZpnHMTI0c0YlHI9q1Yu02tknb/y7sexdayo1uk7QFMPEKmLBcwlv0kbVWhFuoa+1k1b5qPtpTydrCWrp6bEQG+fKVCbFcOCmOC8ZHE+jr3D8SnR7knS1QuAoK3ocDH0FHI3gHQMYSI7gzl0m3ieiX9JELtxAV7MeKWcmsmJVMa2cPnxfU8MneSj7eU8nrW0vx9fZiXnoUSyfFsWRCHGPC3GR39sYSY3x3wQdQvNYY5x0QCVmXwoRLIX2JbJMmnEqCXJgi2M+by6bEc9mUeLqtNjYdrufTfVV8uq+K1W/V8N/sJjshlCUTYlk8IZapSeGusx+pzWrMqjzwkfGo3mN8PzLdWF0w6xJIng0W+eclRoZ0rQiXorXmYHUrq/ZV89n+KrYeacCmISrIl4WZMSyaEMuC8dGEBw5vC7thd6201RpdJgc/Nhaoam8wpsePnWt0l2ReLOubiHMiXSti1FBKkRkXQmZcCN9elE5DWxdrDtawen81qwuqeXN7GV4KpiaHszAzhoWZMUxJCnf8DVNrD5RtgcJPjUf5DkBDUAxkXgLjlxpdJgHhjr2uEMMgLXLhNqw2TX5pI58X1PD5gRrySxvRGsIDfZiXEc2C8dFcMD6GhPCAM57jrC3yhiNw6DOjxV20BjqbjCGCSecZmzFkLIH4abIpg3AKaZELj2DxUsxIiWBGSgT3XphJfVsX6wprWXOghrUHa3hvZwUA6TFBXDA+hvkZ0Zw/LvLMKza2N0LxOihabQR4fZHx/dAkyL7SmF05bhEERIzI7yfEcEmLXIwKWmsOVLWy9mANaw/WsvFwHR3dNixeimnJ4czLiGZeajCWnf9iZngTFH0O5dtA28AnCNIugHGLIX0xRGfKglRixMk4ciFO0dFtZXtxNYfz16GLPietdRu56gB+qhsrXlSHToZxC4mZugzv5PPAe3g3T4VwFOlaEQKMmZTl26F4Hf7F65hzdANzutuMt8bkUBp+Myur41hlm0Z+tQ2qIXh7G7NSdzB7XBSzx0WRnRCKtxuusy48mwS5cF89ncb6JUfWQfF6KNkE9uDu23ghbQGkzscSGMlYYEpeHt9btIja1k42FNXx5aE6NhTVsbqgBjDGt+eOjeD8cZGcnxbF5MQwfL0l2IVrkyAX7qOzxQjro18aa5iUbgFrp/FebLYR3KnzYey8AdcwiQ72Y/mUBJZPSQCguqWDjUX1bCiqY9Phen73odE16O/jxYyUCGalRnJeWiTTU8KdvoyAEEMln0jhuporoGQDHN0IR7+Ayl3GzUllgfgpcN5dkDLHmJRzjuuXxIb4c/nUBC6fagR7bWsnmw/Xs/FwPZuL63n0s4NobYycyUkIZVZqJDNTI8gdG0lMiOxSL8wlQS5cg80K1XuhZKO91b0BGo8Y73kHQNJMuOBHkDIbks8DP+duWhEd7Mclk+O5ZHI8AM0d3Ww90sCW4no2Fzfw/IYjPL3uMACpUYHkjo0kd2wEuWMjGB8b7DrLCQiPIEEuzNHeAKVbjeAu3WR83dVivBccB8nnw/nfNNYsiZ9i+u7wof4+LM6KZXFWLACdPVZ2lzWz9Ug9W4obyCuo5o1tpQCE+HszPSWCGSnh5I6NYGpyOKFnGssuhANIkAvns/YYre3SzVC21Whx1x003lNeEJdt7Abf29oOH+vy47j9vC19LfC7Fxjj2I/UHTNa7Uca2H60gT+tMrpjlIKMmGCmp4QzPSWC6SnhjI8NGdF12MXoJkEuHEtraCo1Artsi9HSrtgB3ceM9wOjjCnv026EpFmQMGNU7EmplCI1OojU6CCuzU0CjD1N80ua2H60gW1HG/h4bxWvbTFa7UG+FiYnhTEtOYJpyeFMSw53n2V7hcuRIBfnpq3OGLtdvs0YCli2FdqqjfcsvjBmMsy4FRJnGv3cEaku39p2lBB/H+aPj2b++GjAaLUX1x1j+9EGdpQ0sv1oI8+sK6LbakzKiwv1Y0qSEepTksKYkhhOWKB0yYiBSZCLwetogop8I7jLthnPvTckUcbU9oylkDgDEnMhLkdmTJ5AKUVadBBp0UFcM8NotXd0W9lX0cyOkkZ2ljaRX9LIJ3ur+n5mbFQgU5LCmZoURk6i8Qj2k3+24mTyiRD9a2+Eyp3G8q0VO4zn+kPH3w9PMbpFZt5pBHf8NPAPNa9eN+XvY7H3mx9fmKupvZtdpU3sLGtkZ0kTW4vreSe/HDD+mEmLDmJyYhiT7cGenRB65oXBhEeQIBfGpgkV+Sc/Gg4ffz8sGeKnGv3aCfbQDooyr95RLizg5C4ZMMa17yprYmdJE7vKmthYVM/KHeV976dFBxkt9oRQshOMcI8Ikr+GPIUEuSfR2ugKqdhpTK6p3Gl83XI8EAhPMYJ6xi0wZiokTIOg6DOfU4yI6GC/k4Y/AtS0dLK7rMl4lDex7UhDX8sdIDE8gInxoWQnGI9JCaEkhgegPOQehSeRIB+tujugZh9U7oaq3fbg3m1slgDGsL/oTGNKe/wUo8U9ZrKsve1GYkL8WGzf07RXQ1sXe8qb2VPe1Pe8an8VvYuchgX4MCk+lInxoUyMD2FifCjj44Lx87aY9FsIR5Agd3daQ0ulEdZVu48Hd+1B0FbjGJ8giJsEk68zwnrMZIidJDu7j0IRQb6ndcsc6+phX0UL+yqa2VvRzJ7yZl7adISObhsA3l6K9JjgvmCfGB/KhPgQYoL9pPXuJiTI3UlnK9Tsh6o9xgSbqj3Go73++DFhycZokQnLj4d2RJpsT+bBAn29+yYv9bLaNMV1bewtb2ZfhfHYUFTPv0/od48K8mVCfAhZcUawTxgTwvjYEAJ8pfXuaiTIXZG1G+oK7WG9F6r3QfUeaCg+foxPEMROhInLIW6yMTsybpJ0jYhBsdhb4ekxwX0LhYHRNbO/soX9lUa4F1S2nNR6VwrGRgaSNSaErDGhZMWFkDUmmNSoIFnH3UQS5GayWaH+sNGXXX3Co64QbN3GMcoCURmQMB2m3WR0icRNgvBUaWULh4sI8mVOehRz0o+PSrLaNEfrj1FQ2cz+yhYK7I9P9lZhs/e9+1q8GBcTRGZcCJlxwfbnEJIjA2UpghEgQT4SrD3GcL6a/fZHAVTvh9oDx9fTBmONkdiJkHWxsTFC3CTjhqS3LJMqzGPxOj6R6eKc+L7vd3RbKaxupaCyhQPVLRyobGHrkQbePmHkjL+PF+kxRrBnxAYzPjZYAt4JJMgdqbvDaE3XFkDNAftzgfE9a9fx48JSIHYCpC8yAjt2AkRnjYo1R4Tn8Pex9M02PVFrZw8Hq1o4WNXKgaoWDlS3srGojre2l/Ud4+vtxbjoIMbHhZARE0xGrPFIjQ6UETTDIEE+HO0NxqiQmgKjVV17wPi68Yix8QEACiLGGgE9/kKIsYd1jAS2GN2C/bxPm60KxiJiB6tbKbQ/DlS1sP3oyWPfLV6KlMhA0u3hnh4TZDzHBstSwGchQX4mNqsRzLWFRlDXHTTCu/YAtNUcP87ia/Rhx0+FydcbQR2dCdHjwSfAvPqFcDEh/j7MSIlgxikBf6yrh6Katr6AP1RjPH9+oLpvQTEwxs2nxwSRHhPMuJjgvq8TwgM8vpvGs4NcazhWb4R0XaER1HWFxqO+6OTukIBII5wzL7YHdSbEZBr92l7yp6AQwxXo691vF02P1UZJQ3tfuB+yP7+7s4Km9u6+43y9vUiLCmJcjNGPPy4mmLToINJjgggP9IxlCjwjyDtbjWCuK4S6Q8biT72h3dF4/DgvH4hMg6jxkLnMeO5tXZ/jnpBCiKHxtnj13WS9kLi+72utqW/roqi2jUPVrRTVtlFU09o3kqbHdrwVHxHo0xfsJz5So4JG1Xj40RPkXceMkSG9QV13yB7eh6C18uRjQxIgOgNyroHIdCOoozKM1rVl9PwnEWI0UkoRFexHVLAfs1JPbmB1W22U1B/jcG0bRTVtFNW2cbi2lTUHanh9a+lJx44J9Sc1OrAv2FPtIZ8SGYi/j3uFvHulVmerEdb1RcdDut7++sSFnwCCYoyQzlgCkeMgKt0I68hx4BtkTv1CCKfysXgxzt6HvmTiye+1dvZQXNvG4do247nOeP5oTxX1bce7UZWC+FB/xkYFkRodaDzbv06JDCTQ1/Vi07Uq0hqO1Rnh3HD45Of6ouM7z/QKijGmn49baIR2ZJoR2JHpsja2EOIkwX7998WDsQZ8cW0bxXVtFNce40idEfSnhjxAbIgfY6OMgB8bGUjKCV+HB/qYsj7NoIJcKXUx8CfAAjyttX5w2Fe0dkNTiTHdvKHYHtbFRmA3HIHO5pOPD0kwAjpzmdGajkwzniPSJKyFEA4RFuDD1ORwpiaHn/ZeU3s3R+uOUVzXxtH6Y32Bv+ZADdUtnScdG+LvbYR8ZBDJkYGMjTJa8SmRgcSH+TttGYMBg1wpZQEeBy4ESoHNSqm3tdZ7z/gz2mpsuttw2BjC1xvaDUeMjXl7V+UDY/he+FhjL8eUOUZAR6Taw3qsDOETQpgqLMCHyUlhTE46vSXf3mXlaL3Rgj9af8z+9TH2VjTz8d7Kk4ZPWrwUieEBpEQGkmwP9+TIgL6gPxeDaZGfBxRqrYsAlFKvAFcCZwzy4NbD8PRXjn8jKMYI56RZMGWF8XXvIyRB1gwRQrilAF+LfQGxkNPes9o0FU3tHK0/RskJIV/S0M5HeypP67I5F4MJ8kSg5ITXpcD5px6klLobuNv+slM90Lz7+LvNwKFTf0QIM0QDtWYXIUQ/sob7gw672am1fhJ4EkAptUVrPdNR5xbCUeSzKVyVUmrLcH92MH0aZUDyCa+T7N8TQgjhAgYT5JuB8UqpNKWUL3AD8LZzyxJCCDFYA3ataK17lFLfAT7CGH74rNZ6zwA/9qQjihPCCeSzKVzVsD+bSms98FFCCCFcloz7E0IINydBLoQQbm7YQa6UulgpVaCUKlRK/Wc/7/sppV61v79RKZV6LoUKMRSD+HzerpSqUUrtsD++YUadwvMopZ5VSlUrpXaf4X2llHrU/tndqZSaMdA5hxXkJ0zbvwSYBNyolJp0ymFfBxq01hnAH4DfDudaQgzVID+fAK9qrafZH0+PaJHCkz0HXHyW9y8BxtsfdwN/HeiEw22R903b11p3Ab3T9k90JfAP+9evA0uUGcuCCU80mM+nEKbQWq8B6s9yyJXA89qwAQhXSsWf7ZzDDfL+pu0nnukYrXUP0AREDfN6QgzFYD6fANfa/3R9XSmV3M/7QphhsJ/fPnKzU3iqd4BUrfUU4BOO//UohNsZbpAPZtp+3zFKKW8gDKgb5vWEGIoBP59a6zqtde9i0k8DuSNUmxADGfKyKMMN8sFM238buM3+9XXAZ1pmH4mRMeDn85Q+xyuAfSNYnxBn8zZwq330ymygSWtdcbYfGNbqh2eatq+U+iWwRWv9NvAM8IJSqhCjY/+G4VxLiKEa5Ofze0qpK4AejM/n7aYVLDyKUuplYBEQrZQqBe4HfAC01k8A7wOXAoXAMeCOAc8pjWQhhHBvcrNTCCHcnAS5EEK4OQlyIYRwcxLkQgjh5iTIhRDCzUmQCyGEm5MgF0IIN/f/Af/YIBo4wyssAAAAAElFTkSuQmCC\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "xs_log = np.linspace(0.001, 0.999, 100)\n",
- "ys_0 = [-np.log(1 - x) for x in xs_log]\n",
- "ys_1 = [-np.log(x) for x in xs_log]\n",
- "plt.plot(xs_log, ys_1, label=r'$y = 1, -\\ln(h(x))$')\n",
- "plt.plot(xs_log, ys_0, label=r'$y = 0, -\\ln(1 - h(x))$')\n",
- "plt.ylim([0, 5])\n",
- "plt.xlim([0, 1])\n",
- "plt.xticks([0, 0.5, 1])\n",
- "plt.legend()\n",
- "plt.grid()\n",
- "plt.title('cost function')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "def logloss(x, y, theta):\n",
- " if y == 1:\n",
- " return -np.log(hypothesis(x, theta))\n",
- " elif y == 0:\n",
- " return -np.log(1 - hypothesis(x, theta))\n",
- " # or (less obvious)\n",
- " return -y * np.log(hypothesis(x, theta)) - (1 - y) * np.log(1 - hypothesis(x, theta))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We can see that if $y$ was suppose to be 0 but is close to 1, the cost will be high. \n",
- "Same logic if $y$ was suppose to be 1 but is close to 0.\n",
- "\n",
- "Then we generalize the cost function for all $x$:\n",
- "$$J(\\theta) = \\frac{1}{n} \\sum_{i = 1}^{n} j(h(x_i), y_i)$$\n",
- "$n$ is the number of elements in $X$ and $Y$."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "def cost(xs, ys, theta):\n",
- " return sum([logloss(x, y, theta) for x, y in zip(xs, ys)]) / len(xs)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Gradient descent\n",
- "\n",
- "Finally, use gradient descent to minimize the cost function:\n",
- "\n",
- "$$\\theta_i := \\theta_i - \\alpha \\frac{\\partial}{\\partial \\theta_i} J(\\theta)\\ \\text{ for } i = 1, ..., n$$\n",
- "\n",
- "Or with gradient notation:\n",
- "\n",
- "$$ \\theta := \\theta - \\alpha \\nabla J(\\theta)$$\n",
- "\n",
- "\n",
- "$\\alpha$ is the learning rate (how fast we want the step to be). \n",
- "Since $\\theta_i$ is only used in the dot product, all of them will have similar partial derivative.\n",
- "\n",
- "let $z = x \\cdot \\theta_j$\n",
- "\n",
- "$\\newcommand{\\pt}{\\frac{\\partial}{\\partial \\theta_j}}$\n",
- "$$\n",
- "\\begin{align}\n",
- " & \\pt J(\\theta) \\\\\n",
- " = & \\pt \\left[ \\frac{1}{n} \\sum_{i = 1}^{n} j(h(x_i, \\theta), y_i) \\right] \\\\\n",
- " = & \\pt \\left[ \\frac{1}{n} \\sum_{i = 1}^{n}\n",
- " (-y_i \\ln(h(x_i, \\theta)) - (1 - y_i) \\ln(1 - h(x_i, \\theta))) \\right] \\\\\n",
- " = & \\pt \\left[ \\frac{1}{n} \\sum_{i = 1}^{n}\n",
- " (-y_i \\ln(\\sigma(z)) - (1 - y_i) \\ln(1 - \\sigma(z))) \\right] \\\\\n",
- " = & \\pt \\left[ \\frac{1}{n} \\sum_{i = 1}^{n}\n",
- " (-y_i \\ln(\\frac{1}{1 + e^{-z}}) -\n",
- " (1 - y_i) \\ln(1 - \\frac{1}{1 + e^{-z}})) \\right] \\\\\n",
- " = & \\frac{1}{n} \\sum_{i = 1}^{n} \\pt \\left[ \n",
- " -y_i \\ln(\\frac{1}{1 + e^{-z}}) -\n",
- " (1 - y_i) \\ln(1 - \\frac{1}{1 + e^{-z}}) \\right] \\\\\n",
- " = & \\frac{1}{n} \\sum_{i = 1}^{n} \\left(\n",
- " -y_i \\pt \\left[ \\ln(\\frac{1}{1 + e^{-z}}) \\right] -\n",
- " (1 - y_i) \\pt \\left[ \\ln(1 - \\frac{1}{1 + e^{-z}}) \\right] \\right) \\\\\n",
- " = & \\frac{1}{n} \\sum_{i = 1}^{n} \\left(\n",
- " -y_i(1 + e^{-z}) \\pt \\left[ \\frac{1}{1 + e^{-z}} \\right]\n",
- " - (1 - y_i) \\frac{1}{1 - \\frac{1}{1 + e^{-z}}} \\pt \\left[ 1 - \\frac{1}{1 + e^{-z}} \\right]\n",
- " \\right) \\\\\n",
- " = & \\frac{1}{n} \\sum_{i = 1}^{n} \\left(\n",
- " -y_i(1 + e^{-z}) \\pt \\left[ \\frac{1}{1 + e^{-z}} \\right]\n",
- " - (1 - y_i) \\frac{1 + e^{-z}}{e^{-z}} (-1) \\pt \\left[ \\frac{1}{1 + e^{-z}} \\right]\n",
- " \\right) \\\\\n",
- " = & \\frac{1}{n} \\sum_{i = 1}^{n} \\left(\n",
- " -y_i(1 + e^{-z}) \\frac{e^{-z}}{(1 + e^{-z})^2} \\pt z\n",
- " - (1 - y_i) \\frac{1 + e^{-z}}{e^{-z}} (-1) \\frac{e^{-z}}{(1 + e^{-z})^2} \\pt z\n",
- " \\right) \\\\\n",
- " = & \\frac{1}{n} \\sum_{i = 1}^{n} \\left(\n",
- " -y_i \\frac{e^{-z}}{1 + e^{-z}} x_{ij}\n",
- " + (1 - y_i) \\frac{1}{1 + e^{-z}} x_{ij}\n",
- " \\right) \\\\\n",
- " = & \\frac{1}{n} \\sum_{i = 1}^{n} \\left(\n",
- " \\frac{-y_i e^{-z}}{1 + e^{-z}}\n",
- " + \\frac{(1 - y_i)}{1 + e^{-z}} \\right) x_{ij} \\\\\n",
- " = & \\frac{1}{n} \\sum_{i = 1}^{n} \\left(\n",
- " \\frac{-y_i e^{-z} + 1 - y_i}{1 + e^{-z}} \\right) x_{ij} \\\\\n",
- "\\end{align}\n",
- "$$\n",
- "\n",
- "$$\n",
- "\\boxed{\n",
- " = \\frac{1}{n} \\sum_{i = 1}^{n} (h(x_i) - y_i) x_{ij}\n",
- "}$$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "def gradient(xs, ys, theta):\n",
- " g = np.array([])\n",
- " for j in range(len(theta)):\n",
- " g = np.append(g, [sum([(hypothesis(x, theta) - y) * x[j]\n",
- " for x, y in zip(xs, ys)]) / len(xs)],\n",
- " axis=0)\n",
- " return g"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "def gradient_descent(xs, ys, theta, alpha=1, epoch=100):\n",
- " for _ in range(epoch):\n",
- " theta = theta - alpha * gradient(xs, ys, theta) \n",
- " return theta"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "weights: -3.9825852503712964 10.630321833954772\n",
- "train cost: 0.0013520554107438081\n",
- "test cost: 0.0010672371683545642\n"
- ]
- }
- ],
- "source": [
- "theta_binary = np.random.randn(len(X_train[0]))\n",
- "theta_binary = gradient_descent(X_train, Y_train, theta_binary, 2, 2000)\n",
- "print('weights: ', *theta_binary)\n",
- "print('train cost:', cost(X_train, Y_train, theta_binary))\n",
- "print('test cost: ', cost(X_test, Y_test, theta_binary))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "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": [
- "plt.scatter(X_train[:, 0], Y_train, s=8, c='b', alpha=0.4, label='train data')\n",
- "plt.scatter(X_test[:, 0], Y_test, s=10, c='g', label='test data')\n",
- "sig_x = np.linspace(X[:, 0].min(), X[:, 0].max(), 100)\n",
- "sig_y = [hypothesis(np.array([x, 1]), theta_binary) for x in sig_x]\n",
- "plt.plot(sig_x, sig_y, c='r', alpha=0.5, label='model')\n",
- "plt.yticks([0, 0.5, 1])\n",
- "plt.ylim([-0.1, 1.1])\n",
- "plt.legend()\n",
- "plt.grid(axis='y')\n",
- "plt.title('Optimized model')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## One vs all\n",
- "\n",
- "What if we don't have a binary target but many groups (>2) to classify. \n",
- "It's in this that one vs all is applied.\n",
- "\n",
- "Here, there is 2 features and 3 categories."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "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": [
- "xs_oa = np.array([[1, 1], [1, 1.3], [1.4, 1.1],\n",
- " [1.5, 2], [1.6, 1.8], [1.4, 1.8],\n",
- " [2.4, 1.2], [2.2, 1.5], [2.3, 1.3]])\n",
- "ys_oa = np.array([0, 0, 0,\n",
- " 1, 1, 1,\n",
- " 2, 2, 2])\n",
- "\n",
- "xs_oa = np.hstack([xs_oa, np.ones((xs_oa.shape[0], 1))])\n",
- "\n",
- "xs_plot_spec = [\n",
- " {'marker': '^', 'c': 'b', 's': 50},\n",
- " {'marker': 'o', 'c': 'r', 's': 50},\n",
- " {'marker': 's', 'c': 'g', 's': 50}\n",
- "]\n",
- "\n",
- "def plot_onevsall(xs, ys):\n",
- " for i, y in enumerate(ys):\n",
- " plt.scatter(xs[i,0], xs[i,1], **xs_plot_spec[y])\n",
- " \n",
- "plot_onevsall(xs_oa, ys_oa)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The tricks is to create an hypothesis function for every target. \n",
- "Each of those will compare his target to all the other one.\n",
- "\n",
- "For example the hypothesis function for *circle* will separate it from *triangle* and *square*"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "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": [
- "plot_onevsall(xs_oa, ys_oa)\n",
- "plt.plot([1.0, 2.4], [1.5, 1.9], c='r')\n",
- "plt.plot([1.0, 1.8], [1.7, 1.0], c='b')\n",
- "plt.plot([1.7, 2.3], [1.0, 1.8], c='g')\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [],
- "source": [
- "def train_against(xs, ys, theta, one, alpha, epoch):\n",
- " ys_ally = ys.copy()\n",
- " ys_ally[ys == one] = 0\n",
- " ys_ally[ys != one] = 1\n",
- " return gradient_descent(xs, ys_ally, theta, alpha, epoch)\n",
- "\n",
- "def train_thetas(xs, ys, theta, alpha=1, epoch=1000):\n",
- " thetas = []\n",
- " for i in np.unique(ys):\n",
- " thetas.append(train_against(xs, ys, theta, i, alpha, epoch))\n",
- " return thetas"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[array([ 5.0954313 , 6.39133932, -16.0566276 ]),\n",
- " array([ 3.21562051, -10.74806413, 12.21725452]),\n",
- " array([-9.47029824, 7.01739702, 7.74698696])]"
- ]
- },
- "execution_count": 15,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "theta_oa = np.random.randn(len(xs_oa[0]))\n",
- "thetas_oa = train_thetas(xs_oa, ys_oa, theta_oa, alpha=1, epoch=1000)\n",
- "thetas_oa"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "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": [
- "plot_onevsall(xs_oa, ys_oa)\n",
- "\n",
- "def plot_boundaries(xs, thetas):\n",
- " for i, ti in enumerate(thetas):\n",
- " xs_ti = np.array([min(xs[:, 1]) - 2, max(xs[:, 1]) + 2])\n",
- " ys_ti = (-1 / ti[1]) * (ti[0] * xs_ti + ti[2]) # from https://utkuufuk.com/2018/05/19/binary-logistic-regression/\n",
- " plt.plot(xs_ti, ys_ti, linewidth=2, c=xs_plot_spec[i]['c'])\n",
- "\n",
- "plt.xlim([xs_oa[:, 0].min() - 0.3, xs_oa[:, 0].max() + 0.3])\n",
- "plt.ylim([xs_oa[:, 1].min() - 0.3, xs_oa[:, 1].max() + 0.3])\n",
- "plot_boundaries(xs_oa, thetas_oa)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Prediction\n",
- "\n",
- "To make a prediction we get the hypothesis for each group $h^{(i)}(x)$, the predicted group is then $\\max_i h^{(i)}(x)$."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [],
- "source": [
- "def make_prediction(x, thetas):\n",
- " ps = [hypothesis(x, ti) for ti in thetas]\n",
- " return ps.index(min(ps)) "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO2dd3RU1RaHv5OQUEIoUlRqUMoDEZVioQREhdAR6UVFFMXns6GCHSu2h2JBKQ8BqdI7QaX3Jh0RRDpSpIWaMvv9cTJmEpLJJJmZe2dyvrVmZWbumXv3zNzse2afvX9biQgGg8FgCHxCrDbAYDAYDN7BOHSDwWAIEoxDNxgMhiDBOHSDwWAIEoxDNxgMhiAhj1UHLl68uERFRVl1eIPBYMgWcVfj2HN6DyJCqUKluLHgjX49/saNG0+JSIn0tlnm0KOiotiwYYNVhzcYDIYss/HoRhqNboTEC8/e+SxfxHyBUsqvNiilDmS0zYRcDAaDwQP2/L2HZuOacSH+Al2qd+HzmM/97swzwzh0g8FgyISjcUdpMrYJJy+dpMnNTRjVdhQhyn7u034WGQwGg404e+UsMWNj2H92P3eWvpOpHacSHhputVnpYhy6wWAwZMDlhMu0mtCKbSe2UaVYFeZ2nUvB8IJWm5UhxqEbDAZDOiQ6Euk8tTMrDq6gdGRpFvZYSPECxa02yy3GoRsMBkMaRITes3sza/csiuYrysIeCylXuJzVZmWKcegGg8GQhld/eZXvN39P/jz5mdt1LtVKVLPaJI8wDt1gMBhcGLR6EB+v/Jg8IXmY2nEq95S9x2qTPMY4dIPBYEjmhy0/0HdhXwC+b/M9zSo1s9iirJGpQ1dKlVVKLVZK7VRK7VBKPZfOmG5Kqa1KqW1KqVVKqdt8Y67BYDD4hnl75tFzZk8ABjUZRPca3S22KOt4UvqfCPQVkU1KqUhgo1LqJxHZ6TLmT6ChiJxRSjUDhgF3+cBeg8Fg8DqrD62m/Y/tSZIk+tfrzwv3vGC1SdkiU4cuIseAY8n345RSu4DSwE6XMatcXrIGKONlOwODuDiYNAn27IFKlaBTJ4iMtNoqg8Hghh0ndtBifAsuJ17msdsf48P7PrTapGyTJXEupVQUcAew1s2wXsD8DF7fG+gNUK6c/VOAssSKFdC8OTgccPEiRETAiy/CvHlQv77V1hkMhnQ4eO4gTcc25cyVM7Sp0oahrYbaTp8lKyhPm0QrpQoCS4EPRGRaBmPuBYYA9UXkb3f7q127tgSN2mJcHJQurf+mJTISjh6Fgj6qLjO/CgyGbHHq0inqj6zP7r9306BcA2K7x5I/LL/VZmWKUmqjiNROb5tHM3SlVBgwFRjnxpnXAEYAzTJz5kHHpEl6Zp4eDofe3quX949rfhUYDNniQvwFmo9rzu6/d1Pj+hrM6jIrIJx5ZniS5aKA/wG7RGRQBmPKAdOAHiLyu3dNDAD27NEONT0uXoS9e71/zLg47czj4lKOffFiyvMXLnj/mAZDEBCfFE+7Se1Yf3Q9FYpUYEG3BRTJV8Rqs7yCJ3no9YAeQGOl1ObkW3Ol1FNKqaeSx7wFFAOGJG8PkliKh1SqpGfH6RERARUrev+YnvwqMBgMqXCIg0dmPMJP+36iZERJYrvHcmOkfzsO+RJPslxWAG5XCUTkceBxbxkVcHTqpEMd6RESord7Gyt+FRgMAYyI8Nz855i4fSKR4ZHM7zafSsUqWW2WVzGVot4gMlLHrSMjU2bqEREpz/tiQdSKXwUGQwDzwfIP+Hr914SHhjOz80xq3ljTapO8jsdZLt4mqLJcnFy4oEMde/dqh9qpk2+zW6zKrLEjJtvH4IZhG4fx5JwnUSgmd5jMQ9UestqkbJPjLBeDhxQs6JtslvRwzv7TZrmEhPjuV4FdMdk+BjdM3TmVPnP7APBti28D2plnhnHogUz9+nomntGvgtwwa3XN9nHiXFto1gwGDoRDh4L3/RvcsvjPxXSd1hWHOHi30bs8WftJq03yKSbkEqykN2t1zt6DadY6YgQ8/3zGC8R588LVq8H7/g0Z8uuxX2k4qiFx8XE8U+cZvmz2ZUBXgToxIRc744tZtLtZa/PmwRVfd5ftA9qZQ/C+f0O67D29l5hxMcTFx9G5emcGNxscFM48M0yWi5WsWKEXNp9/Hj75RP8tXVo/nxNyU466u2yf9Ai292+4hmNxx2jyQxNOXDzBAzc9wOi2owlRucPV5Y53aUd8WemZm3LUO3XSoRRPCbb3b0jF2StnaTauGX+e/ZM6peowteNUwkPDrTbLbxiHbhW+nEXnphz19GoAwt38Awfb+zf8w+WEy7SZ2IYtx7dQpVgV5nadS2Te3LUIbhy6VfhyFu1u1uqrylUrcWb7DB4M/fvDoEEZx8iD8f0bSHQk0mVqF5YdWEbpyNLEdo+lREQJq83yO2ZR1Cqcs+j0nHpOZ5G5MUc9bQ3AbbflrvefixERnprzFDN3z6RovqLEdo+lfJHyVptlCSZt0Sr8Uenpz8pVO5Lb338u4bVfXmPgioHkz5Ofnx/+mbpl61ptkk8xaYt2xB+zaH9WrtqR3P7+cwFfrPmCgSsGEqpCmdxhctA788wwDt1KMqv0NBgMGTJu6zheiNXNnEe2GUmLyi0stsh6jEO3GjOLNBiyzPw983l05qMA/LfJf3n4toetNcgmmCwXg8EQUKw5vIb2k9uT6Ejklbqv8OI9GfQiyIWYGbrBEIjkBuG1dNh5cictxrfgUsIlet7ek4/u/8hqk2yFceiGrJFLHYmtSCu8ljcv/PvfWjrijTeC9vs4eO4gTcc25fTl07Su0pphrYblCn2WrJBp2qJSqiwwBrgeEGCYiAxOM0YBg4HmwCXgURHZ5G6/uT5tMRDJLQqOdsZduivoNZn584Pu+zh16RQNvm/Ab6d+o365+izsvpD8YfmtNssS3KUtehJDTwT6ikg14G7g30qpamnGNAMqJd96A9/mwF6DHfGl9ozBc9xJRoD+HoLs+7gQf4GW41vy26nfuLXkrczqPCvXOvPMyNShi8gx52xbROKAXUDpNMPaAGNEswYoopQKnlbahtyl4GhnMpMLhqD6PuKT4mn/Y3vWHllLVJEoFnRfQNH8Ra02y7ZkKctFKRUF3AGsTbOpNHDI5fFhrnX6KKV6K6U2KKU2nDx5MmuWGqwlNyk42hlP5IKD5PtwiINHZzxK7B+xlChQgoXdF1IqspTVZtkajx26UqogMBV4XkTOZ+dgIjJMRGqLSO0SJXKfcE5Ak5sUHO2MJ3LBQfB9iAgvLHiBCdsnUDC8IPO7zadSsUpWm2V7PHLoSqkwtDMfJyLT0hlyBCjr8rhM8nOGYCG3KTimR1ycbnnXr5/+m9HCpC9xSka4qyYOgu9j4IqBfLnuS8JDw5nZeSa1StWy2qSAIFOHnpzB8j9gl4gMymDYLOBhpbkbOCcix7xop8Fq0tMdj4jwzMEEA77qLpUd6teHY8f0hSUsLEX/PUi+j+Ebh/P6otdRKMa1G0fjCo2tNilg8CRtsT6wHNgGOFfFXgPKAYjId8lO/2sgBp222FNE3OYkmrTFACU3Khj6QxkzuwTZ9zF913TaT26PQxwMaT6EPnX6WG2S7XCXtmiZfG6xYrXlt982YELpBtszYoSekWekXT94sNHj8QJL9i8hZmwMV5Ou8k6jd3ir4VtWm2RLcpqH7hNOn4Zq1WDCBLDommIweIbJ8PE5m//aTJuJbbiadJV/1/k3b0a/abVJ9uPq1UxDfJY59MhIOHUKunaF1q3h8GGrLDEYMsFk+PiUP07/QczYGM5fPU/HWzoyOGawKekHPVn4+Wd46y1o1AgKF4YGDdy+xNKORX36bKBvXzh3Tjv4Tz6B3r2z1sTdYPA5do6hBzh/XfiLeiPrse/MPu6/6X7mdJlD3jx5rTbLGs6ehZUrYdkyWLoUNm6ExMTUY6pXR23fbr8YunNR9OhRrSs0Y4Z+Pjoahg+HypUtMctgSB+jY+N1zl05R8NRDdlyfAu1S9Vm0cOLiMwbnMJi6XLyJCxfrp33smWwZUvq+HNICNSsqZ1idLQ+z4oVs+eiqGuWiwhMnaod+4kTWjzunXegb1/IY/QgDXYhyDJKrORK4hVixsaw9MBSKherzIqeKygREeQZEocPa8ftvO3alXp7WBjceWeKA69bFwoVumY3tnfoTv7+Wzvx0aP145o14X//g9tvt8BAg8HgExIdiXSY3IEZv82gVGQpVj62kqgiUVab5V1EYN++1A58377UY/Lnh3vu0c67YUO46y79XCYETJPoYsVg1Cjo0gWefBI2bYLateGVV/S6QL58VltoMBhygojQZ04fZvw2gyL5ihDbPTY4nLmInnG7OvAjaYrlIyN12KRhQ+3Ea9VKKQrzEraaobty4QK8/jp89ZX+rCpX1rN1E640GAKXNxa9wQfLPyBfnnz83ONn6pWrZ7VJ2SMpCbZuTYl/L1+u0/ZcKVYsJXwSHQ233QahoTk+dMDM0F0pWFDXa3TqpGs2fvtNZ+w8/TQMHJhuaMlgMNiYwWsG88HyDwhVoUzuMDmwnHl8vM46cc6+V6yA82k0Cm+8MWX2HR0NVav6PWXPtjN0V65ehQ8+0I48MRHKloXvvtNJB7bFtGozGP5h/LbxdJvWDYBRbUbxyO2PWGxRJly+DGvXpjjw1avh0qXUYypUSIl/R0fDTTeBH/LnA2ZRNDO2btWzdefLunWDL76A4sV9YGBOMCluBsM/LNi7gFYTWpHoSOTTBz7lpbovWW3StcTFwapVKTng69ZBQkLqMf/6V4rzbtBAzywtIGgcOugZ+uDB8Oab+iJavDh8+SV07uyXi2PmmCIU32N+/QQMaw+vpfGYxlxKuMTLdV/mkwc+sdokzenTOu7tnIFv2pS6I5dSOubtDJ80aAAlS1pnrwvuHDoiYsmtVq1akhP27hW5914RvWQq0rKlyKFDOdqldxg+XCQiIsUw11tEhMiIEVZbGNgsXy4SGZnyGUdE6MfLl1ttmSENO0/slOs+vk4YgDwy/RFxOBzWGXPsmMikSSL//rfIrbde+78ZGipy110iL78sMnu2yJkz1tmaCcAGycCv2nZRNDNuvhl++UVnvvTtC3Pm6F9KlssHGCEn3+HaqNqJ87Nu3tz8+rERh84dounYppy+fJqWlVsyvNVw/+qzHDiQOoXw999Tb8+bV+d9O2Pgd98dFOdOwDp00L+KHn8cmjXTVaYzZ0KfPlrBccQI/Wvc7ziFnDKSWjVCTtnHk0bVRsbWcv6+9DdNxzbl0PlD1Ctbj0ntJxEWGua7A4roiZQz/r1sGRw8mHpMRATUq5cSQqlTJygLWwLaoTspXRqmT4cpU+CZZ/T3WaOGlg948UU/ywd06qQPmh5B0BrMUsyvH9tzMf4iLca3YNepXVQvWZ3ZXWZTIKyAdw/icMD27aln4MePpx5TpIiOezsd+B136NL6ICcoHDro2XqHDtC4sfanY8boDl2TJvlZPsDZAiyjLJcg+FlnGebXj61JSEqg/eT2rD2ylvKFy7Og2wKK5i+a8x0nJsKvv6Y47+XL4cyZ1GNKlkxx3g0bQvXquVK2NeCyXDwlNlbH0g8e1MVZ/frpzBi//MqKi9OCNHPn6sctW8IjjxhnnlNMBpFtcYiDh6c/zLht4yheoDgrH1tJ5WLZlEy9ehXWr09x4CtX6tJxV8qU0Y7bmUZYubJN0tx8T47SFpVSI4GWwAkRqZ7O9sLAWHSP0TzAZyLyfWZG+aOnaFyclg/4+msdZqtSRcfWfZoKbnLQvY9rmiLAkCH6CzWfry0QEV6MfZEv1n5BwfCCLH5kMbVLpZ9Vly4XL8KaNSnx7zVrtFN3pVKl1GX05cvnGgeelpw69GjgAjAmA4f+GlBYRPoppUoAu4EbRCTe3X792SR61aoU+QDQC6gDB/ogdTmQZ5B2ze1O7wKplP4SlTIytt4gh9/9Rys+4tVfXiUsJIx53eZx/033u3/BuXP6e3XOwDdsSLeRQ6oc8FKlsvHGgpMc56EDUcD2DLa9CgwBFFAB2AuEZLbPnOahZ5XLl0XeeEMkTx6ddlq2rMi8eV4+SKDmoNs1t/v8eW1Hep9nZKRIXJy19gUDOfzuh28cLgxA1AAlk7ZPSn/QiRMiU6eKPPecyB13iCiV+rsMCRGpVUvkhRdEZswQOXXKi28w+MBNHro3HHoksBg4hp7Jt3Czn97ABmBDuXLl/PX+U7Fliz53nOdS9+4iJ096aeevvJK+83He+vf30oG8iJ2dZqBeIAOFHH7303dNl5B3QoQByDfrvknZcPiwyPjxIk89JVK16rX7DgsTqVtX5NVXRebPFzl3zsdvNLhw59C9keXSFNgMNAZuBn5SSi0XkfNpB4rIMGAY6JCLF46dZWrU0CG6L77Qi6Rjx+oF1K++go4dcxiWC8QsDDvnduf2NEVfh8Fy8N0vO7CMzlM64xAHb9d4lqe354chPTNv5BAdrQt6Cng5ldEAeCdtsSfwUfKVY69S6k/gX8A6L+zbJ+TJAy+9BG3bwhNPwJIlWgtm3Di93lamTDZ3HIg56HZ2moF4gfQW6a0dvPiidxd/s/Pdi7Bl9XRa/dyNq3KVPjsjeHvAl6nHOBs5OB147dpeb+RgSB9vJGoeBO4DUEpdD1QB9rl9hU2oWBEWLYJhw7S++uzZcMst+nFGExe3OHPQIyP1PyDov87nrVy4i4vTKT79+um/zoVbp9NMD6udZqdOGecS2/UC6Q1cJQ6cDvfixZTn06bwZRdPvvukJJ0DPngwPPQQ+yoWo+n0hzgvV2i/A76afBFVrJieHQ0apDXDT5/W53v//rovpnHm/iOjWIzzBkxAx8cTgMNAL+Ap4Knk7aWAhcA2YDvQPbN9igWLoplx+LBI69YpYb6GDUV+/z2bO4uL0/Hd/v31X6sX79wtfNk5hp6Z7cGKv9YO3H334eEiTZqIFCr0z3N/RSA3P4swAGn8ckm58s1gke3bRZKSvGOPwSPI6aKoL252c+giIg6HFmQrUUJ/MvnyiXz8sUhCgtWW5QBPHLbdnabdLpC+xp+L6z//LJI/v16ozOh4FSrI2Ue7yO0flBUGILWG1pLzV857zwZDlnDn0IOm9N8bKKUXRu+771r5gJEjtTxywOHpwtfRo/r+3r32y+0uWDB3iW75cu3AtZHDsmW6kUN8mpKRypWhUaN/YuBXbixB23HN2Lz/EJWuq8S8bvOIzGuDGgXDNRiHng7FiunK/S5d4MkntfZ97drwyit+lA/wFp4ufOU2p2lnvLm4fvp06iKeTZt0XNyJayOHhg31Yub11/+zOcmRRLcpHVmyfwk3FryR2O6xlIywR6MHw7UYh+6GmBgt6vbaa/DNN/DhhzB1qhb7qhco/W2tzBSxa/Wp3cmJwNtff2nxKmcZ/bZtqbeHhqbogEdH6xO5aPoCWiLC03OfZtquaRTJV4TY7rFUKFrBi2/U4G2CVpzL26xcqbXXf/stpfL8ww8DwD9lR47AG47YaNrknAsXMg+DHTyY4rwza+QQHa3zwT0Mpb256E3eX/4++fLk46ceP1G/nPne7EBQ9RS1kitX4P334eOPtfRE2bIwdKhusOEWq2eqWXGu3nDEgaxpY2fEpZGD83bgQOoxERE6VdDpwO+8M1sxwq/WfsWzC54lVIUyvdN0WlVp5aU3YcgpQdlT1Eo2b04tH9Cjhxv5CbtkkMTFiXz9tUizZiIxMSJffaUzYFzxVgqjKdn3DklJIlu36u+tY0eRG2649vMsXFg31P30U5G1a0Xi43N82PFbxwsDdHri979+n/P3YfAqmLRF75OQIPLJJzq1EXSq48SJOvXxH+yU4+3JhcVbjjjQNG3On9fv/ZVX9N+0Fzp/kZAgsn69yGef6aKIokWv/exKlhRp317kyy/1zCIx0asmxO6NlbB3w4QByMcrPvbqvg3ewZ1DN4ui2SRPHnj5ZXjwQR1bX7pUyweMH6/lA0qXxj46KZ42V/aWDIC7hdjw8BxoK/gAf5TYZ0RWGjk4QyhVqvhMB3zdkXW0m9SOBEcCfe/py8t1X/bJcQw+JCNP7+tboM/QXUlKEhk6NKWorlAh/Tjp5X72mKl6OvP21gzd3S8TEClY0B5FS/7+BXXhgi7keestkUaNUn7eud4qVhR57DGRUaNE/vwzzU8+37Hr5C4p9nExYQDy8PSHJclhqj/tCibk4h/Sygc0qnJE9uS/NecOMqd4GgLxpoNbvlw77oyOaQdZAV/H+s+eFZk7V6RfP5G7704R43e93XKLyNNP63jdkSPeeV9Z5NC5Q1J2kK4CbTGuhcQn5jwOb/Ad7hy6Cbl4kdKlYcYMmDwZnnkGluwuxa2s5V3e4gU+Jw8uBR3+FJcqW9b9dmcIxJsNruvX122hXnrp2nZiYL00L3hfafLkSR3CcaYRbtmSOuQWEgK1aqWET+rXh+LFs2+/Fzh9+TRNxzbl0PlD1C1blx87/EhYaJilNhmyj3HoXsZVPuCFF+CHH/LzCp8yKaQL/3P05LaIP7LnIP1F/frekwE4dCh9Zw7WS/NCzouujhxJnUK4c2fq7WFhcPfdKQ68bl0oXNh79ueQi/EXaTm+JTtP7uSWErcwu8tsCoQZnfJAxjh0H1GsmNaC6doVnuztYOOhmtQO2US/Rtt4Y1RF8hX3ozM/dMj99sOHUz/2lgyA3fXMs1JiLwJ//pnagf/xR+rX5MuX0sihYUNbN3JISEqgw+QOrD68mnKFyxHbPZbr8l9ntVmGHGIcuo+JiYHtO0KS5QNC+WDu7UxtoCXJ/SYfYJVjtXvDD3chprlz9YVw2bKUEMqRI9e+PgAbOTjEwWOzHmP+3vkUL1Cchd0XUrpQaavNMngBUynqR1au1BPf3bv9LB9gZeVmIEgAXLgAEybA6tVw+TJcuqTvnzyZetx116U47+hoLWqVJ7DmRCJC34V9+XzN50SERbD4kcXUKV3HarMMWcCU/tuItPIB5cpp+YCYGB8f2ErH6okmib9JSNDddZzhkxUr4Ny51GNuuCF1Dni1ahl3UHLFaqkHN3y84mP6/9KfsJAw5nadywM3P2C1SYYsYhy6Ddm8Wc/WN23Sj3v0gM8/17F3n2FHx+ovLl/W2t9OB75qlZ6JuxIVlRL/jo6Gm2/OehFPRhfOKVO0kJaFTn7kryPpNasXCsWEhybQqXqQtvALcoxDtymJidqJv/WWnrmXKAFffw0dOvisGDD3EBenwybOGHh6jRyqVElx3g0a6J9LOT1mRqEtSFnHsCDsNGv3LB6c9CAOcfBVs6945s5n/HJcg/dx59AzDQAqpUYCLYETIlI9gzGNgC+AMOCUiDTMvrm5B6d8QNu28MQT2u906gTjxrnIBxg848wZrQPuSSMHpwN3aeTgFdxJPUDqhs+QWnbBhyw/sJxOUzrhEAdvRr9pnHkQ48mKzijga2BMehuVUkWAIUCMiBxUSpl2JlmkUiVYtAiGD9ddkWbNgiVL4LPPtE6Mma2ng7ORg9OBb9umUwudhIZq6VjXIp4MGjl4DXeFSunhh+Kqrce30mpCK64kXuHJWk/yTqN3fHYsg/Vk6tBFZJlSKsrNkK7ANBE5mDz+hHdMy12EhOh2dy1aQJ8+MGcO9O6tky+GDbM+ZdtyDh5Mcd5Ll17byCE8XOd9O0MoWWjk4DXcpYemh4+Lq/488ydNxzbl3NVzPFT1Ib5p/g3KzA6CGm/kXFUGwpRSS4BIYLCIZDSb7w30BiiX03hlkFKmjJ6hT5oEzz4LixfDrbfCe+/B888HXJZc9hDRjs41BzxtI4cCBXQifw4bOXgVd3n36eHDGoATF0/QZGwT/rrwF/dG3cu4duMIDQn1ybEM9sGjRdHkGfqc9GLoSqmvgdrAfUB+YDXQQkR+TzvWFbMomjmnTmn5gLFj9ePatXU/0xo1rLXL6zgcsGNH6irMv/5KPaZwYR33djrwmjV1ab3dSJvlUqDAtdk0TnxUA3D+6nnuHX0vm45t4o4b7mDJo0solLeQV49hsI4cLYp6wGHgbxG5CFxUSi0DbgPcOnRD5hQvDj/8kCwf8CRs2KC1nfr3hzfe0O0iA5LERJ236XTey5fr7vSuFC+us06KFtUz8RdegCJFrLE3K6SnhVO2LLRvn3PBMw+4kniFthPbsunYJipeV5H53eYbZ56L8MYMvSp60bQpEA6sAzqLyHZ3+zQz9KwRFwevvgrffKMfV62q5QPq1rXWLo+4elVfjVwbOaRN7StdWse/GzbUDu+pp3Toxa7VpVnFDzUASY4kOk3pxNRdU7mh4A2semwVFYpW8OoxDNaTozx0pdQEoBFQHDgOvI1OT0REvkse8zLQE3AAI0Tki8yMMg49e6xYoTNfnPIBzzyj5QNsVR906RKsWZMS/16zRifau1KxYuoy+qgo/YZMg+lsISL0mduHoRuHUjhvYZb1XEaN64MtNmeAHIZcRKSLB2M+BT7Nhm2GLFK/vo5WvPeelg/46iu9iDp0KDRtapFR587pWbdzBr5+vQ6ruHLLLalzwDNKsrdL274AY8CSAQzdOJR8efIxu8ts48xzKbkhZyLoyJcPPvhAV5Q65QNiYuDhh2HQIB/LB4BerXXNAd+8+dpGDjVrppTRZ6WRg7ebTuQCvl73Ne8ue5cQFcKk9pNoUL5Bpq8pNLAQcfEZVLQCkeGRnH/1vDfNNPgB49ADmNtvh7VrtRN/+22tv75ggZYPaN/eiwVJR4+mzkDZsSP19jx5UueA56SRg9011G3GpO2TeHb+swAMbzWc1lVae/Q6d87ck+0Ge2K0XIKEPXt0bH3ZMv24TRstH1CqVBZ3JAL796cu4nHXyCE6Wnfl8VYjBxND95if/viJFuNbkOBI4KP7PqJf/X4ev1a9k/nVXt62xjcY3OPrtEWDDahUSRchDR+u9WFmzkyRD+jVK/3ZusMBo0cJj9y9m5DlS1OceNoORpGRqYt4atf2Xc6kN/uaBjHrj6znwUkPkuBI4IW7X+CVeq9YbZLBBpgZehBy+HCKfADAvfe6yAckJWndk2XLODx+GeFrl1GSdBo5OIt4Gja0ppFDbpb6zYTdp3ZT//v6nNGFZwQAACAASURBVLp0iu41ujO67WhClAc67S6YGXrgYmbouQxX+YAXnkng4uJNjKy6jF6VlnHTsRWos2f1uOTxJ0JvoMRDDVENs9jIwZd4q69pRti4CYU7jpw/QpOxTTh16RTNKjZjZOuRWXbmhuDFOPRg48oVWLcOtWwZnZcupdPlVSguQSKwSw+JLxXF0UrRfLommoVXo/krX0VGdVQ89JCllvuP9JpQvPii7QuXTl8+TdOxTTl47iB3l7mbyR0mExZqQ/kDg2UYhx7oXLigu+84499r16Zq5KAAqlThYFQ0/10fzfTT0Rw7UY6Ii3DuavKgizru/uCD1k/MfU5cnHbmrouuftYnzw6XEi7RakIrdpzcQbUS1ZjbdS4R4RFWm2WwGcahBxpnzugZptOBb9x4bSOHGjVS4t/JjRzKAe+dh8RXdfZL2vaZJ0/C9OkE/yw9AAuXEpIS6Di5I6sOraJsobLEdo/luvzX5WifkeGRmeahGwIP49DtzvHjqYt4tm5138ihXj29qJkOhQrpytJp064VM7xwIZfM0gOscMkhDh6f/Thz98ylWP5iLOyxkDKFymT+wkwwRUPBiXHoduPQodQ64Lt3p97ubOTgdOD33JOlxbwZM+BEBi1IDhzQ29u1y4H9difACpf6/dSPMVvGEBEWwbxu8/hX8X9ZbZLBxhiHbiWujRyct/37U48pUEBXXjpDKDls5FC+vG6U4eTECVi4UP91OOD776FRowwn+YGPuyYUISF6u034dOWnfLb6M8JCwpjWaRp3lr7TapMMNsc4dH/icMDOnakd+LFjqccULqwzLZxl9F5u5FCrlr65kpgI//0vDBigc9erVvWBfIBdCJDCpVGbR/HKz7pYaHTb0TS5uYnFFhkCAVNY5EsSE2HLltSNHP7+O/WYEiWQBtGszRvNnS9FE3LbrTounozDAaNHwyOP+D62/fvv8MQTKfIBbdtq/fUsywcEAjYuXJq9ezYPTnqQJElicMxgnr3rWatNMtgId4VFiIglt1q1aknQcfWqyMqVIh9+KBITIxIZKaIDKym30qVFunYV+e47kZ07RRwOmTxZb5oy5dpdutvmC5KSRL79NsX0woVFhg8XcTj8c/zczvIDyyXf+/mEAcgbv7xhtTkGGwJskAz8qpmh5wRnIwfnDHz16msbOdx8c8oCZsOGKY0cknE49JD9+6FCBT1hdM7E3W3zNYcP66ZBc+fqx40ba/mAm2/2z/FzI9uOb6PB9w04d/UcvWv25ruW36GCLuZlyCmm9N9bnD9/bSOHhITUY6pVS4l/u2vkkMy0aVpeHK7NBXe3zdeUKQOzZ8PEifDss7BoEdx6q26s8fzzqaJCBi+w/+x+mo5tyrmr52hXtR1DWgwxztyQZcwM3R2nTqUU8Sxdmn4jh9tvT5mB16+Po1gJj2PerjNwJ86ZOGS8zd954qdOaSc+bpx+XKcO/O9/2sEbcs6JiyeoP7I+e07voVFUI+Z3m0++PNnPZDIEN2aG7imeNnJwLeJJ08hh2hR47DFdxJPZbNp1Bu7EORMXyXibv6s5ixeHsWOhSxcdhlm/XiffvPoqvP56zpR0/bnoa0firsbRfFxz9pzew+033M7MzjONMzdkn4yC684bMBI4AWzPZFwdtARU+8z2KXZYFHU4RPbtExk1SuSxx0QqVrx2ATNfPpFGjUTeekvkl19ELlxwu8ukJJGoKP3SChX0Y0/Gpr1FRWW8LbP9+ppz50SefjrFnqpVRVatyv7+/L3oayeuJFyR+0bfJwxAbh58s/wV95fVJhkCANwsinri0KOBmu4cOhAKLALm2dahOxwiu3aJDB0q0q2bSNmy13rLggV1dsqHH4qsWCFy5UqWDjF5st6Fc1funNTUqSIhIek77ZCQjLeFhurXWs3SpSKVK2ublBJ57jmRuLis7SMrF8BgIzEpUdr/2F4YgNzw2Q3yx+k/rDbJECC4c+iZhlxEZJlSKiqTYf8BpibP0u2Bw/FPI4d/yuhPpmnkULRoSvgkOlrHw7PZyMHh0FooFy7ox5lpo6St2HTl+HHtvm+4If3t5ctny0SvEh2tU+zffRc++QQGD9ayAcOGQRMPa2CsXPS1EhHhP/P/w5SdUyiUtxALui3gpqI3WW2WIRjIyNO73oAoMpihA6WBpUAIMAo3M3SgN7AB2FCuXDnvXrbi40XWrBH55BORli1FihS5dnp7/fUiHTuKfP21yNatXp0STpokkjfvtRP+3BBK2LRJ5I47Ut73o4+K/P23+9ekF3LKLbP0AYsHCAOQvO/llSV/LrHaHEOAQU5CLpK5Q58M3J18361Dd73lOORy+bL+3f/eeyIPPCASEXGtAy9fXqRHD10Z8/vvPquOSUoSKVEi/RBJbnFS8fEiH32UclG7/nodgsroI3cNT+WmC+A3674RBiAh74TI9F3TrTbHEID42qH/CexPvl1AL6C2zWyfWXbocXEiCxeKvPGGSHT0tdNh0EHdxx8X+eEHkf37s/+JZRHnwp6dY97+YvdukQYNUt7/gw+KHD2aeoy7BeFgvgBO2j5J1AAlDECGbxxutTmGAMWdQ89x2qKIVHDeV0qNAuaIyIyc7pczZ3QRjzP+nbaRA6Q0cnAW8WQUdPYxf/yh9bMSEvTfpk2hcuWU7XaIefuLypVhyRIdS3/lFR0XX7RIi3899pgukp0xAw4eTP/1Bw8Gp4Tvz/t+pvu07gjCh40/5PGaj1ttkiEIydShK6UmAI2A4kqpw8DbQBiAiHznNUtOnEidA55eI4c6dVIV8dhB49XhgO++SykYTUjQ6eszZ+bOvGrQ7/upp6BFC+jTR8sHPP44jB8Pw4e7XxCG4LsAbji6gQcnPUiCI4Hn73qe/vX7W22SIUixrlK0Rg3Z0K9figP/7bfUA8LDU3fiqVvXll3Zp0yBnj1TsltAi/aNGpU7MjYyQwQmTIDnntMZLfnzw/vv68e5QT7g979/p97Iepy6dIput3ZjzINjCFG59Epv8AruKkWtc+hKSarC//z5tdN26qDcead+zsakV7rvxKoyfbty8qSelY8frx/feaeWD6he3Vq7fMnRuKPU/V9dDpw7QEzFGGZ2nkl4aLjVZhkCHHs69NBQ2dCsWcoMvGZNPSsPIKZNgw4d0u85HBoKP/4YfLHgnDJ3rg7HHD6s1xtefRVeey1n8gF25MzlM0SPimb7ie3cVfoufnn4FyLCI6w2yxAE2NOhB4I4VyZs3Jgy40yPrl2v7Q5k0KKV/fvDt9/qx9Wq6dn63Xdba5e3uJRwiSY/NGHloZVULV6V5T2XU6xAMavNMgQJxqEbbMmyZXqxdM8enf3y7LM6vm6TxkHZIiEpgXY/tmPO73MoU6gMqx5bRdnCZa02yxBEuHPoJsIbADibN6cX2glknPIB/fvrtYbBg7Uk708/WW1Z9hARnpj9BHN+n8N1+a9jYfeFxpkb/Ipx6AHAtGk6h3v6dKst8T7588PAgbBunZbS2b9fa8H07AmnT1ttXdbo93M/Rm8ZTYGwAszrOo+qJapabZIhl2Ecus1xin6B/htss3QnNWtqpz5woF4gHTVKx9anTrXaMs/4bNVnfLrqU/KE5GFqx6ncVeYuq00y5EKMQ7c56SkSBithYTr8smWLrhs7fhzat9eZQseOWW1dxozePJqXf9JX3dFtRxNTMcZiiwy5FePQbUxGkrzBOkt3UqWKVnwYMkQvkE6frmfrI0emLh62A3N+n0OvWb0A+KLpF3S9tavFFhlyM8ah2xh3LeqCnZAQLRuwcyc0bw5nz0KvXvDAA7Bvn9XWaVYeXEnHyR1JkiReq/8az939nNUmGXI5xqHblLSzcye5ZZbupGxZmDNHN6guVgx++UVnwnz++bVabf5k+4nttJzQksuJl3n8jsd5v/H71hljMCRjHLpN8USRMLeglC7S2rVL/710CV58UStFbN+e+eu9nfZ54OwBmo5tytkrZ2n7r7Z82/JblFLe2bnBkANyLJ9r8A25TZHQE0qU0DP1Ll20fMC6dTo75rXXtIRARvIBzrTPQoVyLph28uJJmoxtwtG4ozQs35AJD00gT4j5NzLYA1MpaghIzp+Hfv20dDHALbdo+YC70mQLugqo5VQwLe5qHI3HNGbD0Q3cdv1tLH10KYXzFc7R+zAYsoqpFDUEHYUKaS2YJUugUiWtQX/PPfDCC3DxYso4b6V9Xk28Srsf27Hh6AZuKnoTC7ovMM7cYDvMDN0Q8Fy+DO+8A599phdKo6J0I43Gja+VN87OLD3JkUS3ad2YtGMS10dcz8rHVnLzdTd7+238Q6GBhYiLj8twe2R4JOdfPe+z4xvsjbsZugn+GQKe/Pnho4+gY0ed2rh5s05vvPdePSt3xTlL9zSWLiLk/yA/CQ7dkur4xeNU/KpiqjHedrDunLkn2w25F+PQDUGDUz7gs8/0jH3x4mvHONM+H3zQs1n6e8ve+8eZZ0SgOljzSyD4yPSUVkqNVEqdUEqlmyCmlOqmlNqqlNqmlFqllLrN+2YaDJ7hbJrx6acZj/E07fO7Dd/x9pK3vWeczTC/BIIPTyKJowB34hR/Ag1F5FbgPWCYF+wyGHJE3bp6gbRxY+3kQac1NmmiddczS/ucsnMKT8992veGGgxeJFOHLiLLgAyFTEVklYicSX64BijjJdsMhmxTqxYMGqQrS/fuhWbN4OpVWLgQtm2DokUzfu2iPxfRbVo3BOH9e00FqCFw8HbaYi9gfkYblVK9lVIblFIbTqZdrTIYfES5crqX6dixWj7g558zlg/YeHQjbSa2IT4pnmfvfJbXGrxmjdEGQzbwmkNXSt2Lduj9MhojIsNEpLaI1C5RooS3Dm0wZIpS0K2blg/o0iVFPqBevRT5gD1/76HZuGZciL9Al+pd+Dzmc1PSbwgovOLQlVI1gBFAGxH52xv7NBh8QYkSurH3rFlQujSsXauzY/q+c5QHfmjCyUsnaXpzU0a1HUWIsqbuLjI8MkfbDbmXHKctKqXKAdOAHiLye85NMgQiDgeMHg2PPJL90np/0qqV7mnavz98N+osg47HAPupVvhOpnScQnho+D9jI8MjM03v8yYmVdCQXTJ16EqpCUAjoLhS6jDwNhAGICLfAW8BxYAhyT9PEzOqYjIEL94UwPIXhQvDoC8vs7JKK7ad2wYn/8XOT+by1sGCvPceREToccHqYP19oTL4HlP6b8gx3hTA8ieJjkTaTWrH7N9nUzqyDK1PrmTYp+VIStLvY9gwuP9+q600GFJjxLkM2cYTLfFA7HsqIvSe3ZvZv8+maL6iLOwRy5CB5Vi7Fm67Df78U8sH9OoFZ85kvj+DwQ6YGbrBLVOmQIcO+m96oRTX2bmTQJil9/+5Px+v/JgCYQX4ucfP3FP2nn+2JSSkyAdcvQo33ADffKObVQcSnpT2g/uKUFP+bz/MDN2QLZxt8CDjtneB2Pd00OpBfLzyY/KE5GFKhympnDmkyAds3qzTGv/6S1/M2rfX9wMFT0r7Tfl/cGEcuiFDMgulBGLf0x+2/EDfhX0B+L7N9zSr1CzDsf/6FyxbpmfnBQvC1KlQtaoOQVn0w9ZgcItx6IZ0Seus03PSgdb3dO7vc+k5sycAnzf9nO41umf6mpAQePpp3UCjWTM4e1Zn8zRpouPsBoOdMPK5hnRxF0pxxtIDqe/pqkOr6DC5A0mSRP96/Xn+bjeGp4NTPmDcOP2ef/4ZqleHDz6A//wHQkN9ZLgNUO+krpY1cXX7YhZFLcLOhTjpLXQ6CYQFz7TsOLGDBt834MyVMzx2+2OMaD0iRyX9J07Ac8/BxIn68V136X6mt9ziJYO9RFpH7E3kbRNzsgrTsciG2LkQx5NQSqBkfBw4e4CmY5ty5soZ2lRpw9BWQ/9x5tm9qJYsCRMmaE2YPn20fED12+KhwQdQfyDkubYhhpnVGvyBcegWkDZ7xNPuOf4ikEIp7jh16RRNxzblSNwRGpRrwISHJpAnJOWUz+lFtXVraNgQ+vWDoUPDYck7sLM9tO4FZdanGmuyRQz+wDh0C0gve8ROs/RatfQtkLkQf4Hm45qz++/d1Li+BrO6zCJ/WP5/tnvrolq4MHz3HQy92hBmjYATt8L/VsNdg6HxmxB+yUvvKOt4WtpvLjbBg3Hofiaj7BG7zdIDmfikeNpNasf6o+upUKQCC7otoEi+IqnGeP2iGrUM+tSAJQNg1Uuw5kX4rS20fgJuWpSDHWef7IZ4fBl7N/gW40L8TCAW4gQSDnHwyIxH+GnfT5SMKMnCHgu5MfLG1GM8SMnMFmFX4IH+8MSdcP1mOHsTjPkFZo6Ay0Uyf73BkEOMQ/cjgViIE0iICM/Nf46J2ycSGR7J/G7zqXhdxWvG+fyiWmoT9K4DjV+D0Kvway/4Zqe5aBt8jnHofiTQCnECjQ+Wf8DX678mPDScmZ1nUvPGmteM8dtFNTQRogfCU7dB2RVw4UbatdO6OHaXDzANNgIXE0P3I9nNHrFzzrpdGLphKG8ufhOFYny78dxb4d50x/k9JbPEbugZDRv6UHDZN0yZohtXDxqkv087drgz6ZWBi3HofiS72SN2zlm3A1N3TuXpeU8D8G2Lb3moWsYfkq9SMt1mlIQIkfV/YNuQb3jqKViwAHr21K3whg2DqKjsHdNgSIupFLU5gdo8wl8s/nMxMeNiiE+K57173+ON6DesNsktIlo+4Lnn4PRpKFAAPvwQnnkmuOUDDN7DyOcGMIHYPMJf/HrsV9pMbEN8UjzP1HmG1xu8brVJmaIUdO8Ou3ZBp05w6ZL+xVC/PuzcabV1hkAnU4eulBqplDqhlNqewXallPpSKbVXKbVVKXXtSpQhW/gsvS4I2Ht6LzHjYoiLj6Nz9c4MbjY4R/os/qZkSa0FM3MmlCoFa9bA7bfDu+9CfLzV1hkCFU9m6KOAGDfbmwGVkm+9gW9zbpYBTM56RhyLO0aTH5pw4uIJmtzchNFtRxOiAvPHZuvWembeu7fulPT223qdZd06qy0zBCKZ/heIyDLgtJshbYAxolkDFFFK3ehmvMEDTM56+py9cpaYcTH8efZP6pSqw9SOUwkPDbfarBxRuDAMHQqLF+v1ku3b4Z57oG9fuHjRausMgYQ3pjWlgUMujw8nP3cNSqneSqkNSqkNJ0+e9MKhgxeTs34tlxMu02ZiG7Ye30qVYlWY23UuBcMLWm2W12jUCLZuTdGYGTQIatSARdYoBxgCEL+mLYrIMGAY6CwXfx470AgWxUNvkehIpMvULiw7sIzSkaWJ7R5LiYgSVpvldQoUgE8+gY4doVcv7eDvu0/f/+wzKGIUBAxu8IZDPwKUdXlcJvk5Qw4IBsVDbyEiPDn7SWbunknRfEWJ7R5L+SLBfUWrXRs2bNDO/d13dQONefNgyBBo29Zq6wx2xRshl1nAw8nZLncD50TkmBf2azAA8Pqi1xm5eST58+RnTtc53FLSZq2BfERYGLz+OmzeDHXrwrFjWpUzEOQDDNbgSdriBGA1UEUpdVgp1Usp9ZRS6qnkIfOAfcBeYDjwtM+sNeQ6Pl/9OQNXDCRUhTKl4xTqlq1rtUl+p2pVWL4cvvoKIiJgyhSoVk3LQVhUF2iwKaZS1GBbxm4dS4/pPQAY03YMPW7rYbFF1nPgAP/IBwA0aaIzZIx8QO7BVIoaAo75e+bTc2ZPAP7b5L/GmSdTvryOpY8ZA9ddBwsXQvXq8OWXkJRktXUGqzEO3WA7Vh9azUM/PkSiI5F+9frx4j0vWm2SrVAKevTQBUmdOulc9eeeM/IBBuPQDTZj58mdtBjfgsuJl+l5e08G3jfQapNsy/XXa/mAGTNS5APuuAPee8/IB+RWjEM32IaD5w7SdGxTzlw5Q+sqrRnWalhA6bNYRZs2sGMHPPGEduRvvaXTHtevt9oyg78xDt1gC05dOkXTsU05fP4w9cvVZ+JDE8kTYuT6PaVIEa2tvmiRlg/Ytg3uvhteekkrOhpyB8ahGyznQvwFWoxvwW+nfuPWkrcyu8ts8oflt9qsgOTee3V16Usv6cf//S/cequRD8gtGIdusJT4pHja/9iedUfWEVUkigXdF1Akn6lvzwkFCsCnn8LatdqZ79un5QOeeALOnrXaOoMvMQ7dYBkOcfDojEeJ/SOWEgVKsLD7QkpFlrLarKDBKR/w3nsQHg4jRuiCpNwo7JZbMA7dYAkiwgsLXmDC9gkUDC/I/G7zqVSsktVmBR3h4fDGG9fKB3TsCMePW22dwdsYh26whIErBvLlui8JDw1nZueZ1CpllMh8SVr5gMmT9XNGPiC4MA7d4HeGbxzO64teR6EY124cjSs0ttqkXEFIiG5GvWMHNG0KZ87Ao49CTIxuQm4IfIxDN/iVabum8dRcres2pMUQ2ldrb7FFuY/y5WH+fD07d5UP+OorIx8Q6BiHbvAbS/YvoevUrjjEwTuN3uGp2k9l/iKDT1AKHn5YSwV07KjlA559Fho0MPIBgYxx6Aa/8OuxX2k9oTVXk67y7zr/5s3oN602yYCWD5g0STcev/FGWL1aywe8/76RDwhEjEM3+Jw/Tv9Bs3HNiIuPo+MtHRkcM9iU9NuMtm31zNwpH/Dmm0Y+IBAxDt3gU/668BdNxjbh+MXj3H/T/YxpO4bQkFCrzTKkg1M+4Jdf4KabUuQDXn7ZyAcECsahG3zGuSvniBkbw74z+6hdqjbTOk4jb568VptlyITGjbUzd8oHfPYZ1KgBixdba5chc4xDN/iEK4lXaDOxDVuOb6FyscrM6zqPyLyRVptl8BCnfMCaNVo+4I8/tKPv3dvIB9gZjxy6UipGKbVbKbVXKdU/ne3llFKLlVK/KqW2KqWae99UQ6CQ6Eiky9QuLD2wlFKRpYjtHkuJiBJWm2XIBnXqaPmAd9/VVafDh8Mtt8DMmVZbZkgPT5pEhwLfAM2AakAXpVS1NMPeAH4UkTuAzsAQbxtqCAxEhD5z+jDjtxkUyVeE2O6xRBWJstosQw4ID9eLpL/+CvfcA0eP6kXUTp2MfIDd8GSGfiewV0T2iUg8MBFok2aMAIWS7xcGjnrPREMg8caiNxjx6wjy5cnHnC5zqF6yutUmGbxEtWpaPmDwYC0f8OOP+rkxY4x8gF3wxKGXBg65PD6c/JwrA4DuSqnDwDzgP+ntSCnVWym1QSm14eTJk9kw12BnBq8ZzIcrPiRUhTK5w2TqlatntUkGLxMaqguQtm+HJk3g9Gl45BFo1gwOHLDaOoO3FkW7AKNEpAzQHPhBKXXNvkVkmIjUFpHaJUqYmGowMW7rOJ6PfR6AkW1G0rJyS4stMviSqChYsEDLBxQtCrGxOrb+1VfgcFhtXe7FE4d+BCjr8rhM8nOu9AJ+BBCR1UA+oLg3DDTYnwV7F/DozEcB+PSBT3n4toetNcjgF5zyAbt2QYcOqeUDdu2y2rrciScOfT1QSSlVQSkVjl70nJVmzEHgPgClVFW0QzcxlVzA2sNreejHh0h0JPJy3Zd5qe5LVptk8DPXX6/j6U75gFWr4PbbtXxAQoLV1uUuMnXoIpIIPAPEArvQ2Sw7lFLvKqVaJw/rCzyhlNoCTAAeFTHLJMHOrpO7aD6+OZcSLvHo7Y/y8f0fW22SwUKc8gGPP55aPmDDBqstyz0oq/xu7dq1ZYP5pgOWQ+cOUXdkXQ6fP0zLyi2Z3mk6eULyWG2WwSYsWqR1Yfbt0zrsL74I77yjC5YMOUMptVFEaqe3zVSKGrLM35f+punYphw+f5h6Zesxqf0k48wNqXDKB/Ttqx8b+QD/YBy6IUtcjL9Ii/Et2HVqF9VLVmd2l9kUCDPTLsO1FCigHXla+YAnn4Rz56y2LjgxDt3gMQlJCbSf3J61R9ZSvnB5YrvHUjR/UavNMtgcV/mAsDCt6FitGsxKm1phyDHGoRs8wiEOes7syYK9CyheoDgLeyykVGQpq80yBAhO+YDNm7Uk79Gj0KYNdO4MJ05YbV3wYBy6IVNEhBdjX2TctnEUDC/I/G7zqVysstVmGQKQatVgxQotH1CggO6WVLUq/PCDkQ/wBsahGzLloxUfMXjtYMJCwpjeaTq1S6W7wG4weIRTPmDHDnjgAS0f8PDD0Ly5kQ/IKcahG9wyYtMIXlv0GgrF2HZjuf+m+602yRAkREVpyYBRo7R8wIIFWj7g66+NfEB2MQ7dkCEzfpvBk3OeBODr5l/T8ZaOFltkCDaU0uJeO3emyAf85z9GPiC7WFZYpJQ6CWT2A6s4cMoP5uSEQLARjJ3extjpXYydnlNeRNJVN7TMoXuCUmpDRhVRdiEQbARjp7cxdnoXY6d3MCEXg8FgCBKMQzcYDIYgwe4OfZjVBnhAINgIxk5vY+z0LsZOL2DrGLrBYDAYPMfuM3SDwWAweIhx6AaDwRAkWOLQlVIxSqndSqm9Sqn+6Wz/XCm1Ofn2u1LqrMu2JJdtPtNrU0qNVEqdUEptz2C7Ukp9mfwetiqlarpse0QptSf59oivbPTQzm7J9m1TSq1SSt3msm1/8vOblVI+7TbigZ2NlFLnXL7bt1y2uT1f/Gznyy42bk8+H69L3ubPz7OsUmqxUmqnUmqHUuq5dMZYeo56aKPl56eHdtri/MwUEfHrDQgF/gBuAsKBLUA1N+P/A4x0eXzBT3ZGAzWB7Rlsbw7MBxRwN7A2+fnrgH3Jf4sm3y9qoZ11nccHmjntTH68Hyhuk8+zETAnp+eLr+1MM7YVsMiiz/NGoGby/Ujg97Sfi9XnqIc2Wn5+eminLc7PzG5WzNDvBPaKyD4RiQcmAm3cjO+C7lPqV0RkGXDazZA2wBjRrAGKKKVuBJoCP4nIaRE5A/wExFhlp4isSrYDYA1Qxle2uMODzzMjsnq+5Igs2mnJuQkgIsdEZFPy/Th0v9/SaYZZeo56YqMdzk8PP8uM8Ov5mRlWOPTSwCGXx4fJfu/QwAAAArdJREFU4MNTSpUHKgCLXJ7Op5TaoJRao5Rq6zszMyWj9+Hx+7OAXugZmxMBFiqlNiqleltkkyv3KKW2KKXmK6VuSX7Olp+nUqoA2glOdXnaks9TKRUF3AGsTbPJNueoGxtdsfz8zMRO25+fdm8E2RmYIiJJLs+VF5EjSqmbgEVKqW0i8odF9gUMSql70f8w9V2erp/8WZYEflJK/ZY8Q7WCTejv9oJSqjkwA6hkkS2e0ApYKSKus3m/f55KqYLoi8rzInLel8fKLp7YaIfzMxM7A+L8tGKGfgQo6/K4TPJz6dGZND9pReRI8t99wBL01dQKMnofWXl/fkEpVQMYAbQRkb+dz7t8lieA6eifj5YgIudF5ELy/XlAmFKqODb8PJNxd2765fNUSoWhHdA4EZmWzhDLz1EPbLTF+ZmZnQFzfvo7aI/+VbAPHUpxLiLcks64f6EXRZTLc0WBvMn3iwN78O0CWRQZL+K1IPWC07rk568D/ky2tWjy/et8/Jm6s7McsBeom+b5CCDS5f4qIMZCO29wftfof9yDyZ+tR+eLv+xM3l4YHWePsOrzTP5sxgBfuBlj6TnqoY2Wn58e2mmb89Pdze8hFxFJVEo9A8SiV4hHisgOpdS7wAYRcaYidgYmSvInmExVYKhSyoH+dfGRiOz0hZ1KqQnole3iSqnDwNtAWPJ7+A6Yh84i2AtcAnombzutlHoPWJ+8q3cl9c9yf9v5FlAMGKKUAkgUrRZ3PTA9+bk8wHgRWWChne2BPkqpROAy0Dn5u0/3fLHQToAHgYUictHlpX79PIF6QA9gm1Jqc/Jzr6EdpF3OUU9stMP56Ymdtjg/M8OU/hsMBkOQYCpFDQaDIUgwDt1gMBiCBOPQDQaDIUgwDt1gMBiCBOPQDQaDIUgwDt1gMBiCBOPQDQaDIUj4P9qIGywtwqe7AAAAAElFTkSuQmCC\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "xs_pred = 1.2 * np.random.rand(50, 2) + 1\n",
- "xs_pred = np.hstack([xs_pred, np.ones((xs_pred.shape[0], 1))])\n",
- "\n",
- "ys_pred = np.array([make_prediction(x, thetas_oa) for x in xs_pred])\n",
- "plot_onevsall(xs_pred, ys_pred)\n",
- "plt.xlim([xs_oa[:, 0].min() - 0.3, xs_oa[:, 0].max() + 0.3])\n",
- "plt.ylim([xs_oa[:, 1].min() - 0.3, xs_oa[:, 1].max() + 0.3])\n",
- "plot_boundaries(xs_oa, thetas_oa)"
- ]
- }
- ],
- "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.5"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}