{ "cells": [ { "cell_type": "markdown", "id": "a6590f1b-86ff-4076-9e9a-723ba6354641", "metadata": {}, "source": [ "## Kernel Support Vector Machine Method" ] }, { "cell_type": "code", "execution_count": 10, "id": "f1a55e93-da10-4f2e-a9a5-8d72a4564604", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from scipy.optimize import minimize\n", "import numpy as np\n", "import random\n", "from math import sin, cos\n", "import matplotlib.pyplot as plt\n", "from skimage import measure\n", "\n", "from sklearn.svm import SVC\n", "\n", "%matplotlib inline\n", "plt.axes(aspect=\"equal\")\n", "\n", "m1 = 100\n", "class1 = [ np.array([\n", " random.normalvariate(1., 1.5), random.normalvariate(1., 0.5)\n", "]) for i in range(m1) ]\n", "\n", "m2 = m1\n", "angle1 = -np.pi*2/3\n", "angle2 = np.pi*2/3\n", "ex = np.array([1., 0.]); ey = np.array([0., 1.])\n", "class2 = []\n", "for i in range(m2):\n", " phi = random.normalvariate(0., 1.)\n", " r = random.normalvariate(5., 0.5)\n", " p = ex*cos(phi)*r + ey*sin(phi)*r\n", " class2.append(p.copy())\n", " \n", "x = class1 + class2\n", "x = np.array(x)\n", "y = [1.]*len(class1) + [-1.]*len(class2)\n", "y = np.array(y)\n", "m = len(x)\n", "perm = np.random.permutation(m)\n", "x = x[perm]\n", "y = y[perm]\n", "\n", "plt.scatter(\n", " [c[0] for c in x], [c[1] for c in x],\n", " color=[ \"r\" if yy > 0. else \"g\" for yy in y ]\n", ")\n", "\n", "degree = 2\n", "C = 2. # Hyperparameter\n", "\n", "# classifier = SVC(C=C, kernel=\"poly\", degree=degree)\n", "classifier = SVC(C=C, kernel=\"rbf\")\n", "classifier.fit(x, y)\n", "\n", "def classifierValue(x):\n", " xx = np.array([ [x[0], x[1]] ])\n", " # return classifier.predict(xx)\n", " return classifier.decision_function(xx)\n", "\n", "# Draw the separating line\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", "steps = 100\n", "\n", "def xcoord(j):\n", " dx = (xmax - xmin)/steps\n", " return xmin + j*dx\n", "def ycoord(i):\n", " dy = (ymax - ymin)/steps\n", " return ymin + i*dy\n", "\n", "# a is a matrix of dimension (steps, steps)\n", "a = np.array([[0.]*steps for iy in range(steps)])\n", "for i in range(steps):\n", " for j in range(steps):\n", " xx = np.array([xcoord(j), ycoord(i)])\n", " a[i, j] = classifierValue(xx)\n", "nullContours = measure.find_contours(a, 0.)\n", "for c in nullContours:\n", " plt.plot(\n", " [xcoord(cc[1]) for cc in c], \n", " [ycoord(cc[0]) for cc in c],\n", " color=\"blue\"\n", " )" ] }, { "cell_type": "code", "execution_count": null, "id": "f395266d-fb90-4b99-af1a-549210068163", "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.7.0" } }, "nbformat": 4, "nbformat_minor": 5 }