{ "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": [ "
" ] }, "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": [ "
" ] }, "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": [ "
" ] }, "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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\n", "text/plain": [ "
" ] }, "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: -2.647912220979194 15.448901536265106\n", "train cost: 0.0020754129182815793\n", "test cost: 0.003588729710123071\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": [ "
" ] }, "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": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAEBRJREFUeJzt3W+MXXWdx/H3t7Yk2g5/YmdZtlBqloruurLCGIg2Lq4PhMYsMWHToAEFTMNqDI2bhsgDecAD17gxagiQLgKSNdhEBmQ36K7ZXe0SKJspQYo0SycQS4GkU9jQmfEBaea7D84tHaZ35l46Z+bc8+v7lUx67/39cs4nzZxPfz333HsiM5EklWVF0wEkSfWz3CWpQJa7JBXIcpekAlnuklQgy12SCmS5S1KBLHdJKpDlLkkFWtnUjteuXZsbNmxoaveS1Ep79uw5nJnDveY1Vu4bNmxgbGysqd1LUitFxO/7medpGUkqkOUuSQWy3CWpQJa7JBXIcpekAjV2tYxOIZOTsHMn7N8PGzfCli0wNNR0KqloPcs9Is4DHgDOBhLYkZk/mDMngB8Am4E/AF/OzKfrj6vWefxx2LwZZmZgehpWr4ZvfAMeeww2bWo6nVSsflbuR4G/z8ynI2II2BMRv8rM52fNuRLY2Pm5FLir86dOZZOTVbFPTh5/bXq6+nPzZnj1VVizpplsUuF6nnPPzNeOrcIzcxLYB6ybM+0q4IGs7AbOjIhzak+rdtm5s1qxdzMzU41LWhLv6g3ViNgAfAx4as7QOuDlWc8PcuI/AETE1ogYi4ixiYmJd5dU7bN///GV+lzT0zA+vrx5pFNI3+UeEWuAh4BtmXnkZHaWmTsycyQzR4aHe341gtpu48bqHHs3q1fDBRcsbx7pFNJXuUfEKqpi/0lmjnaZ8gpw3qzn53Ze06lsyxZYMc+v2IoV1bikJdGz3DtXwvwI2JeZ35tn2qPAdVG5DHgzM1+rMafaaGiouipmaOj4Cn716uOv+2aqtGT6uVrmk8C1wN6IeKbz2q3AeoDMvBt4jOoyyHGqSyGvrz+qWmnTpuqqmJ07q3PsF1xQrdgtdmlJ9Sz3zHwciB5zEvhaXaFUmDVr4MYbm04hnVL8+gFJKpDlLkkFstwlqUCWuyQVyHKXpAJZ7pJUIMtdkgpkuUtSgSx3SSqQ5S5JBbLcJalAlrskFchyl6QCWe6SVCDLXZIKZLlLUoEsd0kqkOUuSQWy3CWpQJa7JBXIcpekAlnuklQgy12SCmS5S1KBLHdJKpDlLkkFstwlqUCWuyQVyHKXpAKt7DUhIu4FPgccysyPdBk/A/hnYH1ne/+YmffVHVTLZHISdu6E/fth40bYsgWGhppOdaK25JQaEpm58ISITwFTwAPzlPutwBmZeUtEDAP/C/xxZr610HZHRkZybGzs5JOrfo8/Dps3w8wMTE/D6tWwYgU89hhs2tR0uuPaklNaAhGxJzNHes3reVomM3cBbyw0BRiKiADWdOYe7TeoBsTkZFWYk5NVYUL157HXp6aazXdMW3JKDavjnPsdwIeBV4G9wM2ZOVPDdrWcdu6sVsLdzMxU44OgLTmlhtVR7p8FngH+BPhL4I6IOL3bxIjYGhFjETE2MTFRw65Vm/37j6+E55qehvHx5c0zn7bklBpWR7lfD4xmZRx4CfhQt4mZuSMzRzJzZHh4uIZdqzYbN1bnrrtZvRouuGB588ynLTmlhtVR7geAzwBExNnAhcCLNWxXy2nLlupNyW5WrKjGB0FbckoN61nuEfEg8CRwYUQcjIgbI+KmiLipM+V24BMRsRf4D+CWzDy8dJG1JIaGqqtNhoaOr4xXrz7++po1zeY7pi05pYb1vBRyqXgp5ICamqrelBwfr05xbNkymIXZlpxSzfq9FNJyl6QWqe06d0lS+1juklQgy12SCmS5S1KBLHdJKpDlLkkFstwlqUCWuyQVyHKXpAJZ7pJUIMtdkgpkuUtSgSx3SSqQ5S5JBbLcJalAlrskFchyl6QCWe6SVCDLXZIKZLlLUoEsd0kqkOUuSQWy3CWpQJa7JBXIcpekAlnuklQgy12SCmS5S1KBLHdJKlDPco+IeyPiUEQ8t8CcyyPimYj4XUT8pt6IkqR3q5+V+/3AFfMNRsSZwJ3A32TmnwN/W080SdLJ6lnumbkLeGOBKV8ARjPzQGf+oZqySZJOUh3n3D8InBURv46IPRFxXQ3blCQtwsqatnEJ8BngvcCTEbE7M1+YOzEitgJbAdavX1/DriVJ3dSxcj8I/FtmTmfmYWAXcFG3iZm5IzNHMnNkeHi4hl1Lkrqpo9x/DmyKiJUR8T7gUmBfDduVJJ2knqdlIuJB4HJgbUQcBG4DVgFk5t2ZuS8ifgk8C8wA92TmvJdNSpKWXs9yz8xr+pjzXeC7tSSSJC2an1CVpAJZ7pJUIMtdkgpkuUtSgSx3SSqQ5S5JBbLcJalAlrskFchyl6QCWe6SVKA6vvJXkpbN6d8+ncm3JucdHzptiCPfPLKMiQaTK3dJrbJQsfczfqqw3CWpQJa7JBXIcpekAlnuklQgy12SCmS5S1KBLHdJrTJ02tCixk8VfohJUqv4AaX+uHKXpAJZ7pJUIMtdkgpkuUtSgSx3SSqQ5S5JBbLcJalAlrskFchyl6QCWe6SVKCe5R4R90bEoYh4rse8j0fE0Yi4ur54kqST0c/K/X7gioUmRMR7gO8A/15DJknSIvUs98zcBbzRY9rXgYeAQ3WEkiQtzqLPuUfEOuDzwF19zN0aEWMRMTYxMbHYXUuS5lHHG6rfB27JzJleEzNzR2aOZObI8PBwDbuWJHVTx/e5jwA/jQiAtcDmiDiamY/UsG1J0klYdLln5geOPY6I+4F/tdglqVk9yz0iHgQuB9ZGxEHgNmAVQGbevaTpJEknpWe5Z+Y1/W4sM7+8qDSSpFr4CVVJKpDlLkkFstwlqUCWuyQVyHKXpAJZ7pJUIMtdkgpkuUtSgSx3SSqQ5S5JBarjWyEbMzMDP/4xfOlLsMJ/piQtwunfPp3JtybnHR86bYgj3zyyjIkWp9WVODoKN9wADz/cdBJJbbdQsfczPmhaW+4zM7B9e/V4+/bquSSp0tpyHx2Fw4erxxMTrt4labZWlvuxVfvUVPV8asrVuyTN1spyn71qP8bVuyQd17pyn7tqP8bVuyQd17pyf+QROHCg+9iBA9W4JJ3qWned+/nnw7ZtC49L0rs1dNpQz+vc26R15X7JJdWPJNWpTR9Q6kfrTstIknqz3CWpQJa7JBXIcpekAlnuklQgy12SCmS5S1KBLHdJKpDlLkkF6vkJ1Yi4F/gccCgzP9Jl/IvALUAAk8DfZeZv6w4qSW3T5K37+lm53w9cscD4S8BfZeZfALcDO2rIJUmt1+St+3qu3DNzV0RsWGD8iVlPdwPnLj6WJGkx6j7nfiPwi5q3KUl6l2r7VsiI+DRVuW9aYM5WYCvA+vXr69q1JGmOWlbuEfFR4B7gqsx8fb55mbkjM0cyc2R4eLiOXUuSulh0uUfEemAUuDYzX1h8JEnSYvVzKeSDwOXA2og4CNwGrALIzLuBbwHvB+6MCICjmTmyVIElSb31c7XMNT3GvwJ8pbZEklSIJm/d17rb7ElSWzR56z6/fkCSCmS5S1KBLHdJKpDlLkkFstwlqUCWuyQVyHKXpAJZ7pJUIMtdkgpkuesEMzNw333Vn5LayXLXCUZH4YYb4OGHm04i6WRZ7nqHmRnYvr16vH27q3eprSx3vcPoKBw+XD2emHD1LrWV5a63HVu1T01Vz6emXL1LbWW5622zV+3HuHqX2slyF3Diqv0YV+9SO1nuAuCRR+DAge5jBw5U45LawzsxCYDzz4dt2xYel9QelrsAuOSS6kdSGTwtI0kFstwlqUCWuyQVyHKXpAJZ7pJUIMtdkgpkuUtSgSx3SSqQ5S5JBbLcJalAPcs9Iu6NiEMR8dw84xERP4yI8Yh4NiIurj9md97rU5K662flfj9wxQLjVwIbOz9bgbsWH6s/3utTkrrrWe6ZuQt4Y4EpVwEPZGU3cGZEnFNXwPl4r09Jml8d59zXAS/Pen6w89qS8l6fkjS/ZX1DNSK2RsRYRIxNTEyc9Ha816ckLayOcn8FOG/W83M7r50gM3dk5khmjgwPD5/0Dr3XpyQtrI5yfxS4rnPVzGXAm5n5Wg3b7cp7fUpSb/1cCvkg8CRwYUQcjIgbI+KmiLipM+Ux4EVgHPgn4KtLlhbv9SlJ/eh5m73MvKbHeAJfqy1RD97rU5J6a909VL3XpyT15tcPSFKBLHdJKpDlLkkFstwlqUCWuyQVyHKXpAJZ7pJUoKg+g9TAjiMmgN/XsKm1wOGeswaDWevXlpxg1qVyqmU9PzN7fjlXY+Vel4gYy8yRpnP0w6z1a0tOMOtSMWt3npaRpAJZ7pJUoBLKfUfTAd4Fs9avLTnBrEvFrF20/py7JOlEJazcJUlztKLcI+LeiDgUEc/NMx4R8cOIGI+IZyPi4uXOOCtLr6xf7GTcGxFPRMRFy51xVpYFs86a9/GIOBoRVy9Xti4ZemaNiMsj4pmI+F1E/GY5883J0et34IyI+JeI+G0n6/XLnbGT47yI+K+IeL6T4+Yucwbi2Ooz60AcW/1knTV36Y6tzBz4H+BTwMXAc/OMbwZ+AQRwGfDUAGf9BHBW5/GVg5y1M+c9wH9S3XHr6kHNCpwJPA+s7zz/owHOeivwnc7jYeAN4LQGcp4DXNx5PAS8APzZnDkDcWz1mXUgjq1+snbGlvTYasXKPTN3UR0A87kKeCAru4EzI+Kc5Un3Tr2yZuYTmfl/nae7qW4o3og+/l4Bvg48BBxa+kTz6yPrF4DRzDzQmd9Y3j6yJjAUEQGs6cw9uhzZ3hEi87XMfLrzeBLYB6ybM20gjq1+sg7KsdXn3yss8bHVinLvwzrg5VnPD9L9L3PQ3Ei1KhpIEbEO+DxwV9NZ+vBB4KyI+HVE7ImI65oOtIA7gA8DrwJ7gZszs9Fbu0fEBuBjwFNzhgbu2Fog62wDcWzNl3U5jq3W3WavFBHxaapfwE1NZ1nA94FbMnOmWmQOtJXAJcBngPcCT0bE7sx8odlYXX0WeAb4a+BPgV9FxH9n5pEmwkTEGqoV5LamMvSrn6yDcmz1yLrkx1Yp5f4KcN6s5+d2XhtIEfFR4B7gysx8vek8CxgBftr55VsLbI6Io5n5SLOxujoIvJ6Z08B0ROwCLqI63zlorgf+IasTr+MR8RLwIeB/ljtIRKyiKqCfZOZolykDc2z1kXVgjq0+si75sVXKaZlHges67+xfBryZma81HaqbiFgPjALXDuiq8m2Z+YHM3JCZG4CfAV8d0GIH+DmwKSJWRsT7gEupznUOogNU/8MgIs4GLgReXO4QnXP+PwL2Zeb35pk2EMdWP1kH5djqJ+tyHFutWLlHxIPA5cDaiDgI3AasAsjMu6nebd4MjAN/oFoZNaKPrN8C3g/c2flX+2g29KVHfWQdGL2yZua+iPgl8CwwA9yTmQte4tlUVuB24P6I2Et1FcotmdnEtxp+ErgW2BsRz3ReuxVYPyvroBxb/WQdlGOrn6xLzk+oSlKBSjktI0maxXKXpAJZ7pJUIMtdkgpkuUtSgSx3SSqQ5S5JBbLcJalA/w9ShwD8RmSTzAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "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": 35, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "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": 36, "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": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array([ 5.05076977, 6.31195834, -15.87703677]),\n", " array([ 3.21813142, -10.8578558 , 12.38691428]),\n", " array([-9.38682431, 6.49524162, 8.28589111])]" ] }, "execution_count": 63, "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": 38, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "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": 39, "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": 74, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }