Last active
October 27, 2017 10:16
-
-
Save nicococo/11d72e7cc75a87423a15873614972ea0 to your computer and use it in GitHub Desktop.
This is a test on how to include an ipython notebook into wordpress.
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
| { | |
| "worksheets": [ | |
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Support Vector Data Description\n", | |
| "===================================\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The problem of *data description* or one-class classification is to make a description of a training set of objects and to detect which (new) objects resemble this training set. \n", | |
| "\n", | |
| "This has been greatly used in outlier detection, i.e. the detection of uncharacteristic objects from a data set. Furthermore, another possible application of data description is in a classification problem where one of the classes is sampled very well, while the other class is severely undersampled. " | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Here, the method proposed by Tax and Duin in 2004. called *Support Vector Data Description* has been implemented. This method obtains a spherically shaped boundary around the complete target set. To minimize the chance of accepting outliers, the volume of this description is minimized. \n", | |
| "\n", | |
| "The error function to be minimized is defined as:\n", | |
| "\n", | |
| "$$F(R, \\mathbf{a}) = R^2$$\n", | |
| "\n", | |
| "with the constraint:\n", | |
| "\n", | |
| "$$\\|\\Phi(\\mathbf{x}_i)-\\mathbf{a}\\|^2 \\le R^2, \\hspace{3mm}\\forall i,$$\n", | |
| "\n", | |
| "where $\\Phi$ defines an implicit mapping of the data into an another (possibly highdimensional) feature space.\n", | |
| "\n", | |
| "To allow the possibility of outliers in the training set, the distance from $\\Phi(\\mathbf{x}_i)$ to the center $\\mathbf{a}$ should not be strictly smaller than $R^2$, but larger distances should be penalized. Therefore, the slack variables $\\xi_i \\ge 0$ are introduced, so the minimization problem becomes:\n", | |
| "\n", | |
| "$$F(R, \\mathbf{a}) = R^2 + C\\sum_i{\\xi_i}$$\n", | |
| "with the constraint which ensures that almost all objectives are within the sphere:\n", | |
| "\n", | |
| "$$\\|\\Phi(\\mathbf{x}_i)-\\mathbf{a}\\|^2 \\le R^2 + \\xi_i, \\hspace{3mm} \\xi_i \\ge 0 \\hspace{3mm} \\forall i.$$\n", | |
| "\n", | |
| "\n", | |
| "This optimization problem can be solved using the Lagrange multipliers, so the following expression is obtained:\n", | |
| "\n", | |
| "<!--$$L(R,\\mathbf{a}, \\alpha_i, \\gamma_i, \\xi_i) = R^2 + C\\sum_i{\\xi_i} - \\sum_i{\\alpha_i(R^2 + \\xi_i - ({\\|\\mathbf{x}_i\\|}^2 - 2\\mathbf{a}\\mathbf{x}_i + {\\|\\mathbf{a}\\|}^2))} - \\sum_i{\\gamma_i\\xi_i},$$\n", | |
| "\n", | |
| "where $L$ should be minimized with respect to $R, \\mathbf{a}, \\xi_i$ and maximized with respect to the Lagrange multipliers $\\alpha_i \\ge 0$ and $\\gamma_i \\ge 0$. -->\n", | |
| "\n", | |
| "<!--After setting the partial derivatives to zero and resubstituting the obtained equations into $L$,--> \n", | |
| "\n", | |
| "$$L = \\sum_i{\\alpha_i(\\Phi(\\mathbf{x}_i)\\cdot\\Phi(\\mathbf{x}_i))} - \\sum_i\\sum_j{\\alpha_i \\alpha_j(\\Phi(\\mathbf{x}_i)\\cdot\\Phi(\\mathbf{x}_j))}$$\n", | |
| "\n", | |
| "subject to the constraints:\n", | |
| "\n", | |
| "$$\\sum_i{\\alpha_i} = 1,$$\n", | |
| "\n", | |
| "$$\\mathbf{a} = \\sum_i{\\alpha_i\\Phi(\\mathbf{x}_i)},$$\n", | |
| "\n", | |
| "$$0 \\le \\alpha_i \\le C.$$\n", | |
| "\n", | |
| "Only objects $\\Phi(\\mathbf{x}_i)$ with $\\alpha_i \\gt 0$ are needed in the data description and these objects are called the *support vectors* (SVs) of the description.\n", | |
| "\n", | |
| "The above used inner products $(\\Phi(\\mathbf{x}_i)\\cdot\\Phi(\\mathbf{x}_j))$ can be replaced by a *kernel* function $K(\\mathbf{x}_i, \\mathbf{x}_j) = (\\Phi(\\mathbf{x}_i)\\cdot\\Phi(\\mathbf{x}_j))$ to obtain more flexible methods, so the optimization problem above becomes:\n", | |
| "\n", | |
| "$$L = \\sum_i{\\alpha_iK(\\mathbf{x}_i, \\mathbf{x}_i)} - \\sum_i\\sum_j{\\alpha_i \\alpha_jK(\\mathbf{x}_i, \\mathbf{x}_j)}.$$\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "input": [ | |
| "import numpy as np\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "\n", | |
| "from tilitools.svdd_dual_qp import SvddDualQP\n", | |
| "from tilitools.svdd_primal_sgd import SvddPrimalSGD\n", | |
| "\n", | |
| "%matplotlib inline" | |
| ], | |
| "language": "python", | |
| "prompt_number": 8 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "input": [ | |
| "# generate raw training data\n", | |
| "Dtrain = np.random.randn(2, 1000)\n", | |
| "Dtrain /= np.max(np.abs(Dtrain))" | |
| ], | |
| "language": "python", | |
| "prompt_number": 9 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "input": [ | |
| "nu = 0.15 # outlier fraction\n", | |
| "\n", | |
| "# train dual svdd\n", | |
| "svdd = SvddDualQP('linear', 0.1, nu)\n", | |
| "svdd.fit(Dtrain)\n", | |
| "\n", | |
| "# train primal svdd\n", | |
| "psvdd = SvddPrimalSGD(nu)\n", | |
| "psvdd.fit(Dtrain, max_iter=1000, prec=1e-4)\n", | |
| "\n", | |
| "# print solutions\n", | |
| "print('\\n dual-svdd: obj={0} T={1}.'.format(svdd.pobj, svdd.radius2))\n", | |
| "print('primal-svdd: obj={0} T={1}.\\n'.format(psvdd.pobj, psvdd.radius2))" | |
| ], | |
| "language": "python", | |
| "prompt_number": 10 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "(2, 1764)\nCalculating linear kernel with size 1764x151.\nCalculating diagonal of a linear kernel with size 1764x1764.\n" | |
| ] | |
| }, | |
| { | |
| "output_type": "display_data", | |
| "png": "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\n", | |
| "text": [ | |
| "<matplotlib.figure.Figure at 0x10f20f510>" | |
| ], | |
| "metadata": {} | |
| } | |
| ], | |
| "input": [ | |
| "# generate test data grid\n", | |
| "delta = 0.1\n", | |
| "x = np.arange(-2.0-delta, 2.0+delta, delta)\n", | |
| "y = np.arange(-2.0-delta, 2.0+delta, delta)\n", | |
| "X, Y = np.meshgrid(x, y)\n", | |
| "(sx, sy) = X.shape\n", | |
| "Xf = np.reshape(X,(1, sx*sy))\n", | |
| "Yf = np.reshape(Y,(1, sx*sy))\n", | |
| "Dtest = np.append(Xf, Yf, axis=0)\n", | |
| "if Dtrain.shape[0] > 2:\n", | |
| " Dtest = np.append(Dtest, np.random.randn(Dtrain.shape[0]-2, sx*sy), axis=0)\n", | |
| "print(Dtest.shape)\n", | |
| "\n", | |
| "res = svdd.predict(Dtest)\n", | |
| "pres = psvdd.predict(Dtest)\n", | |
| "\n", | |
| "# nice visualization\n", | |
| "plt.figure(1)\n", | |
| "plt.subplot(1, 2, 1)\n", | |
| "plt.title('Dual QP SVDD')\n", | |
| "Z = np.reshape(res,(sx, sy))\n", | |
| "plt.contourf(X, Y, Z)\n", | |
| "plt.contour(X, Y, Z, [0.0], linewidths=3.0, colors='k')\n", | |
| "plt.scatter(Dtrain[0, svdd.get_support_inds()], Dtrain[1, svdd.get_support_inds()], 40, c='k')\n", | |
| "plt.scatter(Dtrain[0, :], Dtrain[1, :],10)\n", | |
| "plt.xlim((-2., 2.))\n", | |
| "plt.ylim((-2., 2.))\n", | |
| "plt.yticks(range(-2, 2), [])\n", | |
| "plt.xticks(range(-2, 2), [])\n", | |
| "\n", | |
| "plt.subplot(1, 2, 2)\n", | |
| "plt.title('Primal Subgradient SVDD')\n", | |
| "Z = np.reshape(pres,(sx, sy))\n", | |
| "plt.contourf(X, Y, Z)\n", | |
| "plt.contour(X, Y, Z, [0.0], linewidths=3.0, colors='k')\n", | |
| "plt.scatter(Dtrain[0, :], Dtrain[1, :], 10)\n", | |
| "plt.xlim((-2., 2.))\n", | |
| "plt.ylim((-2., 2.))\n", | |
| "plt.yticks(range(-2, 2), [])\n", | |
| "plt.xticks(range(-2, 2), [])\n", | |
| "\n", | |
| "plt.show()" | |
| ], | |
| "language": "python", | |
| "prompt_number": 15 | |
| } | |
| ] | |
| } | |
| ], | |
| "cells": [], | |
| "metadata": { | |
| "name": "test_svdd" | |
| }, | |
| "nbformat": 3, | |
| "nbformat_minor": 0 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment