{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n# SVM Margins Example\nThe plots below illustrate the effect the parameter `C` has\non the separation line. A large value of `C` basically tells\nour model that we do not have that much faith in our data's\ndistribution, and will only consider points close to line\nof separation.\n\nA small value of `C` includes more/all the observations, allowing\nthe margins to be calculated using all the data in the area.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Authors: The scikit-learn developers\n# SPDX-License-Identifier: BSD-3-Clause\n\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nfrom sklearn import svm\n\n# we create 40 separable points\nnp.random.seed(0)\nX = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]\nY = [0] * 20 + [1] * 20\n\n# figure number\nfignum = 1\n\n# fit the model\nfor name, penalty in ((\"unreg\", 1), (\"reg\", 0.05)):\n clf = svm.SVC(kernel=\"linear\", C=penalty)\n clf.fit(X, Y)\n\n # get the separating hyperplane\n w = clf.coef_[0]\n a = -w[0] / w[1]\n xx = np.linspace(-5, 5)\n yy = a * xx - (clf.intercept_[0]) / w[1]\n\n # plot the parallels to the separating hyperplane that pass through the\n # support vectors (margin away from hyperplane in direction\n # perpendicular to hyperplane). This is sqrt(1+a^2) away vertically in\n # 2-d.\n margin = 1 / np.sqrt(np.sum(clf.coef_**2))\n yy_down = yy - np.sqrt(1 + a**2) * margin\n yy_up = yy + np.sqrt(1 + a**2) * margin\n\n # plot the line, the points, and the nearest vectors to the plane\n plt.figure(fignum, figsize=(4, 3))\n plt.clf()\n plt.plot(xx, yy, \"k-\")\n plt.plot(xx, yy_down, \"k--\")\n plt.plot(xx, yy_up, \"k--\")\n\n plt.scatter(\n clf.support_vectors_[:, 0],\n clf.support_vectors_[:, 1],\n s=80,\n facecolors=\"none\",\n zorder=10,\n edgecolors=\"k\",\n )\n plt.scatter(\n X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.get_cmap(\"RdBu\"), edgecolors=\"k\"\n )\n\n plt.axis(\"tight\")\n x_min = -4.8\n x_max = 4.2\n y_min = -6\n y_max = 6\n\n YY, XX = np.meshgrid(yy, xx)\n xy = np.vstack([XX.ravel(), YY.ravel()]).T\n Z = clf.decision_function(xy).reshape(XX.shape)\n\n # Put the result into a contour plot\n plt.contourf(XX, YY, Z, cmap=plt.get_cmap(\"RdBu\"), alpha=0.5, linestyles=[\"-\"])\n\n plt.xlim(x_min, x_max)\n plt.ylim(y_min, y_max)\n\n plt.xticks(())\n plt.yticks(())\n fignum = fignum + 1\n\nplt.show()" ] } ], "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.9.21" } }, "nbformat": 4, "nbformat_minor": 0 }