{ "cells": [ { "cell_type": "markdown", "id": "b568bd05-eabc-424d-9a2b-8aaa48761c99", "metadata": {}, "source": [ "

Nonlinear Support Vector Machine

" ] }, { "cell_type": "code", "execution_count": 1, "id": "d043a7cb-684b-4881-b3a8-6f56496c1349", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polynomial degree = 3\n", "Dimension of extended space = 9\n", "Parameters of linear classifier in extended space:\n", "w = [-0.40906814 0.17897386 -0.03285319 -0.02294383 -0.03144722 0.0077018\n", " 0.01553396 -0.01288002 0.03024686]\n", "b = -0.026999328447199083\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Nonlinear Support Vector Machine\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import random\n", "from scipy.optimize import minimize\n", "from skimage import measure\n", "import itertools\n", "from math import sin, cos, pi\n", "\n", "d = 3\n", "C = 5.\n", "\n", "def monomials(x, d):\n", " '''Return an array of all products of degree <= d\n", " composed from the coordinates of vector x'''\n", " # m = [1.]\n", " m = []\n", " for l in range(1, d+1):\n", " for i in itertools.combinations_with_replacement(x, l):\n", " v = np.prod(i)\n", " m.append(v)\n", " return np.array(m)\n", "\n", "def f(x):\n", " '''Graph of this function separates two classes of points'''\n", " return 3.*sin(0.5*x) + 1.\n", "\n", "# xmin = -10.; xmax = 10.;\n", "# ymin = -10.; ymax = 10.;\n", "m = 100\n", "class1 = []\n", "class2 = []\n", "for i in range(m):\n", " x1 = random.normalvariate(0., 4.)\n", " y1 = f(x1) + random.normalvariate(3., 2.)\n", " class1.append([x1, y1])\n", " x2 = random.normalvariate(0., 4.)\n", " y2 = f(x2) - random.normalvariate(3., 2.)\n", " class2.append([x2, y2])\n", "x = np.array(class1 + class2)\n", "# print(\"x:\", x)\n", "y = np.array([1.]*m + [-1.]*m)\n", "# print(\"y:\", y)\n", "\n", "%matplotlib inline\n", "ax = plt.gca()\n", "ax.set_aspect(\"equal\")\n", "# ax.set_xlim(-10., 10.)\n", "# ax.set_ylim(-10., 10.)\n", "ax.scatter(\n", " [xx[0] for xx in x],\n", " [xx[1] for xx in x],\n", " color = [(\"red\" if yy > 0 else \"green\") for yy in y]\n", ")\n", "\n", "xext = np.array([monomials(xx, d) for xx in x])\n", "k = len(xext[0])\n", "print(\"Polynomial degree =\", d)\n", "print(\"Dimension of extended space =\", k)\n", "\n", "perm = np.random.permutation(2*m)\n", "x = x[perm]\n", "xext = xext[perm]\n", "y = y[perm]\n", "\n", "def hingeLoss(x):\n", " return max(1. - x, 0.)\n", "\n", "def lossFunction(wb):\n", " '''Loss function to be minimized in Support Vector Machine'''\n", " n = len(xext)\n", " w = wb[:-1]\n", " b = wb[-1]\n", " s = 0.\n", " for i in range(n):\n", " c = y[i]*(w @ xext[i] - b)\n", " l = hingeLoss(c)\n", " s += l\n", " err = w@w + (C/n)*s\n", " # print(\"w:\", w, \"b:\", b, \"err:\", err)\n", " return err\n", "\n", "wb = np.array([0.]*k + [0])\n", "res = minimize(lossFunction, wb)\n", "# print(\"res;\", res)\n", "\n", "w = res.x[:-1]\n", "b = res.x[-1]\n", "print(\"Parameters of linear classifier in extended space:\")\n", "print(\"w =\", w)\n", "print(\"b =\", b)\n", "\n", "def classifier(x):\n", " '''Linear classifier constructed by SVM method'''\n", " xe = monomials(x, d)\n", " return w@xe - b\n", "\n", "# Draw the isoline defined by the equation \n", "# classifier(x) = 0\n", "xmin = min([xx[0] for xx in x]) - 1.\n", "xmax = max([xx[0] for xx in x]) + 1.\n", "ymin = min([xx[1] for xx in x]) - 1.\n", "ymax = max([xx[1] for xx in x]) + 1.\n", "dx = 0.1; dy = dx\n", "xSteps = int((xmax - xmin)/dx)\n", "ySteps = int((ymax - ymin)/dy)\n", "def xcoord(j):\n", " return xmin + j*dx\n", "def ycoord(i):\n", " return ymin + i*dy\n", "# Matrix of function values\n", "a = [[0.]*xSteps for i in range(ySteps)]\n", "a = np.array(a)\n", "for i in range(ySteps):\n", " y = ycoord(i)\n", " for j in range(xSteps):\n", " x = xcoord(j)\n", " v = classifier(np.array([x, y]))\n", " a[i, j] = v\n", " \n", "contours = measure.find_contours(a, 0.)\n", "for contour in contours:\n", " ax.plot(\n", " [xcoord(c[1]) for c in contour],\n", " [ycoord(c[0]) for c in contour],\n", " color=\"blue\"\n", " )\n" ] }, { "cell_type": "code", "execution_count": null, "id": "ef51893c-fdad-4feb-a8b7-015038fc4ba6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "43a30540-3038-45ba-af51-c2883e566c5a", "metadata": {}, "outputs": [], "source": [] } ], "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.10.6" } }, "nbformat": 4, "nbformat_minor": 5 }