Skip to content

Instantly share code, notes, and snippets.

@MikeLing
Last active February 9, 2017 11:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MikeLing/6c08b1d5eaebc385c2a63fa1314b13b1 to your computer and use it in GitHub Desktop.
Save MikeLing/6c08b1d5eaebc385c2a63fa1314b13b1 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# K-Nearest Neighbors (KNN)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### by Chiyuan Zhang and Sören Sonnenburg"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook illustrates the <a href=\"http://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm\">K-Nearest Neighbors</a> (KNN) algorithm on the USPS digit recognition dataset in Shogun. Further, the effect of <a href=\"http://en.wikipedia.org/wiki/Cover_tree\">Cover Trees</a> on speed is illustrated by comparing KNN with and without it. Finally, a comparison with <a href=\"http://en.wikipedia.org/wiki/Support_vector_machine#Multiclass_SVM\">Multiclass Support Vector Machines</a> is shown. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## The basics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The training of a KNN model basically does nothing but memorizing all the training points and the associated labels, which is very cheap in computation but costly in storage. The prediction is implemented by finding the K nearest neighbors of the query point, and voting. Here K is a hyper-parameter for the algorithm. Smaller values for K give the model low bias but high variance; while larger values for K give low variance but high bias.\n",
"\n",
"In `SHOGUN`, you can use [CKNN](http://www.shogun-toolbox.org/doc/en/latest/classshogun_1_1CKNN.html) to perform KNN learning. To construct a KNN machine, you must choose the hyper-parameter K and a distance function. Usually, we simply use the standard [CEuclideanDistance](http://www.shogun-toolbox.org/doc/en/latest/classshogun_1_1CEuclideanDistance.html), but in general, any subclass of [CDistance](http://www.shogun-toolbox.org/doc/en/latest/classshogun_1_1CDistance.html) could be used. For demonstration, in this tutorial we select a random subset of 1000 samples from the USPS digit recognition dataset, and run 2-fold cross validation of KNN with varying K."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First we load and init data split:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(256, 9298)\n",
"(256, 5000)\n",
"(256, 1000)\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"from scipy.io import loadmat, savemat\n",
"from numpy import random\n",
"from os import path\n",
"\n",
"mat = loadmat('../../../data/multiclass/usps.mat')\n",
"Xall = mat['data']\n",
"Yall = np.array(mat['label'].squeeze(), dtype=np.double)\n",
"\n",
"# map from 1..10 to 0..9, since shogun\n",
"# requires multiclass labels to be\n",
"# 0, 1, ..., K-1\n",
"Yall = Yall - 1\n",
"\n",
"random.seed(0)\n",
"\n",
"subset = random.permutation(len(Yall))\n",
"\n",
"Xtrain = Xall[:, subset[:5000]]\n",
"Ytrain = Yall[subset[:5000]]\n",
"\n",
"Xtest = Xall[:, subset[5000:6000]]\n",
"Ytest = Yall[subset[5000:6000]]\n",
"\n",
"Nsplit = 2\n",
"all_ks = range(1, 21)\n",
"\n",
"print Xall.shape\n",
"print Xtrain.shape\n",
"print Xtest.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let us plot the first five examples of the train data (first row) and test data (second row)."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA8oAAADFCAYAAACM0Qt8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGBxJREFUeJzt3VmMn/W93/HvM4s9XsCMzXgBy44NhhrMkhCWEJyDUiAN\nJUqTRkql9qR3rVqdm6qt1Itc9KI3vWqlHLVXpz1V20jJRZTlUIUoORDArDFxCCZmMdh4bAhjjxdm\n7NmfXsDpeaoTwWfagb+X10uKlIu3nuc3//+zfedv5t+0bVsAAADA+/p6vQAAAAA4nxiUAQAAoMOg\nDAAAAB0GZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQYVD+hDRN8ydN0/yqaZrppmn+vNfrgV5rmmZn\n0zR/2TTN6aZpXm+a5mu9XhP0QtM0y5um+bOmaQ43TfNe0zT7mqb5cq/XBb3gfIC/qWmaTzVN87+a\npjnZNM07TdP8adM0A71e18XOoPzJOVZV/66q/kuvFwK99sHF/UdV9RdVtbaq/klV/Y+maa7r6cKg\nNwaq6khV/VFVramqb1fV95um+VQP1wS94nyAv+k/VdW7VbWpqm6t98+Pf97TFV0CDMqfkLZtf9C2\n7Q+r6kSv1wLngb9VVVdV1X9o23a+bdu/rKo9VfXHvV0WfPLatp1s2/bftm17qG3bhbZt/6Kq3qyq\n23q9NvikOR/gD9pWVd9v23aqbdt3quqnVXVjj9d00TMoA+eLpqp29XoR0GtN02yoquuqan+v1wK9\n5nyAqqr6j1X1D5qmWdk0zdVV9eV6f1jmY2RQBnrhlXr/nxD966ZpBpumeaDe/2dEK3u7LOitpmkG\nq+p/VtV/a9v2QK/XA73kfID/4/F6/xPkM1U1WlW/qqof9nRFlwCDMvCJa9t2tqr+XlX93ap6p6r+\nZVV9v96/+MMlqWmavqr671U1U1V/0uPlQE85H+B9H5wLP62qH1TVqqq6sqqGq+rf93JdlwKDMtAT\nbdu+2LbtH7Vtu65t2y9V1faqeq7X64JeaJqmqao/q6oNVfX3P/hlElySnA/wf1lbVVuq6k/btp1u\n2/ZEVf3Xqnqwt8u6+BmUPyFN0ww0TTNUVf1V1d80zZA/686lrGmamz84D1Y2TfOv6v2/5PjnPV4W\n9Mp/rqqdVfWVtm3P9Xox0GPOB/hA27bH6/0/aPfPPpgnrqiqf1xVL/Z2ZRc/g/In59tVda6q/k1V\n/aMP/v+3e7oi6K0/rqq36/3/VvlvV9X9bdtO93ZJ8MlrmmZrVf3Tev8rP95pmmbig//9wx4vDT5x\nzgf4g75eVX+nqsaq6vWqmq2qf9HTFV0CmrZte70GAAAAOG/4RBkAAAA6DMoAAADQYVAGAACADoMy\nAAAAdBiUAQAAoGNR3+PbNM1F8yey+/qy3xGsWrUq3uYVV1wRdU3TRN2pU6eibnJyMuqqqubn5+P2\nfNe2bfZCfkx6eT4MDGSnbnr8Xn755VE3NDQUdVX5cZ7+5f2pqamoO3PmTNRVVc3NzUVd+npPT2ff\nbpV2VfnrU1XH27YdiTe8xC6E+0N6TPb390ddelxU5fec9P1Oj93FXPMXFhbi9gLgfPgIy5Yti7rh\n4eGoS5+BqvLz4ezZs1E3Pj4edYt5XnI+LK0L4ZxIj8v0HpF2i9l3eh9Lu+XLl0ddVf4M+N5770Xd\nxMRE1H0c52I6QyxqUL6YpAPEnXfeGW/zq1/9atSlN6cf/vCHUffUU09FXVXV6dOn45ZPVnqRrMof\nSNLj94EHHoi666+/Puqq8gtqOgAfOHAg6h599NGoq6oaGxuLupGR7Pni9ddfj7qDBw9GXVX++lTV\n4XijF5mlfiBIz69169ZFXVXVihUroi4dgNNj9+TJk1FXlR9rF8gA4Xz4CJs2bYq6b37zm1H30EMP\nRV1V1erVq6Nu7969Ufe9730v6p599tmoq8of9i8Ql+z5UJUPrOlzy5o1a6Iu/RCiqmrlypVRl84Q\nabd9+/aoq8qfAR9//PGo27NnT9Qt5gOQpeafXgMAAECHQRkAAAA6DMoAAADQYVAGAACADoMyAAAA\ndBiUAQAAoMOgDAAAAB0X3fcop99Fm37/5e7du+N9f+lLX4rbxNGjR6Pu5ZdfjreZfhdZ25733wt/\n0Um/27uq6vbbb4+6b33rW1F37bXXRt2xY8eirqrq0KFDUZd+11/6vYVf+MIXoq6q6rLLLou64eHh\nqPvud78bdUeOHIm6qkV9j/JFJf3ey6r82NixY0fUffazn426W2+9Neqqqq666qqoS7+79fnnn1/S\nrir/rvLx8fGoS78Tmt5InwfSY2hmZibed/psdf/998fbTIyOjsbtq6++GnUXyPeKX3TSZ4eqqg0b\nNkTdDTfcEHU33XRT1G3bti3qqvI1ps+K6euzfv36qKvKZ6x333036vbt2xd1i/lO86WeX3yiDAAA\nAB0GZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQYVAGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0DvV5A\nrwwNDUXdyMhIvM3h4eEl3fctt9wSdevWrYu6qqrR0dGom5+fj7fJhxsYyE6zLVu2xNt84IEHom7D\nhg1R98gjj0Tdo48+GnVVVSdOnIi6TZs2Rd2dd94Zdffee2/UVVVdf/31Uffb3/426k6dOhV1MzMz\nUXcpu+yyy+I2PTa+9rWvRd0dd9wRdemxW1W1cuXKqEuPjRtvvDHqbr311qirqvrBD34QdY8//njU\njY+PR13btlFHJn09z5w5E3XPPfdc1L388stRV1V1+PDhqEufwdL75xVXXBF1VVVN08QtS6evL/sM\nb/369fE2H3rooaj78pe/vKT7XlhYiLqq/Lk7Pb/Tc+e6666LuqqqkydPRt3atWujbvny5VG3mHNx\nqe8nPlEGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQYVAG\nAACADoMyAAAAdAz0egEXk6Zpom7FihVRd+WVV0bd0NBQ1NEby5Yti7prrrkm3uauXbui7rXXXou6\nZ555JurGx8ejrqpq7dq1Ubdz586o+9znPhd1u3fvjrqqqrm5uah74YUXou7NN9+MupmZmai7GPX1\nZb+fXbduXbzNu+++O+rSY2PDhg1RNzk5GXVVVSdOnIi6+fn5qFuzZk3Uff7zn4+6qqqzZ89GXXqc\nnzlzJupmZ2ejjqWVHmvpcb6Y69qpU6eiLr1Gp8fapXztvVAMDg5G3fbt2+NtPvjgg1GXPoc98cQT\nUZc+W1Xlz1fDw8NR95WvfCXq0vtdVdX09HTU7dixI+o2btwYdceOHYu6qqU/x32iDAAAAB0GZQAA\nAOgwKAMAAECHQRkAAAA6DMoAAADQYVAGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0DvV5Ar7RtG3Xz\n8/NLvs2+vuz3EwMD2duTbo/eWLZsWdStW7cu3uaVV14ZdZOTk1G3e/fuqFvMsXb55ZdH3eDgYNSd\nO3cu6mZmZqKuquro0aNR9/zzz0fd8ePHo25hYSHqLmWLufaePXs26kZHR6Pu0KFDUbd///6oq6o6\nePBg1KXnw3333Rd1t99+e9RVVd1www1Rt3Xr1qhLf+bZ2dmo4/yW3uuqqjZv3hx1GzdujLpnn302\n6sbGxqKuynW6V/r7+6Pusssui7eZPo8cPnw46n7yk59E3XPPPRd1Vfm1/95774264eHhqHvjjTei\nrqrqN7/5TdSl1/Q1a9ZEXfraVC3uGTBhwgIAAIAOgzIAAAB0GJQBAACgw6AMAAAAHQZlAAAA6DAo\nAwAAQIdBGQAAADoMygAAANBhUAYAAICOgV4v4HzXtu3H0ib6+pb+9xhN0yz5Nvlw8/PzUXfy5Ml4\nm8ePH4+6bdu2Rd3atWuj7uDBg1FXVfXSSy9F3euvvx5127dvj7obb7wx6qqqXnvttah76623om5q\naire96VqYWEh6sbGxuJtPvzww1H38ssvR925c+eiLj0uqqpOnz4ddVu3bo2622+/Per6+/ujrqrq\niiuuiLqRkZGoW758edRNTExEXdXS32f5aOlzQ3r8VFXt2LEj6tL3e//+/VE3Pj4edYvZN0trdnY2\n6k6cOBFv89ixY1G3YsWKqEvXmHZVVVu2bIm6+++/P+o2bNgQdT//+c+jrqrqpz/9adQNDGTj5ejo\naNSlz9EfB58oAwAAQIdBGQAAADoMygAAANBhUAYAAIAOgzIAAAB0GJQBAACgw6AMAAAAHQZlAAAA\n6DAoAwAAQMdArxew1JqmibrBwcGoGxoaivc9MJC9nOka066/vz/q6I1z585F3d69e+Ntfuc734m6\nkZGRqJueno66N998M+qqqkZHR6MuPc537NgRdWfPno26qqr9+/dH3djYWNQtLCzE++bDLeZ9fOWV\nV6Lu8OHDUTc3Nxd1MzMzUVeV3x+uueaaqFu9enXUpfe6qqq+vux35+nPkm6P81t6jR4eHo63uXXr\n1qg7duxY1B05ciTq0nsdvTM/Px916bFRVbVv376ou/fee6PuM5/5TNSdPn066qqqbr311qi7+eab\noy59bnnssceirqrqV7/6VdSl99D0fFzMvXapuYsBAABAh0EZAAAAOgzKAAAA0GFQBgAAgA6DMgAA\nAHQYlAEAAKDDoAwAAAAdBmUAAADoMCgDAABAh0EZAAAAOgZ6vYCl1teXzf4rV66MuuHh4Xjfg4OD\ncZtomibq0p95Mdtk6czNzUXd22+/HW/z5MmTUTcwkJ3ibdtG3dTUVNQtxo033hh1u3btirrJycl4\n3/v27Yu68fHxqFtYWIj3fTFKjrf0WEuP3aqq5cuXR116rezv74+6ZcuWRV1V1cjISNR9+tOfjrpt\n27ZF3WJex4mJiahLz4fp6emoS48JeiM9b9JjvKpq8+bNUffmm29G3djYWNRd6tfoC0H6HqXveVXV\nk08+GXVbt26Nuttuuy3q1qxZE3VVVTfccEPUrVq1Kup+8YtfRN3LL78cdVX5s+f8/HzUXQjXfp8o\nAwAAQIdBGQAAADoMygAAANBhUAYAAIAOgzIAAAB0GJQBAACgw6AMAAAAHQZlAAAA6DAoAwAAQMdA\nrxew1Nq2jbrp6emom5iYiPc9NzcXt4mmaaKury//fUe6TT55izl+FnNcLqXFHD/Dw8NRd/PNN0fd\nzp07o+7111+Puqqq3/3ud1E3OTkZb/NSNTg4WBs2bPjILr1ebdy4Md731VdfHXVDQ0NRNzs7G3WL\nOS7SNT7wwANRt3nz5qhbzBpfffXVqHvrrbeibmpqKt4356+BgexRcf369fE2N23aFHWPPfZY1I2P\nj0dd+ozI+W8x15f0Xv/II49E3Te+8Y2o+/rXvx51Vfk5kT7jPP/881H39ttvR13V0s85FwKfKAMA\nAECHQRkAAAA6DMoAAADQYVAGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAEDHQK8X\nsNQWFhai7ty5c1F38uTJeN/T09Nxm2iaJur6+vLfd6TbhD9kMcfapk2bou6ee+6JutWrV0fd888/\nH3VVVUeOHIm6ubm5eJuXqhUrVtRNN930kd3mzZuj7d11113xvnfu3Bl1K1asiLr0/Z6cnIy6qvz4\n3bp1a9Sl1/Jf//rXUVdV9fDDD0fdwYMHo252djbeN+ev5cuXR93IyEi8zYGB7PEzvUafOXMm6tq2\njTrOf4t5L0+fPh11zz77bNRt2LAh6u6+++6oq8rvEen9qb+/P+oGBwejrip/BkxnsQuBT5QBAACg\nw6AMAAAAHQZlAAAA6DAoAwAAQIdBGQAAADoMygAAANBhUAYAAIAOgzIAAAB0GJQBAACgY6DXC+iV\nubm5qJueno63ubCw8P+6nP8vfX357zuapvkYV8LFbnBwMG63bNkSdbt27Yq68fHxqHvppZeirqrq\n1KlTUde2bbzNS1VfX18NDQ19ZPfFL34x2t4999wT73v9+vVR19/fH3Xp+z0/Px91Vfm1N72eHz16\nNOr27dsXdVVVBw4ciLqzZ89G3VL/zFX5e+Oc/Wjp+7Nq1aqoW7duXbzv9Bg6efJk1M3Ozsb75tKT\nXqsnJiai7sSJE1GXPmNUVR05ciTq0vvYfffdF3Xpz1JV9cwzz0TdmTNn4m2e73yiDAAAAB0GZQAA\nAOgwKAMAAECHQRkAAAA6DMoAAADQYVAGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgY6PUC\nemVhYWFJu6qqtm2jbm5uLuqmpqaWdHtV+Rq5tDRNE3WXX355vM0dO3ZE3apVq6Juz549UTc6Ohp1\nVVWzs7Nxy4ebnZ2tY8eOfWSXXq+GhobifQ8ODkZdepynBgbyW2h67U3vOenrs3379qirqrr99tuj\nbvXq1VF36tSpqDt79mzUVVWNj48v6b4vZen5kL7f69evj/d95syZqJucnIw6zzZ8mPRYX7ZsWdSl\nz0LpcV5VtXfv3qibmJiIul27dkXdgw8+GHVVFd3jq6oOHDgQdYuZX3rFJ8oAAADQYVAGAACADoMy\nAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQMdDrBZzvFhYWlrw9d+5c\n1L399ttRd/r06airWtzPw6Wjv78/6q666qp4m3feeWfUTU1NRd1TTz0Vde+8807UVTkfltLMzEwd\nOXLkI7s9e/ZE2/vUpz4V7/vmm2+OutWrV8fbTExPT8ftiRMnom5ycjLqVqxYEXV33HFH1FVVbdu2\nLeqOHj0adenPnBw3f+Xpp5+Oup/97GfxNi9VTdNE3eWXXx5169evj/c9NjYWdRMTE1HX15d97pN2\nVe4Pl6L0WWj58uVRlz7fVFW98sorUffGG29E3cjISNTt3Lkz6qqqduzYEXWHDx+Ouvfeey/ed6/4\nRBkAAAA6DMoAAADQYVAGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAECHQRkAAAA6\nBnq9gKXWtu2SdvPz8/G+FxYWou7cuXNRNzY2FnUTExNRV5WvkUvLihUrou66666Lt3n99ddH3ZEj\nR6LuwIEDUTc5ORl1LK25ubk6fvz4R3aPPfZYtL30mKzKr6npMTk4OBh1hw8fjrqqqqeffjrqDh06\nFHXXXHNN1N10001RV1U1MjISdel1IH1f1q5dG3VVVe+++27c8uGapom6VatWRd3GjRvjfc/MzETd\n1q1bo25qairqTp06FXVVVe+8886S7pveSZ/5p6enoy49NpJ74l9Jz7P0ejk0NBR1w8PDUVdVdeWV\nV0bd8uXLoy6dX9L37+PgE2UAAADoMCgDAABAh0EZAAAAOgzKAAAA0GFQBgAAgA6DMgAAAHQYlAEA\nAKDDoAwAAAAdBmUAAADoGOj1Anplbm4u6iYnJ+Ntnj17dkm3eezYsSXdb1XVwsJC3HLha5om6lav\nXh11W7ZsWfJ9v/TSS1H3+9//Purm5+ejjqXVtm3NzMx8ZHfo0KFoez/+8Y/jfY+OjkbdbbfdFnWr\nVq2Kuv3790ddVdUzzzwTdelxvnbt2qi79tpro66q6rrrrou64eHhqEuOh6r8mKiqevHFF+OWD9e2\nbdSl19SVK1fG+77nnnuiLj0X02PoiSeeiLqqqh/96EdRd/To0ahLX296J32eTp9bFvPMdMstt0Td\nXXfdFXXXX3991B0/fjzqqqrOnDkTdbOzs1F3IZwTPlEGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0G\nZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQYVAGAACADoMyAAAAdAz0egFLrW3bqJucnIy6AwcOxPt+\n8sknl3Tfe/bsibrx8fGoq8pfHy4t8/PzUffuu+/G2/zlL38ZdUt9nC8sLEQdvTE1NRV1hw8fjreZ\nHhsvvPBC1A0ODkbdqVOnoq6q6uTJk1E3MzMTdWNjY1F35MiRqKuq2rt3b9QtW7Ys6tJzMb0nVlW9\n9957ccuHS58H0mMtvZZXVa1duzbqrr766qhL72FDQ0NRV1XVNE3ccnGYm5uLutHR0ah75JFH4n2f\nPn066nbv3h11fX3ZZ6Evvvhi1FVVvfLKK1F37ty5eJvnO58oAwAAQIdBGQAAADoMygAAANBhUAYA\nAIAOgzIAAAB0GJQBAACgw6AMAAAAHQZlAAAA6DAoAwAAQEfTtm0eN81YVR3++JYDsa1t2470cgHO\nB84zPT0nnA+cZ5wP8Nc8M8Ffi8+HRQ3KAAAAcLHzT68BAACgw6AMAAAAHQZlAAAA6DAoAwAAQIdB\nGQAAADoMygAAANBhUAYAAIAOgzIAAAB0GJQBAACg438Dl6lys83kRgwAAAAASUVORK5CYII=\n"
},
"output_type": "display_data",
"metadata": {}
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA8oAAADFCAYAAACM0Qt8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGPNJREFUeJzt3VuMXvW93+HfmqM94/ERCJiTCWDsYMwpYGhIQojYCCWk\naSoUpWq6lbu0ylXaSr3Yval634uqUZWr3VRKo1RJ2iYVCiQczckKGGPCwQQbg4/YHnwYH2bGM6sX\n7ChLURt/p3vs15jnkSIh9Ml/rZl3nX7va/w2bdsWAAAA8JG+Xu8AAAAAnE8MygAAANBhUAYAAIAO\ngzIAAAB0GJQBAACgw6AMAAAAHQZlAAAA6DAonyNN06xtmubxpmmONE3zh6Zp/lGv9wl6pWmaiT/7\n30zTNP+x1/sFvdI0zfeapvld0zSTTdP8ba/3B3qpaZrlTdP8omma403T7Gya5p/0ep+gVzwz9c5A\nr3fgk6BpmoGq+p9V9Z+r6v6q+mJV/bJpmlvbtt3W052DHmjbdtEf/7lpmkVVta+q/nvv9gh6bk9V\n/fuqeqCqFvZ4X6DX/lNVTVXVp6rqlqr6303TbGnb9ve93S049zwz9Y5PlM+NNVW1sqr+Q9u2M23b\nPl5Vz1bVt3u7W3Be+MdV9UFVPdPrHYFeadv2523b/o+qOtTrfYFeappmtD66L/zbtm0n2rbdWFX/\nqzwzQZVnpnPKoNw7TVWt6/VOwHngr6vqR23btr3eEQB6bnVVnf6zP3G3papu7NH+wPnEM9M5ZFA+\nN96qj979+ddN0ww2TfNX9dEfvx7p7W5BbzVNc3V9dC78l17vCwDnhUVVdfTP/t2Rqhrrwb7AecMz\n07lnUD4H2radrqqvV9VX6qP/ruBfVtVPq2pXL/cLzgPfrqqNbdvu6PWOAHBemKiqxX/27xZX1bEe\n7AucTzwznWMG5XOkbdtX27b9Ytu2K9q2faCqPl1Vm3q9X9Bj/6y8MwrAn2yrqoGmaa7v/Lubq8pf\n5MUnnWemc8ygfI40TbO+aZoFTdOMNE3zr6rqsqr62x7vFvRM0zT/oKouL39zI1TTNANN0yyoqv6q\n6v+7+4VvpuATp23b41X186r6d03TjDZN87mq+odV9V97u2fQO56ZesOgfO58u6r21kf/rfKXq+r+\ntm0ne7tL0FN/XVU/b9vWH6eDqr+pqpNV9W+q6p/+3T//TU/3CHrnX9RHX5P2QVX9t6r6574aik84\nz0w90PhL0wAAAOBPfKIMAAAAHQZlAAAA6DAoAwAAQIdBGQAAADoMygAAANAxp+9obJpmXv+K7KZp\n4ra/vz/qhoaGom50dHReu7lsO3Xq1KmoO3Ys/5viT5w4EXXp34aevoanT5+OuqqqmZmZqGvbNj+A\nzoK+vr42OS4XLFgQrbdw4cJ424ODg/PaDQxkl4L0PJzLmukxlB4Xs7OzUVeVH5dTU1NRl56zExMT\nUVdVNTmZfYtc27YH27a9OF54ns33/eHjoK8vf685Pb8XL14cdel5Mz4+HnVV+fH7MeF8OIP0+J3v\nY7cqf7ZK9zG9Ts7l2ps+W01PT0ddj79lpqfnQ1Vvz4n5PobT4+3kyZNRV5Vf08/G81oqPdbTZ6a5\nzAbzLZ0h5jQoz7f0xa6qWrp0adRdc801UXf77bdH3Z133hl1c9l2erHctm1b1D3++ONRV1X10ksv\nRV06bKSv4aFDh6KuqurIkSNnbHp5cv1Rf39/LV++/IzdZz7zmWi9NWvWxNu+/PLLo+7SSy+Nuksu\nuSTqlixZEnVVVStWrIi69GKePrTM5cZ04MCBqNu1a1fUvfbaa1H34osvRl1V1TvvvBN1J0+e3Bkv\nyrxI3wSrqlq3bl3UPfjgg1GXDhA/+clPoq6q6s0334y6ubwZ1UPOhzNIh4f5Pnar8mewsbGxqNu+\nfXvUPfnkk1FXVfX0009H3e7du6MuHTLOkgvufJjLDLF69eqoe+CBB6Lu7bffjrpXX3016qryDzYu\nuuiiqFu2bFnUzeV6vm/fvqh7//33oy59I7eXz/z+6DUAAAB0GJQBAACgw6AMAAAAHQZlAAAA6DAo\nAwAAQIdBGQAAADoMygAAANBxVr5HeXh4OOquvPLKeM2777476u67776ou+mmm6Iu/f7mqvw70IaG\nhqLu2muvjbr0u3Krqj796U9HXfrdhen32M3lu56ff/75MzYTExPxemfLyMhI3XbbbWfsvvvd70br\nbdiwId52+v2tR48ejbrjx49HXfod4FVVo6OjUZd+j/LIyEjUpedhVf4d1+ma6XcM/uIXv4i6qqof\n/ehHUZd+By5nll7XrrrqqnjNhx9+OOrS76J94YUXoi79vmUuHOn16pprrom6b33rW1GXHuNVVStX\nroy6ycnJqEufl9Lvlq2qOnbsWNQdOXIk6g4fPhx1c7nPXoiapom6RYsWxWuuWbMm6r785S9H3R13\n3BF1N998c9RVVa1YsSLqrrvuuqhbsmRJ1KXnWFXVjh07ou6JJ56IunQ2SJ+tqqpmZmbiNuEOCgAA\nAB0GZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQYVAGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0Dc4mb\npqmBgTP/X6688spovYceeije9te+9rWoW7lyZdSNj49H3Ysvvhh1VVXHjx+PulWrVkXd+vXro+7u\nu++OuqqqdevWRd3ChQujbu/evVG3bdu2qKuqGhoaOmPTNE283tnS19cX/Z7Gxsai9UZHR+Ntnzx5\nMuqeeOKJqHvuueeiLj1vqiq6VsylGxwcjLqLLroo6qqqrr/++qi76667ou6mm26Kurlc+1599dWo\ne/PNN+M1+ctGRkaiLr1GV1V95StfibqlS5dG3datW6Pugw8+iLqqqrZt45Zzay73vMWLF0fdHXfc\nEXX33Xdf1M3lHrZz586oO3XqVNSlv5/h4eGoq8p/j+m9iUz6THDVVVfFa957771Rt2HDhqhLj/V7\n7rkn6qqqJiYmou7YsWNRt3v37qibmZmJuqr8GWf58uVRl84Qc3n2TJ+PUz5RBgAAgA6DMgAAAHQY\nlAEAAKDDoAwAAAAdBmUAAADoMCgDAABAh0EZAAAAOgzKAAAA0GFQBgAAgA6DMgAAAHQMzCXu6+ur\nsbGxM3af/exno/W+/vWvx9u+8cYbo+6dd96JuhdffDHq9u/fH3VVVRdffHHUDQ8PR93g4GDUjY6O\nRl1Vvo+zs7NRl/6+d+/eHXVVVcePHz9jk+7f2XTixInavHnzGbsf/vCH0XovvPBCvO302Hjqqaei\n7uWXX466Y8eORV1VVdM089r19WXv6y1cuDDqqvLz4Y033oi673//+1G3cuXKqKuqWrVqVdzyl6XH\n2rJly6Lu1ltvjbd91VVXRd327dujLj0mjxw5EnVVVW3bxi3nVnr9q8qva3feeWfUDQxkj4o//vGP\no66q6tlnn4269OdOf5a5XE+XLFkSden9mEx6vF122WXxmuvWrYu69DWfnJyMuoMHD0ZdVdXGjRuj\nbtOmTVGX3ksuvfTSqKuq+s53vhN16f3uU5/6VNQNDQ1FXVXVyZMn4zbhE2UAAADoMCgDAABAh0EZ\nAAAAOgzKAAAA0GFQBgAAgA6DMgAAAHQYlAEAAKDDoAwAAAAdBmUAAADoGJhL3NfXV6Ojo2fsrrnm\nmmi9VatWxdseGxuLumXLlkXdnXfeGXVDQ0NRV1XR76aqqr+/P+p2794dbzuV/s5PnToVdS+//HLU\n7dixI+qqqiYnJ8/YzM7OxuudLVNTU7Vr164zdocPH47We+GFF+JtDw4ORt34+HjUHT16NOpOnz4d\ndb105MiRuP3www+j7uKLL466PXv2RN0VV1wRdVXnx7F+oejry94bXrp0adStWbMm3vaCBQuibv/+\n/VGXHrsfh3OWM5vLs8jVV18ddatXr4665D5XVfXLX/4y6qrmdr9LpNfeb37zm/Ga69evj7rf/e53\nUXfw4MGoS56BLmTpNSv9fVZVbd26NeqOHz8edekz7fPPPx91VVWvvPJK1KWzwczMTNSNjIxEXVU+\niw0MZONluo9t20bd2eATZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQYVAGAACADoMyAAAAdBiUAQAA\noMOgDAAAAB0GZQAAAOgYmEvctm1NTU2dsTt48GC03rvvvhtve3h4OOrGxsaibmhoKOqOHTsWdVVV\nu3fvjrrXX399Xtdbu3Zt1FVVLVmyZF63/dxzz0Xdvn37oq6qamZmJm577fTp02dsDh8+HK115MiR\neLtN00Rd27bz2n0czOVn6e/vj7pFixbN63pzOR/efvvtuGV+pPeb9HpalZ+zR48ejbrJycl425y/\n0uNi8eLF8Zpr1qyJuvT43bhxY9S98847UVeVH+fp9fz3v/991G3evDnqqqoefPDBqLv11lujbvv2\n7VG3f//+qKu6sO7df5Q8V1XN7d74gx/8IOpGRkaiLj1+P/jgg6iryueN2dnZqFu5cmXU3XLLLVFX\nVXXZZZdF3XvvvRd16bPQqVOnou5s8IkyAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAECHQRkA\nAAA6DMoAAADQYVAGAACADoMyAAAAdAzMJZ6ZmanDhw+fsXvqqaei9SYnJ+Nt33LLLVE3NjYWdUeO\nHIm6bdu2RV1V1dtvvx11H374YdStWrUq6j73uc9FXVXViRMnom7jxo1Rt2XLlqibmJiIuk+ytm3P\nSvtJ09eXv/938cUXR93tt98edaOjo1G3adOmqKuq2r59e9wyP5qmibqBgTndQiPT09NRNzMzE3Wu\nFee39FhbtmxZvOYNN9wQdemx8frrr0fdoUOHoq6qanZ2NurSfUyfq9Kfparqvvvui7r0/vDCCy9E\n3cGDB6Ouqur06dNx+3GRvubHjh2L13zjjTeiLj0f5/v4nUs7MjISdatXr466e+65J+qqqvr7+6Pu\nlVdeibo9e/ZEXS+Pc58oAwAAQIdBGQAAADoMygAAANBhUAYAAIAOgzIAAAB0GJQBAACgw6AMAAAA\nHQZlAAAA6DAoAwAAQIdBGQAAADoG5hK3bVuTk5Nn7Hbs2BGtNz4+Hm/7ueeei7qhoaGom5qairrD\nhw9HXVXViRMnou6SSy6JujVr1kTdNddcE3VVVXv37o269Pe9Z8+eqDt9+nTUwf9L0zRRNzY2Fq95\n8803R92GDRui7uDBg1H3m9/8Juqqqt5///24ZX6kx1razaXt7++Pur4+73NfCNLXcenSpfGa6TPB\n8ePHoy59ppuYmIi6qo+eJ+fT9PR01B04cCBeM72eX3/99VF36aWXRt3rr78edVWf7GeruRxDMzMz\nZ3FP5kd67U+Poy984QtRd8MNN0RdVdX27duj7sknn4y6ffv2Rd3s7GzUnQ3utAAAANBhUAYAAIAO\ngzIAAAB0GJQBAACgw6AMAAAAHQZlAAAA6DAoAwAAQIdBGQAAADoMygAAANAxcDYWnZ6ejrpDhw7F\na46Pj///7s7fS9u2cTs6Ohp1N9xwQ9R9/vOfj7oFCxZEXVXV5s2bo+7NN9+MuhMnTsTbhv+bpmmi\nbmxsLOpuu+22eNtf/epXo2758uVR9+ijj0bdpk2boq6q6ujRo3HL/EjvYcePH4/XTO8lw8PDUTcw\nkN2+0/OL3khfx2XLlsVrLlq0KOp2794ddQcOHIi606dPR93ZkJ5fc7me7tq1K+pWr14ddek9LD0m\nOP/N5fqbnrc333xz1H3pS1+Kurns45NPPhl1r7zyStTN5R7aKz5RBgAAgA6DMgAAAHQYlAEAAKDD\noAwAAAAdBmUAAADoMCgDAABAh0EZAAAAOgzKAAAA0GFQBgAAgI6BXm68bduz0s6n/v7+uL300kuj\n7p577om6a6+9Nup27twZdVVVGzdujLq9e/dG3enTp+Nt88nSNE3UjY2NRd3tt98edd/61reirqpq\n/fr1Ubdly5aoe+SRR6Lu/fffj7oq59h8Su8jk5OTUTc+Ph5vO30dR0ZGoq6vz/vcF4KhoaGoW7p0\nabzm4OBg1KXH78mTJ6OuV89pc5H+LFVVBw4ciLqZmZmoGx0djbr09avK77Mfh9fmQjSX1zJ95n/w\nwQej7rrrrou6rVu3Rl1VPkPs378/6tJzp5fcaQEAAKDDoAwAAAAdBmUAAADoMCgDAABAh0EZAAAA\nOgzKAAAA0GFQBgAAgA6DMgAAAHQYlAEAAKBjoNc70CtN00TdokWL4jVvuummqLv77rujbmpqKup+\n+9vfRl1V1ebNm6NuYmIiXpNPjvS8qaoaHR2NuvS8+cY3vhF1a9eujbqqqpdeeinqfvazn0Xd1q1b\no+7kyZNRR2+k1789e/bEa05PT0ddes8ZHh6Ot01vJNfLgYHsMWwuzyKDg4NRNzMzE3Vt28bbPt+l\nv5uqqpGRkahLX8O53D85v/X1ZZ8zrlixIl5zw4YNUXfXXXdF3ZEjR6Lusccei7qqqrfeeivqJicn\n4zXPdz5RBgAAgA6DMgAAAHQYlAEAAKDDoAwAAAAdBmUAAADoMCgDAABAh0EZAAAAOgzKAAAA0GFQ\nBgAAgA6DMgAAAHQM9HoHemVgIPvRr7zyynjNe++9N+quuOKKqNuyZUvUPfPMM1FXVbVv376om5mZ\nidfk429wcDDqli1bFq954403Rt39998fdVdffXXUPfvss1FXVfWrX/0q6l599dWoO3bsWNS1bRt1\nzK/09z4xMRF17777brztdM2RkZGoW7BgQdT19eXvh7vuz6/keEuPyenp6XndblXV2NhY1J2NY212\ndjZuE8PDw1F3+eWXx2t+5jOfibpFixZFXfoazuV3417SGwsXLoy6NWvWxGumM0R6vD366KNR98QT\nT0RdVdWBAweibr7P717yiTIAAAB0GJQBAACgw6AMAAAAHQZlAAAA6DAoAwAAQIdBGQAAADoMygAA\nANBhUAYAAIAOgzIAAAB0DPR6B3plZGQk6tauXRuvedttt0XdyZMno27jxo1R984770RdVdXk5GTc\ncv5qmibqFi5cGHVXXnll1G3YsCHqqqo+//nPR93Y2FjUPfPMM1H32GOPRV1V1dtvvx11J06ciLq2\nbeNtc+6lr0/6er/33nvxtg8dOhR16Tm7ePHiqBscHIy6qqrp6em4ZX6kzwM7d+6M1zxw4EDUpdf9\nNWvWRN3evXujrqrq6NGjUTc8PBx1V111VdTdf//9UVdVddddd0XdsWPHom7fvn1Rd+rUqahj/g0M\nZGPRFVdcEXUPPPBAvO30ePvggw+i7te//nXUpc9BVVVTU1Nxe6HwiTIAAAB0GJQBAACgw6AMAAAA\nHQZlAAAA6DAoAwAAQIdBGQAAADoMygAAANBhUAYAAIAOgzIAAAB0DPR6B+Zb0zRRt3Tp0qhbu3Zt\nvO10zddffz3qXnrppagbHx+Puqqqtm3jlnOrry9/3yo91tatWxd1X/rSl6Ju/fr1UVdVdfTo0aj7\n9a9/HXXPPPNM1O3atSvqqqpOnToVt3xyTE1NRd2+ffviNd99992ou+6666JubGws6gYGLrjb/AUl\nPdZ27NgRr/n0009H3YMPPhh1Dz30UNSNjo5GXVXV3r17o27JkiVRd+utt0bdfffdF3VVVYODg1G3\nadOmqNu5c2fUTU9PRx3zb+HChVGXzgZzOd6WL18edc8++2zUbd++PeqOHz8edVWfzBnCJ8oAAADQ\nYVAGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQMdDrHZhv\nTdNE3cKFC6Nu+fLl8bYPHz4cdZs3b466Xbt2Rd309HTUcX5Lj8mqqnXr1kXdww8/HHWrVq2Kum3b\ntkVdVdWjjz4adVu2bIm6Q4cORZ3zgb+v2dnZqDt48GC85tatW6NuxYoVUTc6Ohp1w8PDUVeV3z/b\nto3X5C9Lj7V9+/bFaz7yyCNRNzg4GHVf/OIXo+573/te1FXlP3d6rKXd+Ph41FVV/epXv4q69F6X\nPtPNzMxEHbn02jY0NBR16XV6Ls917777btQ999xzUbd///6oS8/FTyqfKAMAAECHQRkAAAA6DMoA\nAADQYVAGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAECHQRkAAAA6Bnq9A/Otbduo\nm5iYiLrXXnst3vb4+HjUbdy4MeoOHToUdbOzs1FHbzRNE3VDQ0PxmsuWLYu6qampqHvssceiLj12\nq6r+8Ic/RF16LjrOOVfSY+3AgQPxmo8//njU9ff3R93hw4ejLr0ncn47depU3L711ltR99Of/jTq\n9u7dG3X33ntv1FVVXXbZZVG3e/fuqEuf1bZs2RJ1VVVvvvlm1O3fvz/q5vIaMr/S6+Dk5GTUbd++\nPerSZ6uqqqNHj0Zd+hyWziTuEX+ZT5QBAACgw6AMAAAAHQZlAAAA6DAoAwAAQIdBGQAAADoMygAA\nANBhUAYAAIAOgzIAAAB0GJQBAACgo2nbNo+b5kBV7Tx7uwOxq9u2vbiXO+B84DzT03PC+cB5xvkA\nf+KZCf4kPh/mNCgDAADAhc4fvQYAAIAOgzIAAAB0GJQBAACgw6AMAAAAHQZlAAAA6DAoAwAAQIdB\nGQAAADoMygAAANBhUAYAAICO/wP2eoNhptCjKgAAAABJRU5ErkJggg==\n"
},
"output_type": "display_data",
"metadata": {}
}
],
"source": [
"%matplotlib inline\n",
"import pylab as P\n",
"def plot_example(dat, lab):\n",
" for i in xrange(5):\n",
" ax=P.subplot(1,5,i+1)\n",
" P.title(int(lab[i]))\n",
" ax.imshow(dat[:,i].reshape((16,16)), interpolation='nearest')\n",
" ax.set_xticks([])\n",
" ax.set_yticks([])\n",
" \n",
" \n",
"_=P.figure(figsize=(17,6))\n",
"P.gray()\n",
"plot_example(Xtrain, Ytrain)\n",
"\n",
"_=P.figure(figsize=(17,6))\n",
"P.gray()\n",
"plot_example(Xtest, Ytest)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then we import shogun components and convert the data to shogun objects:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Predictions [ 9. 7. 1. 0. 7.]\n",
"Ground Truth [ 9. 7. 1. 0. 7.]\n",
"Accuracy = 97.30%\n"
]
}
],
"source": [
"from modshogun import MulticlassLabels, RealFeatures\n",
"from modshogun import KNN, EuclideanDistance\n",
"\n",
"labels = MulticlassLabels(Ytrain)\n",
"feats = RealFeatures(Xtrain)\n",
"k=3\n",
"dist = EuclideanDistance()\n",
"knn = KNN(k, dist, labels)\n",
"labels_test = MulticlassLabels(Ytest)\n",
"feats_test = RealFeatures(Xtest)\n",
"knn.train(feats)\n",
"pred = knn.apply_multiclass(feats_test)\n",
"print \"Predictions\", pred[:5]\n",
"print \"Ground Truth\", Ytest[:5]\n",
"\n",
"from modshogun import MulticlassAccuracy\n",
"evaluator = MulticlassAccuracy()\n",
"accuracy = evaluator.evaluate(pred, labels_test)\n",
"\n",
"print \"Accuracy = %2.2f%%\" % (100*accuracy)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's plot a few missclassified examples - I guess we all agree that these are notably harder to detect."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA8oAAADFCAYAAACM0Qt8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFuZJREFUeJzt3UuMn3e93/Hv47n4NjO2Exs7YDuO46GJiXFCQhI5EGJC\nBCURqkQl6IJFpW5O1UVVVeqmXZRzqqNu2kUvqioVqdJZoAoaiYaLkGIC4pBAwSEJdkjsGCceOxg7\n9ow9d8/M00VCeRYV/kw18d+xXy8pQone/J7fzPyfy3f+Y0/Ttm0BAAAA71rV6w0AAADA9cSgDAAA\nAB0GZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQYVAGAACADoPyNdY0zVebpnm1aZqppmneaJrm073e\nE/RC0zR/0zTN203TXGqa5vWmaf5Rr/cEvdY0zWjTNLNN0/xNr/cCvdI0zXPvnQeT7/3zWq/3BL3m\n/nDtGZSvoaZpnqiqf1tV/7Cqhqvq0ao60dNNQe/8dVXtatt2pKq+VFV/1TTN/T3eE/Taf6qq/93r\nTcB14J+0bTv03j9/p9ebgeuA+8M1ZlC+tv51VX29bdsX2rZdatv2dNu2p3u9KeiFtm2PtG0798d/\nfe+fO3u4Jeippmm+WlXjVfVsr/cCwPXD/aE3DMrXSNM0fVX1QFVtaZrmeNM0Y03T/Memadb2em/Q\nK03T/Oemaaar6rdV9XZVfa/HW4KeaJpmpKq+XlX/rNd7gevEXzdNc75pmr9tmuaxXm8GesX9oXcM\nytfO1qoaqKq/X1Wfrqp7q+q+qvqXvdwU9FLbtv+43v1jCJ+uqv9ZVXN//v8BN6y/rKr/1rbtWK83\nAteBf1FVu6vqI1X1X6vqfzVN4yeOuFm5P/SIQfnamXnvf/9D27Zvt217vqr+XVV9sYd7gp5r23ax\nbdufVtX2qvqLXu8HrrWmae6tqs9V1b/v9V7getC27c/btr3ctu1c27b/var+tjwvcRNyf+it/l5v\n4GbRtu3FpmnG6t0/h/l//3Ov9gPXof7yZ5S5OT1WVbuq6q2maaqqhqqqr2mavW3bfqKH+4LrRVtV\nTa83AT3wWLk/9EzTtma1a6Vpmq9X1d+tqier6kpVfaeqnmvb9l/1dGNwjTVN86Gq+mxVPVPv/rTF\n5+rdH73+B23bfqeXe4NrrWmadVU10vlP/7zefTD6i7Ztz/VkU9AjTdNsrKqHqurHVbVQVV+pd3/8\n+r62bV/v5d7gWnN/6C3vKF9bf1lVm6vq9aqarar/UVX/pqc7gt5o690fs/4v9e4fAXmzqv6pIZmb\nUdu201U1/cd/b5pmsqpmPQRxkxqoqr+qqruqarHe/cse/54hmZuR+0NveUcZAAAAOvxlXgAAANBh\nUAYAAIAOgzIAAAB0GJQBAACgw6AMAAAAHcv69VBN09x0f0X2e7/cO7J+/fqoGx4ejrpLly5F3fT0\n9NWj99xIf8t527b5F+d98EE4H9LXb19fX9StWbMmPvbatWtXdM2BgYGo6+9f+d96NzMzE3XpOTs5\nORkfe3FxMU3Pt227JV54hX0QzodUej6k1/yqqpGRkatHVbW0tBR1Fy9ejLqFhYWoq8qvF+ma6cfy\nPnE+wJ/09HyourHOifQ5Yzn3iFWrsvcup6amoi69jw0NDUVdVf7skj4z9VI6Q/g9ylexnMHg3nvv\njbqDBw9G3aFDh6LuV7/6VdRVVc3OzsYt16/0gTa9mN9yyy1RNzo6GnVVVfv371/RNW+77bao27p1\na9RV5Q/yR44cibof/OAHUff8889HXVU+ELVt+2a86E0qfRDZuHFj1D344IPxsT/72c9GXfqNz6ef\nfjrq3nnnnairyh+sLly4EHXpQ9X7NFA7H+BPnA+B9NkqfWb65Cc/GR87fXPhl7/8ZdSl97GHH344\n6qqqfvazn0Xd0aNHo24538jtFT96DQAAAB0GZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQYVAGAACA\nDoMyAAAAdPg9yleR/t7NqqrNmzdH3b59+6Lu2LFjUffKK69EXZXfo3w9S3+HaVXV8PBw1G3fvj3q\n7r///qh7/PHHo245a27ZsiXqBgcHo245n8fFxcWo27NnT9SlX5fx8fGoq6o6fPhw1M3MzMRr3qxW\nr14ddXfffXfUffWrX42P/cgjj0Rd+vsn09/tnZ5fVVWbNm2KukOHDkXdSy+9FHVTU1NRB/B+GhgY\niLrdu3dH3Ze+9KX42Ok9fGxsLOp27doVdY899ljUVVW98847UXfy5Mmou3TpUnzsXvGOMgAAAHQY\nlAEAAKDDoAwAAAAdBmUAAADoMCgDAABAh0EZAAAAOgzKAAAA0GFQBgAAgA6DMgAAAHT093oDvdI0\nTdStXbs2XnPbtm1RNzw8HK+ZaNt2RddjZaWvtZGRkXjNhx56KOo+//nPR90jjzwSdaOjo1FXVTU0\nNBR1ExMTUXfy5MmoO3v2bNRV5ef33r17oy79urz44otRV1V14sSJqJuZmYnXvFmtXr066rZv3x51\nH/vYx+Jjb9myJer6+vqiLj0XDx48GHVV+TXo4sWLUZe+dqenp6Ouyv0OWL70OWzTpk1R98ADD0Td\ngw8+GHVVVa+88krUpTNEeh+7/fbbo245a6bPVpcvX466Xl73vaMMAAAAHQZlAAAA6DAoAwAAQIdB\nGQAAADoMygAAANBhUAYAAIAOgzIAAAB0GJQBAACgw6AMAAAAHQZlAAAA6Ojv9QZ6pWmaqBsZGYnX\n3LlzZ9QtLCxE3YULF6Jufn4+6uiN9LV2yy23xGs+8sgjUffkk09G3Z133hl1bdtGXVXVyZMno+4n\nP/lJ1P34xz+OuvS8qao6cOBA1N1xxx1Rl34Nb7/99qirqlq/fn3c8uel197p6emoW1xcjI89NzcX\ndVNTU1G3ZcuWqNu1a1fUVVX192ePBOlrsq+vLz42wPtlcHAw6vbs2RN1TzzxxIquV1U1NjYWddu3\nb4+69DljaGgo6qrye0T63PtB4B1lAAAA6DAoAwAAQIdBGQAAADoMygAAANBhUAYAAIAOgzIAAAB0\nGJQBAACgw6AMAAAAHQZlAAAA6Ojv9QZ6pWmaqBseHo7X3LJlS9SNj49H3YULF6JuYWEh6ri+zc7O\nxu358+ej7vLly1F36dKlqHvrrbeirqrqu9/97op2x48fj7r0PKyqOnjwYNStXr066vr6+qJuYGAg\n6paz5s0svZ6nn/cNGzZE3bp166KuKj/HXnvttaibm5uLurZto2457fz8fNQtLi7GxwZYjvS6X1W1\nfv36qBsdHV3Rbjl27doVdU899VTU7dy5M+rWrFkTdVX5fSy9R3wQeEcZAAAAOgzKAAAA0GFQBgAA\ngA6DMgAAAHQYlAEAAKDDoAwAAAAdBmUAAADoMCgDAABAh0EZAAAAOvp7vYFe6e/PPvTNmzfHa27d\nujXqTp06FXXT09NR17Zt1LHyVq26+veaBgcHo7XSr3dV1U9/+tOoW7duXdTt2bMn6n7zm99EXVXV\noUOHou7EiRNRNzAwEHXpx1JV9fGPfzzqRkZGou7cuXNR94c//CHqqqpmZmbi9mbV19cXdek1et++\nfVG3cePGqKuqevvtt6MuPR/SYzdNE3VV+b1kaWlpRdfj6pJ7zR+lX/OV7nrp/XitrfSa6XrLOe7N\nfI4t52NfXFyMugsXLkTdc889F3VTU1NRV5U/Zzz00ENRlz7fnDx5Muqq8meX2dnZqPsgvH69owwA\nAAAdBmUAAADoMCgDAABAh0EZAAAAOgzKAAAA0GFQBgAAgA6DMgAAAHQYlAEAAKDDoAwAAAAd/b3e\nQK+sW7cu6nbu3BmvOTw8HHWnTp2KuomJiahr2zbqWFmrVq2q9evXX7W78847o/VGRkbiY1+4cCHq\nnn766agbHByMuvQ1WVV1+fLlqFu7dm3UffSjH426L3zhC1FXVXXPPfdE3cDAQNS9/fbbUXf06NGo\nq6oaHx+P2xtJX19f3N56661Rd99990XdQw89FHUbN26Muqqq3//+91G3devWqLvtttuiLj2/qqou\nXbq0ot2VK1fiY9+IVq26+nsR6bPI5s2b4+Ombfr6TV9Dyzlnm6aJuvT5Jn2tTU5ORl1V1dzc3Iqu\nOTs7G3VTU1NRV5Wfi8tZ80aUfvwvvPBC1B0/fjzq0tdQVdXu3bujbtu2bVG3f//+qEufJ5fT3kjX\nfu8oAwAAQIdBGQAAADoMygAAANBhUAYAAIAOgzIAAAB0GJQBAACgw6AMAAAAHQZlAAAA6DAoAwAA\nQIdBGQAAADr6e72BldY0TdSNjIxE3a5du+JjLy4uRt2xY8eibmJiIurato06VlZ/f39t2rTpqt3B\ngwej9T7xiU/Ex37llVei7plnnom6EydORN3w8HDUVVXdd999UZeeYw888EDUPfHEE1FXVbV169ao\nu3DhQtS9+OKLUZdeA6qqpqen4/ZGsnbt2rjdu3dv1H3xi1+MurvvvjvqhoaGoq6qanR0NOq+/OUv\nR11/f3b7XrduXdRVVR0/fjzqTp8+HXUzMzNRdyPew1atWhW9hm+//fZovYcffjg+9oEDB6Lunnvu\nibodO3ZE3XLuD+n53dfXF3UXL16MujfeeCPqqqrOnDkTda+++uqKHjs9D6uqXn/99aibmpqK17wR\nLSwsRN25c+ei7vz581E3ODgYdVX5ebZx48aom5ycjLqXXnop6qqqzp49G3XpPPRB4B1lAAAA6DAo\nAwAAQIdBGQAAADoMygAAANBhUAYAAIAOgzIAAAB0GJQBAACgw6AMAAAAHQZlAAAA6Ojv9QZW2qpV\n2ey/YcOGqNu5c2d87Onp6ag7e/Zs1M3NzcXH5tpr27YWFhaiLrFv37742Lt37466ixcvRt3U1FTU\nbd++Peqqqr72ta9F3f333x9127Zti7rNmzdHXVXV4uJi1B05ciTqnn322ag7depU1FXle/ygaJom\n6lavXh2vmb42hoeHo+53v/td1KXX8qqqLVu2RN3evXujbnBwMOouX74cdVVVr732WtSdOXMm6ubn\n5+Nj32iapom+RgMDA9F6y/lcnjt3LureeOONqEufRT70oQ9F3XLaoaGhqLty5UrUpffjqqrJycmo\nSz/fJ06ciLr0+lNVNT4+Hrdc3XJeH4l169bF7ejoaNTt2LEj6tLX249+9KOoq8rveSv9eewl7ygD\nAABAh0EZAAAAOgzKAAAA0GFQBgAAgA6DMgAAAHQYlAEAAKDDoAwAAAAdBmUAAADoMCgDAABAR3+v\nN7DSmqaJupGRkajbunVrfOxz585F3czMTNQNDg5G3dLSUtRVVS0uLsYtf97i4mJNTExctTty5Ei0\n3qlTp+Jj79+/P+qeeOKJqHvrrbeibmFhIeqqqlavXh11GzdujLo1a9ZE3XLOh/Hx8ahLv4ZHjx6N\nusuXL0ddVVXbtnH7QZB+PNPT0/Ga6dfnm9/8ZtTNzc1FXfqarKo6cOBA1KXn7OjoaNRdvHgx6qqq\nXn755ag7f/581C3nXLzRLC0t1dTU1FW7kydPRuulzxdVVb/4xS+iLr1Gp6/z5ZwPa9eujbr0OejK\nlStRlz5/VVV0f6/K7yPpuZi8bv5oOfdkVk46a2zatClec+/evVE3MDAQdYcPH4669LpflT+73EjP\nLd5RBgAAgA6DMgAAAHQYlAEAAKDDoAwAAAAdBmUAAADoMCgDAABAh0EZAAAAOgzKAAAA0GFQBgAA\ngI7+Xm9gpfX19UXd8PBw1K1ZsyY+9sTERNRt27Yt6tauXRt1r7/+etRVVZ0/fz7qlpaW4jVvVktL\nSzUzM3PV7re//W203g9+8IP42Bs3boy6u+66K+oeffTRqHvuueeirqrqe9/7XtSdPn066m677bao\nu+OOO6KuqmrLli1R19+fXSoHBwejbtUq36O8mtnZ2bg9duxY1I2NjUXdlStXom5gYCDqqvJr70c+\n8pGoS1+7b775ZtRV5deqS5cuRV3btvGxbzRt29b8/PxVu/S1lj5fVFU1TRO3K7neSh93OWu+H6+1\ndM2081x140hfl0NDQ/GaO3bsiLr0+SG99l+8eDHqqqoWFxfj9kbhaQ0AAAA6DMoAAADQYVAGAACA\nDoMyAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQ0d/rDay0gYGBqNuw\nYUPU9fX1xcceHByMuqeeeirq1q1bF3Xf+MY3oq6q6oUXXoi6ubm5eM2b2dLS0lWbs2fPRms9++yz\n8XGHh4ej7sknn4y6T33qU1E3OTkZdVVVhw8fjrpvfetbUde2bdTdddddUVdV9ZWvfCXq9uzZE3X7\n9++PulOnTkVdVdX58+ejLv38fFAs5+OZmZmJutnZ2f/f7fw/pdf8qqr5+fmoGxoairr0Gn3s2LGo\nq6o6c+ZM1KUfC1f3fpy3N9q1AD6omqaJ23R+WVhYiLrx8fGo87z/53lHGQAAADoMygAAANBhUAYA\nAIAOgzIAAAB0GJQBAACgw6AMAAAAHQZlAAAA6DAoAwAAQIdBGQAAADr6e72BXllcXFzxNXfs2BF1\nu3fvjrpVq7LvY3z/+9+PuqqqgYGBqJubm4vX5M+bn5+PupMnT8ZrPvPMM1HXtm3UfeYzn4m6xx9/\nPOqqqj784Q9H3c9//vOoe/nll6Putddei7qqquPHj0fd5z73uah79NFHo+7w4cNRV1V18eLFqFtY\nWIjXvFml50Nq9erVcbtt27YV7dKv99jYWNRVVU1OTkbd0tJSvCbAjSa9lyznvpxef9M1+/uzES+d\nNW5WPjsAAADQYVAGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAECHQRkAAAA6DMoA\nAADQ0d/rDay0+fn5qDt9+nTUnTlzJj72/fffH3Wjo6NRd+LEiahbWFiIuqqqtm3jlmtrdnY2bo8f\nPx513/72t6NubGws6g4cOBB1VVW7du2Kuq1bt0bdnj17om5iYiLqqqq2b98edbfcckvU7dy5M+o2\nbtwYdVVVq1b5fua11jRN1A0ODsZrbtiwIerWrFkTdVeuXIm65ZwP6f0TgJXV19cXdel9Z/369VHX\n33/DjYIryhMYAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAECHQRkAAAA6DMoAAADQYVAGAACA\nDoMyAAAAdPT3egMr7cqVK1F3/PjxqPvOd74TH3toaCjqNmzYEHVHjx6NurGxsairqpqfn49brl+z\ns7NRd/LkyagbHx+PuiNHjkRdVdU999wTdffee2/U3XXXXVF36623Rl1V1ejoaNT192eXyvPnz0fd\n1NRU1FVVLS0txS3Xr/TrODExsaLdW2+9FXVVVdPT01HXtm28JsDNatWq/P3I9LqaPv+l1/OFhYWo\nu1l5RxkAAAA6DMoAAADQYVAGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAECHQRkA\nAAA6DMoAAADQ0d/rDay0tm2j7p133om6Z599Nj72+Ph41P3617+OurGxsag7ffp01FVVLS4uxi0f\nfAsLC1GXng8TExPxsU+dOhV1L7/8ctTdeeedUbdv376oq6q6fPly3CYOHToUdWfOnInXdM5ee+l9\nZGZmJl7z+PHjUffDH/4w6t58882oS+83VVXT09NxC3CzSu8RFy5ciNd8/vnno25ycjLqXn311aib\nmpqKuqr8476ReEcZAAAAOgzKAAAA0GFQBgAAgA6DMgAAAHQYlAEAAKDDoAwAAAAdBmUAAADoMCgD\nAABAh0EZAAAAOpq2bfO4ac5V1Zvv33Ygdnvbtlt6uQHnA9eZnp4TzgeuM84H+BPPTPAn8fmwrEEZ\nAAAAbnR+9BoAAAA6DMoAAADQYVAGAACADoMyAAAAdBiUAQAAoMOgDAAAAB0GZQAAAOgwKAMAAECH\nQRkAAAA6/g+KhPUNCGPr2wAAAABJRU5ErkJggg==\n"
},
"output_type": "display_data",
"metadata": {}
}
],
"source": [
"idx=np.where(pred != Ytest)[0]\n",
"Xbad=Xtest[:,idx]\n",
"Ybad=Ytest[idx]\n",
"_=P.figure(figsize=(17,6))\n",
"P.gray()\n",
"plot_example(Xbad, Ybad)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now the question is - is 97.30% accuracy the best we can do? While one would usually re-train KNN with different values for k here and likely perform Cross-validation, we just use a small trick here that saves us lots of computation time: When we have to determine the $K\\geq k$ nearest neighbors we will know the nearest neigbors for all $k=1...K$ and can thus get the predictions for multiple k's in one step:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1000, 13)\n"
]
}
],
"source": [
"knn.set_k(13)\n",
"multiple_k=knn.classify_for_multiple_k()\n",
"print multiple_k.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We have the prediction for each of the 13 k's now and can quickly compute the accuracies:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy for k=1 is 97.20%\n",
"Accuracy for k=2 is 97.20%\n",
"Accuracy for k=3 is 97.30%\n",
"Accuracy for k=4 is 96.70%\n",
"Accuracy for k=5 is 96.70%\n",
"Accuracy for k=6 is 96.60%\n",
"Accuracy for k=7 is 96.40%\n",
"Accuracy for k=8 is 96.50%\n",
"Accuracy for k=9 is 96.20%\n",
"Accuracy for k=10 is 96.20%\n",
"Accuracy for k=11 is 96.00%\n",
"Accuracy for k=12 is 96.30%\n",
"Accuracy for k=13 is 96.20%\n"
]
}
],
"source": [
"for k in xrange(13):\n",
" print \"Accuracy for k=%d is %2.2f%%\" % (k+1, 100*np.mean(multiple_k[:,k]==Ytest))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So k=3 seems to have been the optimal choice."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Speed comparisons with different KNN solvers"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In SHOGUN, you can use Cover Trees to speed up the nearest neighbor searching process in KNN and the KD-Trees solver is also alternative, which is faster than the other two solvers only on low-dimesional data. Just call set_use_covertree on the KNN machine to switch between different solvers. We also show the prediction time comparison with and without Cover Tree and KD-Trees in this tutorial. So let's just have a comparison utilizing the data above:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Standard KNN took 1.1s\n",
"Covertree KNN took 0.9s\n",
"KDTree KNN took 3.0s\n"
]
}
],
"source": [
"from modshogun import Time, KNN_COVER_TREE, KNN_BRUTE, KNN_KDTREE\n",
"start = Time.get_curtime()\n",
"knn.set_k(3)\n",
"knn.set_knn_solver_type(KNN_BRUTE)\n",
"pred = knn.apply_multiclass(feats_test)\n",
"print \"Standard KNN took %2.1fs\" % (Time.get_curtime() - start)\n",
"\n",
"\n",
"start = Time.get_curtime()\n",
"knn.set_k(3)\n",
"knn.set_knn_solver_type(KNN_COVER_TREE)\n",
"pred = knn.apply_multiclass(feats_test)\n",
"print \"Covertree KNN took %2.1fs\" % (Time.get_curtime() - start)\n",
"\n",
"\n",
"start = Time.get_curtime()\n",
"knn.set_k(3)\n",
"knn.set_knn_solver_type(KNN_KDTREE)\n",
"pred = knn.apply_multiclass(feats_test)\n",
"print \"KDTree KNN took %2.1fs\" % (Time.get_curtime() - start)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Obviously applying KNN is very costly: for each prediction you have to compare the object against all training objects. While the implementation in `SHOGUN` will use all available CPU cores to parallelize this computation it might still be slow when you have big data sets. We can see it been significantly speed up by Cover Trees solver, but the result of KD-Trees solver is not so ideally. So, let's do a more systematic comparison. For that a helper function is defined to run the evaluation for KNN:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def evaluate(labels, feats, use_cover_tree=False, use_KD_Tree=False):\n",
" from modshogun import MulticlassAccuracy, CrossValidationSplitting\n",
" import time\n",
" split = CrossValidationSplitting(labels, Nsplit)\n",
" split.build_subsets()\n",
" \n",
" accuracy = np.zeros((Nsplit, len(all_ks)))\n",
" acc_train = np.zeros(accuracy.shape)\n",
" time_test = np.zeros(accuracy.shape)\n",
" for i in range(Nsplit):\n",
" idx_train = split.generate_subset_inverse(i)\n",
" idx_test = split.generate_subset_indices(i)\n",
"\n",
" for j, k in enumerate(all_ks):\n",
" #print \"Round %d for k=%d...\" % (i, k)\n",
"\n",
" feats.add_subset(idx_train)\n",
" labels.add_subset(idx_train)\n",
"\n",
" dist = EuclideanDistance(feats, feats)\n",
" knn = KNN(k, dist, labels)\n",
" knn.set_store_model_features(True)\n",
" if use_cover_tree:\n",
" knn.set_knn_solver_type(KNN_COVER_TREE)\n",
" elif use_KD_Tree:\n",
" knn.set_knn_solver_type(KNN_KDTREE)\n",
" else:\n",
" knn.set_knn_solver_type(KNN_BRUTE)\n",
" knn.train()\n",
"\n",
" evaluator = MulticlassAccuracy()\n",
" pred = knn.apply_multiclass()\n",
" acc_train[i, j] = evaluator.evaluate(pred, labels)\n",
"\n",
" feats.remove_subset()\n",
" labels.remove_subset()\n",
" feats.add_subset(idx_test)\n",
" labels.add_subset(idx_test)\n",
"\n",
" t_start = time.clock()\n",
" pred = knn.apply_multiclass(feats)\n",
" time_test[i, j] = (time.clock() - t_start) / labels.get_num_labels()\n",
"\n",
" accuracy[i, j] = evaluator.evaluate(pred, labels)\n",
"\n",
" feats.remove_subset()\n",
" labels.remove_subset()\n",
" return {'eout': accuracy, 'ein': acc_train, 'time': time_test}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Evaluate KNN with and without Cover Tree. This takes a few seconds:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluating KNN...\n",
"Done!\n"
]
}
],
"source": [
"labels = MulticlassLabels(Ytest)\n",
"feats = RealFeatures(Xtest)\n",
"print(\"Evaluating KNN...\")\n",
"wo_ct = evaluate(labels, feats, use_cover_tree=False, use_KD_Tree=False)\n",
"wi_ct = evaluate(labels, feats, use_cover_tree=True)\n",
"wd_ct = evaluate(labels, feats, use_KD_Tree=True)\n",
"print(\"Done!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Generate plots with the data collected in the evaluation:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nrkJggg==\n"
},
"output_type": "display_data",
"metadata": {}
},
{
"data": {
"image/png": "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\n"
},
"output_type": "display_data",
"metadata": {}
}
],
"source": [
"import matplotlib\n",
"\n",
"fig = P.figure(figsize=(8,5))\n",
"P.plot(all_ks, wo_ct['eout'].mean(axis=0), 'r-*')\n",
"P.plot(all_ks, wo_ct['ein'].mean(axis=0), 'r--*')\n",
"P.plot(all_ks, wi_ct['eout'].mean(axis=0), 'b-*')\n",
"P.plot(all_ks, wi_ct['ein'].mean(axis=0), 'b--*')\n",
"P.plot(all_ks, wd_ct['eout'].mean(axis=0), 'g-*')\n",
"P.plot(all_ks, wd_ct['ein'].mean(axis=0), 'g--*')\n",
"P.legend([\"Test Accuracy\", \"Training Accuracy\"])\n",
"P.xlabel('K')\n",
"P.ylabel('Accuracy')\n",
"P.title('KNN Accuracy')\n",
"P.tight_layout()\n",
"\n",
"fig = P.figure(figsize=(8,5))\n",
"P.plot(all_ks, wo_ct['time'].mean(axis=0), 'r-*')\n",
"P.plot(all_ks, wi_ct['time'].mean(axis=0), 'b-d')\n",
"P.plot(all_ks, wd_ct['time'].mean(axis=0), 'g:')\n",
"P.xlabel(\"K\")\n",
"P.ylabel(\"time\")\n",
"P.title('KNN time')\n",
"P.legend([\"Plain KNN\", \"CoverTree KNN\", \"KD-Trees\"], loc='center right')\n",
"P.tight_layout()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Although simple and elegant, KNN is generally very resource costly. Because all the training samples are to be memorized literally, the memory cost of KNN *learning* becomes prohibitive when the dataset is huge. Even when the memory is big enough to hold all the data, the prediction will be slow, since the distances between the query point and all the training points need to be computed and ranked. The situation becomes worse if in addition the data samples are all very high-dimensional. Leaving aside computation time issues, k-NN is a very versatile and competitive algorithm. It can be applied to any kind of objects (not just numerical data) - as long as one can design a suitable distance function. In pratice k-NN used with bagging can create improved and more robust results."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Comparison to Multiclass Support Vector Machines"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In contrast to KNN - multiclass Support Vector Machines (SVMs) attempt to model the decision function separating each class from one another. They compare examples utilizing similarity measures (so called Kernels) instead of distances like KNN does. When applied, they are in Big-O notation computationally as expensive as KNN but involve another (costly) training step. They do not scale very well to cases with a huge number of classes but usually lead to favorable results when applied to small number of classes cases. So for reference let us compare how a standard multiclass SVM performs wrt. KNN on the mnist data set from above."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let us first train a multiclass svm using a Gaussian kernel (kind of the SVM equivalent to the euclidean distance)."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"from modshogun import GaussianKernel, GMNPSVM\n",
"\n",
"width=80\n",
"C=1\n",
"\n",
"gk=GaussianKernel()\n",
"gk.set_width(width)\n",
"\n",
"svm=GMNPSVM(C, gk, labels)\n",
"_=svm.train(feats)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's apply the SVM to the same test data set to compare results:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy = 100.00%\n"
]
}
],
"source": [
"out=svm.apply(feats_test)\n",
"evaluator = MulticlassAccuracy()\n",
"accuracy = evaluator.evaluate(out, labels_test)\n",
"\n",
"print \"Accuracy = %2.2f%%\" % (100*accuracy)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since the SVM performs way better on this task - let's apply it to all data we did not use in training."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy = 94.69%\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA8oAAADFCAYAAACM0Qt8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGf9JREFUeJzt3VlsXOd99/HfQ85Q4iJuohZqMakoWixbkik5iGwtcWyl\nTRM4doIEcVAUvWvRohdd73pRtH0vetVedHtfoC/e5O17ESFp2sQNZCS1ozihkURytC/URomiuFND\nzpAcLjOnF3KRB3hT6TcIoyOR3w/gG+OLcw5nznPm/HkkTUiSRAAAAAAA4L6qtA8AAAAAAIDHCYMy\nAAAAAAARBmUAAAAAACIMygAAAAAARBiUAQAAAACIMCgDAAAAABBhUAYAAAAAIMKg/IiEEJ4OIbwd\nQpgIIVwLIXw27WMC0hJCWBFC+KcQwq0QQj6EcDqE8GtpHxeQBtYD8POFELaFEIohhH9O+1iANIUQ\nOkMI3w4h3AshDIYQ/jaEkEn7uJY6BuVH4IMT+d8kvSmpVdJvSfrnEML2VA8MSE9GUp+kj0lqkvSn\nko6FEDpTPCYgLawH4Of7O0k/SfsggMfA30saltQu6Tnd/7z43VSPaBlgUH40dkraIOmvkyQpJUny\ntqQfSvqNdA8LSEeSJFNJkvxZkiS9SZKUkyR5U9JNSfvTPjbgUWM9AP+/EMIbknKS/iPtYwEeA1sk\nHUuSpJgkyaCk45KeSfmYljwG5fQESc+mfRDA4yCEsE7SdkkX0j4WIG2sByx3IYRGSX8u6Q/TPhbg\nMfE3kt4IIdSFEDZK+jXdH5bxS8Sg/Ghc0f0/LvEnIYRsCOFXdP+PTNSle1hA+kIIWUn/T9KXkyS5\nnPbxAGliPQCSpL+Q9E9JktxJ+0CAx8T3df8J8qSkO5JOSvrXVI9oGWBQfgSSJJmX9LqkT0salPRH\nko7p/okOLFshhCpJ/1fSnKTfS/lwgFSxHgAphPCcpKOS/jrtYwEeBx98NhyX9C+S6iW1SWqR9Fdp\nHtdyEJIkSfsYlqUQQrfuPzH4n2kfC5CGEEKQ9L8ldUr6VJIkM+keEZAe1gNwXwjh9yX9D0n5D/5X\ng6RqSZeSJNmX2oEBKQkhtEkakdScJMnEB//vdUl/mSQJf43zl4gnyo9ICGFPCGHlB3+34I91/1+t\n+z8pHxaQpn+Q9LSkVxkKANYD8IH/JWmr7v/Lvs9J+kdJ/y7pV9M8KCAtSZKM6v4/8Pg7IYRMCKFZ\n0m9KOpvukS19DMqPzm9IGtD9v6v8iqRPJEkym+4hAekIIXRI+m3dvwkaDCEUPvjv11M+NOCRYz0A\nP5MkyXSSJIP/9Z+kgqRikiQjaR8bkKLPSfqk7j9ZviZpXtIfpHpEywB/9BoAAAAAgAhPlAEAAAAA\niDAoAwAAAAAQYVAGAAAAACDCoAwAAAAAQIRBGQAAAACASKaSOITAP5H9AFVV3u8dMhnvZV+xYoXV\nNTQ0WJ0klctlq8vlclY3O5veN1wlSRJS27mW53oIwX/Jq6urra6mpmZRt+ee45I0NzdndQsLC1aX\n8rcIjCZJsiatnT8J68E9h+rr663OvUZLUqlUsrr5+flUOsk/xicE6+ERc6/lktTU1GR17pp171mK\nxaLVLUGprgdpea4J9/yV/Hv5xsZGq3PvW+7du2d10tJaP+4MUdGgvBy5w68k1dXVWV1bW5vVbdmy\nxeoOHz5sdZI0MzNjdd/4xjes7saNG1ZXyfCCR2+xf8kjSc3NzVa3efNmq2ttbbW6fD5vdZJ0+/Zt\nqxsZ8b6+s5Kh5JfgVpo7T5P7Cxz35vz555+3um3btlmdJI2Pj1vd4OCg1Q0MDCzq9iSpUChYnXsD\nlrJlux4Wm/v50N7ebm/z1VdftTp3zX7961+3up6eHquTltx9C+thEblrwr0PkqSDBw9a3dGjR61u\ndHTU6o4dO2Z1knT16lWrW0q/dOWPXgMAAAAAEGFQBgAAAAAgwqAMAAAAAECEQRkAAAAAgAiDMgAA\nAAAAEQZlAAAAAAAiDMoAAAAAAESW7fcou18C3tLSYm9z7969Vnfo0CGre/bZZ62uq6vL6iTp+vXr\nVtfd3W11vb29VrfEvo8wde7563639+rVq61uw4YNVif55+/HPvYxq9u0aZPVud95LElvvfWW1b3z\nzjtW19fXZ3Wzs7NWB4/7Pcrud3G712j3ey8lqaamxurc7zJ2v8/yhz/8odVJ0smTJ62uv7/f6tzz\nPEkSq0M63O+MXbdunb1Nd+249w7Hjx+3OvdaATyIe2+1f/9+e5tvvPGG1XV0dFjdd7/7XatbWFiw\nuuWKJ8oAAAAAAEQYlAEAAAAAiDAoAwAAAAAQYVAGAAAAACDCoAwAAAAAQIRBGQAAAACACIMyAAAA\nAAARBmUAAAAAACIMygAAAAAARDJpH8Biq66utro1a9ZY3YEDB+x9v/baa1a3f/9+q2tvb7e6lpYW\nq5OkgYEBqwsh2NvE4shms3brnr979uyxuhdffHFRtydJnZ2dVtfR0WF1dXV1VlcoFKxO8tdOfX29\n1b399ttWd/36dauTpOnpaatLksTe5lLj/uy5XM7q3n33Xau7efOm1UnS+vXrrW7r1q1W9/TTTy/q\n9iRp27ZtVnf8+HGru3z5stVNTU1ZnbS8z/PFVlXlPStxP5taW1vtfW/atMnqRkZG7G0Cvyh3TbjX\n86NHj9r73rt3r9VdvXrV6m7fvm117r2VJNXW1lpdJfdhjzueKAMAAAAAEGFQBgAAAAAgwqAMAAAA\nAECEQRkAAAAAgAiDMgAAAAAAEQZlAAAAAAAiDMoAAAAAAEQYlAEAAAAAiDAoAwAAAAAQYVAGAAAA\nACCSSfsAXCEEq2tpabG6Q4cOWd3nPvc5q5Okjo4OqxsaGrK6TMZ7e9xOkgYHB62uUChYXZIk9r7x\nYCtXrrTbZ555xuq+9KUvWd3Bgwetbt26dVYnSStWrLC6UqlkdblczuqGh4etTpLq6uqs7lOf+pTV\ntba2Wt03v/lNq5OkixcvWt309LS9zaXGvQ6559B7771nddls1uokqba21ura2tqsbteuXVb38ssv\nW10lrXuef/WrX7W6c+fOWZ20vM9zV319vdW572NVlfdMpbm52eok/xjv3btnbxP4Rbnn+urVq61u\n79699r7d+yv3Pv6FF16wulWrVlmd5M8G7nW6XC7b+04LT5QBAAAAAIgwKAMAAAAAEGFQBgAAAAAg\nwqAMAAAAAECEQRkAAAAAgAiDMgAAAAAAEQZlAAAAAAAiDMoAAAAAAEQYlAEAAAAAiGTSPgDXypUr\nrW7Xrl1W99prr1ldZ2en1UnSe++9Z3V9fX1W9/rrr1tdQ0OD1UnSzZs3rS6fz1tdkiT2vvFgCwsL\ndjszM7Oo+66urra6Uqlkb3NoaMjqent7re7s2bNWd/r0aauTpJqaGqt75ZVXrO7jH/+41VXyOhYK\nBau7fPmyvc3lyl1j7mteiVwuZ3XDw8NWd/v2batzP28k6bOf/azV7d+/3+rc61Qlr/fVq1etbm5u\nzt7mk8C9RkvS5s2brc69ro2Pj1tdW1ub1UlSNpu1OvfnDiHY+wZ+Ue7529jYaG9z9erVVrdz506r\nKxaLVlfJPVMl96lLBU+UAQAAAACIMCgDAAAAABBhUAYAAAAAIMKgDAAAAABAhEEZAAAAAIAIgzIA\nAAAAABEGZQAAAAAAIgzKAAAAAABEGJQBAAAAAIhk0tx5CMFu29rarO7gwYNWt2PHDqu7cOGC1UnS\nd77zHatbvXq11TU1NVndwsKC1UnSnTt3rK5QKFhdkiT2vvFgs7OzdtvT02N1X/va16xuaGjI6jZu\n3Gh1ktTf3291p06dsrpLly5Z3eDgoNVJUmtrq9W5a/aLX/yi1b300ktWJ/k/9+XLl+1t4tFzr5Xu\n9XxiYsLqTp8+bXWSVCqVrG7FihVWd+DAAatzP5ckaWxszOoquQ48Caqrq+127dq1Vvfiiy9a3ejo\nqNVNTk5anSRlMqnefgI/V1WV9/wwm80u+r7da/+tW7es7lvf+pbVfe9737M6SRoZGbG6crlsb/Nx\nxxNlAAAAAAAiDMoAAAAAAEQYlAEAAAAAiDAoAwAAAAAQYVAGAAAAACDCoAwAAAAAQIRBGQAAAACA\nCIMyAAAAAAARBmUAAAAAACKZNHdeVeXP6WvWrLG6rq6uRd33yZMnrU6SCoWC1R0+fNjq2tvbrW5i\nYsLqJGl4eNjqZmZmrC5JEnvfy5V7roUQ7G3mcjmr6+7utrqenh6rq62ttTpJmp6etrrR0VGry+fz\nVlcqlaxOksrlstX19/cv6r43btxodZK0detWu02bcw5nMt7HTk1Njb3fSj5LHO51bWFhwd6m27rn\nkHuM7jqUpAsXLljd8ePHra6zs9Pqjhw5YnWSdObMGasbHBy0t/kkcK9VkjQ3N2d17hpz38dKXnP3\n825qasrqKlmLwH/HvcdZv3691bW0tNj7LhaLVnflyhWr+/GPf2x1N2/etDpJmp2dtdulgifKAAAA\nAABEGJQBAAAAAIgwKAMAAAAAEGFQBgAAAAAgwqAMAAAAAECEQRkAAAAAgAiDMgAAAAAAEQZlAAAA\nAAAiDMoAAAAAAEQYlAEAAAAAiGTS3HlVlT+n19XVWV1bW5vVZbNZq2tsbLQ6STp8+LDVffKTn7S6\ndevWWd3w8LDVSdLExITVzc3N2dtcrqqqqtTQ0PDQrrW11dqes63/4q6HcrlsdcVicVE7yT+HQghW\n514v3J9ZkpIksbqFhYVF3Xd9fb3VSdL69evtNk3ZbNY61o6ODmt7GzZssPe9YsUKu3W47/fk5KS9\nzaGhIasbGRmxurGxMaurZM1OT09b3aVLl6zu7NmzVvfyyy9bnSR1dXVZXXd3t73NJ0El17VCoWB1\nuVzO6vbu3Wt17ueS5N+DuWvMPc/daz6WFvc+o6mpyeq2bdtmdc3NzVYn+WvCPUb3nqlUKlndcsUT\nZQAAAAAAIgzKAAAAAABEGJQBAAAAAIgwKAMAAAAAEGFQBgAAAAAgwqAMAAAAAECEQRkAAAAAgAiD\nMgAAAAAAEQZlAAAAAAAimTR3Xi6X7bZQKFhdf3+/1W3ZssXqvvCFL1id5P88a9eutbpSqWR109PT\nVidJMzMzi7rv5ay+vl779+9/aHfw4EFre+45KUltbW1WNzU1ZXUDAwNW565DScrn81bnrtlbt25Z\n3d27d61OkhoaGqxu69atVtfc3Gx1tbW1VidJLS0tdpumlpYWff7zn39o9+lPf9ra3urVq+19u9dA\n9xpdU1NjdcVi0eokaXBw0Op6enqs7syZM1Z37do1q5P8tZjL5azOPcaXXnrJ6iRp3759druUJEli\nt+Pj41bnnmuHDh2yuu3bt1udJM3Ozlrd6Oio1c3Pz1tdVdXiPx+q5F4W6XDfd/cz/MMf/rDVzc3N\nWZ0kjY2NWV17e7vVufeU7nVAkiYnJ+12qeCJMgAAAAAAEQZlAAAAAAAiDMoAAAAAAEQYlAEAAAAA\niDAoAwAAAAAQYVAGAAAAACDCoAwAAAAAQIRBGQAAAACACIMyAAAAAACRTJo7L5fLdnvnzh2re/PN\nN62uqsr7HcHGjRutTpKGhoas7vTp01Z3+PBhqysUClYnScVi0eqSJLG3uVw1NjbqE5/4xEM7p5Gk\nbDZr73tiYsLqpqenF3Xfzc3NVidJTz31lNXt3bvX6qampqzu1q1bVidJMzMzVtfV1WV17uszPz9v\ndZL/HqbNXQ8dHR3W9rq7u+19nzx50urc133dunVW19bWZnWSvx6OHj1qdUeOHLG6GzduWJ3kv+Y/\n/elPrc5ds5V8hq1du9Zul5JKPpNzuZzVue+je03duXOn1UnS5OSk1YUQrK69vd3qamtrrU7yPx/c\nez93PXD/lZ66ujqra2pqsrr+/n5736Ojo1a3YcMGq3v++eetzr0OSP61upL57nHHE2UAAAAAACIM\nygAAAAAARBiUAQAAAACIMCgDAAAAABBhUAYAAAAAIMKgDAAAAABAhEEZAAAAAIAIgzIAAAAAABEG\nZQAAAAAAIpk0d54kid3mcjmre+edd6zu+vXrVtfU1GR1kjQ1NWV1GzdutLqtW7da3czMjNVJ/mte\nyXuzXFVVVWnVqlVW53j//fftfb/99ttW19vba3WFQsHq3J9FklpbW61u8+bNVrdr1y6rO3LkiNVJ\n0rp166xu06ZNVldXV2d1N27csDpJunLlit2mqVQqaWxs7KGd00jSsWPH7H27a2d2dtbq3Pexvr7e\n6iT/XNu+fbvV7dmzx+p27txpdZL0xhtvWN1zzz1ndfl83urca4UkDQwM2O1yVSwWre7SpUtW99Zb\nb1mde05K0po1a6zOPddqamqszv2sk6Rr165Z3YkTJ6zOvVcrlUpWB18IweoyGW8symazVjc+Pm51\nkvSTn/zE6tx7nN27d1vdli1brE6S+vv7ra6SueRxxxNlAAAAAAAiDMoAAAAAAEQYlAEAAAAAiDAo\nAwAAAAAQYVAGAAAAACDCoAwAAAAAQIRBGQAAAACACIMyAAAAAAARBmUAAAAAACIMygAAAAAARDJp\nH4BrYWHB6kZGRqzu3r17VldV5f8uwW0zGe9ln5mZsbpSqWR1kpQkid3iwaanp3Xq1KmHds3Nzdb2\nhoeH7X2PjY0t6jbHx8etbm5uzuokKZvNWt2dO3esrlwuW90zzzxjdZK0ZcsWq3Pfw2KxaHW3b9+2\nOkm6ePGi3aapUCiou7v7od2ePXus7a1du9be96pVq6wun89b3eTkpNVVcj29efOm1Z0/f97qfvCD\nH1jd9u3brU6SPvrRjy5qt3v3bqtrbW21Okm6ceOG3S5X7rXS/Rxxr0F37961Okmqq6uzOvdzxN3e\nwMCA1Un+ms3lclbnvi94/FVXV1tdJffnfX19Vnft2jWr6+rqsrpK7pnOnTtnde690JMwk/BEGQAA\nAACACIMyAAAAAAARBmUAAAAAACIMygAAAAAARBiUAQAAAACIMCgDAAAAABBhUAYAAAAAIMKgDAAA\nAABAhEEZAAAAAIBIJu0DWGxJkljd/Pz8ou+7urra6mZmZqwun89bXW1trdVJUibjveUhBHuby1U+\nn9f3v//9h3azs7PW9nbt2mXv+8iRI1a3c+dOq+vv77e6iYkJq5P8c6i9vd3qDhw4YHUf+tCHrE6S\n6uvr7dZRLBatbmhoyN5mJW2a8vm8Tpw4sWjb27Fjh93W1dVZ3ZUrV6yut7fX6kZGRqxOkqanp61u\ncnLS6qampqyukmN0P3M2bdpkda+88orVLSwsWJ3kHyMerlwuW93c3JzVueekJL3//vtW9+Uvf9nq\nLly4YHXj4+NWJ/lrx/253ftTLD73tS8UClY3PDxsdWvWrLE6yV9nN2/etLp9+/ZZXWdnp9VJUmNj\no9W5r8+TsCZ4ogwAAAAAQIRBGQAAAACACIMyAAAAAAARBmUAAAAAACIMygAAAAAARBiUAQAAAACI\nMCgDAAAAABBhUAYAAAAAIMKgDAAAAABAJJP2ASwlSZJY3dTUlNUNDw9bXWdnp9VJUm1trdVVV1db\n3cLCgr3vpWZ+fl59fX0P7WZmZqzt9ff32/ves2eP1W3bts3q9u3bZ3UNDQ1WJ0l1dXVW19raanXr\n16+3uubmZquTpGKxaHVDQ0NW567tfD5vddL98+xJMDs7q+vXrz+0c1+jHTt22PvevXu31X3mM5+x\nOvf97unpsTpJGhgYsLq5uTmrCyFYXSVr1r2ubNq0yeouXrxodadOnbK6Sls8WDabtbqmpiarc++B\nJH/tuO/3lStXrK5UKlmdJJXLZbvF4819L8fGxqzu/PnzVnfkyBGrk6StW7danXtvtWLFCqtrbGy0\nOsm/ZiwlPFEGAAAAACDCoAwAAAAAQIRBGQAAAACACIMyAAAAAAARBmUAAAAAACIMygAAAAAARBiU\nAQAAAACIMCgDAAAAABBhUAYAAAAAIJJJ+wCWkiRJrG5iYsLqLl++bHWrVq2yOkmqqamxukzGOzVm\nZ2ftfS81SZJofn7+od3Q0JC1vcnJSXvfvb29Vrd582ar27Vrl9U9++yzVidJTz31lNVls1mrW1hY\nsLo7d+5YnSTdvXvX6q5cuWJ17jXg2rVrVif514u0JUliXQ/6+vqs7Y2Pj9v7dt/Hj3zkI1bX1dVl\ndZWsB/f8LZVKVlcul63OPScl/7p/9uxZq/vKV75idWfOnLE6SRobG7NbPFhVlfespLq62uoq+Qxz\nrwPuNt31Vcl6wNLhvu/u586PfvQjq9uyZYvVSdILL7xgdWvXrrW6lStXWt3w8LDVSVKxWLTbpYIn\nygAAAAAARBiUAQAAAACIMCgDAAAAABBhUAYAAAAAIMKgDAAAAABAhEEZAAAAAIAIgzIAAAAAABEG\nZQAAAAAAIgzKAAAAAABEGJQBAAAAAIhk0j6ApSRJEqvL5XJWd/LkSaurqvJ/3zE1NWV1IQR7m3iw\ncrlsde57I0kzMzNWNzQ0ZHVXr161unfffdfqJKmxsdHqVq5caXX19fVWV11dbXWSNDIysqidu26K\nxaLVSdLo6KjdPgnc9ZDP5+1t9vT0WJ37Wl68eNHqduzYYXWS1NHRYXUNDQ1W514vent7rU6S+vr6\nrG5gYMDqhoeHra6S97pUKtktHmxubs7qbt26ZXXd3d32vt3PnOnpaXubwC/Kvbc6f/681X3729+2\n9/3qq69aXTabtbpz585Z3YkTJ6xO8j9D3c/5JwFPlAEAAAAAiDAoAwAAAAAQYVAGAAAAACDCoAwA\nAAAAQIRBGQAAAACACIMyAAAAAAARBmUAAAAAACIMygAAAAAARBiUAQAAAACIhCRJ/DiEEUm3fnmH\nA9g6kiRZk+YBsB7wmEl1TbAe8JhhPQA/wz0T8DP2eqhoUAYAAAAAYKnjj14DAAAAABBhUAYAAAAA\nIMKgDAAAAABAhEEZAAAAAIAIgzIAAAAAABEGZQAAAAAAIgzKAAAAAABEGJQBAAAAAIgwKAMAAAAA\nEPlPpEgzK56nHukAAAAASUVORK5CYII=\n"
},
"output_type": "display_data",
"metadata": {}
}
],
"source": [
"Xrem=Xall[:,subset[6000:]]\n",
"Yrem=Yall[subset[6000:]]\n",
"\n",
"feats_rem=RealFeatures(Xrem)\n",
"labels_rem=MulticlassLabels(Yrem)\n",
"out=svm.apply(feats_rem)\n",
"\n",
"evaluator = MulticlassAccuracy()\n",
"accuracy = evaluator.evaluate(out, labels_rem)\n",
"\n",
"print \"Accuracy = %2.2f%%\" % (100*accuracy)\n",
"\n",
"idx=np.where(out.get_labels() != Yrem)[0]\n",
"Xbad=Xrem[:,idx]\n",
"Ybad=Yrem[idx]\n",
"_=P.figure(figsize=(17,6))\n",
"P.gray()\n",
"plot_example(Xbad, Ybad)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The misclassified examples are indeed much harder to label even for human beings."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2.0
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment