{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pyplot as plt\n", "\n", "SIZE = (30,15)\n", "TEST = True\n", "\n", "fig = plt.figure(figsize=SIZE)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "from sklearn import datasets, svm, metrics\n", "digits = datasets.load_digits()\n", "\n", "images_and_labels = list(zip(digits.images, digits.target))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "print len(images_and_labels)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1797\n" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "print images_and_labels[0]\n", "print images_and_labels[0][0]\n", "print images_and_labels[0][1]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(array([[ 0., 0., 5., 13., 9., 1., 0., 0.],\n", " [ 0., 0., 13., 15., 10., 15., 5., 0.],\n", " [ 0., 3., 15., 2., 0., 11., 8., 0.],\n", " [ 0., 4., 12., 0., 0., 8., 8., 0.],\n", " [ 0., 5., 8., 0., 0., 9., 8., 0.],\n", " [ 0., 4., 11., 0., 1., 12., 7., 0.],\n", " [ 0., 2., 14., 5., 10., 12., 0., 0.],\n", " [ 0., 0., 6., 13., 10., 0., 0., 0.]]), 0)\n", "[[ 0. 0. 5. 13. 9. 1. 0. 0.]\n", " [ 0. 0. 13. 15. 10. 15. 5. 0.]\n", " [ 0. 3. 15. 2. 0. 11. 8. 0.]\n", " [ 0. 4. 12. 0. 0. 8. 8. 0.]\n", " [ 0. 5. 8. 0. 0. 9. 8. 0.]\n", " [ 0. 4. 11. 0. 1. 12. 7. 0.]\n", " [ 0. 2. 14. 5. 10. 12. 0. 0.]\n", " [ 0. 0. 6. 13. 10. 0. 0. 0.]]\n", "0\n" ] } ], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "images_and_labels = list(zip(digits.images, digits.target))\n", "for index, (image, label) in enumerate(images_and_labels[:4]):\n", " plt.subplot(2, 4, index + 1)\n", " plt.axis('off')\n", " plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')\n", " plt.title('Training: %i' % label)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAWYAAAB0CAYAAAC2T5gyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAACqdJREFUeJzt3W9oleUfx/HPURuduXm2k1YDpaOMFjlwpQ/ERc1wZFKo\nDZPKIBpsD5SQQB1EdfZsCkH6qEGSQf/IZSWBQYu2MgYyaSN9Mpq2gZaI88ycc8rO9XsQv/30l3Jf\nm/fZvufu/Xrk2b7nuq7zxX24z71z7Yo555wAAGbMmukFAABuRjADgDEEMwAYQzADgDEEMwAYQzAD\ngDGz0+l0eqYXEWTdunXKZrNatmxZqLWgt7lGf3Mn0r11OTJ37lxXVFTkioqKXCwWc/F4fOLxJ598\nkqtpp1V7e7urqKhwhYWFbvXq1W5gYGBa5o16b69du+bq6upcKpVysVjMdXR0TOv8Ue9vV1eXW7Nm\njUsmk27BggVu06ZN7o8//piWuaPe25MnT7rly5e70tJSl0gk3KpVq9xPP/006XFyFsw3SqVS7vvv\nv7/l965fvz4dSwjd+fPnXSKRcG1tbW5sbMzt2LHDrVy5ctrXEcXeXrt2ze3du9cdPXrUlZWVuc7O\nzhlbSxT7e+TIEdfW1ub++usvd+XKFffqq6+6tWvXTvs6otjbTCbjTp065bLZrMtms27fvn3uvvvu\nm/Q4036PuaOjQwsXLtSePXtUVlam+vp6ZTIZPfPMM7r33nuVTCb17LPP6syZMxPPqamp0f79+yVJ\nBw4c0GOPPaYdO3YomUxqyZIl+vbbb6dUe/r0aT3++OOaN2+eamtrtXXrVr388ster+PQoUOqrKxU\nXV2dCgoKlE6n1dvbq76+vjDaNCVR6e1dd92l1157TdXV1Zo9e3YYrQlFVPq7du1a1dXVqaioSPF4\nXFu3btXPP/8cRoumLCq9TSQSWrx4sWKxmMbHxzVr1iyVlZVNuh8z8su/c+fO6eLFixocHFRra6uy\n2azq6+s1ODiowcFBxeNxbdu2baI+FospFotNPD527JgeeughXbhwQTt37lR9ff2Ual988UWtXLlS\nQ0NDSqfT+uijj2567rJly/TZZ5/d8jWcPHnypvtVhYWFKi8v14kTJ+6sOXcoCr21LIr9/fHHH1VZ\nWTmlfoQpSr0tKSlRPB7Xnj171NbWNvlm5OBq/h9ufMvyww8/uIKCAjc2Nnbb+l9++cWVlpZOPK6p\nqXH79+93zjn3wQcfuPLy8onvjYyMuFgs5s6dOzep2oGBATdnzhw3Ojo68f0tW7a4LVu2eL2m+vp6\n19TUdNPXqqur3Ycffuj1/LBEsbc3WrhwoZlbGVHsb29vr0smk+7o0aOTfu6dinpvR0ZG3M6dO90j\njzzistnspJ47I1fMCxYsUEFBwcTjK1euqLGxUalUSolEQk888YSGh4flbvP3le6///6JfxcWFkqS\nLl++PKnas2fPKplM6u677574/qJFi7xfQ1FRkS5dunTT14aHh1VcXOw9Ri5EobeWRam/v/32m9at\nW6d9+/apurp60s8PW5R6+99xW1pa1NfXp19//XVSz52RYL7xbYEkvfPOO+rr69OxY8c0PDyszs5O\nub9/MZmzNZSVlWloaEijo6MTXxscHPR+/tKlS9Xb2zvxeGRkRP39/Vq6dGmo65ysKPTWsqj0d2Bg\nQLW1tXrrrbf00ksvhb3EKYlKb280Pj6ubDY7Ef6+TGwwuXz5suLxuBKJhIaGhtTc3JzzOR944AGt\nWLFC6XRa169fV1dXl7755pt//Oe4nY0bN+rEiRM6dOiQrl69qubmZlVVVenBBx/M8conJx97K0lj\nY2O6evXqP/5tTT7298yZM3ryySe1bds2NTQ05Hi1U5ePvW1vb1dPT4/Gx8d16dIlvf7666qoqFB5\nefmk1mHiinn79u0aHR3V/PnztWrVKj399NO3bcT/38S/1Xi+tR9//LG6urp0zz336M0339TmzZtv\neitVWVmpTz/99JZjz58/X1988YXeeOMNJZNJdXd3m/hlVhR6K0kVFRUqLCzU2bNn9dRTT2nu3Lkm\nrrqj0N/3339fp0+fVjqdVnFxsYqLizVv3rzbv+hpEoXeZjIZvfDCCyopKVFFRYXOnz+vw4cP3/5F\n30bM5fJ9QZ7ZvHmzHn74Yb399tszvZTIobe5RX9zZyZ6a+JWxkzp7u5Wf3+/stmsjhw5osOHD2vD\nhg0zvaxIoLe5RX9zx0Jv50zrbMb8+eefeu6553ThwgUtWrRI7733Xv7spTeO3uYW/c0dC73lVgYA\nGPOvvpUBABaZuZVx8OBBr7pdu3YF1tTW1gbWtLS0BNaUlpZ6rSlKampqAmsymUxgjc9fk/233RPt\n6OgIrPHpSVVVVShz5Yvdu3cH1jQ1NQXWLF682Gu+48ePB9bkOhu4YgYAYwhmADCGYAYAYwhmADCG\nYAYAYwhmADCGYAYAY8x8jtnn88nS3+dxBbl48WJgTTKZDKz5/PPPvda0adMmr7p8UFJSEljT2dkZ\nWBPWZ3bzQU9Pj1fd6tWrA2sSiURgze+//+41Xz7w+fyxz89ha2trYE1jY6PXmnw+x7xmzRqvsaaK\nK2YAMIZgBgBjCGYAMIZgBgBjCGYAMIZgBgBjCGYAMIZgBgBjCGYAMGZadv757KTx2dEnSf39/YE1\nS5YsCazxOeXEZ91Sfuz8892dFtbJFz6nbETFV1995VXnc6Cnz27I5uZmr/nyQUNDQ2CNz67g5cuX\nB9b4nmCS6119PrhiBgBjCGYAMIZgBgBjCGYAMIZgBgBjCGYAMIZgBgBjCGYAMGZaNpj4HPX06KOP\neo3ls3nEh88H0vPFu+++G1iTTqe9xhoeHr7D1fytpqYmlHHywfbt273qUqlUKGOtX7/ea7584PPz\nfOrUqcAanw1qvhtHfPKqtLTUa6yp4ooZAIwhmAHAGIIZAIwhmAHAGIIZAIwhmAHAGIIZAIwhmAHA\nGDMbTHxOFAmThQ+Rh8VnU8Irr7ziNVZYrzmTyYQyzkzzeR0+G3wk/5NOghw4cCCUcfKFzyaUoaGh\nwBrfDSY+de3t7YE1d/KzxBUzABhDMAOAMQQzABhDMAOAMQQzABhDMAOAMQQzABhDMAOAMdOywcTn\ng9bHjx8PbT6fzSPd3d2BNc8//3wYy/lX6unpCaypqqqahpXcGZ+TX/bu3RvafF9++WVgTUlJSWjz\nRYVPxvhsCpGkxsbGwJrdu3cH1rS0tHjNdytcMQOAMQQzABhDMAOAMQQzABhDMAOAMQQzABhDMAOA\nMQQzABhDMAOAMdOy88/naBifnXiSdPDgwVBqfOzatSuUcZC/fI7k6ujo8Bqrt7c3sGbjxo2BNevX\nrw+s8T1KbMOGDV51M6mpqSmwxuc4KJ8dwZL03XffBdbkelcwV8wAYAzBDADGEMwAYAzBDADGEMwA\nYAzBDADGEMwAYAzBDADGmNlg4nNUi+S36WPFihWBNWEeZZUPfI8j8tm88PXXXwfW+Gy68N0EMZN8\njr/yOUbLt87nKCuf/qdSKY8V5ccGE59joxoaGkKbz2fzSGtra2jz3QpXzABgDMEMAMYQzABgDMEM\nAMYQzABgDMEMAMYQzABgDMEMAMbEnHNuphcBAPgfrpgBwBiCGQCMIZgBwBiCGQCMIZgBwBiCGQCM\nIZgBwBiCGQCMIZgBwBiCGQCMIZgBwBiCGQCMIZgBwBiCGQCMIZgBwBiCGQCMIZgBwBiCGQCMIZgB\nwBiCGQCM+Q8A/AZHAlCn9AAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "n_samples = len(digits.images)\n", "data = digits.images.reshape((n_samples, -1))\n", "\n", "print data" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[ 0. 0. 5. ..., 0. 0. 0.]\n", " [ 0. 0. 0. ..., 10. 0. 0.]\n", " [ 0. 0. 0. ..., 16. 9. 0.]\n", " ..., \n", " [ 0. 0. 1. ..., 6. 0. 0.]\n", " [ 0. 0. 2. ..., 12. 0. 0.]\n", " [ 0. 0. 10. ..., 12. 1. 0.]]\n" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "print(__doc__)\n", "\n", "# Author: Gael Varoquaux \n", "# License: BSD 3 clause\n", "\n", "# Standard scientific Python imports\n", "import matplotlib.pyplot as plt\n", "\n", "# Import datasets, classifiers and performance metrics\n", "from sklearn import datasets, svm, metrics\n", "\n", "# The digits dataset\n", "digits = datasets.load_digits()\n", "\n", "# The data that we are interested in is made of 8x8 images of digits, let's\n", "# have a look at the first 3 images, stored in the `images` attribute of the\n", "# dataset. If we were working from image files, we could load them using\n", "# pylab.imread. Note that each image must have the same size. For these\n", "# images, we know which digit they represent: it is given in the 'target' of\n", "# the dataset.\n", "images_and_labels = list(zip(digits.images, digits.target))\n", "for index, (image, label) in enumerate(images_and_labels[:4]):\n", " plt.subplot(2, 4, index + 1)\n", " plt.axis('off')\n", " plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')\n", " plt.title('Training: %i' % label)\n", "\n", "# To apply a classifier on this data, we need to flatten the image, to\n", "# turn the data in a (samples, feature) matrix:\n", "n_samples = len(digits.images)\n", "data = digits.images.reshape((n_samples, -1))\n", "\n", "# Create a classifier: a support vector classifier\n", "classifier = svm.SVC(gamma=0.001)\n", "\n", "# We learn the digits on the first half of the digits\n", "classifier.fit(data[:n_samples / 2], digits.target[:n_samples / 2])\n", "\n", "# Now predict the value of the digit on the second half:\n", "expected = digits.target[n_samples / 2:]\n", "predicted = classifier.predict(data[n_samples / 2:])\n", "\n", "print(\"Classification report for classifier %s:\\n%s\\n\"\n", " % (classifier, metrics.classification_report(expected, predicted)))\n", "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(expected, predicted))\n", "\n", "images_and_predictions = list(zip(digits.images[n_samples / 2:], predicted))\n", "for index, (image, prediction) in enumerate(images_and_predictions[:4]):\n", " plt.subplot(2, 4, index + 5)\n", " plt.axis('off')\n", " plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')\n", " plt.title('Prediction: %i' % prediction)\n", "\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Automatically created module for IPython interactive environment\n", "Classification report for classifier SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,\n", " gamma=0.001, kernel='rbf', max_iter=-1, probability=False,\n", " random_state=None, shrinking=True, tol=0.001, verbose=False):\n", " precision recall f1-score support\n", "\n", " 0 1.00 0.99 0.99 88\n", " 1 0.99 0.97 0.98 91\n", " 2 0.99 0.99 0.99 86\n", " 3 0.98 0.87 0.92 91\n", " 4 0.99 0.96 0.97 92\n", " 5 0.95 0.97 0.96 91\n", " 6 0.99 0.99 0.99 91\n", " 7 0.96 0.99 0.97 89\n", " 8 0.94 1.00 0.97 88\n", " 9 0.93 0.98 0.95 92\n", "\n", "avg / total 0.97 0.97 0.97 899\n", "\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Confusion matrix:\n", "[[87 0 0 0 1 0 0 0 0 0]\n", " [ 0 88 1 0 0 0 0 0 1 1]\n", " [ 0 0 85 1 0 0 0 0 0 0]\n", " [ 0 0 0 79 0 3 0 4 5 0]\n", " [ 0 0 0 0 88 0 0 0 0 4]\n", " [ 0 0 0 0 0 88 1 0 0 2]\n", " [ 0 1 0 0 0 0 90 0 0 0]\n", " [ 0 0 0 0 0 1 0 88 0 0]\n", " [ 0 0 0 0 0 0 0 0 88 0]\n", " [ 0 0 0 1 0 1 0 0 0 90]]\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\ngg==\n", "text": [ "" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }