{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "\n", "\n", "*This notebook contains an excerpt from the [Python Data Science Handbook](http://shop.oreilly.com/product/0636920034919.do) by Jake VanderPlas; the content is available [on GitHub](https://github.com/jakevdp/PythonDataScienceHandbook).*\n", "\n", "*The text is released under the [CC-BY-NC-ND license](https://creativecommons.org/licenses/by-nc-nd/3.0/us/legalcode), and code is released under the [MIT license](https://opensource.org/licenses/MIT). If you find this content useful, please consider supporting the work by [buying the book](http://shop.oreilly.com/product/0636920034919.do)!*" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "\n", "< [In Depth: Gaussian Mixture Models](05.12-Gaussian-Mixtures.ipynb) | [Contents](Index.ipynb) | [Application: A Face Detection Pipeline](05.14-Image-Features.ipynb) >" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# In-Depth: Kernel Density Estimation" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "deletable": true, "editable": true }, "source": [ "In the previous section we covered Gaussian mixture models (GMM), which are a kind of hybrid between a clustering estimator and a density estimator.\n", "Recall that a density estimator is an algorithm which takes a $D$-dimensional dataset and produces an estimate of the $D$-dimensional probability distribution which that data is drawn from.\n", "The GMM algorithm accomplishes this by representing the density as a weighted sum of Gaussian distributions.\n", "*Kernel density estimation* (KDE) is in some senses an algorithm which takes the mixture-of-Gaussians idea to its logical extreme: it uses a mixture consisting of one Gaussian component *per point*, resulting in an essentially non-parametric estimator of density.\n", "In this section, we will explore the motivation and uses of KDE.\n", "\n", "We begin with the standard imports:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns; sns.set()\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Motivating KDE: Histograms\n", "\n", "As already discussed, a density estimator is an algorithm which seeks to model the probability distribution that generated a dataset.\n", "For one dimensional data, you are probably already familiar with one simple density estimator: the histogram.\n", "A histogram divides the data into discrete bins, counts the number of points that fall in each bin, and then visualizes the results in an intuitive manner.\n", "\n", "For example, let's create some data that is drawn from two normal distributions:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "def make_data(N, f=0.3, rseed=1):\n", " rand = np.random.RandomState(rseed)\n", " x = rand.randn(N)\n", " x[int(f * N):] += 5\n", " return x\n", "\n", "x = make_data(1000)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "We have previously seen that the standard count-based histogram can be created with the ``plt.hist()`` function.\n", "By specifying the ``normed`` parameter of the histogram, we end up with a normalized histogram where the height of the bins does not reflect counts, but instead reflects probability density:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\nj6u1tVW9vb3yer1qamqSJE1MTOjgwYNqa2tTdna2Nm3apIcffljd3d13rQEAZI7pTCs7z7047kmU\n4qkxee/fMrS7u7tVXl4uSSotLVVfX1902cDAgJYvXy6XyyVJWrNmjd566y319PTctQYAkFniPTl3\nOpMoZcoUo5ah7ff75Xa7bxU4HAqHw7Lb7Z9YlpOTo9HRUQUCgbvWmGbcf1nhsfGY1w/5B/U/W+wH\ntYOjw5JscfUUbw3vwXvwHrwH73HL2NXLcf382cQytF0ulwKBQPT57eHrcrnk9986HhEIBJSbmztl\nzVTy892W6yRbW/OzqW4BAABJMdzGtKysTKdOnZIk9fT0qKSkJLqsuLhY58+f17Vr1zQ+Pq7Tp0/r\nc5/7nFatWnXXGgAAMD22SCQSmWqF288ElySv16t33nlHwWBQHo9Hf/vb33T48GFFIhFVVVVp06ZN\nd6wpKipK/GgAAEhjlqENAABmB/PODAMAIEMR2gAAGILQBgDAEIQ2AACGmHWhPTAwoDVr1mh8PPYb\nmpjO7/fru9/9rrZu3arq6mr19PSkuqWkiEQiqq2tVXV1tbZt26b3338/1S0l1cTEhJ588kk9+uij\n+ta3vqWTJ0+muqWku3LlitatW6d///vfqW4l6X71q1+purpaGzdu1LFjx1LdTlJNTExoz549qq6u\n1pYtWzLq99/b26utW7dKki5cuKDNmzdry5Ytqq+vj6l+VoW23+/XoUOHlJ2dnepWkuq3v/2t1q5d\nq5aWFnm9Xj399NOpbikpbr+v/Z49e+T1elPdUlIdP35cixYt0u9//3u9/PLL+slPfpLqlpJqYmJC\ntbW1mjt3bqpbSbq33npL//znP9Xa2qqWlhZduhT7rFnp4NSpUwqHw2ptbdVjjz2mn/3sZ6luKSle\neeUV/fjHP9b169cl3bgc+oknntDRo0cVDofV0dFh+TNmVWg/9dRTeuKJJzLuP/F3vvMdVVdXS7rx\nhyxTPrRMdV/7TPC1r31Nu3fvlnTjroEOR2bNlPvTn/5UmzZt0pIlsU8MkS7efPNNlZSU6LHHHtOu\nXbv05S9/OdUtJVVhYaFCoZAikYhGR0c1Z86cVLeUFMuXL9dLL70Uff7OO+9ozZo1kqQvfelL+sc/\n/mH5M1LyV+KNN97Qq6++Oum1T33qU/rGN76hlStXKp0vHb/T2L1erz772c9qaGhITz75pH70ox+l\nqLvkmuq+9plg3rx5km78O+zevVuPP/54ijtKnra2Ni1evFgPPfSQfvnLX6a6naQbGRnRf//7Xx05\nckTvv/++du3apb/85S+pbitp5s+fr4sXL6qyslIffvihjhw5kuqWkqKiokL/+c9/os9vz7r58+dr\ndHTU8mekJLSrqqpUVVU16bWvfvWreuONN/SHP/xBH3zwgWpqatTS0pKK9hLqTmOXpP7+fv3gBz/Q\nvn37op+80t1071GfTi5duqTvfe972rJli77+9a+nup2kaWtrk81mU1dXl86cOaN9+/bpF7/4hRYv\nXpzq1pJi4cKFKi4ulsPhUFFRkbKzszU8PKy8vLxUt5YUv/vd71ReXq7HH39cg4OD2rZtm/70pz/J\n6XSmurWkuv3vXSAQ0IIFCyxrZs33cSdOnIg+/spXvqLf/OY3Kewmuf71r3/p+9//vn7+859r5cqV\nqW4nacrKytTZ2anKysqMvEf9zQ+nTz31lL74xS+mup2kOnr0aPTx1q1b9fTTT2dMYEvS6tWr1dLS\nou3bt2twcFD/+9//tGjRolS3lTS5ubnRw0Fut1sTExMKh8Mp7ir5PvOZz+jtt9/W5z//ef3973+P\n6e/ArAnt29lstrT+ivzjnn/+eY2Pj6uhoUGRSEQLFiyYdNwjXVVUVKirqyt6PD/TTkQ7cuSIrl27\npqamJr300kuy2Wx65ZVXMm5vw2aLbxrGdLBu3TqdPn1aVVVV0asoMunf4dvf/rZ++MMf6tFHH42e\nSZ5p5zJJ0r59+3TgwAFdv35dxcXFqqystKzh3uMAABgisw4gAgBgMEIbAABDENoAABiC0AYAwBCE\nNgAAhiC0AQAwBKENAIAh/h+zvw1TQgOgbwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "hist = plt.hist(x, bins=30, normed=True)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Notice that for equal binning, this normalization simply changes the scale on the y-axis, leaving the relative heights essentially the same as in a histogram built from counts.\n", "This normalization is chosen so that the total area under the histogram is equal to 1, as we can confirm by looking at the output of the histogram function:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "density, bins, patches = hist\n", "widths = bins[1:] - bins[:-1]\n", "(density * widths).sum()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "One of the issues with using a histogram as a density estimator is that the choice of bin size and location can lead to representations that have qualitatively different features.\n", "For example, if we look at a version of this data with only 20 points, the choice of how to draw the bins can lead to an entirely different interpretation of the data!\n", "Consider this example:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "x = make_data(20)\n", "bins = np.linspace(-5, 10, 10)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 2, figsize=(12, 4),\n", " sharex=True, sharey=True,\n", " subplot_kw={'xlim':(-4, 9),\n", " 'ylim':(-0.02, 0.3)})\n", "fig.subplots_adjust(wspace=0.05)\n", "for i, offset in enumerate([0.0, 0.6]):\n", " ax[i].hist(x, bins=bins + offset, normed=True)\n", " ax[i].plot(x, np.full_like(x, -0.01), '|k',\n", " markeredgewidth=1)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "On the left, the histogram makes clear that this is a bimodal distribution.\n", "On the right, we see a unimodal distribution with a long tail.\n", "Without seeing the preceding code, you would probably not guess that these two histograms were built from the same data: with that in mind, how can you trust the intuition that histograms confer?\n", "And how might we improve on this?\n", "\n", "Stepping back, we can think of a histogram as a stack of blocks, where we stack one block within each bin on top of each point in the dataset.\n", "Let's view this directly:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "(-0.2, 8)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\ntdfynlQojUYj1q5dG4sXL44rrrgi3nnnnbwnFVatVovrr78+lixZEt/5zndiy5YteU8qtKGhoViw\nYEFs27Yt7ymF9dBDD8XixYvjkksuiSeeeCLvOYVVq9Vi9erVsXjx4li6dGnT29S0BHdkZCTuuuuu\n6OzsnI5X3xIeffTR+OIXvxgbN26M9evXx7p16/KeVCibN2+OsbGxGBgYiNWrV/tXqiaxadOm6Ovr\ni9/85jfxy1/+Mm699da8JxVWrVaLtWvXRldXV95TCuull16KV199NQYGBmLjxo3x/vvv5z2psJ5/\n/vmo1+sxMDAQK1eujHvuuWfS66cluDfffHP86Ec/cqOexHe/+93xf/KwVqu5c3KIV155Jc4///yI\niDjrrLPijTfeyHlRcV100UWxatWqiIio1+vR3j4tP0CuJdx5551x2WWXxbx58/KeUlgvvPBCnHHG\nGbFy5cq4+uqr48tf/nLekwrr9NNPj4MHD0aj0Yjh4eE44YQTJr3+mD4yf/e738Wvf/3rCf/fJz7x\nifjGN74RZ555ZvghVv/0Uee0fv36+OxnPxuDg4Nx/fXXx5o1a3JaV0wjIyPR2/u/P+Ktvb096vV6\nlMu+7OBQM2bMiIh/ntmqVavi2muvzXlRMT355JPR398f5513Xjz44IN5zymsDz74IN57773YsGFD\nvPPOO3H11VfH008/nfesQuru7o533303Fi5cGLt3744NGzZMev2U/2jHr33ta3HSSSdFo9GI119/\nPc4666zYuHHjVL6JlvHmm2/GddddFzfccEN86UtfyntOodxxxx3xuc99LhYuXBgREQsWLIjnnnsu\n31EF9v7778c111wTS5cujYsvvjjvOYW0dOnSKJVKERGxdevWmD9/fjzwwAPR39+f87Ji+fnPfx79\n/f2xfPnyiIj45je/GY8++miceOKJ+Q4roDvuuCM6Ozvj2muvjR07dsQVV1wRf/jDH6Kjo+Mjr5/y\n556eeeaZ8d9fcMEF8cgjj0z1m2gJb731Vvzwhz+Me++9N84888y85xTO5z//+Xj22Wdj4cKF8dpr\nr8UZZ5yR96TC2rVrV6xYsSJuvvnmOPfcc/OeU1iPP/74+O+XLVsW69atE9uPcPbZZ8fGjRtj+fLl\nsWPHjti/f3/09fXlPauQZs+ePf4pnN7e3qjValGv1w97/bR+sqdUKnla+TDuvvvuGBsbi9tuuy0a\njUbMmjUr7rvvvrxnFcaFF14YL7744vjnuX3R1OFt2LAh9uzZE/fff3/cd999USqV4uGHHz7svWxi\n/JEu/27BggXx8ssvx6JFi8a/W8B5fbQrr7wybrrppliyZMn4VyxP9rVL/rUgAEjAV6AAQAKCCwAJ\nCC4AJCC4AJCA4AJAAoILAAkILgAk8P8AAbMWd9VicXcAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "bins = np.arange(-3, 8)\n", "ax.plot(x, np.full_like(x, -0.1), '|k',\n", " markeredgewidth=1)\n", "for count, edge in zip(*np.histogram(x, bins)):\n", " for i in range(count):\n", " ax.add_patch(plt.Rectangle((edge, i), 1, 1,\n", " alpha=0.5))\n", "ax.set_xlim(-4, 8)\n", "ax.set_ylim(-0.2, 8)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The problem with our two binnings stems from the fact that the height of the block stack often reflects not on the actual density of points nearby, but on coincidences of how the bins align with the data points.\n", "This mis-alignment between points and their blocks is a potential cause of the poor histogram results seen here.\n", "But what if, instead of stacking the blocks aligned with the *bins*, we were to stack the blocks aligned with the *points they represent*?\n", "If we do this, the blocks won't be aligned, but we can add their contributions at each location along the x-axis to find the result.\n", "Let's try this:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\nOQQugNRz8WDRxZrTjsAFkGqFI1wX48vFmtONwAWQasYYR7t2dLHmdCNwAaSckSG8EAMCF0DqOXmX\nMpyTCZrA9319//vf1/bt29XU1KSbb75ZZ555Zhy1AUDdGWOcvBrqYs1pF3iEu3nzZnmep1/+8pda\ntWqV7rrrrjjqAoBYFJ7DdRA9TTkn8Aj3C1/4gs4//3xJ0p49ezRlypS6FwUAcSkMQO9e5BK37gkM\nXElqamrS9773PT3zzDP68Y9/XO+aACBW7sUtXOQZE/68xKFDh3TxxRfrt7/9rdra2upZF2KWy+X0\nD//4B2VaWquex+SJzfrcuedEWBVQmd//0ys60per6D25XE7vHWtXe8ekOlVVH4O9ezVtysSSr3/i\nrNN1xumnSZLe2rZDb+14t+h0H85O1jlz//2Y3x07dkxPPftnNbe0jPxuzqwPac6Zs8a9/0+vvKHu\nw70V128Gc/r7L82v+H0uCzzCfeKJJ7R//35961vfUmtrq5qamtTUVP7Sb3d3T2QFJlU222lVOx07\ndkzb3x3QpKlTq57Hge6D+vi/i/472dZWtqKdpLd3HJbfmi07TUdHq/r6+kf9pl2STvqdA7wu7TtS\n+uW2t3drYttkSdJb2/Zo39HiOxS9vd36m1PHLjeHD7+nnQd8zfjw1JF28d7Zq2lTusa9/50d3erz\npldcft/hw4lZXrPZzlDTBQbuF7/4Rd1www1aunSp8vm81qxZo5ZRez1IhsKdmrWdWOOaEmAPU+Ln\nshMO/6rIndul5lF1V9QpvOkrMHDb29t1zz33xFELGiiK7u1SuP7AMiyCo4RsjFIPRdW7LdP4t6Lj\nC0gaDtya5xLBPIAasAiOMCX/UW7CAt8v0t1liXlU2+Rp/FMRuBjhZn+yAIJUGm7FxgguPY80Rmd1\nCFwM4RoukoClcJgp868gfpEzXqXOgtHi4RG4kMQg3EgG7iOoXNEgNZJCnvGq+pSyMRFdynIHgQtJ\nQytdyhZ+IMlqCTMjP2ze1iB9O/gELkZwDReuY5exuEqzt6IzXlU2uiePI1ykUxT9yfq+H1E1AGo1\nOszK3qRc4i7lcb8reQ23hiNpAhdpZIyRl65lHwmUtg14WaGfwy3yO1PksaAaP2fc27z0/b0IXEiK\nZkzQlK07gNXGrNFlV85idyQXucQU8QqexgtYBC4kVbhHC1iKnb7iqnkO9+RIjLxpPa7hIqWMqX2F\n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\n0/r163X22Weru7tb1113ndasWdOg6uzU29urzs4TXbxlMhn5vq+mJm47OFl7e7ukQputWrVK11xz\nTYMrstPjjz+urq4unXfeefrJT37S6HKsdfjwYe3du1cbNmzQrl27dNVVV+mpp55qdFlW6ujo0O7d\nu7Vw4UK9//772rBhQ9npI+/a8Utf+pJmzpwpY4xee+01zZ07Vxs3bozyIxLjzTff1LXXXqvrr79e\nn/3sZxtdjlVuv/12ffKTn9TChQslSQsWLNBzzz3X2KIstm/fPl199dVaunSpFi1a1OhyrLR06VJ5\nnidJ2rp1q2bPnq37779fXV1dDa7MLj/60Y/U1dWl5cuXS5K+8pWv6OGHH9b06dMbW5iFbr/9drW2\ntuqaa67R/v37dfnll+s3v/mNWlpaik4f+bmnp59+euTn888/Xw899FDUH5EI27Zt03e+8x3dc889\nOuussxpdjnU+9alP6dlnn9XChQu1ZcsWzZkzp9ElWevgwYNasWKFbrrpJs2bN6/R5Vjr0UcfHfl5\n2bJlWrduHWFbxDnnnKONGzdq+fLl2r9/v44fP65p06Y1uiwrTZkyZeQSTmdnp/L5vHzfLzl9XS/2\neJ7HaeUS7rrrLg0MDOjWW2+VMUaTJ0/Wvffe2+iyrHHBBRfoxRdfHLnOzU1TpW3YsEFHjhzRfffd\np3vvvVee5+nBBx8suZcNjRzpYrwFCxbo5Zdf1uLFi0eeFqC9irviiit044036rLLLhu5Y7ncvUuM\nFgQAQAy4AwUAgBgQuAAAxIDABQAgBgQuAAAxIHABAIgBgQsAQAwIXAAAYvD/AS5vVjRqV4IYAAAA\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x_d = np.linspace(-4, 8, 2000)\n", "density = sum((abs(xi - x_d) < 0.5) for xi in x)\n", "\n", "plt.fill_between(x_d, density, alpha=0.5)\n", "plt.plot(x, np.full_like(x, -0.1), '|k', markeredgewidth=1)\n", "\n", "plt.axis([-4, 8, -0.2, 8]);" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The result looks a bit messy, but is a much more robust reflection of the actual data characteristics than is the standard histogram.\n", "Still, the rough edges are not aesthetically pleasing, nor are they reflective of any true properties of the data.\n", "In order to smooth them out, we might decide to replace the blocks at each location with a smooth function, like a Gaussian.\n", "Let's use a standard normal curve at each point instead of a block:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\nHn/8cY2MjOgzn/mMnnnmGdOxXCkajWp0dFR33HGHFhcX9fjjj19y+4LPpfy7v/u72rdvn2zbVnNz\ns26++WY98cQThTxE2ejq6tLf/M3f6G//9m/1wQ9+0HQcV/nKV76iW265RXfccYck6dZbb9VLL71k\nNpSLTUxM6HOf+5wOHz6sP/iDPzAdx5UOHz4sy7IkSZ2dnTp48KC+/e1vq6amxnAyd/mnf/on1dTU\n6J577pEkfexjH9P3vvc97d2712wwF/rKV76iYDCo++67T1NTU7r77rv19NNPKxAIXHD7gl97evbZ\nZ9/882233aZ/+7d/K/QhykJvb6/+6q/+St/85jd14403mo7jOu9973v14osv6o477lBTU5NuuOEG\n05Fca3Z2Vp/+9Kf14IMP6v3vf7/pOK71H//xH2/++a677tLDDz9M2V7Ar//6r+uJJ57QPffco6mp\nKa2vr6u6utp0LFeqqqp68xZOPB5XJpNRLpe76PZFvdljWRaXlS/iG9/4hjY3N/XII4/Itm0lEgk9\n9thjpmO5xu23367jx4+/eZ+bh6Yu7vHHH9fy8rK+9a1v6bHHHpNlWfrud7970d+yoTfPdPE/3Xrr\nrWpoaNDHP/7xN98WYLwu7E/+5E/0D//wD7rzzjvffGL5Us8usTwfAAAO4AkUAAAcQOECAOAAChcA\nAAdQuAAAOIDCBQDAARQuAAAOoHABAHDA/wfgZJ23FcbXQwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from scipy.stats import norm\n", "x_d = np.linspace(-4, 8, 1000)\n", "density = sum(norm(xi).pdf(x_d) for xi in x)\n", "\n", "plt.fill_between(x_d, density, alpha=0.5)\n", "plt.plot(x, np.full_like(x, -0.1), '|k', markeredgewidth=1)\n", "\n", "plt.axis([-4, 8, -0.2, 5]);" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "This smoothed-out plot, with a Gaussian distribution contributed at the location of each input point, gives a much more accurate idea of the shape of the data distribution, and one which has much less variance (i.e., changes much less in response to differences in sampling).\n", "\n", "These last two plots are examples of kernel density estimation in one dimension: the first uses a so-called \"tophat\" kernel and the second uses a Gaussian kernel.\n", "We'll now look at kernel density estimation in more detail." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Kernel Density Estimation in Practice\n", "\n", "The free parameters of kernel density estimation are the *kernel*, which specifies the shape of the distribution placed at each point, and the *kernel bandwidth*, which controls the size of the kernel at each point.\n", "In practice, there are many kernels you might use for a kernel density estimation: in particular, the Scikit-Learn KDE implementation supports one of six kernels, which you can read about in Scikit-Learn's [Density Estimation documentation](http://scikit-learn.org/stable/modules/density.html).\n", "\n", "While there are several versions of kernel density estimation implemented in Python (notably in the SciPy and StatsModels packages), I prefer to use Scikit-Learn's version because of its efficiency and flexibility.\n", "It is implemented in the ``sklearn.neighbors.KernelDensity`` estimator, which handles KDE in multiple dimensions with one of six kernels and one of a couple dozen distance metrics.\n", "Because KDE can be fairly computationally intensive, the Scikit-Learn estimator uses a tree-based algorithm under the hood and can trade off computation time for accuracy using the ``atol`` (absolute tolerance) and ``rtol`` (relative tolerance) parameters.\n", "The kernel bandwidth, which is a free parameter, can be determined using Scikit-Learn's standard cross validation tools as we will soon see.\n", "\n", "Let's first show a simple example of replicating the above plot using the Scikit-Learn ``KernelDensity`` estimator:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "(-0.02, 0.22)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.neighbors import KernelDensity\n", "\n", "# instantiate and fit the KDE model\n", "kde = KernelDensity(bandwidth=1.0, kernel='gaussian')\n", "kde.fit(x[:, None])\n", "\n", "# score_samples returns the log of the probability density\n", "logprob = kde.score_samples(x_d[:, None])\n", "\n", "plt.fill_between(x_d, np.exp(logprob), alpha=0.5)\n", "plt.plot(x, np.full_like(x, -0.01), '|k', markeredgewidth=1)\n", "plt.ylim(-0.02, 0.22)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The result here is normalized such that the area under the curve is equal to 1." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### Selecting the bandwidth via cross-validation\n", "\n", "The choice of bandwidth within KDE is extremely important to finding a suitable density estimate, and is the knob that controls the bias–variance trade-off in the estimate of density: too narrow a bandwidth leads to a high-variance estimate (i.e., over-fitting), where the presence or absence of a single point makes a large difference. Too wide a bandwidth leads to a high-bias estimate (i.e., under-fitting) where the structure in the data is washed out by the wide kernel.\n", "\n", "There is a long history in statistics of methods to quickly estimate the best bandwidth based on rather stringent assumptions about the data: if you look up the KDE implementations in the SciPy and StatsModels packages, for example, you will see implementations based on some of these rules.\n", "\n", "In machine learning contexts, we've seen that such hyperparameter tuning often is done empirically via a cross-validation approach.\n", "With this in mind, the ``KernelDensity`` estimator in Scikit-Learn is designed such that it can be used directly within the Scikit-Learn's standard grid search tools.\n", "Here we will use ``GridSearchCV`` to optimize the bandwidth for the preceding dataset.\n", "Because we are looking at such a small dataset, we will use leave-one-out cross-validation, which minimizes the reduction in training set size for each cross-validation trial:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "from sklearn.grid_search import GridSearchCV\n", "from sklearn.cross_validation import LeaveOneOut\n", "\n", "bandwidths = 10 ** np.linspace(-1, 1, 100)\n", "grid = GridSearchCV(KernelDensity(kernel='gaussian'),\n", " {'bandwidth': bandwidths},\n", " cv=LeaveOneOut(len(x)))\n", "grid.fit(x[:, None]);" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Now we can find the choice of bandwidth which maximizes the score (which in this case defaults to the log-likelihood):" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "{'bandwidth': 1.1233240329780276}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid.best_params_" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "The optimal bandwidth happens to be very close to what we used in the example plot earlier, where the bandwidth was 1.0 (i.e., the default width of ``scipy.stats.norm``)." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Example: KDE on a Sphere\n", "\n", "Perhaps the most common use of KDE is in graphically representing distributions of points.\n", "For example, in the Seaborn visualization library (see [Visualization With Seaborn](04.14-Visualization-With-Seaborn.ipynb)), KDE is built in and automatically used to help visualize points in one and two dimensions.\n", "\n", "Here we will look at a slightly more sophisticated use of KDE for visualization of distributions.\n", "We will make use of some geographic data that can be loaded with Scikit-Learn: the geographic distributions of recorded observations of two South American mammals, *Bradypus variegatus* (the Brown-throated Sloth) and *Microryzomys minutus* (the Forest Small Rice Rat).\n", "\n", "With Scikit-Learn, we can fetch this data as follows:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "from sklearn.datasets import fetch_species_distributions\n", "\n", "data = fetch_species_distributions()\n", "\n", "# Get matrices/arrays of species IDs and locations\n", "latlon = np.vstack([data.train['dd lat'],\n", " data.train['dd long']]).T\n", "species = np.array([d.decode('ascii').startswith('micro')\n", " for d in data.train['species']], dtype='int')" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "With this data loaded, we can use the Basemap toolkit (mentioned previously in [Geographic Data with Basemap](04.13-Geographic-Data-With-Basemap.ipynb)) to plot the observed locations of these two species on the map of South America." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\nxC0QzFD+P0Qmdryva36JAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from mpl_toolkits.basemap import Basemap\n", "from sklearn.datasets.species_distributions import construct_grids\n", "\n", "xgrid, ygrid = construct_grids(data)\n", "\n", "# plot coastlines with basemap\n", "m = Basemap(projection='cyl', resolution='c',\n", " llcrnrlat=ygrid.min(), urcrnrlat=ygrid.max(),\n", " llcrnrlon=xgrid.min(), urcrnrlon=xgrid.max())\n", "m.drawmapboundary(fill_color='#DDEEFF')\n", "m.fillcontinents(color='#FFEEDD')\n", "m.drawcoastlines(color='gray', zorder=2)\n", "m.drawcountries(color='gray', zorder=2)\n", "\n", "# plot locations\n", "m.scatter(latlon[:, 1], latlon[:, 0], zorder=3,\n", " c=species, cmap='rainbow', latlon=True);" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Unfortunately, this doesn't give a very good idea of the density of the species, because points in the species range may overlap one another.\n", "You may not realize it by looking at this plot, but there are over 1,600 points shown here!\n", "\n", "Let's use kernel density estimation to show this distribution in a more interpretable way: as a smooth indication of density on the map.\n", "Because the coordinate system here lies on a spherical surface rather than a flat plane, we will use the ``haversine`` distance metric, which will correctly represent distances on a curved surface.\n", "\n", "There is a bit of boilerplate code here (one of the disadvantages of the Basemap toolkit) but the meaning of each code block should be clear:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Set up the data grid for the contour plot\n", "X, Y = np.meshgrid(xgrid[::5], ygrid[::5][::-1])\n", "land_reference = data.coverages[6][::5, ::5]\n", "land_mask = (land_reference > -9999).ravel()\n", "xy = np.vstack([Y.ravel(), X.ravel()]).T\n", "xy = np.radians(xy[land_mask])\n", "\n", "# Create two side-by-side plots\n", "fig, ax = plt.subplots(1, 2)\n", "fig.subplots_adjust(left=0.05, right=0.95, wspace=0.05)\n", "species_names = ['Bradypus Variegatus', 'Microryzomys Minutus']\n", "cmaps = ['Purples', 'Reds']\n", "\n", "for i, axi in enumerate(ax):\n", " axi.set_title(species_names[i])\n", " \n", " # plot coastlines with basemap\n", " m = Basemap(projection='cyl', llcrnrlat=Y.min(),\n", " urcrnrlat=Y.max(), llcrnrlon=X.min(),\n", " urcrnrlon=X.max(), resolution='c', ax=axi)\n", " m.drawmapboundary(fill_color='#DDEEFF')\n", " m.drawcoastlines()\n", " m.drawcountries()\n", " \n", " # construct a spherical kernel density estimate of the distribution\n", " kde = KernelDensity(bandwidth=0.03, metric='haversine')\n", " kde.fit(np.radians(latlon[species == i]))\n", "\n", " # evaluate only on the land: -9999 indicates ocean\n", " Z = np.full(land_mask.shape[0], -9999.0)\n", " Z[land_mask] = np.exp(kde.score_samples(xy))\n", " Z = Z.reshape(X.shape)\n", "\n", " # plot contours of the density\n", " levels = np.linspace(0, Z.max(), 25)\n", " axi.contourf(X, Y, Z, levels=levels, cmap=cmaps[i])" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Compared to the simple scatter plot we initially used, this visualization paints a much clearer picture of the geographical distribution of observations of these two species." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Example: Not-So-Naive Bayes\n", "\n", "This example looks at Bayesian generative classification with KDE, and demonstrates how to use the Scikit-Learn architecture to create a custom estimator.\n", "\n", "In [In Depth: Naive Bayes Classification](05.05-Naive-Bayes.ipynb), we took a look at naive Bayesian classification, in which we created a simple generative model for each class, and used these models to build a fast classifier.\n", "For Gaussian naive Bayes, the generative model is a simple axis-aligned Gaussian.\n", "With a density estimation algorithm like KDE, we can remove the \"naive\" element and perform the same classification with a more sophisticated generative model for each class.\n", "It's still Bayesian classification, but it's no longer naive.\n", "\n", "The general approach for generative classification is this:\n", "\n", "1. Split the training data by label.\n", "\n", "2. For each set, fit a KDE to obtain a generative model of the data.\n", " This allows you for any observation $x$ and label $y$ to compute a likelihood $P(x~|~y)$.\n", " \n", "3. From the number of examples of each class in the training set, compute the *class prior*, $P(y)$.\n", "\n", "4. For an unknown point $x$, the posterior probability for each class is $P(y~|~x) \\propto P(x~|~y)P(y)$.\n", " The class which maximizes this posterior is the label assigned to the point.\n", "\n", "The algorithm is straightforward and intuitive to understand; the more difficult piece is couching it within the Scikit-Learn framework in order to make use of the grid search and cross-validation architecture.\n", "\n", "This is the code that implements the algorithm within the Scikit-Learn framework; we will step through it following the code block:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "from sklearn.base import BaseEstimator, ClassifierMixin\n", "\n", "\n", "class KDEClassifier(BaseEstimator, ClassifierMixin):\n", " \"\"\"Bayesian generative classification based on KDE\n", " \n", " Parameters\n", " ----------\n", " bandwidth : float\n", " the kernel bandwidth within each class\n", " kernel : str\n", " the kernel name, passed to KernelDensity\n", " \"\"\"\n", " def __init__(self, bandwidth=1.0, kernel='gaussian'):\n", " self.bandwidth = bandwidth\n", " self.kernel = kernel\n", " \n", " def fit(self, X, y):\n", " self.classes_ = np.sort(np.unique(y))\n", " training_sets = [X[y == yi] for yi in self.classes_]\n", " self.models_ = [KernelDensity(bandwidth=self.bandwidth,\n", " kernel=self.kernel).fit(Xi)\n", " for Xi in training_sets]\n", " self.logpriors_ = [np.log(Xi.shape[0] / X.shape[0])\n", " for Xi in training_sets]\n", " return self\n", " \n", " def predict_proba(self, X):\n", " logprobs = np.array([model.score_samples(X)\n", " for model in self.models_]).T\n", " result = np.exp(logprobs + self.logpriors_)\n", " return result / result.sum(1, keepdims=True)\n", " \n", " def predict(self, X):\n", " return self.classes_[np.argmax(self.predict_proba(X), 1)]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### The anatomy of a custom estimator" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Let's step through this code and discuss the essential features:\n", "\n", "```python\n", "from sklearn.base import BaseEstimator, ClassifierMixin\n", "\n", "class KDEClassifier(BaseEstimator, ClassifierMixin):\n", " \"\"\"Bayesian generative classification based on KDE\n", " \n", " Parameters\n", " ----------\n", " bandwidth : float\n", " the kernel bandwidth within each class\n", " kernel : str\n", " the kernel name, passed to KernelDensity\n", " \"\"\"\n", "```\n", "\n", "Each estimator in Scikit-Learn is a class, and it is most convenient for this class to inherit from the ``BaseEstimator`` class as well as the appropriate mixin, which provides standard functionality.\n", "For example, among other things, here the ``BaseEstimator`` contains the logic necessary to clone/copy an estimator for use in a cross-validation procedure, and ``ClassifierMixin`` defines a default ``score()`` method used by such routines.\n", "We also provide a doc string, which will be captured by IPython's help functionality (see [Help and Documentation in IPython](01.01-Help-And-Documentation.ipynb))." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Next comes the class initialization method:\n", "\n", "```python\n", " def __init__(self, bandwidth=1.0, kernel='gaussian'):\n", " self.bandwidth = bandwidth\n", " self.kernel = kernel\n", "```\n", "\n", "This is the actual code that is executed when the object is instantiated with ``KDEClassifier()``.\n", "In Scikit-Learn, it is important that *initialization contains no operations* other than assigning the passed values by name to ``self``.\n", "This is due to the logic contained in ``BaseEstimator`` required for cloning and modifying estimators for cross-validation, grid search, and other functions.\n", "Similarly, all arguments to ``__init__`` should be explicit: i.e. ``*args`` or ``**kwargs`` should be avoided, as they will not be correctly handled within cross-validation routines." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Next comes the ``fit()`` method, where we handle training data:\n", "\n", "```python \n", " def fit(self, X, y):\n", " self.classes_ = np.sort(np.unique(y))\n", " training_sets = [X[y == yi] for yi in self.classes_]\n", " self.models_ = [KernelDensity(bandwidth=self.bandwidth,\n", " kernel=self.kernel).fit(Xi)\n", " for Xi in training_sets]\n", " self.logpriors_ = [np.log(Xi.shape[0] / X.shape[0])\n", " for Xi in training_sets]\n", " return self\n", "```\n", "\n", "Here we find the unique classes in the training data, train a ``KernelDensity`` model for each class, and compute the class priors based on the number of input samples.\n", "Finally, ``fit()`` should always return ``self`` so that we can chain commands. For example:\n", "```python\n", "label = model.fit(X, y).predict(X)\n", "```\n", "Notice that each persistent result of the fit is stored with a trailing underscore (e.g., ``self.logpriors_``).\n", "This is a convention used in Scikit-Learn so that you can quickly scan the members of an estimator (using IPython's tab completion) and see exactly which members are fit to training data." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Finally, we have the logic for predicting labels on new data:\n", "```python\n", " def predict_proba(self, X):\n", " logprobs = np.vstack([model.score_samples(X)\n", " for model in self.models_]).T\n", " result = np.exp(logprobs + self.logpriors_)\n", " return result / result.sum(1, keepdims=True)\n", " \n", " def predict(self, X):\n", " return self.classes_[np.argmax(self.predict_proba(X), 1)]\n", "```\n", "Because this is a probabilistic classifier, we first implement ``predict_proba()`` which returns an array of class probabilities of shape ``[n_samples, n_classes]``.\n", "Entry ``[i, j]`` of this array is the posterior probability that sample ``i`` is a member of class ``j``, computed by multiplying the likelihood by the class prior and normalizing.\n", "\n", "Finally, the ``predict()`` method uses these probabilities and simply returns the class with the largest probability." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### Using our custom estimator\n", "\n", "Let's try this custom estimator on a problem we have seen before: the classification of hand-written digits.\n", "Here we will load the digits, and compute the cross-validation score for a range of candidate bandwidths using the ``GridSearchCV`` meta-estimator (refer back to [Hyperparameters and Model Validation](05.03-Hyperparameters-and-Model-Validation.ipynb)):" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "from sklearn.datasets import load_digits\n", "from sklearn.grid_search import GridSearchCV\n", "\n", "digits = load_digits()\n", "\n", "bandwidths = 10 ** np.linspace(0, 2, 100)\n", "grid = GridSearchCV(KDEClassifier(), {'bandwidth': bandwidths})\n", "grid.fit(digits.data, digits.target)\n", "\n", "scores = [val.mean_validation_score for val in grid.grid_scores_]" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Next we can plot the cross-validation score as a function of bandwidth:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'bandwidth': 7.0548023107186433}\n", "accuracy = 0.966611018364\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.semilogx(bandwidths, scores)\n", "plt.xlabel('bandwidth')\n", "plt.ylabel('accuracy')\n", "plt.title('KDE Model Performance')\n", "print(grid.best_params_)\n", "print('accuracy =', grid.best_score_)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "We see that this not-so-naive Bayesian classifier reaches a cross-validation accuracy of just over 96%; this is compared to around 80% for the naive Bayesian classification:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/plain": [ "0.81860038035501381" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.naive_bayes import GaussianNB\n", "from sklearn.cross_validation import cross_val_score\n", "cross_val_score(GaussianNB(), digits.data, digits.target).mean()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "One benefit of such a generative classifier is interpretability of results: for each unknown sample, we not only get a probabilistic classification, but a *full model* of the distribution of points we are comparing it to!\n", "If desired, this offers an intuitive window into the reasons for a particular classification that algorithms like SVMs and random forests tend to obscure.\n", "\n", "If you would like to take this further, there are some improvements that could be made to our KDE classifier model:\n", "\n", "- we could allow the bandwidth in each class to vary independently\n", "- we could optimize these bandwidths not based on their prediction score, but on the likelihood of the training data under the generative model within each class (i.e. use the scores from ``KernelDensity`` itself rather than the global prediction accuracy)\n", "\n", "Finally, if you want some practice building your own estimator, you might tackle building a similar Bayesian classifier using Gaussian Mixture Models instead of KDE." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "\n", "< [In Depth: Gaussian Mixture Models](05.12-Gaussian-Mixtures.ipynb) | [Contents](Index.ipynb) | [Application: A Face Detection Pipeline](05.14-Image-Features.ipynb) >" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }