{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction\n", "\n", "This Jupyter Notebook introduces [Kernel Density Estimation](https://en.wikipedia.org/wiki/Kernel_density_estimation) (KDE) alongside with [KDEpy](https://kdepy.readthedocs.io/en/latest/).\n", "Kernel density estimation is an approach to solve the following problem.\n", "\n", "> **Problem.** Given a set of $N$ data points $\\{x_1, x_2, \\dots, x_N\\}$, estimate the probability density function from which the data is drawn.\n", "\n", "There are roughly two approaches to solving this problem:\n", "\n", "1. Assume a **parametric form**, e.g. a [normal distribution](https://en.wikipedia.org/wiki/Normal_distribution), and estimate the *parameters* $\\mu$ and $\\sigma$. These parameters uniquely determine the distribution, and are typically found using the [maximum likelihood principle](https://en.wikipedia.org/wiki/Maximum_likelihood_estimation). The advantage of this approach is that we only need to estimate a few parameters, while the disadvantage is that the chosen parametric form might not fit the data very well.\n", "2. Use **kernel density estimation**, which is a non-parametric method -- we let the data speak for itself. The idea is to place a *kernel function* $K$ on each data point $x_i$, and let the probability density function be given by the sum of the $N$ kernel functions.\n", "\n", "Assuming a parametric form is a perfectly valid approach, especially if there is evidence suggesting the presence of a theoretical distribution.\n", "However, for [exploratory data analysis](https://en.wikipedia.org/wiki/Exploratory_data_analysis) we might want to assume as little as possible when plotting a distribution, and this is where kernel density estimation and KDEpy comes to the rescue." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from scipy.stats import norm\n", "import matplotlib.pyplot as plt\n", "from KDEpy import FFTKDE # Fastest 1D algorithm\n", "\n", "np.random.seed(123) # Seed generator for reproducible results\n", "\n", "distribution = norm() # Create normal distribution\n", "data = distribution.rvs(32) # Draw 32 random samples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The histogram\n", "\n", "A KDE may be thought of as an extension to the familiar [histogram](https://en.wikipedia.org/wiki/Histogram). \n", "The purpose of the KDE is to estimate an unknown probability density function $f(x)$ given data sampled from it. \n", "A natural first thought is to use a histogram – it’s well known, simple to understand and works reasonably well.\n", "\n", "To see how the histogram performs on the data generated above, we'll plot the true distribution alongside a histogram. \n", "As seen below, the histogram does a fairly poor job, since:\n", "- The location of the bins and the number of bins are both arbitrary.\n", "- The estimated distribution is discontinuous (not smooth), while the true distribution is continuous (smooth)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = np.linspace(np.min(data) - 1, np.max(data) + 1, num=2**10)\n", "\n", "plt.hist(data, density=True, label='Histogram', edgecolor='#1f77b4', color='w')\n", "plt.scatter(data, np.zeros_like(data), marker='|', \n", " c='r', label='Data', zorder=9)\n", "plt.plot(x, distribution.pdf(x), label='True pdf', c='r', ls='--')\n", "plt.legend(loc='best');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Centering the histogram\n", "\n", "In an effort to reduce the arbitrary placement of the histogram bins, we center a *box function* $K$ on each data point $x_i$ and average those functions to obtain a probability density function.\n", "This is a (very simple) kernel density estimator.\n", "\n", "$$\\hat{f}(x) = \\frac{1}{N} \\sum_{i=1}^N K \\left( x-x_i \\right) \\quad \\text{ where } \\quad K = \\text{box function}$$\n", "\n", "Since each function $K$ has $\\int K \\, dx = 1$, we divide by $N$ to ensure that $\\int \\hat{f}(x) \\, dx = 1$.\n", "A kernel density estimator with $\\int \\hat{f}(x) \\, dx = 1$ and $\\hat{f}(x) \\geq 0$ for every $x$ is called a *bona fide* estimator.\n", "\n", "Enough theory -- let's see what this looks like graphically on a simple data set." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from KDEpy import TreeKDE\n", "np.random.seed(123)\n", "data = [1, 2, 4, 8, 16]\n", "\n", "# Plot the points\n", "plt.figure(figsize=(14, 3)); plt.subplot(1, 3, 1)\n", "plt.title('Data points')\n", "plt.scatter(data, np.zeros_like(data), marker='|', c='r', label='Data')\n", "\n", "# Plot a kernel on each data point\n", "plt.subplot(1, 3, 2); plt.title('Data points with kernel functions')\n", "plt.scatter(data, np.zeros_like(data), marker='|', c='r', label='Data')\n", "for d in data:\n", " x, y = TreeKDE(kernel='box').fit([d])()\n", " plt.plot(x, y, color='#1f77b4')\n", " \n", "# Plot a normalized kernel on each data point, and the sum\n", "plt.subplot(1, 3, 3); plt.title('Data points with kernel functions summed')\n", "plt.scatter(data, np.zeros_like(data), marker='|', c='r', label='Data')\n", "for d in data:\n", " x, y = TreeKDE(kernel='box').fit([d])()\n", " plt.plot(x, y / len(data), color='#1f77b4')\n", "x, y = TreeKDE(kernel='box').fit(data)()\n", "plt.plot(x, y, color='#ff7f0e');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let us grapically review our progress so far:\n", "\n", "1. We have a collection of *data points* $\\{x_1, x_2, \\dots, x_N\\}$.\n", "2. These data points are drawn from a *true probability density function* $f(x)$, unknown to us.\n", "3. A very simple way to construct an estimate $\\hat{f}(x)$ is to use a *histogram*.\n", "4. A *KDE* $\\hat{f}(x)$ *with a box kernel* is similar to a histogram, but the data chooses the location of the boxes.\n", "\n", "Looking at the graph below, we see that the KDE with a box kernel is the most promising estimate so far." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3XmczdX/wPHXmTGbGQyDCBkKEWOsyZaypBIpyhZSSqXUN5X69q1Iv1SKilJJG6Wi5IuK1HxDyr7vaWIsWWcwq5k5vz/OvbPembkz87lzl3k/H4/7uMvnc8/nPdt7zj2f83kfpbVGCCGEb/FzdwBCCCGsJ8ldCCF8kCR3IYTwQZLchRDCB0lyF0IIHyTJXQghfJAkdyGE8EGS3IUQwgdJchdCCB9UwV0Hrl69uo6MjHTX4YUQwitt3LjxlNa6RlH7uS25R0ZGsmHDBncdXgghvJJS6m9n9pNhGSGE8EGS3IUQwgdJchdCCB/ktjF3Ry5evEhcXBwpKSnuDkV4oODgYOrWrUtAQIC7QxHC43lUco+Li6NSpUpERkailHJ3OMKDaK05ffo0cXFxNGjQwN3hCOHxPGpYJiUlhYiICEnsIh+lFBEREfKpTggneVRyBySxiwLJ74YQzvO45C6EEKL0PGrM3ROEhYVx4cIFAJYtW8a4ceNYuXIlc+bM4YMPPqBGjRokJibSokULJk+eTLNmzQDo1q0bx44dIyQkBIArrriCBQsWFOvYGzZs4NNPP+Wtt94iJiaGwMBAOnbsCMDIkSPp06cPAwYMKPD9sbGx9OnThx07dpTkSy+Q/YKz6tWrW9puQWJiYpg6dSpLlixxav9OU37mSHyyZcevEx7CmgnXW9aeEO4gyb0AK1eu5OGHH2b58uVcdtllADz22GOMHz8egC+//JLrr7+e7du3U6OGuRJ43rx5tG3btsTHbNu2bdb7Y2JiCAsLy0ru3iojIwN/f3+XHuNIfDKxU262rL3ICUsta0sId5FhGQdWrVrF6NGjWbp0KZdffrnDfe6880569erF559/7nS7LVq0ID4+Hq01ERERfPrppwDcdddd/PTTT8TExNCnTx9iY2OZNWsW06ZNIzo6mlWrVgHw66+/0rFjRxo2bFjgp4L09HRGjBhBVFQUAwYMICkpCTD/rFq1akWLFi0YNWoUqampJCQk0KRJE/bu3QvA4MGD+eCDDwqMPzk5md69e2ftM3fuXNq3b090dDT3338/GRkZgPn089xzz3H11Vezdu1aIiMjef7552ndujUtWrRgz549ACQmJjJq1CjatWtHq1at+O6775z+XgohCue5PffvJ8Dx7da2WasF3Dil0F1SU1Pp168fMTExXHnllYXu27p166xEBTB06NCsYZmePXvy2muv5dq/U6dOrFmzhvr169OwYUNWrVrF8OHD+f3333n33Xezau1ERkYyZswYwsLCsj4pfPjhhxw7dozVq1ezZ88e+vbt63CIZu/evXz44Yd06tSJUaNG8c477zB27FhGjhzJypUrady4McOHD+fdd9/l0UcfZcaMGYwcOZJx48Zx9uxZRo8e7fBrvXDhAoMGDWL48OEMHz6c3bt38+WXX7JmzRoCAgJ48MEHmTdvHsOHDycxMZHmzZszadKkrPdXr16dTZs28c477zB16lRmz57NSy+9xPXXX8+cOXOIj4+nffv29OjRo9DvuRDCOdJzzyMgIICOHTvy4YcfFrmv1jrX83nz5rFlyxa2bNmSL7EDdOnShV9//ZVff/2VBx54gO3bt3PkyBGqVatGWFhYkce79dZb8fPzo1mzZvzzzz8O96lXrx6dOnUCYNiwYaxevZq9e/fSoEEDGjduDMCIESP49ddfAfNPqEWLFjz00EPMnj27wGP369ePu+++m+HDhwPmk8DGjRtp164d0dHRrFy5koMHDwLg7+/P7bffnuv9t912GwBt2rQhNjYWgOXLlzNlyhSio6Pp1q0bKSkpHDp0qMjvgxCiaJ7bcy+ih+0qfn5+fPXVV/To0YP/+7//45lnnilw382bNxdrjL1r167MnDmTQ4cO8dJLL/Htt9+yYMECunTp4tT7g4KCsh7n/cdil3e6oFKqwH0BMjMz2b17NyEhIZw5c4a6des63K9Tp058//33DBkyJKvNESNG8PLLL+fbNzg4ON84uz12f39/0tPTs76GhQsX0qRJk1z7FvSPSwjhPOm5O1CxYkWWLFnCvHnzCuzBL1y4kOXLlzN48GCn261Xrx6nTp1i//79NGzYkM6dOzN16lSHyb1SpUqcP3++2LEfOnSItWvXAvDFF1/QuXNnrrzySmJjYzlw4AAAn332Gddeey0A06ZNo2nTpnzxxReMGjWKixcvOmx30qRJ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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "np.random.seed(123)\n", "data = distribution.rvs(32)\n", "\n", "# Use a box function with the FFTKDE to obtain a density estimate\n", "x, y = FFTKDE(kernel='box', bw=0.7).fit(data).evaluate()\n", "\n", "plt.plot(x, y, zorder=10, color='#ff7f0e', label='KDE with box kernel')\n", "plt.scatter(data, np.zeros_like(data), marker='|', c='r', \n", " label='Data', zorder=9)\n", "plt.hist(data, density=True, label='Histogram', edgecolor='#1f77b4', color='w')\n", "plt.plot(x, distribution.pdf(x), label='True pdf', c='r', ls='--')\n", "plt.legend(loc='best');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Choosing a smooth kernel\n", "\n", "The true function $f(x)$ is continuous, while our estimate $\\hat{f}(x)$ is not.\n", "To alleviate the problem of discontinuity, we substitute the box function used above for a gaussian function (a normal distribution). \n", "\n", "$$K = \\text{box function} \\quad \\to \\quad K = \\text{gaussian function}$$\n", "\n", "The gaussian is smooth, and so the result of our estimate will also be smooth.\n", "This looks even better than our previous jagged estimate.\n", "\n", "> **Note (Kernel functions).** Many kernel functions are available, see `FFTKDE._available_kernels.keys()` for a complete list." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD8CAYAAACb4nSYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3Xd4VGX2wPHvSSd0QpMaOgQICQRQIIhIVYoNAQsoNlTU1XUtP+tiX12xoYioa0NUEAUFaYKA0gKE3gIGCC2QCqQn7++PO0AIKZNkJpNJzud55snMve+99wwkZ+68VYwxKKWUqhw8XB2AUkqpsqNJXymlKhFN+kopVYlo0ldKqUpEk75SSlUimvSVUqoS0aSvlFKViCZ9pZSqRDTpK6VUJeLl6gDyqlu3rgkMDHR1GEop5VY2btx4yhhTr6hy5S7pBwYGEhER4eowlFLKrYjIQXvKafWOUkpVIpr0lVKqEtGkr5RSlUi5q9PPT2ZmJjExMaSlpbk6FFUO+fn50aRJE7y9vV0dilLlnl1JX0SGAO8CnsAMY8zrBZS7CfgB6G6MibBtexq4C8gGHjbGLCpukDExMVSvXp3AwEBEpLiHqwrMGENcXBwxMTG0aNHC1eEoVe4VWb0jIp7AVGAoEASMFZGgfMpVBx4G1uXaFgSMAToCQ4APbecrlrS0NAICAjThq0uICAEBAfotUCk72VOn3wOIMsYcMMZkALOAkfmUewn4D5D7r28kMMsYk26M+RuIsp2v2DThq4Lo74ZS9rMn6TcGDud6HWPbdp6IhAJNjTG/FPdYpSoEY+Ddd+HVV2HePEhPd3VESuXLnqSf323U+YV1RcQDmAL8s7jH5jrHvSISISIRJ0+etCOksletWrXzzxcsWECbNm04dOgQL774Io0bNyYkJIQ2bdpwww03sHPnzvNl+/XrR7t27QgJCSEkJISbbrqp2NeOiIjg4YcfBmDFihX89ddf5/fdcccdzJ49u9Djo6Oj6dSpU7GvW5TAwEBOnTrl8PMWZMWKFQwbNqzMrmeX7Gzrpwh8/TU88wyMHAktW8Lcua6NTal82JP0Y4CmuV43AY7mel0d6ASsEJFo4HJgnoiE2XEsAMaY6caYMGNMWL16RY4idqlly5bx0EMP8dtvv9GsWTMAHn30USIjI9m3bx+jR4+mf//+5P7w+uabb4iMjCQyMrLIBJ2fsLAw3nvvPeDSpO+uss8lS3e2bh0EBcGePdbrVasgJQUWLICGDeGGG2DmTNfGqFQe9iT9DUAbEWkhIj5YDbPzzu00xiQZY+oaYwKNMYHAWmCErffOPGCMiPiKSAugDbDe4e+ijKxatYp77rmHX3/9lVatWuVbZvTo0QwaNIiZxfhj79y5M4mJiRhjCAgI4MsvvwTg9ttvZ+nSpefvcKOjo5k2bRpTpkwhJCSEVatWAbBy5Up69epFy5YtC/xQycrKYvz48QQHB3PTTTeRkpICWB9ioaGhdO7cmQkTJpCenk5SUhLt2rVjjy2ZjR07lk8++aTA+FNTUxkyZMj5Ml9//TU9evQgJCSE++6773yCr1atGs8//zw9e/ZkzZo1BAYG8sILL9C1a1c6d+7M7t27ATh79iwTJkyge/fuhIaG8vPPP9v9b1lmdu2CoUMhK8u6ywfw84MqVaztf/0Fzz4L117r2jiVyqPILpvGmCwRmQQswuqy+ZkxZoeITAYijDHzCjl2h4h8D+wEsoAHjTGlusX79/wd7DyaXJpTXCKoUQ1eGN6x0DLp6emMHDmSFStW0L59+0LLdu3a9XwCA7j11lupUqUKAAMHDuTNN9+8qHzv3r35888/ad68OS1btmTVqlWMGzeOtWvX8tFHH52fiygwMJCJEydSrVo1Hn/8cQA+/fRTjh07xurVq9m9ezcjRozItwppz549fPrpp/Tu3ZsJEybw4YcfMmnSJO644w6WLVtG27ZtGTduHB999BH/+Mc/+OCDD7jjjjt45JFHSEhI4J577sn3vZ45c4YxY8Ywbtw4xo0bx65du/juu+/4888/8fb25oEHHuCbb75h3LhxnD17lk6dOjF58uTzx9etW5dNmzbx4Ycf8tZbbzFjxgxeeeUV+vfvz2effUZiYiI9evRgwIABhf6bl6mzZ60qHB8fWLoU8usq6usLL71kPU9PhwMHoEOHso1TqXzYNSLXGLPAGNPWGNPKGPOKbdvz+SV8Y0y/c330ba9fsR3Xzhiz0HGhly1vb2969erFp59+WmRZYy5utshdvZM34QOEh4ezcuVKVq5cyf3338+2bds4cuQIderUuagtoSDXXXcdHh4eBAUFceLEiXzLNG3alN69ewNw2223sXr1avbs2UOLFi1o27YtAOPHj2flypWA9eHUuXNnHnzwQWbMmFHgtUeOHMmdd97JuHHjAOubw8aNG+nevTshISEsW7aMAwcOAODp6cmNN9540fE33HADAN26dSM6OhqAxYsX8/rrrxMSEkK/fv1IS0vj0KFDRf47lJnHH4eoKPjuu/wTfl7jxsGAARAX5/zYlCqCW4zIza2oO3Jn8fDw4Pvvv2fAgAG8+uqr/N///V+BZTdv3kxYWJjd5+7bty9Tp07l0KFDvPLKK8ydO5fZs2cTHh5u1/G+vr7nn+f9wDknb7dGESmwLEBOTg67du2iSpUqxMfH06RJk3zL9e7dm4ULF3LLLbecP+f48eN57bXXLinr5+eHp+fFwzTOxe7p6UlWVtb59zBnzhzatWt3UdmCPtDKVFYWHDtmJf4rr7TvmKeegu7drUbeadOcG59SRdC5d4rB39+fX375hW+++abAO/45c+awePFixo4da/d5mzZtyqlTp9i3bx8tW7akT58+vPXWW/km/erVq3P69Olix37o0CHWrFkDwLfffkufPn1o37490dHRREVFAfDVV19xpS2RTZkyhQ4dOvDtt98yYcIEMjMz8z3v5MmTCQgI4IEHHgDg6quvZvbs2cTGxgIQHx/PwYN2zfh63uDBg3n//ffPfyht3ry52O/Xaby8rF45r75q/zGhoTBpEkyfDuXpvahKSZN+MdWpU4fffvuNl19++XwD47mG1TZt2vD111/z+++/k7sX0q233nq+y2ZBddM9e/Y8X80SHh7OkSNH6NOnzyXlhg8fzty5cy9qyLVHhw4d+OKLLwgODiY+Pp77778fPz8/Pv/8c0aNGkXnzp3x8PBg4sSJ7N27lxkzZvDf//6X8PBw+vbty8svv1zgud955x3S0tJ44oknCAoK4uWXX2bQoEEEBwczcOBAjh07ZnecAM899xyZmZkEBwfTqVMnnnvuuWId7zRLl8K+fVbDrVcxvyS/+CIEBMCjjzolNKXsJYV9xXeFsLAwk3cRlV27dtFBG8FUIZz+O5KRAa1aWf3v//ijZOd4/3348ktYsgRq1XJsfKrSE5GNxpgi65X1Tl8pe3z9NcTEQCFtOUV64AFYv14TvnIpTfpKFSU7G15/Hbp2hUGDSn4eT0+raig+HspTbyRVqbhd7x2lytz8+VZd/g8/XBiIVVJZWdCpE/Trp6N1lUvonb5SRTl4ENq2heuuK/25vLxg9GjrA6SYDdxKOYImfaWK8sgjsHNn8XvsFOSBB6w7/kKmtlDKWTTpK1WYc3fjnsVe+6dgbdrAkCHw8cdQwPgHpZxFk74d4uLizvezb9iw4fmplENCQsjIyCjzeJ599lneeecdAHbu3EmXLl0IDQ09P42BcpD0dKv+/cknHX/uiRPh6FGwDZhTqqxoQ64dAgICiIyMBODFF1+8aMKzc4wxGGPw8Cjbz9Eff/yRm266qfwMYKpIFi60etpcdZXjz33NNVbjcOvWjj+3UoXQO/1SiIqKolOnTkycOJGuXbty+PBhauXqgz1r1izuvvtuwJo35oYbbiAsLIwePXqwdu3aS843Y8YMrr/+egYPHky7du0uGgU7efJk2rVrx8CBA9m3bx8A8+bN44MPPmDatGnlaxbKiuLrr6F+fWuyNEfz9taEr1zCPe/0+/W7dNvNN1sNZCkp1l1UXnfcYT1OnYK8Uw+vWFHiUHbu3Mnnn3/OtGnTzk8Ylp+HH36YJ554gssvv5zo6GiGDRvG9u3bLym3fv16tm/fjo+PD927d2fYsGFkZGQwZ84cIiMjycjIICQkhCuuuIIRI0awfv166tatyz/+8Y8SvweVj6Qk+OUXuO8+xzXg5nXmDIwfD8OGwZ13OucaSuXhnkm/HGnVqhXdu3cvstzSpUvPL0oCkJCQQGpq6vl59s8ZPHgwtWvXBqwpk1evXk1aWho33ngjVapUoUqVKgwfPtyxb0Jdas4cq07/ttucd42qVWH3bjhxQpO+KjPumfQLuzP39y98f926pbqzz6tq1arnn3t4eFw0XXFaWtr558YY1q9fj4+PT6Hny28K5Py2Kye7+WaoUQOKMUV2sYnALbdYK2zFxEAB01cr5Uh21emLyBAR2SMiUSLyVD77J4rINhGJFJHVIhJk2x4oIqm27ZEiUqEnE/fw8KB27drs27ePnJwc5uZaGHvAgAFMnTr1/OtzDcN5LV68mMTERFJSUvj555/p3bs3ffv25ccffyQtLY3k5GR++eUXp7+XSq9aNasa0NkftueqGn/80bnXUcqmyKQvIp7AVGAoEASMPZfUc5lpjOlsjAkB/gO8nWvffmNMiO0x0VGBl1dvvPEGQ4YM4eqrr75o4ZGpU6fy559/EhwcTFBQUIFrzvbp04dbbrmF0NBQxo4dS0hICD169OD666+nS5cujBo1ir59+5bV26mcfvoJ3nzTGkDlbO3aWd1C58xx/rWUwo6plUXkCuBFY8xg2+unAYwxly6NZO0fC4wzxgwVkUDgF2NMJ3sDqsxTK8+YMYPt27ef74Ov7OfQ35EBA+DwYau+vSyq1aZPt/rsv/BC2VxPVUj2Tq1sT51+Y+BwrtcxQM98Lvgg8BjgA/TPtauFiGwGkoFnjTGXrPwhIvcC9wI0a9bMjpCUcpL4eKvN51//KrsEfO+9ZXMdpbAv6ef3m3/J1wNjzFRgqojcAjwLjAeOAc2MMXEi0g34SUQ6GmOS8xw7HZgO1p1+Md9DhXGuT79yoV9+saZSvv76sr1uejps2gRXXFG211WVjj0NuTFA01yvmwBHCyk/C7gOwBiTboyJsz3fCOwH2pYsVKXKwNy50Lixc3vt5OeVVyA8HBISyva6qtKxJ+lvANqISAsR8QHGAPNyFxCRNrleXgvss22vZ2sIRkRaAm2AA44IXCmHM8a6yx81Csp4Og2GDrWuvWhR2V5XVTpFVu8YY7JEZBKwCPAEPjPG7BCRyUCEMWYeMElEBgCZQAJW1Q5AX2CyiGQB2cBEY0y8M96IUqUmAvPmWcm/rPXoYY0h+fVXGDOm7K+vKg27BmcZYxYAC/Jsez7X80cKOG4OoH3RlHvIyAAfH9f0oPH0tKZbXrjQuuN35FTOSuWiE67ZydPTk5CQEDp27EiXLl14++23ycnJKfSY6OhoZuqSeO7BGAgKgqefdl0Mw4ZBXBysW+e6GFSFp0nfTlWqVCEyMpIdO3awZMkSFixYwL///e9Cj9Gk70Z274b9+yEw0HUxXHMNrF0Ll1/uuhhUhVdxk36/fvnPxukA9evXZ/r06XzwwQcYY4iOjiY8PJyuXbvStWtX/vrrLwCeeuopVq1aRUhICFOmTCmwnCoHFi60fg4d6roYqleHnj3LvhFZVSruOeFaOdCyZUtycnKIjY2lfv36LFmyBD8/P/bt28fYsWOJiIjg9ddf56233jo/V05KSkq+5VQ5sHChVb3j6sGB+/fD22/DU09B06ZFl1eqmDTpl8K5KSwyMzOZNGkSkZGReHp6snfv3nzL21tOlbEzZ2DlSnjoIVdHYg3S+vBD6NJFR+oqp9CkX0IHDhzA09OT+vXr8+9//5sGDRqwZcsWcnJy8PPzy/eYKVOm2FVOlbGcHHjjDSgPE9l16GANDlu6VJO+cgpN+iVw8uRJJk6cyKRJkxARkpKSaNKkCR4eHnzxxRdkZ2cDUL16dU6fPn3+uILKKRerUQPKy8pjIjBwoDVeQLtuKifQFiM7paamnu+yOWDAAAYNGsQLL7wAwAMPPMAXX3zB5Zdfzt69e88vrBIcHIyXlxddunRhypQpBZZTLmSMNZf9yZOujuSCgQOtid82b3Z1JKoCKnJq5bJWmadWViVX4t+R/futBco/+AAefNDxgZVEbCyEhMC0aTBihKujUW7CkVMrK1Vx/f679fPqq10bR27168ORIzq3vnIKrd5RlduyZdCokbWCVXkiYlU9FTHqW6nicpukX96qoVT5UeLfjZwc606/f//yd1e9cyc0bw6LF7s6ElXBuEXS9/PzIy4uThO/uoQxhri4uJJ1f921y2rALU9VO+e0aGHV7S9Z4upIVAXjFnX6TZo0ISYmhpPlqYeFKjf8/PwuWoTebh07Wg25AQGOD6q0qlSBPn006SuHc4uk7+3tTYsWLVwdhqqIWrZ0dQQFGzjQmo4hNtZq3FXKAeyq3hGRISKyR0SiROSpfPZPFJFtIhIpIqtFJCjXvqdtx+0RkcGODF6pEsvMhHHjYPVqV0dSsKuusn7+8Ydr41AVSpFJ37bc4VRgKBAEjM2d1G1mGmM6G2NCgP8Ab9uODcJaXrEjMAT48NzyiUq5VEQEfPUVHD/u6kgK1rWrNXZAv+UqB7KneqcHEGWMOQAgIrOAkcDOcwWMMcm5ylcFzrW4jgRmGWPSgb9FJMp2vjUOiF2pklu2zPrppOm3HcLLyxo0ppQD2VO90xg4nOt1jG3bRUTkQRHZj3Wn/3BxjlWqzC1bZo16rVvX1ZEULicHtmyBpCRXR6IqCHuSfn4dmC/pO2mMmWqMaQU8CTxbnGNF5F4RiRCRCO2ho5wuNRX++qt8dtXMKyLC+nD67TdXR6IqCHuSfgyQezWHJsDRQsrPAq4rzrHGmOnGmDBjTFi9evXsCEmpUoiJgbZt3SPpd+1qrai1YoWrI1EVhD1JfwPQRkRaiIgPVsPsvNwFRKRNrpfXAvtsz+cBY0TEV0RaAG2A9aUPW6lSaNMGtm1z7dKI9vLygvBwTfrKYYpsyDXGZInIJGAR4Al8ZozZISKTgQhjzDxgkogMADKBBGC87dgdIvI9VqNvFvCgMUYnkVeuZUz5m3ahMP36wYIFVk+jhg1dHY1yc24xtbJSDpORAYGB8NxzcP/9ro7GPhs2QI8e8O23MGaMq6NR5ZROraxUfjZtgmPHwJ3ajkJDrTv9Pn1cHYmqADTpq8pl5UrrZ3i4a+MoDi8v92h/UG5Bk76qXFatsubOb9Dgos2xp9NYvOME+06cJjPH0LhWFa5oFUBo01pIeaj/P3QIvvjCWiw9T+xKFYcmfVV55ORYc+3cdNP5TfFnM3hr8R6+23CY7BxDNV8vfL08iDubAUD7htV5+poOXNnWxdVBsbHw/PNWzyOt11eloElfVR6pqdZcNn37AhB5OJH7v97IydPp3NazGbdd3pzW9ashIiSmZPDb9uNM+2M/4z9bzw2hjXn5+k74+7joTyYkBKpVs76paNJXpaC9d1SltPFgPOM+XU/tqj58dGs3OjepmW+59KxsPly+n/d+30e7BtX53509aFizBAu2OMLgwVYj9Natrrm+Ktfs7b3jFitnKeUQO3ZASgq7jycz7tP11K/hx5z7exWY8AF8vTx5dGBb/ndnD2ISUhk9fQ0xCSllGHQu4eGwfTskJLjm+qpC0KSvKgdjYMAAEic+xL1fbqSqrxff3nM5DWrYd9d+Zdt6fHVXD+LPZjBm+lpik9OcHHA+wsPBz89a5lGpEtKkryqHqCjM8eM82Xoox5JS+ei2bsWupgltVpuv7+pJ3JkMJnyxgbPpWU4KtgC9e0NiIvTqVbbXVRWKJn1VOaxcybwOfVmUUoXHB7WjW/PaJTpNl6a1mHprKDuPJvPgzE1k55Rhm5iXF/j4lN31VIWkSV9VCvGr1/HCoAcIbVqLu8NLty5u//YNmDyyEyv2nGTKkr0OitBOv/4Kl18OKS5qV1BuT5O+qhTeSa7NaV9/3rgpGE+P0g+2uu3y5twc1oQPlkexbNcJB0RoJxFYt856KFUCmvRVhbfveDLftO3LLa2r0rZBdYedd/LITnRsVINHv4vkUFwZ3Xn36mUl/lWryuZ6qsLRpK8qvFcX7sbf14tHb3HshGV+3p5Mu60bAA/P2kxmdo5Dz5+vWrUgOFiTvioxTfqqQtt0KIHle07y4GVZ1Knq+EbQpnX8efWGzkQeTuS9ZfuKPsARwsOt5R4zM8vmeqpC0aSvKrT3l+2jdsZZbp/3sdOuMSy4EaO6WfX7aw/EOe065w0ZYj0SE51/LVXh2JX0RWSIiOwRkSgReSqf/Y+JyE4R2Soiy0Skea592SISaXvMy3usUs6yNSaR5XtOcvea2VTtc4VTr/XiiI4EBlTl0e8iSUpx8h34tdfCnDnutSaAKjeKTPoi4glMBYYCQcBYEQnKU2wzEGaMCQZmA//JtS/VGBNie4xwUNxKFWnq8ihqehrGbfrF6fPnV/X14t0xIZw8nc7Tc7dSJnNaJSU5/xqqwrHnTr8HEGWMOWCMyQBmASNzFzDGLDfGnOu+sBZo4tgwlSqeQ3EpLN55gtsyDlJdcqB7d6dfM7hJLf45qB0Lth3n+4jDzr3YE09Aq1bWdNFKFYM9Sb8xkPs3OMa2rSB3AQtzvfYTkQgRWSsi1+V3gIjcaysTcfLkSTtCUqpw//srGk8Rbt+1zBrM5OtbJte9r29LerUK4MV5O4mKPeO8C3XoAHFxOg+PKjZ7kn5+I1ny/e4qIrcBYcCbuTY3s033eQvwjoi0uuRkxkw3xoQZY8LqaT2lKqXTaZl8H3GYa4Mvo+H8OTB3bpld28NDmDI6hCo+njz07WbSMrOdc6Fz1VXadVMVkz1JPwZomut1E+Bo3kIiMgB4BhhhjEk/t90Yc9T28wCwAggtRbxKFWn2xhjOpGdxZ+8W1kCm2iWbZ6ekGtTw461Rwew6lszrC3c75yKtWsFll2nSV8VmT9LfALQRkRYi4gOMAS7qhSMiocDHWAk/Ntf22iLia3teF+gN7HRU8ErlZYzhqzUHCW1Wi5C5X8I991jTKpex/u0bcGfvQP73VzRLdzphmgYR625/5UqXvD/lvopM+saYLGASsAjYBXxvjNkhIpNF5FxvnDeBasAPebpmdgAiRGQLsBx43RijSV85zYboBA6cOsutPZvD7NmwZYuVIF3gqaHtCbqsBv+avYXjSU6Yf/++++Dll7UxVxWLLpeoKpTHvo9kyY4TrPtnH/zrB8CkSfDWWy6LZ//JMwx7bzVdmtbk67t64uWp4yGVc+hyiarSSUrNZMG2Y4wIaYT/lk2Qnu70/vlFaVWvGi9d14m1B+J54zcn1O/v2QN//OH486oKy8vVASjlKPO2HCUtM4exPZrB/2w1jH0cO8laSdzUrQlbYxL5ZNXfdGxUk+tCC+vxXEz//CdERcFuJzUYqwpH7/RVhfHdhkN0bFSDTo1rQrVqMHw4BAS4OiwAnhsWRI8WdXhyzla2xThwJG14uHW3HxtbdFml0KSvKojtR5LYfiSZMd1tvYsfeQTmlZ+pnrw9Pfjw1q4EVPXh3q8iOJaU6pgT9+1r/dSum8pOmvRVhTBnUww+Xh6MCGls1eWXwx4tdav58sn4ME6nZTH+s/UkpmSU/qTdukGVKlbXTaXsoElfub3sHMOvW49xVbt61KziDVOnQv365XLq4Y6NajL99m5En0rhri8iSM0o5YhdHx+44gpN+spumvSV29sQHU/s6XSGd2lkbVi1CmrWtFaZKod6ta7LO2NC2HQogQn/20BKRlbpTvjRR7B0qWOCUxWeJn3l9uZvOUoVb0/6t69vVeusWnWhrrucuqbzZbx9cxfW/R3H+M/WczqtFHPwt21bbhqsVfmnSV+5tazsHBZuP86AoAb4+3hZs07GxZX7pA9wfWgT3hsbyqZDidzyyTpik0sxavftt+F//3NYbKri0qSv3Npf++OIP5vB8ODLrA3nerG4eFCWvYYFN2L67d3Yf/IMI6f+yY6jJezOOWcOTJ/u2OBUhaRJX7m1+VuOUt3Piyvb2abkDguD556zZqF0E1d3aMAPE6/AGBg1bQ0/boop/kn69oUNGyAlpeiyqlLTpK/cVnpWNr/tOM6goIb4enlaG8PCYPJkl02yVlIdG9Xk50m96dSoJo99v4XHvo/kbHoxGnjDwyErC9atc16QqkLQpK/c1sq9pzidlsXwLraqnVOn4M8/IcMB/d9doEENP2be05NHrm7DT5uPMPTdVfwZdcq+g3v3tj7otOumKoImfeW2ftl6lNr+3vRuXdfa8Ouv1lw7e/e6NrBS8PL04NGBbZl17xV4egi3zljHv37YUvRArpo1oWdPSEgom0CV29IJ15RbSs3IZsnOE1wX2hjvc9MVr1wJdepAUJBrg3OAHi3qsPCRcN5bto+PVx5g+Z5YnhsWxIgujZCCqq7+/BM89D5OFc6u3xARGSIie0QkSkSeymf/YyKyU0S2isgyEWmea994Edlne4x3ZPCq8vp9dywpGdkMO9drB6ykHx5eYRKfn7cnTwxpz/xJfWhcqwqPzIpk3GfrORh3Nv8DKsj7Vs5V5G+JiHgCU4GhQBAwVkTy3kptBsKMMcHAbOA/tmPrAC8APYEewAsiUrYLlqoKaf6Wo9Sr7kvPFrZBSceOWVMMu0H//OIKalSDHx/ozb9HdGTzoUQGTVnJ1OVRZGTlmV8oPd2q23/7bdcEqtyCPbcGPYAoY8wBY0wGMAsYmbuAMWa5MeZcX7G1WIunAwwGlhhj4o0xCcASYIhjQleV1em0TJbvieXazpfh6WGr6nCz/vnF5ekhjO8VyNLHruTqDvV5c9Eern1vFev/jr9QyNcX4uNh2TLXBarKPXuSfmPgcK7XMbZtBbkLWFjCY5Uq0tJdJ0jPyrnQawdgxAireic01HWBlYGGNf348NZufDo+jJSMbG7+eA1P/7jtwvw9fftadfvZpZzITVVY9iT9/FqN8l1YV0RuA8KwFkq3+1gRuVdEIkQk4uSg9xZ6AAAgAElEQVTJk3aEpCqz+VuO0bhWFUKb5qop9POz7vK9KkffhKs7NGDJY325J7wFszYcYsQHf7L7eLKV9JOSYNs2V4eoyil7kn4M0DTX6ybA0byFRGQA8AwwwhiTXpxjjTHTjTFhxpiwevXq2Ru7qoQSUzJYufckw4Ivw+Nc1U5CAjzxhFt31SwJfx8vnrk2iK/v6kliSiYjP/iT2fU7WTu1v74qgD1JfwPQRkRaiIgPMAa4aEkiEQkFPsZK+LnXbVsEDBKR2rYG3EG2bUqVyKIdx8nKMRemUQZYvRrefBOOH3ddYC7Uu3VdFj4STrfmtXl8WQxvTXoT0zzQ1WGpcqrIpG+MyQImYSXrXcD3xpgdIjJZREbYir0JVAN+EJFIEZlnOzYeeAnrg2MDMNm2TakSmb/lGIEB/nRsVOPCxpUrrcVEevRwXWAuVq+6L19M6MGY7k35oGoH/pHalMzs8rd6mHI9uypAjTELgAV5tj2f6/mAQo79DPispAEqdc7J0+n8tf8UD17V+uIBSitWWKNR/fxcFlt54O3pwWs3dKZpHX/eXLSHjNR03hvX48LgNaXQaRiUG1m4/Rg5hourdhITYdMmuOoq1wVWjogIDwZ68tyy6SzcE8ekmZsu7c+vKjVN+spt/LLlGO0aVKdtg+oXNu7bZ80707+/6wIrbwIDuevwOp5P2MiiHSd4as5WjMm3w52qhDTpK7dwLCmV9dHxF0+7ANC9O5w8aU20piwicNVVTJg/jccGtOHHzUeYsnSfq6NS5YQmfeUWft16DIBhuat2zvH0tB7qgv794dgxHmqczc1hTXhv2T6+jzhc9HGqwtOkr9zC/C1H6dy4Ji3qVr2wMS4OOnSABQsKPrCyslV3yYoVvHJ9Z8Lb1OXZudvZGpPo4sCUq2nSV+XeobgUtsQkXVq188cfsHu3VaevLtaypbVQ+rBheHt68N6YUOpV9+X+rzeRcNY9F5lRjqFJX5V787dag7ivzZv0ly8Hf3+rXl9dTATGj4em1oD42lV9+PDWrpw8nc6j30eSk6MNu5WVJn1V7s3fcpRuzWvTpLb/xTuWL7cacH18XBNYeZeUBJ99BgcOANClaS2eGx7Eij0n+d9f0a6NTbmMJn1VrkXFnmb38dMMz3uXf+IE7Nih/fMLk5wMd90FP/98ftNtPZsxoEN93vhtN1Gxp10YnHIVTfqqXJu/5RgicE3nPEk/NRXGjYPBg10TmDto2hTatIHffz+/SUR47YZgqvp68eh3W3SqhkpIk74qt4wxzN96lJ4t6lC/Rp4pFgID4YsvKvz8+aXWv781N1FW1vlN9ar78ur1ndh2JImpy6NcGJxyBU36qtzacTSZAyfPMqJLPuvuHDgAOsq0aP37W9U8mzZdtHlIp8sY3qURHy7fz/6TZ1wUnHIFTfqq3Jq35SjensLQTg0v3nH0KLRqBVOnuiYwd9Kvn/Vz48ZLdj03rAN+3h48M3ebTtNQiWjSV+VSTo5h/paj9G1Tj9pV8/TOObcGbO/eZR+Yu6lfH2Jj4f77L91V3Y+nhnZg7YF4Zm+McUFwyhU06atyaUN0PMeS0hgRks+0C4sXQ7160KVL2QfmjgpZjW5M96aENa/NKwt2Ea+DtioFTfqqXJq35ShVvD0Z0KHBxTtycmDJEhg4EDz019cu0dEwcqS1YHoeHh7CK9d35nRaFlOWVK7lJisru/5qRGSIiOwRkSgReSqf/X1FZJOIZInITXn2ZdtW0zq/opZShcnMzmHBtmMMCGpAVd886/xs22b10R840DXBuaM6daz5iX79Nd/d7RpW59aezfhm3UH2HNe++xVdkUlfRDyBqcBQIAgYKyJBeYodAu4AZuZzilRjTIjtMSKf/UpdZHXUKRJSMhmR34yaLVvC7NlwzTVlH5i7qlEDrrgCFhW8PPWjA9pS3c+bl37ZqY26FZw9d/o9gChjzAFjTAYwCxiZu4AxJtoYsxXQkR6q1OZFHqWGnxd929a9dGf16nDjjVYDpbLf4MFWt83Y2Hx3167qw6MD2rA66hRLd+VfRlUM9iT9xkDuibhjbNvs5SciESKyVkSuy6+AiNxrKxNx8uTJYpxaVTSpGdks3nGcazpfhq9XnjnyU1PhP/+BgwddE5w7GzTI+rl0aYFFbr28Oa3rV+OVX3eSnpVdRoGpsmZP0pd8thXn+18zY0wYcAvwjoi0uuRkxkw3xoQZY8LqFdLTQFV8v++O5WxGdv5VO6tXw5NPwq5dZR+Yu+vWDa6+Gnx9Cyzi7enBs9d2IDouhZnrDpVhcKos2ZP0Y4CmuV43AY7aewFjzFHbzwPACkDHzasCzdkUQ8MafvRsGXDpzsWLrRk1+/Yt+8DcnYeHdZd/442FFruybT2uaBnAB79HcSY9q9Cyyj3Zk/Q3AG1EpIWI+ABjALt64YhIbRHxtT2vC/QGdpY0WFWxxZ5O44+9J7m+a2M8PfL5grl4sTWVsr//pfuUfVJT4XTBPXREhCeHtifubAYzVh0ow8BUWSky6RtjsoBJwCJgF/C9MWaHiEwWkREAItJdRGKAUcDHIrLDdngHIEJEtgDLgdeNMZr0Vb5+3nyU7BzDjV2bXLrz+HHYuvVC3bQqvoQECAiAjz4qtFhI01oM7dSQT1Ye4NSZ9DIKTpUVu/rpG2MWGGPaGmNaGWNesW173hgzz/Z8gzGmiTGmqjEmwBjT0bb9L2NMZ2NMF9vPT533VpQ7M8Ywe2MMoc1q0bp+tUsLREaCt7dOpVwatWtbcxYtXlxk0ccHtyMtK4cPftdZOCsaHdKoyoUdR5PZc+J0/nf5AEOGwKlTOvVCaQ0eDKtWwdmzhRZrVa8ao7o14Zt1Bzkcn1JGwamyoElflQuzN8bg4+XB8OB8eu2cU6OGtfarKrmhQyEj46KFVQryjwFt8RDR6RkqGE36yuUysnL4OfIIg4IaUNPf+9ICK1ZYM2pGaVVDqYWHWwPc5s8vsmjDmn6M7xXIT5FHiIrVOfcrCk36yuV+332ChJRMbupWQNXO/PkQEQENG+a/X9nPxwc++QQefNCu4vf1bYmftyfvLtvn5MBUWdGkr1zum3WHuKymH31a5zPtAlgThfXrB9XyaeBVxTd6tN1tIwHVfLmjVyC/bD2qk7FVEJr0lUsdjDvLqn2nGNO9GV6e+fw67t8Pe/bAsGFlH1xFtnBhgbNu5nVPeEuq+njx7jKt268INOkrl5q5/hCeHsLo7k3zL3AuMV17bdkFVRm89BK88IJdRWtX9WFC70AWbDvOzqPJTg5MOZsmfeUy6VnZ/BARw4AO9WlY0y//QoGBcNdd1pTKynGGD7fWzT1q34wqd/VpSXU/L95Zqnf77k6TvnKZ37YfJ/5sBrf2bF5woREjYMaMsguqsjhXXWZnFU9Nf2/u7tOSxTtPsC0myYmBKWfTpK9c5pu1h2hWx7/gBtz9+0Gn2naOTp2gWTO7um6ec2efQGpW8da7fTenSV+5xK5jyayPjueWns3wyG9yNbCmUe7WDXQlJ8cTsdbN3bkTsu2bO7+Gnzf39m3Jst2xRB5OdHKAylk06SuX+HT131Tx9mRMQQ24KSlWD5Nhw3QUrrO8+irs3QuenkWXtRnfK5A6VX10lK4b06Svylxscho/Rx5hVFgTavn75F9o8WIr8d9wQ9kGV5lUq2bNs1+Mb1LVfL24r29L/th7ko0H450YnHIWTfqqzH255iBZOYYJvVsUXGjuXGtWyCuvLLvAKqNZs6BdO2uefTvdfkVz6lbz4b+L9W7fHWnSV2UqNSObr9cdZGCHBgTWrZp/oawsq4Fx+HBrOmXlPAEBsG8fLFpk9yH+Pl7c3681f+2PY83+OCcGp5zBrqQvIkNEZI+IRInIU/ns7ysim0QkS0RuyrNvvIjssz3GOypw5Z5mbzxMYkomd4cX0u/ey8vqQ/7ss2UXWGXVrx/UqQNz5hTrsFt7NqNBDV/eXrIHow3tbqXIpC8insBUYCgQBIwVkaA8xQ4BdwAz8xxbB3gB6An0AF4QkdqlD1u5o4ysHKb9cYDQZrXoHljEr0GLFtCmTdkEVpl5e1u9eObNg3T7V8ny8/Zk0lWt2RCdwKp9p5wYoHI0e+70ewBRxpgDxpgMYBYwMncBY0y0MWYrkJPn2MHAEmNMvDEmAVgCDHFA3MoNzdkUw5HEVB65ug1SUI+cjAy49VZYs6Zsg6vMbrwRkpOthdOL4ebuTWlcqwr/XbJX7/bdiD1JvzFwONfrGNs2e5TmWFWBZGbnMHV5FF2a1OTKtvUKLrh4McycCfHaM6TMDBgA995rDdYqBl8vTx6+ujVbDieybFesk4JTjmZP0s/vlszej3W7jhWRe0UkQkQiTuoIzApp7uYjxCSk8nBhd/kA335r1TEPHFh2wVV2vr7w8cfQuXOxD72haxOaB/jz9pK95OTo3b47sCfpxwC5R9A0AeybpcnOY40x040xYcaYsHr1CrkLVG4pPSubD36PomOjGvRvX7/ggmfPwk8/wahR1mIfquwYA5s3w6ZNxTrM29ODR65uw85jySzacdxJwSlHsifpbwDaiEgLEfEBxgDz7Dz/ImCQiNS2NeAOsm1TlcjXaw9xKD6Ffw1uV/hd/vz51oCssWPLLjhlMcZq0H3uuWIfOjKkMa3qVWXK0r1k691+uVdk0jfGZAGTsJL1LuB7Y8wOEZksIiMARKS7iMQAo4CPRWSH7dh44CWsD44NwGTbNlVJJKVm8v7v++jTum7hdflgjQ7t399ax1WVLQ8PqwF90aJiT3Ln6SE8OrAte0+c4Zet9lYCKFeR8tbqHhYWZiIiIlwdhnKQ1xbsYvqqA/zyUB86Nqrp6nBUYXbssGbffP99mDSpWIfm5BiueW8V6Vk5LHm0b/6roCmnEpGNxpiwosrp/4xymsPxKXz+VzTXhzYuOuHv3QtpaWUTmMpfx47W2rlffVXsQz1sd/t/nzrL3M1HnBCcchRN+sopjDG8MG8HXh7Cvwa3K6owXHedVaesXGv8eNi1C44Xv1F2UFADOjeuyXu/7yMzO++QHVVeaNJXTrFox3F+3x3LYwPbclnNKoUXXrvWSjSjRpVNcKpg99xjLaHYsGGxDxURHhvUlsPxqXy7/pATglOOoElfOdyZ9CxenLeTDpfV4I5egUUf8Nln4O8Po0c7PTZVhGrVrIcxkFP8u/V+betxecs6vLt0H6fTMp0QoCotTfrK4d78bTcnTqfx6vWdim7QO3PGmt735puhevWyCVAV7tgxa6DWzJlFl81DRPi/azoQdzaDj/844ITgVGlp0lcOtXLvSb5Yc5DxVwQS2syOufUWLLAS/113OT84ZZ+GDa3J1z75pESHBzepxYgujZix+gDHk7RxvrzRpK8cJuFsBo//sIU29avx1ND29h00ahSsWwe9ezs3OGU/Ebj7bli50mprKYF/DW5HTg68vWSPg4NTpaVJXzmEMYZnftpGQkoGU0aH4Odt57qrItCjh66DW97ceac1J8/775fo8KZ1/Bl3RXNmb4xh9/FkBwenSkOTvnKIz/+MZsG24zw2sB2dGts5COuOO3ShlPKqfn1rhO4XX5R4xtNJ/VtTzdeL1xfudnBwqjQ06atSW3sgjlcW7GJgUAPu61vIili5HTpkDQLKynJucKrk/vUvmD7d6s1TArX8fZjUvzUr9pxkxR6derm80KSvSuVYUiqTZm6ieR1//ntzFzw87KymmTrV+vnAA84LTpVO+/bW3X4pZjwd3yuQlnWr8u/5O0nPynZgcKqkNOmrEktOy+TOzzeQlpnDx7d3o4afnYuYJybCtGnWik3FXLhDlbH0dHjjDWsG1BLw9fLkhREd+fvUWT5bHe3Y2FSJaNJXJZKelc19X24kKvYM027rRpsGxehj/+GH1vJ8Tz/tvACVY3h7w+efW1Mul2CwFsCVbesxMKgB7/++j2NJqQ4OUBWXJn1VbFnZOTz2/RbWHIjjzVHB9GlTt3gnuOEG+O9/ITTUOQEqx/HwgGeegS1brMXTS+j5YUFk5RheXaCNuq6mSV8VS1Z2Do9+v4Vftx7jmWs6cH1ok+KfpH17eOwxxwennGPsWGjdGiZPtqZnKIGmdfy5/8pWzN9ylL+iTjk4QFUcmvSV3bKyc/jnD1uYv+UoTw5pzz329tQ5JyXF6qa5W+/23IqXl3W3v3lziev2Ae7v14rmAf48PXcbqRnaqOsqdiV9ERkiIntEJEpEnspnv6+IfGfbv05EAm3bA0UkVUQibY9pjg1flZW0zGwe+nYzP0ce5Ykh7bi/X6vin+T9961+36f0Ts/t3HYb3H47XHZZiU/h5+3Jazd05mBcClOW7nVgcKo4vIoqICKewFRgINZC5xtEZJ4xZmeuYncBCcaY1iIyBngDODdl4n5jTIiD41ZlKCk1k3u/jGDd3/E8e20H7g4v5h0+QEICvP46XHst9Onj+CCVc3l5wZdflvo0vVrVZWyPpsxYdYBhwZcR3KSWA4JTxWHPnX4PIMoYc8AYkwHMAvKudjES+ML2fDZwtRS6ArZyF8eSUhn98Ro2HUrg3TEhJUv4AP/5DyQlwauvOjZAVbaOH4cnnyzVKmdPDe1Aveq+PDF7KxlZuthKWbMn6TcGDud6HWPblm8Z20LqSUCAbV8LEdksIn+ISL4rXovIvSISISIRJ4u5KLNyno0H4xn+/p8cjk/hszu6MzIk73+7nQ4cgClT4JZbIDjYsUGqsrVjh/UBXsI5eQBqVvHm5es6s/v4ad5bts+BwSl72JP087tjz9uEX1CZY0AzY0wo8BgwU0RqXFLQmOnGmDBjTFi9evXsCEk523cbDjFm+lqq+noy98HehLcpxf9LvXrwj39Yg3yUe7v6arjmGnjlFThxosSnGRjUgJu6NeHDFVGs/7tkc/uokrEn6ccATXO9bgIcLaiMiHgBNYF4Y0y6MSYOwBizEdgPtC1t0Mp5MrNzeOHn7Tw5ZxuXtwzg5wd707Y4A6/yU726VZ/fuITfFFT58t//Wj2xStnt9sURHWlax59Hv4skKVVX2Sor9iT9DUAbEWkhIj7AGCDvKI15wHjb85uA340xRkTq2RqCEZGWQBtAl9Mppw7HpzBq2hq+WHOQe8Jb8Pkd3anlX/J5Vzh7FoYNg9WrHRekcr327a3R1DNnwqJFJT5NNV8v3hkdwvHkNJ77aTumhGMAVPEU2XvHGJMlIpOARYAn8JkxZoeITAYijDHzgE+Br0QkCojH+mAA6AtMFpEsIBuYaIzR73Ll0G/bj/PE7C0YA1Nv6cq1wSXvmnfe//0f/PorPP546c+lypenn7Ya5jt3LtVpQpvV5tEBbXhr8V66B9bm9isCHROfKpCUt0/XsLAwExER4eowKo30rGxeW7Cb//0VTXCTmnwwtivNAvxLf+I//oB+/eChh+C990p/PlV+GVOqRXBycgx3fxnByr0n+e6+y+nWvI4Dg6s8RGSjMSasqHI6IrcSi4o9w40f/cX//opmQu8W/DDxCsck/KQka+Wl1q3htddKfz5VfsXGQt++pRqp6+EhTBkdQuPaVZj49SZik3VdXWfSpF8J5eQYPv/zb659bxVHElKZfns3nh8ehK+XnUscFuX99+HwYWswT9WqjjmnKp9q1rQWtp8wAY7m7d9RjNNU8Wb67WGcScvinq82kpKhi+s4iyb9SuZoYiq3f7aOf8/fSe/WdVn0aF8GdWzo2Is8/bRVvXPFFY49ryp/fH2tBt3UVGv21FIM2mrXsDrvjAlhW0wiD83cTFa2DtxyBk36lYQxhp82H2HwOyvZfCiR127ozKfjw6hf3c9xF1m5EmJiwNMTevVy3HlV+dahgzWn0rp11kpopWgnHNyxIf8e2Yllu2N57mft0eMMRfbeUe7veFIaz/+8ncU7T9CteW3evrkLzQMcXO2yZYs1r07fvlaPHVW53HijtdDKrFnWAjk1a5b4VLdf3pzjSalMXb6fGn7ePDW0PTqri+No0q/AcnIMM9cf4o2Fu8nMyeHpoe25O7wlnvauY2uvAweshF+rlrWQtqqcXnzRGnldioR/zuOD2pGUmsnHKw+QYwz/d00HTfwOokm/goqKPcPTP25lQ3QCvVsH8Or1nR1/dw+wfz9cdZVVp7tihY66rcw8PKBOHcjMhLvugoEDremYS0BEeGlkJzxF+GTV32RmG54bFuT4G5ZKSJN+BXM2PYupy6OYsepvqvh48uZNwdzUrYnz7pIef9waebtsWakH6qgKIisLjhyBceOs7ruTJpXoNCLCiyM64u3pwYzVf3MsKZV3RodSxcdBvcwqKR2cVUEYY/gp8givL9zNieR0bghtzNPXWFPYOumC1oCchATrD7xTJ+dcR7mntDQYMwZ+/tnqzfXSS1YDfwl9tvpvXvp1J8FNajHttq5cVrOKA4OtGHRwViWy9kAcN370F49+t4UGNfz48YFevD06xDkJ3xh4910YOhQyMqB2bU346lJ+fjB7NtxzjzVAb8KEUp1uQp8WTLutG/tOnOba91azYk+sgwKtfLR6x41FHk7kv4v3sGrfKRrU8OU/N1pVOR7OqveMjYW777ZGXw4fDunp4FOKCdlUxeblBR9/DF27Wt06oVRTNgzu2JD5D/XhwW82ccfnG7irTwv+Oagt/j6axopDq3fcjDGGdX/H88nKAyzbHUudqj480K8Vt13eHD9vJ9V15uTAp59aKyadPQtvvmnNqaO9KVRxPfMMxMVZ8/EHBBRdPh+pGdm8smAnX689RNM6VXjlus70bavrcNhbvaNJ301kZOWwYNsxZqw+wPYjydSp6sOdvQK5s08Lqvk6+U4nLc2qwmncGD76CIKCnHs9VXE9+SS89RbUqAHPPmsN5qpSsvr5tQfiePrHbfx96ix929bjySHt6Nio9N1F3ZUm/QrAGMOOo8nM3hjDz5FHSEjJpFW9qtwd3pLrQxs7784+MxPmzYOvvrKG2Pv7W421jRrp3b0qvR074F//goULoX5961vksGElOlVaZjZfrTnIB8ujSErNZEjHhtwV3oKw5rUrXb9+e5O+VoaVMzk5hsiYRJbtOsHiHSfYF3sGHy8PBgU1YFRYU8Jb13VOnb0x1qja2bPh88+tybOaNYM9eyA0VPvfK8fp2BEWLLDGdbzxBrRoYW3futWaqG/gQLvbivy8Pbmnb0tu7t6U6Sv38/XaQ/y24zidG9dkVFgTrul8GXWrOakHm5uy605fRIYA72ItojLDGPN6nv2+wJdANyAOGG2Mibbtexq4C2sRlYeNMYUutVPZ7vRzcgz7Ys+wPjqeiOh4/ow6xakzGXh6CGHNazO8SyOGBzeipr+34y9+8qS17F3z5rBzp/XH6OEBgwbBgw9aPXRK0c1OqWK5/36YNg2qVbMS/9ChcOWV0Nb+FVZTMrL4cdMRvlpzkD0nTuPpIVzRMoAr29YjvG1d2jWoXmG/ATisese23OFeYCDWWrgbgLHGmJ25yjwABBtjJorIGOB6Y8xoEQkCvgV6AI2ApUBbY0x2QderqEk/KzuHE6fTOZKQyt4Tp9lz3HrsPp5Mcpo1jWy96r5c3jKAAR3qc2XbeqVbqjA/8+ZZd/Pbt1t3Vbt3WwNovvjCutP/9lvrj23UKKv8ihWFn69fP/vKlda565yT+3r5xZB327nXkZHWz8TEi8uuXm0lmpCQi4/zsn0Rzsq6uPy5MoXFlZ/8ji3Jv3FR76eoa9SqVfhxxZXf+UoiIwMWL4ZffrG+CRw+DIGB8Pff1v5PP7WqF9u1sx4BAYVWN+4+nszPkUdZutP6xgwQUNWHTo1rEtykJh0b1aRlvao0q+PvvKrSMuTI6p0eQJQx5oDtxLOAkcDOXGVGAi/ans8GPhDr43QkMMsYkw78bVtOsQewxt434izGGIyBHGMwcP452LYZMLmeYyDbGNKzsknLzCEtM9v2yCEtK5v0zGySUzNJSskg4WwGiamZJKZkcupsBkcS0zienEZ2zoUP2Oq+nrStX41hHevTtWU9ugfWpllVTyQ72xZMBiSnWQmnjm0loUOHrJ4P6ekXHj4+F/5gP/nESuiJiXDq1IU/mnm2JY2ffhp27bK+TnfqBOPHW0kerD+eW24pg395pQrg42PV7Q8bZv0N7NoFJ05c2P/GG7Bv34XX/v5w881WdSTACy9YPc1q1ICaNWlfowbt27fnySFXciwplVXLNrEhLottp5L5cN9Jsm1/jiJwWQ0/GtXwpW41H+pW9yWgmi91q/lR1c8Lfx8vqvp6UtXXi6o+Xvh5e+DpIXh7euDlIXh5eODlKdbDw6PcTxVhT9JvDBzO9ToG6FlQGduauklAgG372jzHOqVyOO5MOle+tgSTmoYRIQfBiO3h5W1ty8mxkr04d0yaZ042tVOTqZl2hoCUJHoMG0jjOlVptHAujef9QKu4wzROPomANYglNdU6cNw4q/E0t3r1rP7xAA8/bI1wzK1FC2vCM7Dq49ets+686tSxEn63bhfKzpsHDRvqwiaq/BOxeonl7im2cydER1vtTHv2WNN4n6v6McYaExAbe/HUzvfcA9Onc1kNP26+sQ832zanevmyt24zom+ZwMFrbiT6eCLHflnC/qq1WOdfiwT/kvcCEpODhy0G8fBAPD0QY6xvMoAAYgyCQXx9wcsLyc5GUlMIbteYmfc5d1pye5J+fh9beeuECipjz7GIyL3AvQDNmjWzI6RL+Xl7cnOrasjOQ3hg/c4IBkGQkG541KqJHDuG7Npl+wcXPDBWuV698KheHQ4exGPPbus/Bc6fh3798PD3x2N/FL57d+NHDn5i8CMHXzH43n4rftWqUH3jemptXk91cpAacu7Nwc1dbHXjodAg1+0FXKhCABg9+sL8NSLWo0aNC/ufeALuuMNauMLPz/pZrdqF/b/9VnjvmlatSvRvq1S54OVlLcHZurU1q2tuInD8uJXwz/A095kAAAUnSURBVJyx5vxJTr5wg2MM/PTT+W/IVdLT6ZKeTpfgYAhvY20/vAxMEuQkkJmdQ0KOByndr+BsaDdSEpI5+9VMUowHqUbINpCJB1mdOpPVqjVZyafJWr6CLDzIAnJsqc+0aY9p3BiTnAwbNtiSn2DElghbd8DUb4BJTMREHqJR+1Dn/zPaUSYGaJrrdRMg77po58rEiIgXUBOIt/NYjDHTgelg1enbG3xuVX29eH5CP6BfIaXaA1cVsr81cHXBu/u0wGraKECjgTC8kP2DB1uPglx77aW/zLkVtTBJBW2gUspuIlC9uvXIzcMDRo4s+DhfX3jqqfMvvYH6ufc3qgmvP1n4ta8JLnz/zT0K339b2Sw8ZE89xwagjYi0EBEfYAwwL0+ZecB42/ObgN+N1UI8DxgjIr4i0gJoA6x3TOhKKaWKy94um9cA72B12fzMGPOKiEwGIowx80TED/gKCMW6wx+Tq+H3GWACkAX8wxizsLBrVdTeO0op5Uw6IlcppSoRnVpZKaXUJTTpK6VUJaJJXymlKhFN+kopVYlo0ldKqUpEk75SSlUimvSVUqoSKXf99EXkJHCwkCJ1gVNlFI4r6Ptzb/r+3J+7vsfmxpgiFwsud0m/KCISYc8ABHel78+96ftzfxX9PWr1jlJKVSKa9JVSqhJxx6Q/3dUBOJm+P/em78/9Vej36HZ1+koppUrOHe/0lVJKlZBbJn0ReUhE9ojIDhH5j6vjcRYReVxEjIjUdXUsjiQib4rIbhHZKiJzRaSWq2NyBBEZYvu9jBKRp4o+wn2ISFMRWS4iu2x/d4+4OiZnEBFPEdksIr+4OhZncbukLyJXASOBYGNMR+AtF4fkFCLSFGttxkOujsUJlgCdjDHBwF7gaRfHU2oi4glMBYYCQcBYEQkq/Ci3kgX80xjTAbgceLCCvb9zHgF2uToIZ3K7pA/cD7xujEkHMMbEujgeZ5ny/+3dP2sUURyF4fdABAsV7MRE0RTp7EyaIIoREQ35AKIErBQsLMTCgB9BLCwsRBAMSMCApf8KO6MYEtBORDBRUbDQTiTH4o4QcDdKMrPXu/t7qp2dLc4wy9m7c4e5wCVaLCRfOtsPbf+sNp+R1k4u3QjwxvZb2z+Au6TBSVew/dH2fPX6O6kY+/OmqpekAeAEcDN3liaVWPpDwAFJc5KeShrOHahukiaAZduLubN0wBlgzSU0C9EPvF+1vUSXleJvkvaQlkady5ukdtdIA62V3EGa1Jc7QCuSHgM7WuyaImXeTvqLOQzMSBp0Ybch/eUYLwNHO5uoXmsdn+371WemSJcNpjuZrSFq8V5R38l/IWkLcI+03vW33HnqImkc+Gz7paRDufM06b8sfdtH2u2TdA6YrUr+uaQV0rMyvnQqXx3aHaOkfcBeYFESpEsf85JGbH/qYMQNWescAkiaBMaBsdJ+sNtYAnat2h4APmTK0ghJm0iFP217Nneemo0CE5KOA5uBbZLu2D6VOVftirtPX9JZYKftK5KGgCfA7i4pjj9Iegfst13iA6BaknQMuAoctF3Uj3U7kvpIk9JjwDLwAjhp+3XWYDVRGoHcBr7avpA7T5Oqkf5F2+O5szShxGv6t4BBSa9Ik2WT3Vr4Xew6sBV4JGlB0o3cgTaqmpg+DzwgTXLOdEvhV0aB08Dh6pwtVKPiUJjiRvohhBDWr8SRfgghhHWK0g8hhB4SpR9CCD0kSj+EEHpIlH4IIfSQKP0QQughUfohhNBDovRDCKGH/AKkEcP+DrvkHwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Use the FFTKDE with a smooth Gaussian\n", "x, y = FFTKDE(kernel='gaussian', bw=0.7).fit(data).evaluate()\n", "\n", "plt.plot(x, y, zorder=10, label='KDE with box kernel')\n", "plt.scatter(data, np.zeros_like(data), marker='|', c='r', label='Data')\n", "plt.plot(x, distribution.pdf(x), label='True pdf', c='r', ls='--')\n", "plt.legend(loc='best');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Selecting a suitable bandwidth" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To control the bandwidth $h$ of the kernel, we'll add a factor $h >0$ to the equation above.\n", "\n", "$$\\hat{f}(x) = \\frac{1}{N} \\sum_{i=1}^N K \\left( x-x_i \\right) \\quad \\to \\quad \\hat{f}(x) = \\frac{1}{N h} \\sum_{i=1}^N K \\left( \\frac{x-x_i}{h} \\right)$$\n", "\n", "- When $h \\to 0$, the estimate becomes jagged (high variance, overfitting).\n", "- When $h \\to \\infty$, the estimate becomes oversmoothed (high bias, underfitting).\n", "\n", "> **Note (Bandwidth).** The `bw` parameter is implemented so that it corresponds to the *standard deviation* $\\sigma$ of the kernel function $K$. This is a design choice for consistent bandwidths across kernels with and without finite support.\n", "\n", "> **Note (Automatic Bandwidth Selection).** Automatic bandwidth selection based on the data is available, i.e. `bw='silverman'`. For a complete listing of available routines for automatic bandwidth selection, see `FFTKDE._bw_methods.keys()`.\n", "\n", "In general, optimal bandwidth selection is a difficult theoretical problem." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "for bw in [0.25, 'silverman']:\n", " x, y = FFTKDE(kernel='gaussian', bw=bw).fit(data).evaluate()\n", " plt.plot(x, y, label='bw=\"{}\"'.format(bw))\n", " \n", "plt.scatter(data, np.zeros_like(data), marker='|', c='r', label='Data')\n", "plt.plot(x, distribution.pdf(x), label='True pdf', c='r', ls='--')\n", "plt.legend(loc='best');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Weighted data\n", "\n", "As a final modification to the problem, let's weight each indiviual data point $x_i$ with a weight $w_i \\geq 0$.\n", "The contribution to the sum from the data point $x_i$ is controlled by $w_i$.\n", "We divide by $\\sum_{i=1}^N w_i$ to ensure that $\\int \\hat{f}(x) \\, dx = 1$.\n", "Here is how the equation is transformed when we add weights.\n", "\n", "$$\\hat{f}(x) = \\frac{1}{N h} \\sum_{i=1}^N K \\left( \\frac{x - x_i}{h} \\right)$$\n", "\n", "$$\\hat{f}(x) = \\frac{1}{\\left( \\sum_{i=1}^N w_i \\right ) h} \\sum_{i=1}^N w_i K \\left( \\frac{x - x_i}{h} \\right)$$\n", "\n", "The factor $N^{-1}$ performed uniform weighting, and is removed in favor of the $w_i$'s.\n", "\n", "> **Note (Scaling of weights).** If the weights do not sum to unity, they will be scaled automatically by KDEpy.\n", "\n", "Let's see how weighting can change the result." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(14, 3)); plt.subplot(1, 2, 1)\n", "plt.scatter(data, np.zeros_like(data), marker='o', c='None', \n", " edgecolor='r', alpha=0.75)\n", "\n", "# Unweighted KDE\n", "x, y = FFTKDE().fit(data)()\n", "plt.plot(x, y)\n", "\n", "plt.subplot(1, 2, 2); np.random.seed(123)\n", "weights = np.exp(data) * 25\n", "plt.scatter(data, np.zeros_like(data), marker='o', c='None', \n", " edgecolor='r', alpha=0.75, s=weights)\n", "\n", "# Unweighted KDE\n", "x, y = FFTKDE().fit(data, weights=weights)()\n", "plt.plot(x, y);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Speed\n", "\n", "There is much more to say about kernel density estimation, but let us conclude with a speed test.\n", "\n", "> **Note (Speed of FFTKDE).** Millions of data points pose no trouble for the FFTKDE implementation. Computational time scales **linearily** with the number of points in practical settings. The theoretical runtime is $\\mathcal{O}(2^d N + n \\log n)$, where $d$ is the dimension, $N$ is the number of data points and $n$ the number of grid points. With $d=1$ and $n = 2^{10}$ (the default values), $N$ dominates." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import time\n", "import statistics\n", "import itertools\n", "import operator\n", "\n", "def time_function(function, n=10, t=25):\n", " times = []\n", " for _ in range(t):\n", " data = np.random.randn(n) * 10\n", " weights = np.random.randn(n) ** 2\n", " start_time = time.perf_counter()\n", " function(data, weights)\n", " times.append(time.perf_counter() - start_time)\n", " \n", " return statistics.mean(times)\n", "\n", "def time_FFT(data, weights):\n", " x, y = FFTKDE().fit(data, weights)()\n", " \n", "# Generate sizes [5, 10, 50, 100, ..., 10_000_000]\n", "data_sizes = list(itertools.accumulate([5, 2] * 7, operator.mul))\n", "\n", "times_fft = [time_function(time_FFT, k) for k in data_sizes]\n", "plt.loglog(data_sizes, times_fft, label='FFTKDE')\n", "\n", "plt.xlabel('Number of data points $N$')\n", "plt.ylabel('Average time $t$')\n", "plt.grid(True);" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5 \t0.002\n", "10 \t0.003\n", "50 \t0.001\n", "100 \t0.001\n", "500 \t0.001\n", "1,000 \t0.001\n", "5,000 \t0.001\n", "10,000 \t0.001\n", "50,000 \t0.002\n", "100,000 \t0.003\n", "500,000 \t0.01\n", "1,000,000\t0.02\n", "5,000,000\t0.095\n", "10,000,000\t0.183\n" ] } ], "source": [ "for size, time in zip(data_sizes, times_fft):\n", " print('{:,}'.format(size).ljust(8), round(time, 3), sep='\\t')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## References" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "This page introduced quite a bit of theory. If you would like to read more, please see the :ref:`literature` section. In particular see the posts by VanderPlas and the books by Silverman and Wand." ] } ], "metadata": { "celltoolbar": "Raw Cell Format", "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.6.6" } }, "nbformat": 4, "nbformat_minor": 2 }