Skip to content

Instantly share code, notes, and snippets.

@MikeLing
Created February 16, 2017 12:56
Show Gist options
  • Save MikeLing/2f842d828276c60310b4d6a93e5d406b to your computer and use it in GitHub Desktop.
Save MikeLing/2f842d828276c60310b4d6a93e5d406b to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"# K-Nearest Neighbors (KNN)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"#### by Chiyuan Zhang and Sören Sonnenburg"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"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": {
"deletable": true,
"editable": true
},
"source": [
"## The basics"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"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": {
"deletable": true,
"editable": true
},
"source": [
"First we load and init data split:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"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": {
"deletable": true,
"editable": true
},
"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": {
"collapsed": false,
"deletable": true,
"editable": true
},
"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\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x108e50490>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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",
"text/plain": [
"<matplotlib.figure.Figure at 0x10ba8e790>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"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": {
"deletable": true,
"editable": true
},
"source": [
"Then we import shogun components and convert the data to shogun objects:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"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": {
"deletable": true,
"editable": true
},
"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": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"image/png": "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\nQRkAAAA6/g+KhPUNCGPr2wAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x108e50050>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"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": {
"deletable": true,
"editable": true
},
"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": {
"collapsed": false,
"deletable": true,
"editable": true
},
"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": {
"deletable": true,
"editable": true
},
"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": {
"collapsed": false,
"deletable": true,
"editable": true
},
"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": {
"deletable": true,
"editable": true
},
"source": [
"So k=3 seems to have been the optimal choice."
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"## Speed comparisons of different KNN solvers"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"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": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Standard KNN took 1.0s\n",
"Covertree KNN took 0.8s\n",
"KDTree KNN took 3.2s\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": {
"deletable": true,
"editable": true
},
"source": [
"KNN predictions are very costly: predictiong a new point's class requires computing distances to all training samples. While Shogun exploits multi-core infrastructure, KNN quickly becomes infeasible for large datasets. We can see that the Cover Tree is faster than standard KNN. In contrast, the KD-Trees solver is much slower. This is likely to be caused be the high-dimensional data that we used. We now use low-dimensional data to verify it."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(4, 150)\n",
"(4, 100)\n",
"(4, 50)\n"
]
}
],
"source": [
"# The data set is Ronald Fisher's measurements of type, petal width (PW), petal length (PL), sepal width (SW), \n",
"# and sepal length (SL) for a sample of 150 irises. \n",
"# Check more information in http://www.math.uah.edu/stat/data/Fisher.html\n",
"low_dimension_martix = np.loadtxt('../../../data/multiclass/Fisher.txt')\n",
"\n",
"Xall_low = low_dimension_martix[:,[1, 2, 3, 4]].transpose()\n",
"Yall_low = low_dimension_martix[:, 0]\n",
"\n",
"Xtrain_low = Xall_low[:, :100]\n",
"Ytrain_low = Yall_low[:100]\n",
"\n",
"Xtest_low = Xall_low[:, 100:]\n",
"Ytest_low = Yall_low[100:]\n",
"\n",
"print Xall_low.shape\n",
"print Xtrain_low.shape\n",
"print Xtest_low.shape"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Predictions [ 2. 0. 1. 1. 1.]\n",
"Ground Truth [ 2. 0. 2. 2. 1.]\n",
"Accuracy = 92.00%\n"
]
}
],
"source": [
"labels_low = MulticlassLabels(Ytrain_low)\n",
"feats_low = RealFeatures(Xtrain_low)\n",
"k=3\n",
"dist_low = EuclideanDistance()\n",
"knn_low = KNN(k, dist_low, labels_low)\n",
"labels_test_low = MulticlassLabels(Ytest_low)\n",
"feats_test_low = RealFeatures(Xtest_low)\n",
"knn_low.train(feats_low)\n",
"pred_low = knn_low.apply_multiclass(feats_test_low)\n",
"print \"Predictions\", pred_low[:5]\n",
"print \"Ground Truth\", Ytest_low[:5]\n",
"\n",
"evaluator_low = MulticlassAccuracy()\n",
"accuracy_low = evaluator_low.evaluate(pred_low, labels_test_low)\n",
"\n",
"print \"Accuracy = %2.2f%%\" % (100*accuracy_low)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Standard KNN took 0.0065s\n",
"Covertree KNN took 0.0008s\n",
"KDTree KNN took 0.0019s\n"
]
}
],
"source": [
"start = Time.get_curtime()\n",
"knn_low.set_k(3)\n",
"knn_low.set_knn_solver_type(KNN_BRUTE)\n",
"pred_low = knn_low.apply_multiclass(feats_test_low)\n",
"print \"Standard KNN took %2.4fs\" % (Time.get_curtime() - start)\n",
"\n",
"\n",
"start = Time.get_curtime()\n",
"knn_low.set_k(3)\n",
"knn_low.set_knn_solver_type(KNN_COVER_TREE)\n",
"pred_low = knn_low.apply_multiclass(feats_test_low)\n",
"print \"Covertree KNN took %2.4fs\" % (Time.get_curtime() - start)\n",
"\n",
"\n",
"start = Time.get_curtime()\n",
"knn_low.set_k(3)\n",
"knn_low.set_knn_solver_type(KNN_KDTREE)\n",
"pred_low = knn_low.apply_multiclass(feats_test_low)\n",
"print \"KDTree KNN took %2.4fs\" % (Time.get_curtime() - start)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"We now can see the KD-Tree solver is faster than the Standard KNN from above comparison which prove the KD-Tree is more suitable for low-dimensional data. Next, let's do a more systematic comparison of Shogun's KNN implementations. We begin by defining a helper function:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"def evaluate(labels, feats, knn_solver_type=KNN_BRUTE):\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 knn_solver_type is KNN_COVER_TREE:\n",
" knn.set_knn_solver_type(KNN_COVER_TREE)\n",
" elif knn_solver_type is KNN_KDTREE:\n",
" knn.set_knn_solver_type(KNN_KDTREE)\n",
" elif knn_solver_type is KNN_BRUTE:\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": {
"deletable": true,
"editable": true
},
"source": [
"Evaluate KNN with and without Cover Tree. This takes a few seconds:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"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, KNN_BRUTE)\n",
"wi_ct = evaluate(labels, feats, KNN_COVER_TREE)\n",
"wd_ct = evaluate(labels, feats, KNN_KDTREE)\n",
"print(\"Done!\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"Generate plots with the data collected in the evaluation:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"image/png": "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\nP66yXsE9RfXGAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1103ba190>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n2AAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11506d950>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"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": {
"deletable": true,
"editable": true
},
"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": {
"deletable": true,
"editable": true
},
"source": [
"## Comparison to Multiclass Support Vector Machines"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"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": {
"deletable": true,
"editable": true
},
"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": 14,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"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": {
"deletable": true,
"editable": true
},
"source": [
"Let's apply the SVM to the same test data set to compare results:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"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": {
"deletable": true,
"editable": true
},
"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": 16,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"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",
"text/plain": [
"<matplotlib.figure.Figure at 0x10ffb6ed0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"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": {
"deletable": true,
"editable": true
},
"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
},
"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