{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Lab exercise 02, Supervised learning, KNN" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "import pandas as pd\n", "from sklearn.neighbors import KNeighborsRegressor\n", "from sklearn.model_selection import cross_val_predict\n", "%pylab inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1, Load and preprocess the data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "!wget -q https://patbaa.web.elte.hu/Mammals.xls\n", "data = pd.read_excel('Mammals.xls', sheet_name='All Data', na_values=-999).set_index('Species')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "BodyW 0\n", "BrainW 0\n", "SWS 14\n", "PS 12\n", "TS 4\n", "LifeSpan 4\n", "GT 4\n", "PI 0\n", "SEI 0\n", "ODI 0\n", "RND 0\n", "dtype: int64" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plt.imshow(data.isna().T)\n", "plt.show()\n", "data.isna().sum() " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "na_counts = data.isna().sum()\n", "data = data.drop(na_counts[na_counts > 10].index.values, axis=1)\n", "data = data.fillna(data.mean())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2, K-nearest neighbors regression" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "LifeSpan = data.pop('LifeSpan')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "knn = KNeighborsRegressor(n_neighbors=10, weights='uniform', p=2)\n", "lifespan_pred = cross_val_predict(knn, data, LifeSpan, cv=len(data)) # leave-one-out" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(8, 8))\n", "plt.scatter(LifeSpan, lifespan_pred)\n", "plt.xlim(-2, 110)\n", "plt.ylim(-2, 110)\n", "plt.xlabel('Actual lifespan (years)', fontsize=20)\n", "plt.ylabel('Predicted lifespan (years)', fontsize=20)\n", "plt.title('Without normalization', fontsize=25)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MAE:\t 13.056 \n", "Pearson: -0.01\n" ] } ], "source": [ "MAE = (LifeSpan - lifespan_pred).abs().mean()\n", "corr = np.corrcoef(lifespan_pred, LifeSpan)[0,1]\n", "\n", "print('MAE:\\t', np.round(MAE, 3), '\\nPearson:', np.round(corr, 3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 3, K-nearest neighbors regression with normalization." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "means, stds = data.mean(), data.std()\n", "normed_data = (data - data.mean())/data.std()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "lifespan_pred_norm = cross_val_predict(knn, normed_data, LifeSpan, cv=len(normed_data)) # leave-one-out" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(8, 8))\n", "plt.scatter(LifeSpan, lifespan_pred_norm)\n", "plt.xlim(-2, 110)\n", "plt.ylim(-2, 110)\n", "plt.xlabel('Actual lifespan (years)', fontsize=20)\n", "plt.ylabel('Predicted lifespan (years)', fontsize=20)\n", "plt.title('With normalization', fontsize=25)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Normalization is important here, because KNN calculates distance. Therefore if a userful variable is in the data but that has much lower scale than a useless one, then the useless one will suppress the useful ones. In our data the RND column had large random numbers and it caused random predictions without normalization." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MAE:\t 9.525 \n", "Pearson: 0.573\n" ] } ], "source": [ "MAE = (LifeSpan - lifespan_pred_norm).abs().mean()\n", "corr = np.corrcoef(lifespan_pred_norm, LifeSpan)[0,1]\n", "\n", "print('MAE:\\t', np.round(MAE, 3), '\\nPearson:', np.round(corr, 3))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Species\n", " Eastern American mole -14.653276\n", " Rock hyrax (Hetero. b) -13.647759\n", " Name: LifeSpan, dtype: float64, Species\n", " Echidna 34.320000\n", " Man 79.254483\n", " Name: LifeSpan, dtype: float64)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "errors = (LifeSpan - lifespan_pred_norm).sort_values()\n", "errors.head(2), errors.tail(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Man lives way longer as expected and Eastern American mole dies too early" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "MAEs = {}\n", "for k in [1, 5, 10, 15]:\n", " knn = KNeighborsRegressor(n_neighbors=k, weights='uniform', p=2)\n", " preds = cross_val_predict(knn, normed_data, LifeSpan, cv=len(data)) # leave-one-out\n", " MAEs[k] = (LifeSpan - preds).abs().mean()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAETCAYAAAARcPDAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xl4VOXZx/HvnRUSwh72JZAgiCIiAQEVghbX1t22ShUUURatba1WW1ttfdvaWlvbKiggglZxxa2uFEGQRQyyymKABAj7GoGErPf7xznBYZgsk0xyJsn9ua5ck5w5c+Y3k+XOc86ziKpijDHGVFeE1wGMMcbUD1ZQjDHGhIQVFGOMMSFhBcUYY0xIWEExxhgTElZQjDHGhIQVFGOMMSFhBcUYY0xIWEExxhgTElFeB6hNrVu31qSkJK9jGGNMnbJ8+fL9qppY0X4NqqAkJSWRnp7udQxjjKlTRGRrZfazU17GGGNCwgqKMcaYkLCCYowxJiSsoBhjjAkJKyjGGGNCokH18qqqt1fs4PGPN7LzcB4dmjfmvkt6cnW/jl7HMsaYsGIFpQJvr9jBg7PXkFdYDMCOw3k8OHsNgBUVY4zxYae8KvD4xxtPFJNSeYXFPP7xRo8SGWNMeLKCUoGdh/OC2m6MMQ2VFZQKdGjeOKjtxhjTUFlBqcB9l/SkcXTkSdsaR0dy3yU9PUpkjDHhyS7KV6D0wvvjH29kh3ua68HLrZeXMcb4s4JSCVf368jV/TqSuf8YFz0xn52H872OZIwxYcdOeQWhW+t4Lu/Tnv8s3UpObqHXcYwxJqx4WlBEZLqI7BWRtT7bWorIHBHJcG9blPHYv4rI1yKyXkT+JSJSG5knpKVwNL+IF5Zk1cbTGWNMneF1C2UGcKnftgeAuaraA5jrfn0SERkCnAecBZwJDACG1WhSV+8OTbmwVxumL8okt6CoNp7SGGPqBE8LiqouAA76bb4KmOl+PhO4OtBDgUZADBALRAN7aijmKSYOT+ZQbiEvf7Gttp7SGGPCntctlEDaquouAPe2jf8OqroEmAfscj8+VtX1tRWwf9eWnNutJVMXbiG/qLjiBxhjTAMQjgWlQiKSApwOdAI6AheKyNAy9r1DRNJFJH3fvn0hy3DXhSns+Taf2V/tCNkxjTGmLgvHgrJHRNoDuLd7A+xzDbBUVY+q6lHgQ2BQoIOp6hRVTVXV1MTExJCFPD+lNWd1asYzn22mqLgkZMc1xpi6KhwLyrvAKPfzUcA7AfbZBgwTkSgRica5IF9rp7wARIQJaSlsPZDL+2t21eZTG2NMWPK62/AsYAnQU0SyRWQM8BgwQkQygBHu14hIqohMcx/6BrAZWAOsAlap6nu1nf/i3m1JadOESfM2U1Kitf30xhgTVjwdKa+qN5Zx10UB9k0Hbnc/LwburMFolRIRIUxIS+YXr61i7oa9jOjd1utIxhjjmXA85VWn/KBvBzq1aMxT8zahaq0UY0zDZQWlmqIjIxg3LJlV2w+zZPMBr+MYY4xnrKCEwPX9O5GYEMvT8zd5HcUYYzxjBSUEGkVHMvaCbizadIAV2w55HccYYzxhBSVEbjq3K80aRzNp/mavoxhjjCesoIRIk9goRg9JYs66PWzY/a3XcYwxptZZQQmh0UOSiIuJZLK1UowxDZAVlBBqER/DTwZ15b1VO9l64JjXcYwxplZZQQmx28/vRlREBM98tsXrKMYYU6usoIRYm6aNuCG1E28uz2Z3znGv4xhjTK2xglID7hyaTLEq0xZaK8UY03BYQakBXVrFcWXfDrz0xTYOHSvwOo4xxtQKKyg1ZHxaMnmFxTy/KNPrKMYYUyusoNSQ09omcMkZbZmxOIsjxwu9jmOMMTXOCkoNmpCWwrfHi3jpi21eRzHGmBpnBaUG9e3cnAt6tGbawkyOFxZ7HccYY2qUFZQaNiEthf1H83k9fbvXUYwxpkZZQalhg7q35JwuzXnmsy0UFpd4HccYY2qMFZQaJiJMHJ7CjsN5vLNyp9dxjDGmxlhBqQUX9mpDr3YJTJq/ieISWybYGFM/WUGpBaWtlC37jvHJ17u9jmOMMTXC04IiItNFZK+IrPXZ1lJE5ohIhnvboozHdhGRT0RkvYisE5Gk2spdFZf3aU9Sqzienr8JVWulGGPqH69bKDOAS/22PQDMVdUewFz360BeAB5X1dOBgcDemgoZCpERwvi0ZNbu+JYFGfu9jmOMMSHnaUFR1QXAQb/NVwEz3c9nAlf7P05EegNRqjrHPc5RVc2tyayhcE2/TrRv1oin523yOooxxoSc1y2UQNqq6i4A97ZNgH1OAw6LyGwRWSEij4tIZKCDicgdIpIuIun79u2rwdgVi4mKYOwF3VmWeZAvs/zrqDHG1G3hWFAqIwq4APglMADoDowOtKOqTlHVVFVNTUxMrL2EZbhxYBdaxsdYK8UYU+8EXVBEJF5EThORISLST0Q6hjjTHhFp7z5XewJfG8kGVqjqFlUtAt4GzglxjhrROCaSMed3Y/7GfazdkeN1HGOMCZlKFRQRSRaRP4rIMuAwsB5YCKQD29yeWq+KyA9FJKqamd4FRrmfjwLeCbDPl0ALESltclwIrKvm89aanwzqSkJsFJPnb/Y6ijHGhEy5BUVEUkXkI2Aj8CDQF1gDfAzMwmkZLASKgRvcbdki8qCIxFb05CIyC1gC9BSRbBEZAzwGjBCRDGCE+3VplmkAqlqMc7prroisAQSYGuyL90qzxtHcPLgrH6zdxeZ9R72OY4wxISFljYkQkZnASCAHeBV4BVimqgEXSnfHgVyC06oYBGwHbnZ7coWF1NRUTU9P9zoGAPuP5nPeY59yZd8OPH5DX6/jGGNMmURkuaqmVrRfeS2Ui4FfAB1UdYKqLiirmACoapaqPquqQ4Czga+AYcEGbyhaN4nlxoFdeGvFDrIPhX2PZ2OMqVB5BaW7qv5LVfODPaiqrlbVa4C/VT1a/XfH0O4ATF2wxeMkxhhTfWUWFFXNq+7BQ3GM+qxD88Zce05HXvlyO/uOBF23jTEmrFR7HIqIRLvdh3uGIlBDM25YMgXFJUxflOl1FGOMqZZKFxS3S/BrItLSZ1sy8DVO9+F17sj16nYbblC6Jzbh8j7teXHJVnLyCr2OY4wxVRZMC+U2oJeq+s4Z8gSQAswDVuPMw3Vr6OI1DBPSkjmaX8SLS7K8jmKMMVUWTEHpjTOgEAARaQpcDrymqt/DmfF3A1ZQgnZGh2YM75nIc59nkltQ5HUcY4ypkmAKSiKwy+frwThzar0CoKqFwBwgOWTpGpC7LkzhUG4hs5Zt9zqKMcZUSTAF5QjQzOfrYYACn/tsOw4khCBXg9O/a0vO7daSqQu2kF9U7HUcY4wJWjAFJQO4TERiRSQGZ6qV1arqu1pUV8J8oatwNnF4Cru/Pc5bX+3wOooxxgQtmIIyBWea+AycySG7A9P99jkXp9eXqYILerSmT8dmTP5sM0XFJV7HMcaYoFS6oKjqTJyJGuNwTn095X4AICIXAkk4Pb5MFYgIE4cns/VALh+s3e11HGOMCUpQAxtV9deq2tr9uEdPnlnyc6AF8GRIEzYwF/duR0qbJkyat4mSksATdxpjTDgKZmDjpyLyaFn3q2qBqua4C16ZKoqIECakJbNh9xE+3WCXo4wxdUcwLZRBQMB1201o/aBvBzq1aMxT8zZR1vICxhgTboLt5dW5poKY70RHRnDnsGRWbj/Mki0HvI5jjDGVEkxBmQZcISJdaiqM+c4N/TvRukksk+bZMsHGmLohmILyHs6F90UicpeInCsiXUWki/9HDWVtUBpFRzL2gm58vmk/K7cf9jqOMcZUKJiCsgW4AugI/BNY7G7L9Puw1aJCZOSgrjRrHM3T8zZ5HcUYYyoUzFTzL+BMtWJqSZPYKEYPSeKfczPYuPsIPdvZrDbGmPBV6YKiqqND/eQiMh34PrBXVc90t7UEXsUZJJkF/FBVD5Xx+KY4o/bfUtW7Qp0vHIweksTUhVuYPH8TT/64n9dxjDGmTNVesbGaZgCX+m17AJirqj2Aue7XZXkU+KxmooWHFvExjDy3C++u2sm2A7lexzHGmDJ5WlBUdQFw0G/zVcBM9/OZwNWBHisi/YG2wCc1FjBM3H5Bd6IiInhmgfX4MsaEr6CX6xWRAcAlOBfnYwPsoqo6phqZ2qrqLvdAu0SkTYAMETirRd4MXFSN56oT2jZtxPWpnXgjPZt7LupB26aNvI5kjDGnqHRBERHBOUX1E0BwLtCLzy7qs706BaUyJgAfqOp2J1bZROQO4A6ALl3qbo/mcUOTefXL7UxbuIXfXNHb6zjGGHOKYE553YXTIngRSMUpHk8CQ4Bf4yzA9QrOtPbVsUdE2gO4t4EmtBoM3CUiWcDfgFtE5LFAB1PVKaqaqqqpiYmJ1YzmnS6t4riybwde+mIbh44VeB3HGGNOEUxBGQVsVNXRqvqVu+2wqi5V1ceA4cB1wIXVzPSu+1ylz/mO/w6qOlJVu6hqEvBL4AVVLe/ifb0wPi2Z3IJinl+c5XUUY4w5RTAFpSfwqd+2E6fMVHUF8F+c01GVIiKzgCVATxHJFpExOGuujBCRDGCE+zUikioi04LIW++c1jaBi3u3ZcaiTI7m26TOxpjwEsxFeQFyfL4+BrT02ycDuLiyB1TVG8u465QL7aqaDtweYPsMnGs7DcKE4Sl8sm4PLy3dyp3Dkr2OY4wxJwTTQtmB07Or1Bagv98+PXAKjakhZ3duzvkprZm6MJPjhcVexzHGmBOCKSjLOLmAfAgMFJHfisgZIjIRZwzJ0lAGNKeaODyF/UfzeX15ttdRjDHmhGAKyptApIh0c7/+K7AV+D2wGvg3cJjyR7abEBjUvSXndGnOM/M3U1hc4nUcY4wBgigoqvq2qp6uqpnu1weBfsD9wBTgQaCPqm6okaTmBBFh4vAUdhzO492VO72OY4wxQBVGyvtS1RyccSCmll3Yqw292iUwaf4mrunXkYiI8gd4GmNMTfN6ckhTRSLChOEpbN53jE/W7fY6jjHGBFdQRCRCRO4WkaUikiMiRT739RORSSJyWuhjmkCu6NOepFZxPD1vM6q2VI0xxluVLigiEgPMwZluJRlnqhXf8yyZwG3AyFAGNGWLjBDGpyWzZkcOCzP2ex3HGNPABdNCuQ9nepXf40wbf9KodVU9DCzAmYnY1JJr+nWifbNGPGXLBBtjPBZMQRkJLFLVP6hqCYGXA84E6u6UvnVQTFQEYy/ozrLMg3yZ5b+0jDHG1J5gCko3Kh60eJBTp2MxNezHAzvTMj6GSdZKMcZ4KJiCkgc0r2CfLjiDG00tiouJ4rbzkpi3cR9f78yp+AHGGFMDgikoK4GL3YvzpxCRZjjXT5aFIpgJzs2Dk0iIjWLSfFsm2BjjjWAKylSgM/CSiDT1vUNEmuPM+NsCeCZk6UylNWsczc2Du/LBml1s2XfU6zjGmAYomKlXZgHP4yyitQ8YDyAi6cAunIkhJ6nqBzWQ01TCbed3IyYygsnWSjHGeCCogY2qOgZnrMk6IBFnHMo5wCZgjKreHfKEptJaN4nlxoFdeGvFDnYczvM6jjGmgQl66hVVnaGq/YAmQCcgQVX7qOrzIU9ngjZ2aHcApi7Y4nESY0xDE8xI+Wjfr1U1T1V3qqotqBVGOjZvzDX9OjJr2Tb2H833Oo4xpgEJasVGEfmLiKTUWBoTEuPSkikoLmH655leRzHGNCDBFJQInOlXNorIHBG5TkSqNf29qRnJiU24vE97XlyylZy8Qq/jGGMaiGAKSgfgJ8BC4CLgNWC7iPzRZxVHEyYmpCVzJL+IF5dkeR3FGNNABNNtuEBVX1bVNKAXzqzDUTgrNWaIyAcicpWIBHNdZrqI7BWRtT7bWrotoAz3tkWAx50tIktE5GsRWS0iP6rsczYUZ3RoxvCeiUxflEVuQVHFDzDGmGqq0gJbqvqNqt4LdOS7VsulwGxgm4g8IiIdKnGoGe7jfD0AzFXVHsBcAq9RnwvcoqpnuI9/0h1caXxMHJ7CwWMFvLJsu9dRjDENQLVWbFTVAuB94C1gJ864lA7A74BMEXlSRGLLefwCnAklfV0FzHQ/nwlcHeBx36hqhvv5TmAvzrgY4yM1qSUDu7VkyoItFBSVeB3HGFPPVbmgiMggEXkep5D8A4gH/gWcjTP4cSNwN86psWC0VdVdAO5tmwpyDARigIDDw0XkDhFJF5H0ffv2BRml7ps4PIXd3x7nrRXZXkcxxnjg7RU7OO+xT+n2wPuc99invL1iR409V7BLACeIyAQRWQUsAkYB64E7gA6q+jNVXa2qM4B+wKfA9SHO7JunPfAicKu7RsspVHWKqqaqampiYsNrxAzt0Zo+HZsxef5miktsmWBjGpK3V+zgwdlr2HE4DwV2HM7jwdlraqyoBHMBfRpOa+TfQA+cP+SD3D/Wz6nqSXN9qGoxMJ/g10fZ4xaK0oKxt4w8TXFOtz2kqhWt09JgiQgThyeTdSCX99fs8jqOMaYWPf7xRvIKi0/alldYzOMfb6yR5wumhXIbsBu4H+ikqqNVtaKp6ucDfwgy07s4LR/c23f8d3Cn0H8LeEFVXw/y+A3Oxb3bkZwYz6R5m1C1VooxDcXOMub0K2t7dQVTUC5T1R6q+oSqVmqtWVVdpKq/L+t+EZkFLAF6iki2iIwBHgNGiEgGMML9GhFJdVtJAD8EhgKjRWSl+3F2EK+lQYmIECakpbBh9xE+3RCwwWeMqWc27j6CSOD7OjRvXCPPKQ3pP9bU1FRNT0/3OoYnCotLSHt8Pm2axjJ7/BCkrJ80Y0yd98WWA4x9IR1VpaBYyffp5dk4OpI/X9uHq/t1rPTxRGS5qqZWtF+ZLRQRqXYJC8UxTGhER0Ywblh3Vmw7zNItlWpgGmPqoA/W7OLm6ctonRDLB/cM5S/XnUXH5o0RnMljgy0mwShvLq5MEfkz8IyqBjVtrYj0xbl2kg48Wo18JoRuSO3MP+duYtL8TQxObuV1HGNMiM1cnMUj731Nv87NeW7UAFrEx9C5ZVyNFRB/5V1D+QT4O7BLRCaLyPDyWhwi0l1ExovIEuAroC8wL7RxTXU0io5k7AXdWJixn1XbD3sdxxgTIqrKXz7awMPvfs1Fvdry0u2DaBEfU+s5yiwoqnoLcC5OK+MO4H9AjoisEpGPRGSWiLwlIgtEZA+QATwNJAG/AXqq6uc1/gpMUEYO6krTRlE8PW+T11GMMSFQWFzCva+tYvL8zdx0bhee+ck5NI6J9CRLudPPq2o6cLGI9ADG4MwyfDbQx2/XfTjzeL0JvKmqNmd6mGoSG8Xo87rxr7kZfLPnCKe1TfA6kjGmio7mFzH+P8tZmLGfX4w4jbsvTPG0w02lug2raoaqPqCqA4BmQE9gCM5o+I6q2lZVb1DVV6yYhL9bhyQRFxPJ5PkBZ6sxxtQB+47kc+OUpSzefIC/XNeHn17Uw/Pem1VZUz7XLTBLVXVV6bxbpu5oER/DTQO78O6qnWw7kOt1HGNMkDL3H+O6yYvJ2HuEqbf050cDungdCajmbMOm7ho7tDuRIjy7wFopxtQlK7cf5rrJizlyvJBZYwdxYa+2Xkc6wQpKA9W2aSOuT+3E6+nZ7P32uNdxjDGVMG/DXm6cspT42EjeHD+Efl1OWX/QU1ZQGrBxQ5MpKilh6sItXkcxxlTgtfTt3P5COt0T43lz/BC6JzbxOtIprKA0YF1axXFl3w689MU2Dh0r8DqOMSYAVeXfczO4/43VDEluxat3DqZNQiOvYwVkBaWBG5+WQm5BMTMWZ3kdxRjjp7hEeejttTwx5xuu6deR50YNoElsuaM9PGUFpYHr2S6BEb3bMmNxFkfzi7yOY4xxHS8sZvx/lvPSF9u4c1h3nrihLzFR4f0nO7zTmVoxcXgKOXmFvPzFVq+jGGOAw7kFjJz2BXPW7+HhH/TmwctOJyIi/GcIL7egiMhQEal0B2cROUtEbql+LFObzu7cnPNTWjN1YSbH/VZ3M8bUruxDuVw3eTFrsnN46sZzuPW8bl5HqrSKWijzgNG+G0TkVyJyoIz9rwGeD0EuU8smDE9m35F8Xl+e7XUUYxqs9bu+5brJi9l7JJ8XxgzkirPaex0pKBUVlEBtrEZA8xrIYjw0uHsr+nVpzrOfbaawuKTiBxhjQmrx5v388JklCMLr4wYzqHvdW2LCrqEYAESEiWkpZB/K471VO72OY0yD8t6qnYye/iXtmjVi9oQh9GrX1OtIVWIFxZxwYa829GqXwKT5mykpaThLQxvjpec+z+TuWSvo27kZr48bXGPrvdcGKyjmhIgIYcLwFDbtPcon6/Z4HceYeq2kRPnj++t49L/ruPSMdrw45lyax9X+olih5GlBEZHpIrJXRNb6bGspInNEJMO9DThZjYiMcvfJEJFRtZe6fruiT3uSWsUxaf4mVK2VYkxNKCgq4eevrWTqwkxuGdyVp0eeQ6NobxbFCqXKFJSa/KsyA7jUb9sDwFxV7QHMdb8+iYi0BB7GWVFyIPBwWYXHBCcyQhg3LJnV2TkszNjvdRxj6p0jxwu5dcYy3lm5k/su6cnvrzyDyDowxqQyKlNQHhGR4tIP4HcAvtv876ssVV0AHPTbfBUw0/18JnB1gIdeAsxR1YOqegiYw6mFyVTRNed0pF3TRrZMsDEhtvfb4/zo2aUs3XKQv93Ql4nDvV1hMdQqU1AkyI/qalu6aJd72ybAPh2B7T5fZ7vbTAjERkUydmh3vsg8SHqWf703xlTF5n1HuXbyYrIOHOO5Ualc37+T15FCrtyCoqoRVfiojROBgQpXwFNzInKHiKSLSPq+fftqOFb9cePAzrSMj2GSLRNsTLUt33qI6yYvJq+gmFfuGERaz0D/J9d94djLa4+ItAdwb/cG2Ccb6OzzdScg4OAJVZ2iqqmqmpqYmBjysPVVXEwUt52XxKcb9vL1zhyv4xhTZ81Zt4eR05bSrHE0sycM4axO9XdceEgLiohcJiJvVfMw7wKlvbZGAe8E2Odj4GIRaeFejL/Y3WZC6ObBSTSJjWKytVKMqZJZy7Zx54vpnNY2gTfHD6Frq3ivI9WoahcUEekoIr8VkSzgv8CVQTx2FrAE6Cki2SIyBngMGCEiGcAI92tEJFVEpgGo6kHgUeBL9+MP7jYTQs0aR3Pz4K68v2YXW/Yd9TqOMXWGqvKPOd/w4Ow1XNAjkVljB9G6SazXsWqcVGWsgTjdEq4A7sDpXVV63eQzYKqqzgpZwhBKTU3V9PR0r2PUKfuO5HP+Xz7lqrM78Nfr+3odx5iwV1RcwkNvr+WVL7dzff9O/PnaPkRHhuPVhcoTkeWqmlrRfkG9ShHpLCK/B7bhnIr6PhAFLAJOU9ULw7WYmKpJTIjlxwM6M/urHew4nOd1HGPCWl5BMXe+uJxXvtzOXcNTePz6s+p8MQlGha9URCJE5GoReR/YAvwWSATeAn7g7rZBVe1Eez11x7BkAKYu2OJxEmPC18FjBdw4dSmfbtzLo1edwS8v6VmvxphURrmLE4vI/wG3Au1wuup+hTO6/eXSaxYN7Q1riDo2b8w1/TryypfbuOvClAZxLtiYYGw/mMuo6cvIPpzH5JH9ufTMdl5H8kRFLZRfA22ByUAft/vtU3YBvOEZl5ZMflEJzy/K9DqKMWFl7Y4crp28mP1H83np9nMbbDGBiguKuvuMBO4SkXNrPpIJR8mJTbj8zPa8sHgrOXmFXscxJix8nrGfH09ZSnSE8Ob4IQxIaul1JE9VVFC64nTPPQLcCSwWkfUicr+INNwy3ECNT0vmSH4R/1m61esoxnju7RU7GP38Mjq1aMzsCefRo22C15E8V9HUK9mq+jCQhDO+5H0gBWdsyHYR+aDGE5qwcWbHZqT1TOS5zzPJKyj2Oo4xnlBVpizYzM9eXUn/ri149c7BtGvWyOtYYaFS/dlUtURV/6uqV+K0Wh4BdvDdDL83iMi/ReTsmolpwsVdw1M4eKyAV77c5nUUY2pdSYny6H/X86cPNnBFn/bMvG0gzRpHex0rbATdQVpVd6rqH4BuOIMb3wHigYnAchH5MrQRTThJTWrJwG4tmbJgCwVFJV7HMabW5BcVc/crK5i+KJNbz0vi3zf2qxeLYoVSlUfcqONDVb0GZ6LGh4As4JwQZTNhauLwFHblHOftFTu8jmJMrcjJK2TU9GW8v3oXD17Wi999vzcR9WRRrFAKyRBOVd2jqn9S1WScxa9MPTa0R2vO7NiUyZ9tprjElgk29dvunOP86NklpGcd4skfnc2dw5Jt/F0ZQj4ngKr+L9THNOFFRJiYlkLm/mN8sGaX13GMqTGb9h7h2kmL2H4wl+dvHcDV/Wwdv/JUNFL+lqocVFVfqFocU1dcckY7khPjeXreJr5/Vnv7j83UO19mHeT2melER0bw6p2DObNjM68jhb1yCwrONCvBnNMQd38rKPVcRIQwIS2Fe19fxbyNe7mwV1uvIxkTMh+t3c09r6ygQ/PGvHDbQDq3jPM6Up1QUUEBKMJZ52RdDWcxdcyVZ3fg73O+4alPNzG8ZxtrpZh64cWlW3n4nbWc1ak500cPoGV8jNeR6oyKCspnwFDgaqANMBV4TVWP13QwE/6iIyMYN6w7v33na77IPMig7q28jmRMlakqf/tkI0/P28xFvdrw75v6ERdTmf+5TamKRsoPB3oCf8MZIf88sMsdxHhWLeQzYe6G1M60bhLL0/M2eR3FmCorLC7h/jdW8/S8zfwotTPP3tzfikkVVNjLS1U3qeqvcMaa/BD4AhgPrBCRZSIyRkTq90LJpkyNoiO5/YJuLMzYz6rth72OY0zQjuUXMfaFdF5fns09F/Xgsev6ENWAFsUKpUq/a6papKpvquqlQDLwJ6A9MAXYKSKDayijCXMjz+1C00ZRTJpvrRRTt+w/ms+NU5ey4Jt9/OmaPvx8xGl2LbAaqlSGVXWrqv4WZ035HUATnFUcTQOU0Cia0ed14+Ov95Cx54jXcYyplK0HjnH95MVs3H2EZ29O5aZzu3gdqc4LuqCISAcReUhEtuD0/moF/AdnNUfTQN06JIm4mEgmz7fTOYksAAAaEUlEQVSVoE34W519mGsnLeZwXiEvjx3EiN7W7T0UKlVQ3HXlrxSRd3Hm6/oDzhop9wAdVHWUqmaHMpiI3CMia0XkaxH5WYD7m4nIeyKyyt3n1lA+vwlOi/gYbhrYhXdW7WT7wVyv4xhTps++2cePpyylUXQkb4wbQv+uLbyOVG+UW1BEpJu7rvx24G1gODATGKSqfd3lgHNCHUpEzgTGAgOBvsD3RaSH324TgXWq2hdIA54QEesw7qHbL+hOpAjPfGatFBOe3lyezZgZX9K1VTyzJwwhpU0TryPVKxW1UDYBDwLZONdL2qnqWFVdVsO5TgeWqmquqhbhjIe5xm8fBRLEuYLWBDiIMwjTeKRds0Zc178Tr6dns/dbG6pkwoeq8vS8Tdz7+irO7d6S1+4cRNumtihWqFVUUATnj3R74HfAehHZVsFHKNaHXQsMFZFWIhIHXI7TbdnXUziFZyewBrhHVU9ZoENE7hCRdBFJ37dvXwiimfKMG9adopISpn2e6XUUYwAoLlEefvdrHv94I1f27cDzoweS0MgWxaoJlRm5Ew10qukgvlR1vYj8BZgDHAVWcWrr4xJgJXAhTjfmOSKyUFW/9TvWFJyuzaSmptpc6zWsa6t4ruzbgf8s3cqEtGSax9lZSOOd44XF/PzVlXy4djdjL+jGg5edbuuY1KCKRspHVOUjFMFU9TlVPUdVh+Kczsrw2+VWYLa70NcmIBPoFYrnNtUzPi2F3IJiZizO8jqKacBycgu55bllfLh2Nw9dcTq/ucIWxappYTscVETauLddgGuBWX67bAMucvdpizNFzJbazGgC69kugRG92/L8oiyO5ttlLVP7dh7O4/pnFrNy+2H+dWM/br+gu9eRGoSwLSjAmyKyDngPmKiqh0RknIiMc+9/FBgiImuAucCvVHW/V2HNySakJZOTV8isL7Z5HcU0MBt3H+HaSYvZnXOcGbcN4Mq+HbyO1GCE7exnqnpBgG3P+Hy+E7i4VkOZSuvXpQXnpbRiysIt3Dy4K42iI72OZBqApVsOMPaFdBpHR/LqnYPp3aGp15EalHBuoZg6bmJaCvuO5PPG8pCOeTUmoA/W7OKW55bRJiGW2ROGWDHxgBUUU2MGJ7eiX5fmPPPZZoqKT+nRbUzIzFiUycSXv6JPp2a8MW4InVrYCotesIJiaoyIMDEthexDeby3eqfXcUw9VFKiPPbhBh55bx3fO70tL91+Li1shUXPWEExNerCXm3o1S6BSfM2U1Jiw4BM6BQUlXDv66t45rPNjDy3C8/8pL9dq/OYFRRToyIihPFpyWTsPcqc9Xu8jmPqiaP5RYyZ+SVvrdjBvSNO4/+uPpNIG2PiOSsopsZd0ac9XVvF8fS8TahaK8VUz94jx/nxlCUs3nyAv153Fndf1MMWxQoTVlBMjYuKjGDcsGRWZ+fw+SYbKmSqLnP/Ma6bvJjNe48x9Zb+/HCA/xR/xktWUEytuPacjrRr2oin59kywaZqVm4/zHWTF3Msv5hZdwziwl62KFa4sYJiakVsVCRjh3Zn6ZaDLN960Os4po75dMMebpyylPjYSN4YN5izOzf3OpIJwAqKqTU3DuxMi7hoJs2zBbhM5b325XbGvrCc5DbxzB5/Ht0TbVGscGUFxdSauJgobjuvG3M37GXdzm8rfoBp0FSVf83N4P43VzMkuRWv3DGYxIRYr2OZclhBMbXqlsFJNImNYtJ8u5ZiylZcovzm7bX8fc43XNuvI8+NGkCT2LCdetC4rKCYWtUsLpqfDOrK+2t2sWXfUa/jmDCUV1DMuP8s5+UvtjFuWDJP/LAvMVH2p6ousO+SqXVjzu9GTGQEz35my9eYkx06VsDIaUv53/o9PPKD3jxwWS8bY1KHWEExtS4xIZYfD+jM7BXZ7Dyc53UcEyayD+Vy/TOLWbvjW56+6RxGn9fN60gmSFZQjCfGDu2OKkxdaK0UA+t2fsu1kxaz90g+L4wZyOV92nsdyVSBXeUynujUIo6r+3XkxSVZfLh2N3tyjtOheWPuu6QnV/fr6HU8U4sWb9rPnS8uJz42ijfGDaFnuwSvI5kqsoJiPNOjTROKSmB3znEAdhzO48HZawCsqDQQ767ayb2vrSSpVTwzbxtIh+aNvY5kqsFOeRnPvLBk6ynb8gqLefzjjR6kMbVt2sIt/HTWCvp1bsEb44ZYMakHrIViPFPWBfnSlkq31nF0bRVPUqt4uraKs7Uu6omSEuVPH6xn2ueZXHZmO/7xo7Pte1tPhG1BEZF7gLGAAFNV9ckA+6QBTwLRwH5VHVarIU21dGjemB0Bikp0pPDR2l0cyi08aXv7Zo1IahVPkk+hSWodR9eW8TSOsT9IdUF+UTH3vb6ad1ft5JbBXXn4B2fYOib1SFgWFBE5E6eYDAQKgI9E5H1VzfDZpzkwCbhUVbeJSBtv0pqquu+Snjw4ew15hcUntjWOjuTP1/bh6n4dycktJOvAMbIOHGPrgVyy9juff/L1Hg4cKzjpWO2aNqJrqzi3yMST1CqOpNZOyyYuJix/zBucI8cLufPF5SzefID7L+3J+GHJNsakngnX37TTgaWqmgsgIp8B1wB/9dnnJmC2qm4DUNW9tZ7SVEvphffHP97IzsN5p/TyahYXTd+45vQNMLNsTl4h2w7kOgVn/zGy3M/nbtjD/qMnF5s2CbEnikzXVvF0cwtNUqt44m06j1qx99vjjHr+SzL2HOGJG/pyXf9OXkcyNUDCcQU9ETkdeAcYDOQBc4F0Vb3bZ5/SU11nAAnAP1X1hfKOm5qaqunp6TWW24SHI8cLnRaNT7HZeuAYmftz2X80/6R9ExNindbMiZaNW2xax9vcUSGyae9RRk1fxqHcAiaNPIe0nnYyoa4RkeWqmlrRfmH5G6Oq60XkL8Ac4CiwCijy2y0K6A9cBDQGlojIUlX9xncnEbkDuAOgS5cuNR3dhIGERtGc2bEZZ3Zsdsp9R/OL2HrgGFn7vys4Ww/k8tk3+3h9efZJ+7ZuEuvTqjm5dZPQKLq2Xk6dtnzrIcbM/JKoCOGVOwZxVidbx6Q+C8sWij8R+ROQraqTfLY9ADRS1Ufcr58DPlLV18s6jrVQTHmO5RextbQ1c+AYW0uLzoFj7Pn25JZNq/iYE9do/K/bNLViA8CcdXu46+WvaN+sETNvG0jXVvFeRzJVVKdbKAAi0kZV94pIF+BanNNfvt4BnhKRKCAGOBf4Ry3HNPVIfGwUvTs0pXeHpqfcl1vwXbHJ8ukgsHjTAWZ/teOkfVvGx9C1VRzdWsU7vdFau0WnVTzN4hpGsXn5i2089PYa+nRsxnOjB9C6ia1j0hCEbUEB3hSRVkAhMFFVD4nIOABVfcY9LfYRsBooAaap6loP85p6LC4mitPbN+X09qcWm7yCYrYdzCVz/7GTCs7SLQeYveLkYtM8LtotLnEnXbPp1jqe5nExtfVyaoyq8o//ZfCvuRmk9Uzk6ZvOsY4PDUidOOUVKnbKy9S244VOsSlt0ZR2EMjan8vOnDx8f/2aNY7264323XibFnHRYd/Ftqi4hN+8tZZX07dzQ/9O/OnaPkRH2mQc9UGdP+VlTH3QKDqS09omcFrbUyc8PF5YTPahXDL3l/ZCczoILN96iHdX7Typ2DRtFHWiRVNacEqLT8v4GM+LTW5BEXe9vIJPN+zlruEp3HvxaZ5nMrXPCooxHmkUHUlKmwRS2pxabPKLitl+MO+kQpN14Bgrth/iv6t3UuJTbBIaRZ106qyrzym1VrVQbA4czWfMzHRWZR/m0avP5OZBXWv0+Uz4soJiTBiKjYokpU0TUto0OeW+gqISth/KPbn784FcVmfn8MGaXScVmyaxUSfG1fiOt+naKo7EJrHVLjbbD+Zyy/Rl7Dycx+SR/bn0zHbVOp6p26ygGFPHxERFkJzYhOTEwMVmx+G8E9dsth5wOgt8vSOHj9buptin2sTHRJ7SC6208CQmBC42b6/YcWJmg9YJseQVFBEZEcFLt59LalLLGn3dJvxZQTGmHomJiqBba2cApr/C4hJ2HMo7ZQaB9buO8MnXeyjyKTZxpcXGp4PA9oO5TFuYyfGiEgD2HclHgF9dmmLFxABWUIxpMKIjI5wWSOt46HnyfUXFbsvmwMkdBDbuOcL/1u+hsDhwb1AFXly6jXFpKTX/AkzYs4JijCEqMoKu7kBMSDzpvqLiEnblHOeCv84L+Niy1rUxDY91EjfGlCsqMoLOLePoWMaKirbSoillBcUYUyn3XdKTxn4rKzaOjuS+S3qW8QjT0NgpL2NMpVS0fo0xVlCMMZV2db+OVkBMmeyUlzHGmJCwgmKMMSYkrKAYY4wJCSsoxhhjQsIKijHGmJBoUAtsicg+YKvXOfy0BvZ7HSIIdSlvXcoKdStvXcoKdStvOGbtqqqJFe3UoApKOBKR9MqshBYu6lLeupQV6lbeupQV6lbeupTVn53yMsYYExJWUIwxxoSEFRTvTfE6QJDqUt66lBXqVt66lBXqVt66lPUkdg3FGGNMSFgLxRhjTEhYQfGIiHQWkXkisl5EvhaRe7zOVBERiRSRFSLyX6+zVEREmovIGyKywX2PB3udqSwi8nP3Z2CtiMwSkUZeZ/IlItNFZK+IrPXZ1lJE5ohIhnvbwsuMvsrI+7j7s7BaRN4SkeZeZiwVKKvPfb8UERWR1l5kqworKN4pAu5V1dOBQcBEEentcaaK3AOs9zpEJf0T+EhVewF9CdPcItIR+CmQqqpnApHAj71NdYoZwKV+2x4A5qpqD2Cu+3W4mMGpeecAZ6rqWcA3wIO1HaoMMzg1KyLSGRgBbKvtQNVhBcUjqrpLVb9yPz+C8wcvbOcFF5FOwBXANK+zVEREmgJDgecAVLVAVQ97m6pcUUBjEYkC4oCdHuc5iaouAA76bb4KmOl+PhO4ulZDlSNQXlX9RFWL3C+XAp1qPVgAZby3AP8A7gfq1EVuKyhhQESSgH7AF94mKdeTOD/gJV4HqYTuwD7gefcU3TQRifc6VCCqugP4G85/oruAHFX9xNtUldJWVXeB888R0MbjPMG4DfjQ6xBlEZErgR2qusrrLMGyguIxEWkCvAn8TFW/9TpPICLyfWCvqi73OkslRQHnAJNVtR9wjPA6JXOCe+3hKqAb0AGIF5GfeJuq/hKR3+Ccbn7J6yyBiEgc8Bvgd15nqQorKB4SkWicYvKSqs72Ok85zgOuFJEs4BXgQhH5j7eRypUNZKtqaYvvDZwCE46+B2Sq6j5VLQRmA0M8zlQZe0SkPYB7u9fjPBUSkVHA94GRGr7jJZJx/rlY5f6+dQK+EpF2nqaqJCsoHhERwTnHv15V/+51nvKo6oOq2klVk3AuGH+qqmH7X7Sq7ga2i0hPd9NFwDoPI5VnGzBIROLcn4mLCNMOBH7eBUa5n48C3vEwS4VE5FLgV8CVqprrdZ6yqOoaVW2jqknu71s2cI77Mx32rKB45zzgZpz/9le6H5d7HaoeuRt4SURWA2cDf/I4T0BuK+oN4CtgDc7vZFiNlBaRWcASoKeIZIvIGOAxYISIZOD0RnrMy4y+ysj7FJAAzHF/157xNKSrjKx1lo2UN8YYExLWQjHGGBMSVlCMMcaEhBUUY4wxIWEFxRhjTEhYQTHGGBMSVlBM2HNnXJ3vdY5QEpGLRWSxiBxyX9/bYZApzc3ySAiOFdT3LJTPbbwT5XUAYxoad+62d4DDwPPAt8AGDyMZExJWUIypfd8DGuEsX/Cy12F8LANOB/Z7HcTUTVZQjKl9HdzbcJumPhdrKZlqsGsoDYiIJLnnqWe4n78iIvtF5LiIpLuzCvs/5hH3MWnlHc9v+wx3ezcRuUtE1rnPkSUiv3bnrEJEbhCRZSJyzF217qnyVisUkQ4i8qK7b56ILBeRm8rZ/xIR+cB9jfkistldue+U1frcbFki0lRE/u5+XljZc/oi8kMRWSAiOW62NSLyoIjE+uyTJiIK/N7dNM99nwK+v37HH+3uN1pEhovIfBE5IiLfisj7InJ6GY+Lc3OsdN/noyKyRERuDLBvmdcxRGSAiHzi85z/E5HB5f18uI9rLSJTRGSX+z34WkRureC1DnaPn+M+38ciklrGvs1E5M8istH9GTvk7v+98l6fiAx037eD7rYkd5+zxFk1M8vNu09EvhKRJ8WZzNWUw1ooDVNXnNMbW4AXgZbAj4B3ROR7qjovRM/zNyANeA/4BLgS+CMQIyIHceZ/ehtYiDMf1EScFQvHBzhWC2Ax3113aA78EGe+ro6q+rjvziLyO5w/3AeB/+LMhnsW8EvgchEZHGC5gBjgU5z34xOcaxuZFb1IEfkTzgqA+4GXgaPAZTjzh10iIiPcmYSz3ExpwDCchamy3MNkUTnfx5nu/kPgGaA3cDkwQER6q+qJ01Vu4fwUZ62dr4DpOP9EXgK8LCJnqOpDlXh9F+C8H6WzY28G+gDz3OOXpTmwCCjAma+sEXA9MF1ESlR1ZoDHnIvzXv4PeBpIAa4FhorIxaq60O/1LXLfgy9x1uxpjfNz8YmIjFfVZwM8x2D3OT5335PWQIGInIWzJpHiTH6ZCTR1M0wAHgIKy3m9RlXto4F8AEk4vywKPOx33yXu9g/8tj/ibk8r53gz/LbPcLdnAR19tjfH+aN7DGcBrNN97ovFmRE4H2jjd7zSzK8BET7bu+EUjAKgu8/24e7+i4Hmfsca7d73D7/tWe72/wHxQbyng93HbQPa+WyPwimkCvy6su9pOc9TmrsIuMjvvj+7991fxvfBf3sj4COcxdLO9tme5u7/iM+2CCDD3X6Z33HG+Xxv0vzuK90+DYj02d7bfQ3r/PZP83nMXX73XeVuz/D7/j/rbn8Wd15Cd3sPIMf9WUoq4znuDPAeP+Hed1WA+1r4Prd9BP6wU14N01bg/3w3qOrHOH8UB4bweR5VZ0XC0uc4jPOfXxzO4lfrfe7LB17FaSUEOn1TDPxKVUt8HpMJ/AvnP+ebffb9qXs7Vv2W/lXVGcBKYGQZme9V1WOVenWO29zb/1OfKcbVWW72Xpw/2rcHcbyKvKKqc/22lc5OfOJ7JyKtgJ8A6ar6V9+dVfU4zlTuApR5ytA1BOc/9Hmq6r/K4RSc9dnLkgv8QlWLfZ57HU6r4nQRSQjwmE3AJL+87wCfuTkucF9ftPv6jgIPqvtX390/A+fnIga4JcBzrNTALZdSef4bVPWQ78+eCcxOeTVMK31/yX1sx/mPO1TSA2wrvRAdaPXH0uITaL3vbW4B8TcfeBjntE6pwTinJm4QkRsCPCYGSBSRVqp6wGf7cWB1gP3LU7pw1ymnflT1GxHJBrqJSHP/4lZFgd7T7e5tC59tA3BOH5Y1tqP0ekDAay8+St/Xz/3vUNUSEVkMnFbGYzM08CqkpXmbA0f87ltYxh/u+TinCfvhFJdeOP+YLFLVQGuyf4pziqpfgPuWlZH3VeAe4G0ReQOntbpIVTeXsb/xYwWlYSrrD1sRoe2okVPGc1R0X6CLn3vKeI7SVkEzn22tcH62H64gXxPAt6Ds9f1Pt5JKn3dXGffvArq4+4WioJxyDFUtEqefQ6TP5lbu7QD3oyxNKni+0tdX1vtf1nYo/+cMTs5b0fH8v8+Ved/BKVplHeskqrrMvV70G5xrPTcDiMhG4PeqOquM5zIuO+VlKlL632Kgfz4C/bLWlLZlbC9dGtW3QOUAh1RVKvjY6nesqiwOVPq8ZS3R2j5AvtpQ+nz/qOA9GF7BcUpbGGW9/2Vtr6rKfp+r876X+X1W1SWq+n2c1t55wKNuppcD9RwzJ7OCYipyyL3tHOC+gF05a0iX0q6dftLc2xU+25YCLUTkjBrO5Pu8af53iEgKzum7zBCd7grGMpx/Bi6o5nFKX9/5/neISATONZZQOt89rr80vzwbca7RnC0iLQLsX1oov6pKCFXNV9XFqvo7vrsmd1VVjtWQWEExFSk933yriJxopYhIZ+B3tZgjEviL7x8bEemG88teBPzHZ99/uLdTRaQDfkQkXkQGhSjXdPf2IRFJ9HmOSJxu0xHAcyF6rkpT1b3AS0CqiPzW93tXSkSS3fewPItwugkPF5HL/O67g7Kvn1RVD5wuuieIyFU410824XQxR1ULcF5fE+APfvsn4/xcFOJ0i68UEblARJoFuKu01RS2a9GHC7uGYsqlql+IyAJgKLBMRD7F+QX7AfAxgVsuNWE1zhiF5SLyCc459B/hnHa73/fCqarOFZEHcLrTZojIBzhjCprgjMEZhnOR+dLqhlLVxSLyV+B+YK17MfcYzjiUM93nebycQ9Sku3D+QP8BuFlEPse5RtEB52L8AOBGyhlr4154vx2nm/G7IlI6DuUsnLFDH+K81lD1gPoIeMItXqv4bhzKcWCM3wX7B3BaYHeJyACccTGl41AScLofVziOyMe9wMXiTGq5BacH2Rk4r+8Q3/WmM2WwFoqpjKtwxhN0Au7G6TlzP07X09pyCOf0ytfArTjjMjKBkeo3qBFAVf+CUwTfxzkX/jPgBqAjzh+GCgf0VZaq/grnD3MGTjfVn+L8bj0EjHD/m651bg+rYTjfs/3AdcAvcE4HHQF+DsypxHHmu8eZD1yB8/oau8fZ4u4WqDdXVXyBc3orFqcgXobTY2uoqi7wy3UQp0ffX3E6IfwC53u8DLhUVU/qflwJk3B6eiXhXJC/G6cFNgnoZ729KibBd2oxxhiHiCzCaTk2C3L8jqmHrIVijCmXOx9YoPnPRuO0Gj+xYmLAWijGmAqISC+c3lVzcC6MR+Gc9jwfZ6zJEN9ZD0zDZQXFGFMut1vu4zjXUdrhXN/YjTOS/I92bcGUsoJijDEmJOwaijHGmJCwgmKMMSYkrKAYY4wJCSsoxhhjQsIKijHGmJCwgmKMMSYk/h/BJfUHt7bKuAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x, y= zip(*MAEs.items())\n", "plt.plot(x, y, 'o-')\n", "plt.xlabel('number of neighbors', fontsize=20)\n", "plt.ylabel('MAE (years)', fontsize=20)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 4, K-nearest neighbors regression by hand. You may use only numpy and pandas for this task." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "Man = normed_data[normed_data.index == 'Man '].values # trailing whitespaces... Excel\n", "manfree_data = normed_data[normed_data.index != 'Man '].values # might .strip() them\n", "manfree_lifespans = LifeSpan[normed_data.index != 'Man '].values" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "distances = ((manfree_data - Man)**2).sum(1)**0.5 # Euclidean distance" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "20.74551724137931" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "manfree_lifespans[distances <= sorted(distances)[9]].mean() # mean lifespan of the 10 closest one" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Actual_lifespansPredicted
Species
Man100.020.745517
\n", "
" ], "text/plain": [ " Actual_lifespans Predicted\n", "Species \n", "Man 100.0 20.745517" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preds = pd.DataFrame({'Actual_lifespans':LifeSpan, 'Predicted':lifespan_pred_norm})\n", "preds[preds.index == 'Man '] # prediction from the 3,A" ] } ], "metadata": { "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.5" } }, "nbformat": 4, "nbformat_minor": 2 }