Skip to content

Instantly share code, notes, and snippets.

@MikeLing
Last active March 7, 2017 11:57
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/c57eef21a17c4371e2dcb3f4ce7505eb to your computer and use it in GitHub Desktop.
Save MikeLing/c57eef21a17c4371e2dcb3f4ce7505eb 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": 24,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(256, 9298)\n",
"(256, 5000)\n",
"(256, 1000)\n",
"[ 6. 5. 4. ..., 4. 0. 1.]\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\n",
"print Yall"
]
},
{
"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": 25,
"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 0x10e855d10>"
]
},
"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 0x116c57d10>"
]
},
"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": 26,
"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": 27,
"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 0x10e899110>"
]
},
"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": 28,
"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": 29,
"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": 30,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Standard KNN took 1.1s\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: predicate 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 by caused be the high-dimensional data that we used. We now use low-dimensional data to verify it. In this experiment, we use the Letter Recognition Data Set to test it. For more information about data set, see http://archive.ics.uci.edu/ml/datasets/Letter+Recognition"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(16, 8000)\n",
"(16, 2000)\n"
]
}
],
"source": [
"Yall_low = np.genfromtxt('../../../../shogun-data/multiclass/letter-recognition.dat', delimiter=',', usecols=(0,), dtype=\"string\")\n",
"Xall_low = np.genfromtxt('../../../../shogun-data/multiclass/letter-recognition.dat', delimiter=',', usecols=(range(1,17))).transpose()\n",
"\n",
"# cover alphabet to numbers\n",
"Yall_low = np.array([ord(data) - 64 for data in Yall_low], dtype=np.double)\n",
"\n",
"Xtrain_low = Xall_low[:, :8000]\n",
"Ytrain_low = Yall_low[:8000]\n",
"\n",
"Xtest_low = Xall_low[:, 8000:]\n",
"Ytest_low = Yall_low[8000:]\n",
"\n",
"print Xtrain_low.shape\n",
"print Xtest_low.shape"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Predictions [ 13. 22. 25. 24. 22.]\n",
"Ground Truth [ 13. 22. 25. 24. 22.]\n",
"Accuracy = 91.25%\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": 33,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Standard KNN took 1.3214s\n",
"Covertree KNN took 0.3118s\n",
"KDTree KNN took 0.6500s\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 can see that the KD-tree solver now is faster than standard KNN on this 16-dimensional dataset. The cover tree solver is still fastest. 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": 34,
"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 using all possible solvers. This takes a few seconds. And we are going back to the initial dataset(the USPS digit recognition dataset) now:"
]
},
{
"cell_type": "code",
"execution_count": 35,
"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": 36,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10f049350>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n9ttpZe+9914++eSTtOvKly9PfHw8AAcPHiQ0NPSS7u1plODIFTkWf4yrJ1xNty+6sWLfCowxFAko\n4nZYIiKXb88eaNcO9u7NkuoCAwNZvnw5q1atwt/fn7Fjx2b62oULF17WPY8ePcq1117LwIEDufPO\nOwEoVaoUo0ePJiEhId1rfH19+eijjy7rfp5ICY5ckSD/IMoEleF/Pf5H/dL13Q5HROTKPfcc/PYb\nPPtsllfdpk0bNm3adNaxEydOEBkZSaNGjahXrx7ffvtt2rnTrTzz5s2jffv29OrVi1q1atGvXz+s\ntene48SJE3Tu3JlbbrmFIUOGpB0vWbIkkZGRfPrpp+le98ADD/DGG2+QlJR0pW/TI2gWlVyWz1d8\nTtGAonSp0YVJvSa5HY6IyMU98AAsX37h8wsWQErKP6/fe895+PhAmzbpXxMeDm++manbJyUlMWvW\nLDp16nTW8YCAAL7++msKFy7MwYMHad68Oddff/15g2yXLVvG6tWrKVeuHK1ateL333+ndevW593n\nwQcfZMCAAQwfPvy8c48++iidO3fmrrvuOu9cxYoVad26NRMmTKBbt26Zek+eTC04csnGLx3PrV/f\nyril49wORUQk6zRtCqVKOQkNOF9LlYJmza6o2tjYWMLDw4mIiKBixYrcfffdZ5231jJy5Ejq169P\nx44d2bVrF/v27UsnvKaEhITg4+NDeHg427ZtS/d+HTp04Ntvv2X//v3nnatSpQrNmjVj4sSJ6V47\nYsQIXn31VVLOTPS8lFpwJNNOb7nQo3YPoo9FM7LNSLdDEhHJvMy0tAwZAuPGQUAAJCRAz54wZswV\n3fb0GJwL+fzzzzlw4ABLlizBz8+P0NDQdFdezp8/f9pzX1/fC3Yl9e3bl1atWnHdddfxyy+/UKhQ\nobPOjxw5kl69etGuXbvzrq1evTrh4eFMmTIls2/PY6kFRzLl771/0+SDJmw9vJXgwGCebv80fr6X\nt3y2iIjH2rcPBg+GRYucr1k00DgjR48epVSpUvj5+fHLL7+wffv2K65z+PDhREZGcuONN543qLhW\nrVqEhYUxY8aMdK99/PHHee211644BrcpwZGLSk5Jpu9Xfdl7Yi9H4o64HY6ISPaZNg3efRcaNHC+\nTpuW7bfs168fUVFR1KtXj88++4xatWplSb2vvPIKISEh3Hbbbed1OT3++ONER0ene12dOnVo1KhR\n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\nTsvWqVNZE29ekZLiDPD29T37eLFiznYZIiK5mBKcHJCUksSt9W7l1nq3nn/ygw+cGUYvv3z+H6Ks\nNHq0MzPrttvg+PGsq3f1amjd2ulKmjsX2rfPurqbNYNly2DYMHjnHWeV5j/+yLr6c7P166FtWyfB\nKVvWabU5vQZRQoLTBXj77e4uIyAiko2U4OSAfD75+M9V/6FnWM+zTxw/Dv/5j/OH6LrrsjeIwoWd\nVY63boXhw7OmzsWLndgB5s+Hpk2zpt4zFSgAb74JP//s/GFu3doZiB0fn/X3yg0SE51kuUEDWLMG\nPvkEmjQ5ew2iyEin1XDy5H9m22kXenGDBr9LdrLW5tlH48aNbU6YuWGm/Sv6r/NPPPOMtWDtokU5\nEoe11trHHnPu+fXXV1bPvHnWFipkbWiotZs2ZU1sF3P0qLV33+3EX7++tcuX58x9vcXSpdY2bOh8\nf3r2tHbPnozLb9xobdeuTvmaNa394YeciVPktCFDrPXxcb6KZBIQZTPxN971JMPNR04lONXeqmZv\n+OKGsw/u3WttwYLW9uqVIzGkiY93/giWKHHxP4AXMnOmtQEB1taubW10dNbGlxkzZlhbpoy1fn7W\nPv+8tYmJOR+DJ4mNtXbkSGt9fa0tXdraqVMv7frvvrO2WjXn46BHD2u3bs2WMEXSBAQ4v2/nPgIC\n3I5MvEBmExx1UWWzkwknKRZQjMjKkWefePZZZ4ftF17I2YD8/Z1Vjk+cgAEDLn3l4MmTnfEbYWFO\nt1T58tkTZ0a6doVVq6BHD2eMSatWzpiTvNjcvXAhNGzoDCC/7TanW6pnz4tfd6YuXZzv54svwg8/\nQO3a8Mwz2uldspa1znjDsWOd5ST8/P45Z4zG2J0ruz/P8sLnZWayoNz6yKkWnPNs2GBtvnzuNsuO\nHu38j2ns2MxfM26ctcZY26aNtUeOZF9sl2LSJGuDg53/+bVqlXeau48ft/a++5yfR8WK1s6enTX1\n7txpbd++zu9GpUrWfvWVtSkpWVO35D379lk7caLTtVyp0j8tNRUqON2ixjgtsaeP+/hYe911Titk\nfLzb0bsru7vvvLh7kEy24Bh7qf+Dz0UiIiJsVFRUtt4j+lg0ZYPK4utzxgypm26C7793/jdTpky2\n3v+CUlKcVY5//92ZqVSjRsblX3/dWZW4Uydnl/ICBXImzswICEh/0HFAQO5shZgzx1lEcccO+Ne/\n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\npyWlUz6tq/sAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10eeb6bd0>"
]
},
"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 of brute solver\", \"Training Accuracy of brute solver\", \n",
" \"Test Accuracy of cover tree solver\", \"Training Accuracy of cover tree solver\", \n",
" \"Test Accuracy of kdtree solver\", \"Training Accuracy of kdtree solver\"])\n",
"\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": 37,
"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": 38,
"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": 39,
"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 0x10a103590>"
]
},
"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