Created
September 8, 2021 08:25
-
-
Save mlaves/c98cd4e6bcb9dbd4d0c03b34bacb0f65 to your computer and use it in GitHub Desktop.
Kernel SVM.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "nbformat": 4, | |
| "nbformat_minor": 5, | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3 (ipykernel)", | |
| "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.8.8" | |
| }, | |
| "colab": { | |
| "name": "Kernel SVM.ipynb", | |
| "provenance": [], | |
| "include_colab_link": true | |
| } | |
| }, | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "view-in-github", | |
| "colab_type": "text" | |
| }, | |
| "source": [ | |
| "<a href=\"https://colab.research.google.com/gist/mlaves/c98cd4e6bcb9dbd4d0c03b34bacb0f65/kernel-svm.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "db32bdaf" | |
| }, | |
| "source": [ | |
| "# Kernel Support-Vector Machine in PyTorch\n", | |
| "\n", | |
| "In this notebook, we will implement support-vector machines for classification with linear and Gaussian radial basis function kernels." | |
| ], | |
| "id": "db32bdaf" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "24654e3c" | |
| }, | |
| "source": [ | |
| "from matplotlib import pyplot as plt\n", | |
| "import seaborn as sns\n", | |
| "import torch\n", | |
| "import numpy as np\n", | |
| "from sklearn.datasets import make_moons\n", | |
| "sns.set()\n", | |
| "np.random.seed(0)" | |
| ], | |
| "id": "24654e3c", | |
| "execution_count": 1, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "8deeac3c" | |
| }, | |
| "source": [ | |
| "## Training Data\n", | |
| "\n", | |
| "We use the simple two-moons toy dataset showing two interleaving half circles." | |
| ], | |
| "id": "8deeac3c" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 284 | |
| }, | |
| "id": "f33a3ed6", | |
| "outputId": "7e8f4527-a850-4e5e-c74a-0d4331d221dd" | |
| }, | |
| "source": [ | |
| "x, y = make_moons(20, noise=0.1)\n", | |
| "y[np.where(y==0)] = -1\n", | |
| "\n", | |
| "fig, ax = plt.subplots()\n", | |
| "ax.scatter(x[np.where(y==-1),0], x[np.where(y==-1),1], label='Class 1')\n", | |
| "ax.scatter(x[np.where(y==1),0], x[np.where(y==1),1], label='Class 2')\n", | |
| "ax.set_title('Training data')\n", | |
| "ax.legend();\n", | |
| "x = torch.FloatTensor(x)\n", | |
| "y = torch.FloatTensor(y)" | |
| ], | |
| "id": "f33a3ed6", | |
| "execution_count": 2, | |
| "outputs": [ | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAELCAYAAADDZxFQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de5ycZXn/8c8esmvibkwcFgKYcMjhwgYVAhESGhJPILQiJkWIQqBQ5KDSSkFbUUhV+Kn0ZyuCEkkhwQNFmhSoHNS8ihFMtEmBn4JysWBIAjG/bKYJm81hJ7s7/WOeCbObZ3dndp85Pft9v1557cz93PPMfe1k55rnvu+575p0Oo2IiEhfteVugIiIVCYlCBERCaUEISIioZQgREQklBKEiIiEUoIQEZFQShAifZjZY2Z2cdR1h8vM0mY2pRTPJQJQo+9BSByYWUfO3TFAJ9Ad3L/C3X9Q+lZFy8zSwFR3f2mQekcDG4BR7t5VirZJPNWXuwEiUXD3puxtM3sF+Ct3X9W3npnV601TJD9KEBJrZjYP+D7wLeAzwM/M7Brge8ApZP4Gfglc6e6vBo/5OfB9d19qZpcAfwX8CrgM2Alc7e6PDaHuMcBy4ETg14ADb3H3C/tp+/XAtUAa+EKfY38GfAWYDLwO/Iu7Lw4O/yL4udPMAD4AbAPuAt4VnO8nwCfdfWeev0oZgTQGISPBBOCtwFHAJ8j8v78nuD8J2AvcPsDjTyHzZn4I8HXgX8ysZgh1fwj8F5AAFgMX9feEZvZB4Doyb+5Tgff3qbIbWASMA/4MuMrMzg2OnR78HOfuTe6+FqgB/g9wBPB2YGLQBpF+6QpCRoIe4CZ37wzu7wVWZA+a2c3AEwM8fqO73xXUXQ58GzgM2JpvXTNrAGYC73P3FPCUmT08wHN+FLjH3Z8LzrUYWJg96O4/z6n7GzO7D5gLPBh2smDcIjt20WZm3wBuGuD5RZQgZERoc/d92TtmNgb4J+CDwPiguNnM6ty9O+TxBxKBu+8Jum2aQuoNVPcQ4H/cfU9O3c1kPsmHOQL475z7G3MPmtkpwFeB44EGoBF4oJ9zYWaHAd8E5gDNZK6idvRXXwTUxSQjQ9+pen8LGHCKu4/ljS6Z/rqNovBH4K1BcsrqLzlk6+cen9Tn+A+Bh4GJ7v4W4E7eaH/Y1MRbgvJ3BDFfSHHjlRhQgpCRqJlMN9NOM3srJehqcfeNwHpgsZk1mNks4EMDPORHwCVm9idBUunbxmYyVyT7zOzdwMdyjrWR6VY7tk/9DuB1MzsSuH54EclIoAQhI9E/A6OB7WRmHD1eouf9ODALSJKZgXQ/me9rHCSY+fTPwH+SGTv4zz5Vrga+ZGa7gBvJJJTsY/cANwO/NLOdZnYq8A/ADDIznh4BVkYXlsSVvignUiZmdj/wgrtrsFgqkgapRUrEzGYC/0PmW85nAB8mM9AsUpGUIERKZwKZrp0E8Cpwlbs/U94mifRPXUwiIhJKg9QiIhIqLl1MjWS+pfpH3ljBU0REBlYHHA6sI2RGXVwSxEzgyXI3QkSkSs0BnupbGJcE8UeAHTt209Mz/DGVRKKJZLJj8IoVLA4xQDziiEMMEI84FENvtbU1jB//ZgjeQ/uKS4LoBujpSUeSILLnqnZxiAHiEUccYoB4xKEYQoV2zWuQWkREQilBiIhIqLh0MYnICLF37246OnbS3V34zrHbttXS09NThFaVzlBiqKurp6lpHKNHv7mgxylBiEjV2Lt3N7t27WDcuBZGjWqgpqawFcvr62vp6qruBFFoDOl0mv37U+zc2QZQUJJQghAJsfb5raxc/TLJ9k4SYxuZP3cys6ZPKHezRryOjp2MG9dCQ0NjuZtSNWpqamhoaGTcuBZef327EoTIcKx9fivLH3uBVPApLdneyfLHXgBQkiiz7u4uRo1qKHczqtKoUQ0Fd8tpkFqkj5WrXz6QHLJSXT2sXP1ymVokuQrtVpKMofzedAUh0keyPXQPn37LZWTr6upi2bKlrFr1UxobG6itrWXGjJlcddWn+elPH2PNmif5yle+XrTnb211vvGNr/Hii86sWadF+lxKEFIU1dyHnxjbGJoMEmPV7y0Hu+WWf6Czcx933/09xox5M11dXTzyyMOkUqmSPP/48W/lU5+6ltZWZ/36X0d6biUIiVy19+HPnzu5V/sBGuprmT93chlbJcNRrA8smzdv4he/eIKVKx9lzJjM4G99fT0f/vD8g+omk9tZvPgGdu/eTSqVYvbs07j66r8G4Mknf85dd32H2to6uru7+MxnPsuMGSdz993fZdWqn9DQ0EhNDdx22xLGj39Lr/MeckgLhxzSwsaNG4YdT1+RJQgz+0dgAXA08A53fy6kTh1wG/BBIA181d2XDnZMqstAffjVkCCybazWKyDprZgfWF580Xnb2yYxduzYQes2NTXzta/9E2PGjKGrq4trr/0Uv/rVGk49dTZLly7hs5+9geOPfyfd3d3s27eX9vbX+dGPfshDDz1OY+Ob2LNnd8lnb0V5BfEg8E0GXlX148AUYCqZXbWeMbNV7v7KIMekisShD3/W9AlKCDFRKR9Yenp6+Pa3v8lvf/sbIE0ymaS19UVOPXU2J510Mrfd9g3mzXsvp546m2OPnUJ3dzdHHjmRL3/5Jt797lOZPXvOgauUUolsFpO7P+Xumwepdj5wl7v3uHsbmaRyXh7HpIr011evPnwph2J+YJk2zXj11U20t7cPWvf++3/Arl3tfPe7y1i+/F+ZM2ceqVSmDddc87d87nNfoL5+FF/84t/x8MP/Tl1dHUuW3MOCBR+lrW0bl112IS+91DrsNhei1NNcJwEbc+5vAibmcUyqyPy5k2mo7/1fS334Ui7F/MAyceIkTjvtdG699Rb27NkNQHd3N//xHw+yZ8+eXnV37dpFInEIjY2NtLVt46mnVh84tmnTK0yePIWPfnQhZ5xxFr///e/Ys2c3O3fu5MQTT+Kyy67g2GMn84c/lHaqdawGqROJpsjO1dLSHNm5yqVcMZwzr5mxzW/i3sd+z/Ydezlk/GgWnfV25p00tHyv16JylDuObdtqqa8v7HPtee+dwt2P/J7U/pxJB6NqOe+9Uwo+V5jFi7/M0qVLuOyyixg1ahQ9PT3Mnv2njBnTSG1tDTU1NdTX13LBBQu54YbPsWjR+Rx66KHMnPluamszx5YsuYPNmzdRV1dHU1MzN9xwI/v27eHzn7+ezs59pNNpzI7jfe97H0Cvdm/ZsoUrrriUzs59dHam+MhHzubyy6/knHPOPaittbW1Bb2GNel0tOuKm9krwJ/3M0j9CHCPu/9bcP92YKO73zrQsTye9mhgQzLZEck66S0tzbS17Rr2ecopDjHA8OKolKm2ei2is3XrRiZMOKrgx1XK/4UoDGc9qb6/v9ramuwH62OAVw56rqE1ccgeAC43s5VkBqLPJbPV3WDHRApS7VNtJVrZSQdxWKyvlCIbgzCz28zsVeBtwCozez4of9TMTg6qfQ/4A9AK/Ar4krtvyOOYSEG0XIbI8EV2BeHu1wDXhJSfnXO7G7iqn8f3e0ykUHGYaitSblqsT2JJU21Fhk8JQmJJU21Fhi9W01xFsrRchsjwKUFIbGm5DJHhUYIQERmGcu8H8fDD/86KFfeTTqepqanhYx9bxJlnnj34A/OgBCEisZdqXUNq3QrSHUlqmhI0zFxAw9TZkZy73PtBvO1tE/nWt5Ywduxb2Lbt//OXf/kx3vnOEzj88COGfW4lCBGJtVTrGjqfXAZdmTfsdEcycx+GnSQqYT+IGTNOPnD70EMPI5E4hG3btilBiIgMJrVuxYHkcEBXitS6FcNOEJW2H8TTT6+no6OD4447blhxZSlBiEispTuSBZUXS7H3g9iw4Q985Ss3cdNNN9PY+KZI2qzvQYhIrNU0JQoqL0Sl7AexefMmrr/+r7n++s/zrnedMOy4spQgRCTWGmYugPqG3oX1DZnyYaqE/SBee+1Vrr320/zN31zHrFmnDTumXOpiEpFYy44zFGsW0xe+8A/cffd3ufTSixg1qp50Os2pp55GQ0PvpHTeeRfwxS9+josu+igtLYdx0kkzDxz7zndu59VXN1FXV09TUxN///c30tHRwQ03fJZUqpOenh6mTTuOuXPfc9Dzf+c736K9fSdLly5h6dIlAFx11ac55ZRZw44t8v0gyuRotB9EL3GIAeIRRxxigMqIY6j7QWTFYbnvUu4HoS4mEREJpQQhIiKhNAYxAsVp+0UZebJLSkhhhjKcoAQxwmgrTumrmj4w1NXVs39/atAvjMnB9u9PUVdX2Fu+uphGGG3FKbmyHxiyO+1lPzCsfX5rmVsWrqlpHDt3tpFKdQ7pE/FIlE6nSaU62bmzjaamcQU9VlcQI4y24pRcA31gqMSriNGjM98kfv317XR3dxX8+NraWnp6qnsW01BiqKurp7l5/IHfX74iSxBmNg1YDiSAJLDI3Vv71LkXeGdO0TuBc939YTNbDFwNbAmO/dLdPxlV+6pNsS77E2MbQ5OBtuIcmarxA8Po0W8u+I0uqxKm6g5XKWOI8griTuAOd/++mV0ILAHem1vB3Rdlb5vZu4D/BH6SU+Ved78uwjZVpWKOE8yfO7nXuUFbcY5k+sAgA4lkDMLMDgVmAPcFRfcBM8ysZYCHXQb8wN0r96NKmRRznGDW9AlcfNZxB94AEmMbufis4yqyO0GKT3t3y0CiuoKYCLzm7t0A7t5tZluC8ra+lc2sAfgY8P4+hy4wszOArcBN7r42ovZVlWJf9msrTsnS3t0ykHINUp8LbHL3Z3PK7gRudvf9ZvYB4CEze7u7570mb/CV8Ui0tDRHdq6Cn3v8aNp27A0tL6Rd5YwhSnGIo5JjOGdeM+fMm5pX3UqOI1+KIX9RJYjNwJFmVhdcPdQBRwTlYS4F7s4tcPetObd/ZmabgeOB1eQpLmsxnfunx4SOE5z7p8fk3a5yxxCVOMQRhxggHnEoht5y1mIKPx7Fk7j7NuBZYGFQtBB4xt3DupfeBswBftCn/Mic2yeQWYDPo2hftdE4gYhUgii7mK4ElpvZjcAOYBGAmT0K3Oju64N6FwP/4e47+jz+FjM7CegGUsBFuVcVI43GCUSk3CJLEO7+AnBKSPnZfe7f3M/jL46qLSIiMnxaakNEREIpQYiISCglCBERCaUEISIioZQgREQklBKEiIiEUoIQEZFQShAiIhJKCUJEREIpQYiISCglCBERCaUEISIioZQgREQklBKEiIiEUoIQEZFQShAiIhJKCUJEREJFueWoiIiUUKp1Dal1K0h3JKlpStAwcwENU2dHdn4lCBGRKpRqXUPnk8ugKwVAuiOZuQ+RJQl1MYmIVKHUuhUHksMBXalMeUQiu4Iws2nAciABJIFF7t7ap85i4GpgS1D0S3f/ZHBsDHAPcBLQBVzn7j+Oqn0iInGS7kgWVD4UUV5B3Anc4e7TgDuAJf3Uu9fdTwj+fTKn/Dqg3d2nAB8ClppZU4TtExGJjZqmREHlQxFJgjCzQ4EZwH1B0X3ADDNrKeA05xMkleDKYz1wVhTtExGJm4aZC6C+oXdhfUOmPCJRdTFNBF5z924Ad+82sy1BeVufuheY2RnAVuAmd18blE8CNubU2xQ8Pm+JRHQXHC0tzZGdq1ziEAPEI444xADxiCM2MbScya6xo9nxxA/oak9SPzbB+Pd8nObjT4/seUo9i+lO4GZ3329mHwAeMrO3u3sknWbJZAc9Pelhn6elpZm2tl0RtKh84hADxCOOOMQA8YgjdjEcdiKjLzjxwLF9wL4C4qutrRnwg3VUYxCbgSPNrA4g+HlEUH6Au2919/3B7Z8Fx48PDm8CjsqpPqnv40VEpHQiSRDuvg14FlgYFC0EnnH3Xt1LZnZkzu0TgKMBD4oeAK4Ijk0FZgKPR9E+EREpXJRdTFcCy83sRmAHsAjAzB4FbnT39cAtZnYS0A2kgIvcfWvw+FuBZWb2UnD8E+5e3deCIiJVLLIE4e4vAKeElJ+dc/viAR6/GzgvqvaIiMjw6JvUIiISSmsxScUr9oJkIhJOCUIq2q7nflH0BclEJJy6mKSi7XjiB0VfkExEwilBSEXrai/+gmQiEk4JQipa/djiL0gmIuGUIKSijX/Px4u+IJmIhNMgtVS05uNPp719r2YxiZSBEoRUvIaps5UQymzt81t58Km1tO3YS2JsI/PnTmbW9AnlbpYUmRKEiAxo7fNbWf7YC6S6egBItney/LEXAJQkYk5jECIyoJWrXz6QHLJSXT2sXP1ymVokpaIEISIDSrZ3FlQu8aEupiJb+/xWVq5+mWR7p/pupSolxjaGJoPE2MYytEZKSVcQRZTtu83+cWX7btc+v3WQR4pUjvlzJ9NQ3/utoqG+lvlzJ5epRVIquoIoooH6bnUVIdUi+3/1wac2aBZTCVXCIpVKEEWkvluJi1nTJ3DOvKlVv59ztUi1rul3kUpazixZO9TFVET99dGq71ZEBpJat6IiFqlUgigi9d2KyFD0txhlqRepVBdTEWX7aDWLSUQKUdOUCE0GpV6kMrIEYWbTgOVAAkgCi9y9tU+dLwIXAN3AfuDz7v6T4Ngy4P3A9qD6A+5+c1TtK5dZ0ycoIYhIQRpmLug1BgGUZZHKKLuY7gTucPdpwB3AkpA6/wXMdPd3ApcC95vZ6JzjX3X3E4J/VZ8cRESGomHqbBrnXHLgiqGmKUHjnEuqcxaTmR0KzAA+EBTdB9xuZi3u3patl71aCPwGqCFzxfFqFO0QEYmLSlikMqoriInAa+7eDRD83BKU92cR8LK75yaHa83st2b2oJm9PaK2iYjIEJRlkNrM5gJf5o0rDoAbgD+6e4+ZLQIeN7Njs0knH4lEU2RtbGlpjuxc5RKHGCAeccQhBohHHIohfzXpdHrYJwm6mF4EEu7ebWZ1ZAaqp+Z2MQV1ZwE/Aj7s7k8PcM4kMMPdN+bRhKOBDclkBz09w4+npaW56r8QFIcYIB5xxCEGiEcciqG32tqa7AfrY4BXDjoexZO4+zbgWWBhULQQeCYkOcwE7gf+om9yMLMjc26fSWam02tRtE9ERAoXZRfTlcByM7sR2EFmjAEzexS40d3XA98GRgNLzCz7uIvc/bfBYw8DeoB24Bx374qwfSIiUoDIEoS7vwCcElJ+ds7tmQM8/v1RtUVERIZPS22IiEgoJQgREQmlBCEiIqGUIEREJJQShIiIhFKCEBGRUEoQIiISSglCRERCKUGIiEgoJQgREQmlBCEiIqGUIEREJJQShIiIhFKCEBGRUEoQIiISSglCRERCKUGIiEgoJQgREQkV5Z7UVWft81tZufplku2dJMY2Mn/uZGZNn1DuZo04qdY1pNatIN2RpKYpQcPMBTRMnV3uZomMeJElCDObBiwHEkASWOTurX3q1AG3AR8E0sBX3X3pYMeKYe3zW1n+2AukunoASLZ3svyxFwA4Z15zsZ5W+ki1rqHzyWXQlQIg3ZHM3AclCZEyi7KL6U7gDnefBtwBLAmp83FgCjAVmAUsNrOj8zgWuZWrXz6QHLJSXT2sXP1ysZ5SQqTWrTiQHA7oSmXKRaSsIkkQZnYoMAO4Lyi6D5hhZi19qp4P3OXuPe7eBjwInJfHscgl2zsLKpfiSHckCyoXkdKJ6gpiIvCau3cDBD+3BOW5JgEbc+5vyqkz0LHIJcY2FlQuxVHTlCioXERKJ1aD1IlEU951L/nz6dz+wP+jc3/3gbLGUXVc8ufTAWhpqf5xiGqI4U3vu5Dtj9xJuuuNK7ea+kYOed+FNAftr4Y4BhOHGCAecSiG/EWVIDYDR5pZnbt3BwPORwTluTYBRwHrgvu5Vw0DHctLMtlBT086r7rTJ41j0QftoFlM0yeNA6CtbVchT11xWlqaqyOGw06kYc7FB81i2nfYiexr21U9cQwgDjFAPOJQDL3V1tYM+ME6kgTh7tvM7FlgIfD94OczwVhCrgeAy81sJZnZTucCc/I4VhSzpk/QtNYK0DB1tmYsVQhN/ZZcUc5iuhL4tJm9CHw6uI+ZPWpmJwd1vgf8AWgFfgV8yd035HFMRIosO/U7O1EjO/V77fNby9wyKZfIxiDc/QXglJDys3NudwNX9fP4fo+JSPENNPVbVxEjk5baEBFAU7/lYLGaxSQiQ5cY2xiaDOIy9TvVuoZN/7qSrvbtWtIlT7qCEBEA5s+dTEN977eEhvpa5s+dXKYWRSe7pEtX+3bgjSVdUq1rytyyyqYEISJAZlbfxWcdd+CKITG2kYvPOi4W4w9a0mVo1MUkIgfEdeq3lnQZGl1BiEjsaUmXoVGCEJHYa5i5AOobehfWN2TKpV/qYhKR2MvOVur+b81iKoQShIiMCA1TZ9My+8yqX4uplNTFJCIioZQgREQklLqYpOqkWtcctDy4+pJFoqcEIVUl+43Y7Jeest+IBZQkRCKmLiapKvpGrEjpKEFIVdE3YkVKRwlCqoq+EStSOkoQUlX0jViR0tEgtVSV7EC0ZjGJFJ8ShFSdhqmzlRBESkBdTCIiEmrYVxBmNga4BzgJ6AKuc/cfh9T7MHAj0AjUAHe7+/8Njl0C/DPwSlB9g7t/ZLhtExGRoYviCuI6oN3dpwAfApaaWVNIva3Ah9z9eGA2cJWZzck5vsrdTwj+KTmIiJRZFAnifGAJgLu3AuuBs/pWcvdfu/uW4PbrwO+BoyJ4fhERKYIoBqknARtz7m8CJg70ADM7DjgVuCKneK6ZPQu0A19z90cKbUgiEXbhMjQtLc2Rnatc4hADxCOOOMQA8YhDMeRv0ARhZk+TSQJhDiv0Cc3scOAh4OrsFQXwY+B+d99rZicCj5nZe9z994WcO5nsoKcnXWiTDtLS0lz1a8bHIQaIRxxxiAHiEYdi6K22tmbAD9aDJgh3nzHQcTPbRKarqC0omgQ80U/dQ4FVwNfd/YGc59iec/sZM/sl8G4y3VAiIlIGUYxBPEDQVWRmU4GZwON9K5lZAvgZcLu7/0ufY0fm3D6KTPfTbyJom4iIDFEUYxC3AsvM7CWgG/iEu+8CMLMvAVvc/U7g74BpwBVmlh17+Ka73wN8MpgG2xWUf97dn4mgbSIiMkQ16fTw++wrwNHABo1BvCEOMUA84ohDDBCPOBRDbzljEMfwxvfQ3jgeybOIiEjsKEGIiEgoJQgREQmlBCEiIqGUIEREJJQShIiIhFKCEBGRUEoQIiISSluOikjspFrXaN/yCChBiEhBKv3NN9W6hs4nl0FXCoB0RzJzH6DlzLK1qxqpi0lE8pZ98013JIE33nxTrWvK3LI3pNatOJAcDuhKZcqlIEoQIpK3anjzzSavfMulf0oQIpK3anjzrWlKFFQu/VOCEJG8VcObb8PMBVDf0LuwviFTLgVRghCRvFXDm2/D1Nk0zrnkQNKqaUrQOOeSihpIrxaaxSQiecu+yVbyLCbItLPS2lSNlCBEpCB68x051MUkIiKhlCBERCTUsLuYzGwMcA9wEtAFXOfuPw6pNw94FHgxKOp091Nyjn8RuCS4u8zdvzzctomIyNBFMQZxHdDu7lPMbCrwpJlNcfeOkLq/c/eT+xaa2enAecDxQdGvzWy1u/8igvaJiMgQRJEgzgcuBnD3VjNbD5wFPFDgOe51970AZnZvUKYEIRKi0tdDkniIIkFMAjbm3N8ETOyn7jQzexrYD3zb3ZfnnOPnfc5xegRtE4mdgRajU5KQKA2aIII39En9HD6sgOd6Gpjo7q+b2THAKjN7zd1XFXCOASUSTVGdipaW5sjOVS5xiAHiEUeUMWz615Wh6yF1//dKWmYXd7VSvRaVoVQxDJog3H3GQMfNbBNwFNAWFE0Cngg5T3vO7Q1m9iBwGrCKzBXDUTnVJwGbB2tbX8lkBz096UIfdpCWlmba2nYN+zzlFIcYIB5xRB1DV/v2fsuL+bvSa1EZooyhtrZmwA/WUUxzfQC4AiAYpJ4JPN63kpkdbmY1we23AmcAz+acY5GZjTaz0cAi4EcRtE0kdqphPSSJhygSxK3AODN7Cfgx8Al33wVgZl8ysyuDeguA58zsWTKDz/e6+0MA7v5zYCXwfPBvpbuvjqBtIrFTDeshSTzUpNPD75KpAEcDG9TF9IY4xADxiKMYMZRjFpNei8pQpC6mY4BX+h7XWkwiVUjrIUkpaKkNEREJpQQhIiKhlCBERCSUEoSIiIRSghARkVBKECIiEkoJQkREQilBiIhIKCUIEREJpQQhIiKhlCBERCSU1mISqVLadlSKTQlCpApp21EpBXUxiVSh1LoVoduOptatKE+DJJaUIESqULojWVC5yFAoQYhUIW07KqWgBCFShbTtqJSCBqlFqlB2IFqzmKSYhp0gzGwMcA9wEtAFXOfuPw6pdw1waU7RscBSd7/WzOYBjwIvBsc63f2U4bZNJM607agUWxRXENcB7e4+xcymAk+a2RR378it5O63AbcBmNko4DXghzlVfufuJ0fQHhERiUAUYxDnA0sA3L0VWA+cNchjPgT80d3XR/D8IiJSBFFcQUwCNubc3wRMHOQxl5Lplso1zcyeBvYD33b35RG0TUREhmjQBBG8aU/q5/BhhT6hmR0OvBe4JKf4aWCiu79uZscAq8zsNXdfVci5E4mmQpvTr5aW5sjOVS5xiAHiEUccYoB4xKEY8jdognD3GQMdN7NNwFFAW1A0CXhigIdcDDzq7ttznqM95/YGM3sQOA3IN0HUAezYsZuennSeD+lfItFEMtkxeMUKFocYIB5xxCEGiEcciqG32toaxo9/MwTvoX1F0cX0AHAFsD4YpJ4JLByg/l8Cn8ktCK4qtrp72szeCpwBfKGANhwOZAONRJRXI+UShxggHnHEIQaIRxyKIdThwMt9C6NIELcCy8zsJaAb+IS77wIwsy8BW9z9zuD+aUAT8JM+51gAXGVm+4M2LXf3hwpowzpgDvDHoA0iIjK4OjLJYV3YwZp0evhdMiIiEj9aakNEREIpQYiISCglCBERCaUEISIioZQgREQklBKEiIiEUoIQEZFQ2jAIMLMLgc8CfwL8jbvfPkDdy4HPATXAY8A17t5TksoOZBgAAAOGSURBVIYOoIB9OeZRYXtvmNk0YDmQAJLAomBl4Nw6dWSWi/8gkAa+6u5LS93W/uQZw2LgamBLUPRLd/9kKds5EDP7RzJfWj0aeIe7PxdSp6JfB8g7jsVU9muRAL4HTAZSQCtwhbu39amX19/9UOkKIuNZ4AJ6709xkGAhwZuAWcDU4N+FRW9dfg7sy0FmOfWlZtbf9/F/5+4nBP8qYWOmO4E73H0acAfB8vF9fByYQuZ3PgtYbGZHl6yFg8snBoB7c373FfOGFHgQOJ3eqzP3VemvA+QXB1T2a5EGvu7u5u7vILMMxldD6hXyd18wJQjA3Z9z998Bg10J/AXwoLu3BVcNd5HZD6MSDGVfjrIzs0OBGcB9QdF9wAwza+lT9XzgLnfvCT5FPQicV7qW9q+AGCqauz/l7psHqVaxr0NWnnFUNHf/H3f/eU7Rr8gsitpXUf/ulSAKM5S9L0qlkLZNM7OnzezXZnZx8Zs2oInAa+7eDRD83MLBba/k332+MQBcYGa/MbOfmtmsUjYyIpX8OhSqKl4LM6sFrgIeDjlc1NdjRIxBDLanRfYPu5JFuC9HJHtvyJDcCdzs7vvN7APAQ2b2dndPlrthI1A1vRbfAjqAfsdGi2VEJIjB9rQoQHbvi6xJQEkuZaPalyOCvTeithk40szq3L07GAQ9goN/r9n4sqtO9v3kVE55xeDuW3Nu/8zMNgPHA6tL2trhqeTXIW/V8loEA+5TgQ/1Mxmm0P14CqIupsKsAM41s5bgsu9y4EdlblNWdl8OcvbleLxvJTM73MxqgtvZvTeeLWE7e3H3bcHzZ/cQWQg803e2Bpn4Ljez2qBv/1zg30rX0v7lG4OZHZlz+wQys2y8RM2MSsW+DoWohtfCzG4hMzvpXHfv7KdaXn/3Q6XlvgEzW0hmX4vxZKaU7QbOcPffhexpcQWZKbEAPwU+VQldVGb2ZmAZcCKZPTE+m91TIzcGM/sUmf7M3L03bi1PqzPM7DgyU0THAzvITBF1M3sUuNHd1wefym8nk9AAvubu3y1Piw+WZwzLyfzBd5P5f3aTuz9atkb3YWa3AfOBCcB2IOnu06vpdYC846j012I68ByZ6eh7g+IN7v4RM3sWONvdtwz0dx8FJQgREQmlLiYREQmlBCEiIqGUIEREJJQShIiIhFKCEBGRUEoQIiISSglCRERCKUGIiEio/wUbk7ogCT7PfQAAAABJRU5ErkJggg==\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "da37fc6e" | |
| }, | |
| "source": [ | |
| "## The Hinge Loss\n", | |
| "\n", | |
| "The SVM will be trained using the hinge loss\n", | |
| "$$\\min_{\\mathbf{w}} \\left[ \\frac{1}{n} \\sum_{i=1}^{n} \\max\\left(0, 1-y_{i}(\\mathbf{w}^{T}\\mathbf{x}_{i}-b)\\right) \\right] .$$" | |
| ], | |
| "id": "da37fc6e" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "115d16fe" | |
| }, | |
| "source": [ | |
| "def hinge_loss(x, y):\n", | |
| " return torch.max(torch.zeros_like(y), 1-y*x).mean()" | |
| ], | |
| "id": "115d16fe", | |
| "execution_count": 3, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "dfe49048" | |
| }, | |
| "source": [ | |
| "class KernelSVM(torch.nn.Module):\n", | |
| " def __init__(self, train_data_x, kernel='rbf',\n", | |
| " gamma_init=1.0, train_gamma=True):\n", | |
| " super().__init__()\n", | |
| " assert kernel in ['linear', 'rbf']\n", | |
| " self._train_data_x = train_data_x\n", | |
| " \n", | |
| " if kernel == 'linear':\n", | |
| " self._kernel = self.linear\n", | |
| " self._num_c = 2\n", | |
| " elif kernel == 'rbf':\n", | |
| " self._kernel = self.rbf\n", | |
| " self._num_c = x.size(0)\n", | |
| " self._gamma = torch.nn.Parameter(torch.FloatTensor([gamma_init]),\n", | |
| " requires_grad=train_gamma)\n", | |
| " else:\n", | |
| " assert False\n", | |
| " \n", | |
| " self._w = torch.nn.Linear(in_features=self._num_c, out_features=1)\n", | |
| "\n", | |
| " def rbf(self, x, gamma=1):\n", | |
| " y = self._train_data_x.repeat(x.size(0), 1, 1)\n", | |
| " return torch.exp(-self._gamma*((x[:,None]-y)**2).sum(dim=2))\n", | |
| " \n", | |
| " @staticmethod\n", | |
| " def linear(x):\n", | |
| " return x\n", | |
| "\n", | |
| " def forward(self, x):\n", | |
| " y = self._kernel(x)\n", | |
| " y = self._w(y)\n", | |
| " return y" | |
| ], | |
| "id": "dfe49048", | |
| "execution_count": 4, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "8de892eb" | |
| }, | |
| "source": [ | |
| "model_linear = KernelSVM(x, kernel='linear')\n", | |
| "model_kernel = KernelSVM(x, kernel='rbf')\n", | |
| "opt_linear = torch.optim.SGD(model_linear.parameters(), lr=0.1)\n", | |
| "opt_kernel = torch.optim.SGD(model_kernel.parameters(), lr=0.1)" | |
| ], | |
| "id": "8de892eb", | |
| "execution_count": 5, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "b2ba690b", | |
| "outputId": "89d15f2b-0e00-4f36-b58b-6dad80747ce9" | |
| }, | |
| "source": [ | |
| "for i in range(1000):\n", | |
| " opt_linear.zero_grad()\n", | |
| " opt_kernel.zero_grad()\n", | |
| " \n", | |
| " pred_linear = model_linear(x)\n", | |
| " loss_linear = hinge_loss(pred_linear, y.unsqueeze(1))\n", | |
| " pred_kernel = model_kernel(x)\n", | |
| " loss_kernel = hinge_loss(pred_kernel, y.unsqueeze(1))\n", | |
| " \n", | |
| " loss_linear.backward()\n", | |
| " opt_linear.step()\n", | |
| " loss_kernel.backward()\n", | |
| " opt_kernel.step()\n", | |
| "\n", | |
| "print(\"loss linear model\", loss_linear.item())\n", | |
| "print(\"loss kernel model\", loss_kernel.item())" | |
| ], | |
| "id": "b2ba690b", | |
| "execution_count": 6, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "loss linear model 0.34402042627334595\n", | |
| "loss kernel model 0.0\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "f41f3df9" | |
| }, | |
| "source": [ | |
| "grid_x, grid_y = torch.meshgrid(torch.arange(x.min()*1.1, x.max()*1.1, step=0.1),\n", | |
| " torch.arange(x.min()*1.1, x.max()*1.1, step=0.1))\n", | |
| "x_test = torch.stack((grid_x, grid_y)).reshape(2, -1).transpose(1,0)\n", | |
| "\n", | |
| "y_test_linear = model_linear(x_test).detach()\n", | |
| "y_test_kernel = model_kernel(x_test).detach()\n", | |
| "\n", | |
| "y_test_linear = y_test_linear.transpose(1,0).reshape(grid_x.shape).numpy()\n", | |
| "y_test_kernel = y_test_kernel.transpose(1,0).reshape(grid_x.shape).numpy()" | |
| ], | |
| "id": "f41f3df9", | |
| "execution_count": 7, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 229 | |
| }, | |
| "id": "61712d80", | |
| "outputId": "5ce4eaed-1fcc-4c02-d552-8a4c26202b29" | |
| }, | |
| "source": [ | |
| "fig, ax = plt.subplots(1,2, figsize=(8,3))\n", | |
| "\n", | |
| "cs0 = ax[0].contourf(grid_x.numpy(), grid_y.numpy(), y_test_linear)\n", | |
| "ax[0].contour(cs0, '--', levels=[0], colors='tab:green', linewidths=2)\n", | |
| "ax[0].plot(np.nan, label='decision boundary', color='tab:green')\n", | |
| "ax[0].scatter(x[np.where(y==-1),0], x[np.where(y==-1),1])\n", | |
| "ax[0].scatter(x[np.where(y==1),0], x[np.where(y==1),1])\n", | |
| "ax[0].legend()\n", | |
| "ax[0].set_title('Linear Kernel')\n", | |
| "\n", | |
| "cs1 = ax[1].contourf(grid_x.numpy(), grid_y.numpy(), y_test_kernel)\n", | |
| "cs11 = ax[1].contour(cs1, '--', levels=[0], colors='tab:green', linewidths=2)\n", | |
| "ax[1].plot(np.nan, label='decision boundary', color='tab:green')\n", | |
| "ax[1].scatter(x[np.where(y==-1),0], x[np.where(y==-1),1])\n", | |
| "ax[1].scatter(x[np.where(y==1),0], x[np.where(y==1),1])\n", | |
| "ax[1].set_title('RBF Kernel')\n", | |
| "\n", | |
| "fig.subplots_adjust(wspace=0.2, hspace=0.1,right=0.8)\n", | |
| "cbar_ax = fig.add_axes([0.82, 0.13, 0.02, 0.67])\n", | |
| "cbar = fig.colorbar(cs1, cax=cbar_ax)\n", | |
| "cbar.add_lines(cs11)" | |
| ], | |
| "id": "61712d80", | |
| "execution_count": 8, | |
| "outputs": [ | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<Figure size 576x216 with 3 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "b39fbbc4" | |
| }, | |
| "source": [ | |
| "" | |
| ], | |
| "id": "b39fbbc4", | |
| "execution_count": 8, | |
| "outputs": [] | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment