Skip to content
Snippets Groups Projects
Jupyter Notebook Block 1 - Introduction to Image Classification.ipynb 401 KiB
Newer Older
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAABECAYAAAB6WXVJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAABttElEQVR4nO39eZBtWXbeh/323me8870558t886u5u6q6q7sBYiIAggRA0qQkSoZMSbSokBSWKImEZQdpRSjscPAPSxGiJdkOmjIZpkKkQQqkRBACCIJAAwQaPXdX11xvrDfkPNz5nnlv/7FOZhUpdBMUulnN7lwRL16++zLz3rPPPmuv9a1vfUs557iwC7uwC7uw7yzTH/YHuLALu7ALu7Bvvl049wu7sAu7sO9Au3DuF3ZhF3Zh34F24dwv7MIu7MK+A+3CuV/YhV3YhX0H2oVzv7ALu7AL+w60b5lzV0r9uFLqXaXUXaXUn/1Wvc+FXdiFXdiF/c9NfSt47kopA9wGfgx4AnwR+Fedc29909/swi7swi7swv5n9q2K3D8J3HXO3XfO5cDPAH/kW/ReF3ZhF3ZhF/aPmfct+r2XgMcf+PcT4FMf/Aal1L8D/DsA2gQfb8bL4MAGmjKCYGKxgQYHVQTe3GEDBXWioSuH9RXWgKrkNWfA5KCsQ1koGgplkT8VVCGYzKEc6NySLhuCkfxep8Gk8suVczitKBsKncv7B1NH5SuUdYDCBmA90AXoUt6zChS6AFV/Nmc4/7xn5gyg5OdcfbRWARBYwkNwRlHGCpMD9eeowvqaS/DmFc7TOK0o2qBK8GeOKlJUDUd4ZCmbBi+xWF9T+aCcvK8/s5SRlmstwKl6rRw4VV+bk+svY40/qygbBl3W6xHJ78KCrj6wpnl9zYHCZLIOJrOUsZb3nVSUTYNT9ftquSdFE0wK/rzC+hpVOZynsL5C5w5nFLqwZD2NtzjbOPKz1gd/WpF3jHwm3v+93ry+9ojz++GMwimo2o7gFFQh66QquSZrZG+UDYX1wVuAySzOU+Qt2Ue6oP7bgYIqkO+V+y/r6Tzwp/b8OsoIwqGlaGm8xFG0ZF8EE0cZyc+HQwtA3pUNofOz++0oY4Wu5NpMBqqUvaWsw3qKqulQuUK5+v7GGuuBl0IZyd9FE/wZlI16nQKHN5E9bNKz3ydroEu5vnwJgiFYT6EqRxUqdFn/vKJ+hhxVLPccC86rr3dUYT2N9dXZLcOp+gvAJJaq3odn982f12s0d+TLDjPVoOU9ipbCZNR7E0xS4Xwt1x9AMLVkfY1J5XtMJs/D2b3VpQPryLuaYGyxvqLog54rdH3fkMcak8v+xYGXWpypr8FC0VTvX3urhFMPZeUZoFWhR6beH3IfdAVF2+HN1D+yP7DyXt68oooMaKh82V9V0+FP5LpMJj7GhrIfnZI9iZO1ztuKfOfJsXNu5bfxwd8y5/5PNOfcXwL+EkBzedt98ul/FzPNmDzXY3JFs/x6gc4tJi05frFBNJRFP9uAzb2c2VZAsqzo3a9YrMhmWn49oWh5BKc5uz/YxGSw8rWUoukxuezRu1/gTwvK2PDgXzJs/qrCn1vm6x6No4pgUmAWJVXD4+S5iOjUMbqpWftyweSyh5dCfFSyWPWYbyqCCXTvF+jCMtsKaByWeEnFbDMAxAGUTUXWg/ZDR9GUjdI4tkyuGHQB801H2bXc+JmcxUbIbFMzeKdAWUfWNUwvG8oG+BPY+MyEsh2QLPvsf68iOtasfSHj9NmQyTMVV/9OxfSST/NAPmPekY0SDh39dxOOXm5gMoe/cDilQEH3zgJnFCarSFciosOEyY0Wzd2Mo5dievcLVOk4eCUgHIKXyIFgMsdiTdPcswSTiqxvaD1KGd+IaT/Jyfoe83XD5v+0w+5PXKLoQP/divmaJho6jl9W9N6BwesTpjfaNPYyZttykkUnJTbQNB5NufOv9Vj/nMV6ijJSmMIxuaJZ+2LGyfMhXuLQJaTLivDE0X5S4C0qnvxoTPeOxWlF3hGnOn6u5MbPlITv7LD3R6/T3qlwBpKBobVTcPxiQNmAwVuWzu0Jo+c6HH4SWg81jX2LM9C9u8AZzeHHGmRL0L0jB1AwcWR9xcavnbK43GG6bRg/7bj5Mwv2v6dF727Jzg8ZnHFs/4OK8VWf+ZZj8zMl8c6cg+/tMrnh6L0t96X9pGT/Uz69O5a8LQ6ntVsxu2QYvJWy2AjZ/f0l8YOA+MjRv51x8IkIVcnhkQ0U3fsVhx/TrH++YnTDo2hDfivh6l/RHH48ZOVrObMNHy9z5E1FMHc0DnLu/2/hxn9jSdZDdOGYXhJXoawjGjn8uZUAacmjuZtjPcVi3We6rdn6lSloxfhGow4cxGk6LQfl4K0FJx9tYDIoY7lvlz694PDjDVZfTdj5Dwr83+jgz2WfHr4C3TuKzqMSpxSNx1MW220WK4ZkTbH5Gwse/OGY/tvyPuG4YnLFIxzJIRyOKqyv2P+U4dI/LPGSknt/UtF+NaJxIM7S5I6iqQlmltmGIT6xxIcFedfDW1TYQDO+6pH1wUsg/r1HtP5CBxtoRjd81O87pfv/blPGmubjBYefbBMfWfa/z7H6eUUws2QdQ9ZTNA4teUfRu5ORrPikffFdrb2KJz/muPE3S/a+J6J3z5IMFOOnHdu/XJEODK2dHJ1WZMshB6943PlPf/rh1/Ox3yrnvgNsf+DfW/Vrv60pC7PLMdHQB+dYerPAmxUUbR9lDb17BeHBnKIfk/V9TGaZXg6ITypaTyoWa75E/Qam2yHtxxmLzYjlNwrGV33yrkd4nBP0DVWkCA8K8vWQxiNDYz9hvikOxZ+W5B0fOj7eoiKYOuabmuauY7HiEUwdfmLJuwYvczR3IRpVOE8RPp7jjCLveixWPDoPM0Y3Q8KJo7lfUjbkBjbeq6giiUxVZRi8nYENqU4MVWxo35+hqiZVqKgCTfvujNlml8FbFelAY32Dso7O22PKuI/TjsmVgN69Auf56LwgGlmJVjV0Hpbo3JEuGYq2T/PAoktHdJJTNDxsoNBFxfhqi7yjCCaOxr2U6CQkWQuIjy1Z16ALx9LbFU5BGSu81DFfM7QfV/izirzr0X6YMroZE59U+JMcnVVYL2L+7Crd9wqSJY+jlzXhiSI6yencCwgnlmylQXyUk3d9Wo8zHv5ERPNJQPdhwei5LkuvwfSyYfBWDn0P60H/ToVJK1q7FcFEIvjGocOflWQDn6zn0XokTr/9YMbkRpO0r2k89FBVQfLCFu0nFXlH09rJOH7BIz7RNPYcWU9hPZjcaqMsRIea9iO5zslVn7wbkKx4eAtHfCwHXTBxtJ9k6Cog2W7jz0pWvpzgVJv5pZilt3JU5ei9Y1BOMb7uU8aw9IZkSWU7RFXixHr3M5Jln/BowdKbLdKeJj6R+9Z4PEW5FmXDUMSK5t0AfwrtnRJvmrH0huHoJZ/24wJnfPxpReeeprGzoApbOA3jPCZZsQzeKRnd8Bm8k/Hox0Iu/3JG1vcpI0PjLZ+iW+DPLOFxgs5jqkgz2zRY49C5JTxJyTtNRjdCvMzhzx39OxXz7QZ5W9M4LBlf92ntVuRNjZdavBRMUtB9IPshGlqq0GNyLab7sMQ/mlO9s8SlVxOOn48Jpo72e5r+7Yys5xEf5pLRGujfToAYVVQsve4wBZSRYnzNp3c3JzpYcPJSF5NZ0r7P6pctTkHR8mi87dO9X+IllmRZfq/dDMFBugIrr6YkayFpVxN40H3tBG/RZbHq4yeWveVlgq4lHWiW3sp4vNGnGVt05aiaPr07Od6ion0/ZrEOwV2Lco7ug4pglOPPA7xxRjOvsH4MznH0kqb3hmK+oVn9akHR0vRvFzgd4k9SDj/u07lXkQ8C/GnJ0huKO9/ACX+rMPcvAreUUteUUgHwU8DPfb1vdhqik+I8/ZuvyZmjKzl5s64h3WgxuxRQxpLuNo6qOqoN8BPJy60Ey1ijURaSgUfWg3BYkC0FlLGkmVUrIByWZMsWNMRHBWWsKGODPyvx5hX+OMNfOHQmziw+KbG+wiTykDkFeVdRNDRVqCiWGxRtg6oczf1CosyGoogVRUtTNAR2SAeGtGfQuSVvQ7Lsk/dgsSEbr2wHLFY0Onf4M0sxiFBOPkPRUjhP4+9NsA2fZEWRLilaeyWqcuRtgXWsryibBpNJ6j7b9CgjhfPU+XqXkRwSeVtTRR7NvZzuvVzS83bEfCPAm1vSvkYX4iTna1oyJKPIWxpv4Uj7msWqTzAuWayHNA5LkmVDFXnY0DDb1ATDnCrUzDcV8b6iigGtSFYUZahQpaVoeujCki4HtB5JduCUwk8syarCWzi5xqYimEp0ZQND3tKg5LXplmGxHgj8Esp6WQ9mVxoULYVyjsW2ZATh0YJk2eAvLEXDE/gvUJQxFO16T56Wck8ask6LNR/rK6KdmXw+D+YbmspXlA1xGkVT4S0q0iWfdC0mWZO9PV/3Ze+Fivklid6qACZXNf60QlWWKpR7l/V8kiWNM5rJFQNA1pH3yZcasn8Khy4dWc+RrsgzglLMtjx0BcmKh6qgbBgW64oq9lksa2abmnTFEkwrpluGYOKoAk04UhRNj6KhMLkl2ZBMSVkne3LVk8/nIVBhrLGhR9HQNI4rvKR+dlcN8WFO46gkbxviY3sO9aGUrEHskyzLe83XDdaDYG7J2oay3yBfLZmvh1hf4LfZFcv4aoDJncBtzZAy0mSDgLwnkNT0siZrK3ThCEeWdOCRL8U0jkqcUYQTy3Tb4KUVwahgfrVksWLAnsFjmmBaUQWKKnQULQ+dO6KxRTnItrpkfY/FuibpG8rVnObjBd7CkSz72KsJ3sLilARlZcNgA0265Gjuvp91Fk1N2fRI+wYXGrKBHCizLY0/kQy/9Sgl7RvJhgee3IOWT3giz7dJ5aBYrJpv6IS/JZG7c65USv0p4JcAA/wV59yb3+hn5puBYJ5hjf8FRiLGymAKV2808FL5umhq8o4iOrVkbX2OSZahbLy8rYmGFbMtj7zjn+OKAFWoKdoeOpMNnfYNzoANFEnLR5fyUECN42eSsuGgaBmKWOMvLP7M1Y5SUYXy8J3hjF5qcRq82sE6Iw7nrD6QLvkoK+lgMAbrafKOwV8owUubNf5aWMFAW/KzRdtDF02Klo8/k9+dtw3BtEIXkPXEkZsc8o4iHFuJjjuaxbIhnFr8mUAVyjqKpqKKDEXHI29qWWtfcPZkxcMU7vzB9efy2Ysm+HPBcP0FoGRdlIXFmjiVbODLtSpYbEZ4qUWXhnS1xuoDjTeXz+il8pmtZwinFemSvJfJdf1QIDhp26PoKMq54Nd5z8NPHHnH/CP33yj5jE5D0VL4h07Wrq/wJoa8q6iCVr2+jirWlG25xjMYIetqnApqbFThlMMGkKxAeqlF3tY1vgtZT+5NGUm9JF3yqXyFruTeZn0fXTiKlsGfO8qmIllSFF1HdCTZHsi6SE1HoMeqKXukigSS0YWWfRYIbJP1NP5c6i66cBRdgagW62ffDya1mEwcTdEGfwomVcw2BC9OVjXxMaTLgu9nHU001JikDhKU1DvOsGjr19i9MpjEQ1eO2aZB51J78RJHtuSTDAzRSA7hcGzlvmSWsqHI+4HUR+r6TRXCfFUw6qwfYMYGXVlsINdoUgkuFiuGZuWwvk8ZK5QVmLZoB3gL8BfiqPOOor1ToUvLouMTnZbkLX3+XKtA441NXZ+T51vnFfNNX/xLQL2n5Hqtp/Dm8nyrUmpw5tQn7yuyviY+tlQznyrWZG0JhqwHOAjG4rDDkTwLZawIR3Vdq+FTRXVtDlhsWjr3NIvNCF2BretE/kL2QNYH52myvoeXWPz5N2Y6fst47s65X3DOPeWcu+Gc+/Pf6HutgeEzMLukmW8p+rcTptsBk2uGylc0Hs9JBxJlZR1N2tecPgfxkaW5m6McjJ63FE2YXoXZhsfoljjmvO9YrEiEVzYksqhiw+ErmvhQMbrpUwWKdAlmm4bh04bxdUM6MHgLy/j5ku79nOOXNOmyYnzDMHwOFiuaaGgJZhLd5l2PcFwx21IcflyWdb5lWazocyc+X9c0Dgraj3LKWJF3ZROY1NHYd4xuGapAE59UJEuao5e0FCK1orVfkbdhfM1nsRGDVgzeTLABHL0sRa/mrmN62dB+nDG5oklWFc6DZEnT2i1ZrCuSgSZZMiQrHnnXI1kVrPT0GcPJR+HwE5CsR/gLy+kLkA4Uh694nD5r6N5Z4M8tJhPnOb0G0WnFfENx8oIhGJecvuCoQshbmvA0Ixw6Tp8z4mQSaL1yTLpsyTuCuysLJy8Y0oEm6ykWSwbvE0MmH81JB5qTlxxbvzpnfr1gum0Ih475mhRqR9flEGrupHiJpbVb0HmUcfyiYr4F/TsF6UBRNJRALQYa+7IGw6d9Gkclxx/x8SclxaBkfENLTacSB3b6PEwvSyGxdyfBelC0JY0fPQ3zLei+V2ByR7Lu0BUEY8fopqFoKcLjnO57gnn3Xz1hsaJpP85Z/0LC8KWSKrasfTFldENz+lxA87Ci+15JOCykkOZrVl5NcRrCkeDuVaSpQlis+aTLEB05KS7PLfN1n2hYScARK7KBwD/xscMsStqPLcHM0X4ojri1UzG9Kgd9+5lT4qOCbACjGz5rX7DM1w1lpAW2OCrIelLELyOp45RNg/UUo2ctsytyUPfupxx+zHDykmWybZhelSL9+Kn3g5vZJTnM02UhIBQdx+gjlu69nKyn6dyD8LQkGzgW61KQbByX52SE+brPbFvhzyxVDOmSx/pnpyTLsucnzxWEwxIsLNY1w6cDjl9WDN7OOP6Iz2LVp/VYcPCyaRjfkKy6aCgmVwx2JaexnzN8WjO6JRlnsuLRf/WE3v2C3p2c/puK0Y2A6VVL5+6MwZc8rIGsrxhf9wgmFbqyNA4cw08UJCuaZFmhS4c3L4mGFePrAU4rkmVNY9/RvTmke79gdknT2Ms4fVYOd+vBYtlQPL/g5PmIk+cNedvQfZB+Qx/8oRVUP2gmh/47EE5Kykgz24poP84J5nJCTW+06dxPqBoefqjxjyqqyCeYlDXjwdG5Y9C5o/3IEU4s/kKgkO5tCMcWb2ExuSGYWIJRTvd2TLoE7ScVaU/TfuhoHFZ4icFfOExmSZYNnXclNe7cgyp0hKd19JNB2tOY3NHeqYiOpBjaeiJF0zLWtN/T+FPBZPNYEZ068q53zkppPRImRNFS5F1Yfr3Cn1dUgaa1W6EqQzApwXnM1wzNXUfnYS7ZgXWcvBBjUkfnPuKoVxRLbxbkHY+lt0pmm4aioaV2sOHRv10JjBQIrFU0NZ0HluZegdMBwURYCY2dOdlSRPddiE8rioak0+laSNHQOAXNA4vTBudB+5GkRE5D87EmmFoahznZUkg0tHiJqg8/y8mbS7T3FNFpweimT+OgonHkUCWkfUM0qhjd6dF5omgeWEymOHq5SfsdaO4LlBGdSmbU2pWMarYVySEZakxuWXpDMprxVZ/2I0t0KulS0VIs1hW9u1JEdVrR3JF73X43pP2oYr4uYVT7saVxoChjx2JNMbkW096psL5HOClpPvaoIsg6UhRvPQScFAj771bCalCK6SVD575j+syA+NRx+myIyRytuxJdzy4p+rcrlIOkr5mvG/q3HfGpw2QVi7VQoJNQ0Ti2xIcZugzQuSXqBaQrinAIRVPT3CtIl32CEcQnwgbr3SkZPuVRNr1z1s9iXbH0RsVixdC9o7CBZf76gHa7Ij5ydN4rOP5IQP+u0GOiw4zZdkx8bHFG09yX+21SiwkV7XuGaOjw5xXJSsDgLUeyZIhO5fuDeUXroUc4qjC5JhgLVKKsRzCzBCND+EAz3/Tp3p5z719u0buv6NyTyDrrS1ajc/m781DWAORwCyYVw+daUkBF0X3Tx3o53rwiPHU0D0r8qcfoRiBrXTlGTxma+5IRth868n4g9ZlHFWUUkfdKlt6UOpcqoXM/YfZ0n8WKZCnjWzB406LuKWZXmswuQzSE7nulsLi6Hrp0LDYU8YOAcOSITmRfCpxo6N7PqWJNc18OzOk7A6pnFP7MMd8MiY8kMl+sK3p3KszdmO79gsaRwZ9WjK9F8Gtf369+W8gPOC1wSxmJ41is6prmKHjxfE1j5lKAyZtK8EVgvu4xW/eYXpHUaHZZ6Eq6cFijBHIIFdMtI1BNS5EODIuNkPi0YrFpiY9ysr7gsyg5CKyRyHN8Q6MLiVC9miYZTiwmhbKpmG0rsp4m7WmKjkfWqalSVn7emroO4CSqcwaSZc3wKXEMVVxDAAPIlqxU5Y1icsVjvippY9bzmV0W+MR51JisR9H2yAZKHhIHeVORrDm8pGL4lJzZAi8oTO4Y36yx9gaSGnc0ZaQEcok0ZQw4iI8teT9ketkjPrXyvrpmmlzxyHqKdEWRdoVyN77moWqK2nwzOE+Ni5YcSNNtia5n64asrwnG8rvytiYdIJh+7gjGBc4I1c9byAYvYoWXQLoq6xhM5GETWEARHmcsVjXpQJGsaqkJLBuC6Rm1UKJJauisaCryrmDbZaSZbRiqEGbbIUW7hvx8yHoCg3lJfa9b8pCWsTwui2WDrqSoN9vSZH1FPLQky5q8V/P9FOQ9n2TN4ScCXVgP0mWYb8l1VRFMr5xBipbRs07+f80n6yrSpYDJFc3sknx2k1mqyMie3vbRlSPrW4q27CtlHWlPkffkI1hfnP5ZpJ935fekayWTq4a8zmYWKwaTCv6tKoEkFpuWItYkA1MXkAXWqAJYrEmdqQo18w2ByKr6vSZX5H77M4eXCRw2uSyObnTTI60x8rPnPutowqEcZsmyxgaGqlUxXxfoxWSOvAPzNY90WTHd8qhCjZcJnGYDCRxmW0IZrmLwFo7ZJZ/5pZgqlOegcVSRdxT+rGK+Zig6jtmGIWvL3p9ue1Ija9T3eMWc02eVlSLwdMtjsSawT7mZkbfr/dnT5JsF4xuCNJSxIe1pZpcC0iVHMHqfjmt9GN+Q9TRJSRVosq6SDDGDZFUYV3lLncPRZ5RRnSn8RSnU4VDqbd/Ivi0i9zPusD8X1kM4dviTgrJh6DwsWax4VK2AaCiUpjMsu/LFIZsnMF/XNJ8gaamCcFJRZZq0B609SzAumV4Kae8UBKc5RTcgGGuw0DgQeMSflRQtqeAr66hC2WDNHcHlGkfyfV7mCKcWXWiiU4vJHd6iIj4Rh+cniuikoAoCGocSIZ/h3l4iUWpQ42VOQzgU3qrzpFgSTBzRqCJvaYJJSeMgxCTCJQ6GGV5a4ZTCW0jWEkwF3vAWGlVaWk/koDC5ZCEoRf9twXH9mUNXDpM5gomlbGj8cUHUNJSRHEDR/pwqbtf1AYW/sPV90qgKwrHAALoUh2IyuZb4qCAdCJYbnmRUQcTCk0je+qquDyhMIpxsf2YIpnIgVbERGmlaYTJJR4O5xRpFMJaNXzTlENel8IJtZGjuS22jiJH6QOqkGL1wRCfCYjGJJZiL4zaZwp8L00aXPnlL03qcsViNUZXDpBCdKKkRVEiNYmyID6SIripo7RZkfe+8h8Fk4qTiY4vOdc3bV+jcEow8/FmFLhzBtCLr+pQNcVomlfqKlzh0IawQ60F8WlLGmvC0IBzoc0zWegqdVSjr0X2QM7oR4M8UwQjCseDGrd2KdFmcaXgK/kL2affegrzdxBmFPzE0d+WQc0r2YrKqiIYC0cRHBf40wl+UhBOHvyiJTuRDNPdkHYKpJT5IqYKYMlL4iWRAqtJ1P0XNCLOS5RUNRTSUzNGf5CRrESYXDnrR0lgjB4JyoBOpl+VtKQ57C7kPXia05fA0wwaxFBprhtnsUgd/4c7rPNHQ4k9LrO/jL0oWqwHBRG5Y+3HJ9LpH41CeXdA0jkqBn05K5ps+8WkFDvy5HCTOaMKRxZ/WReW5RzSUAMRPHGph6N6TDNGfl/gLTXxYML0cStBihSCiKoEy845BFxVeYomPwWktzjqD5o49h3JBqJfRSYmyBirJ+sOTAnXlG7vvb4vI3Xow3TZMt3yml+Qhz/s1M8ZT9N6akvf8mh4okeT0ksH6wmgIZlZOaAPzDUMVaSZXPBoHGYtNhT8pyTvCe826hqrhMbrpYzKYb4b4c0u6rEhWAhYrhvm6RAeDt+akS9B9UDJfM+RNTd7SzNeluNI8qDBF/TsDLbSqJU1aR2/JqiIZmPPGHmWh9SSlvVOc/7/JJV1r7Clm9fsGc0sVSJTlTXOiYyeYe1cxudHETHLMoqB3T9LbZEnTuT2he9cxvRrR3MsZXwvI24rGfk7ly2E32zDyfqclJrXCzb+kKbo+VSD4+uSKoWyHOKU4fdYj7WvSgRSo249y/KSOituaxZoiPhHeetqXAuPkmiFva5L1iPbdCSBRUe+tCVlXsbhSMrsqjqBxKCyC0Y2QZNljvu6RLPsk6xXjp6CINdPLwqNfXJLIJ+2LA3RGMboeEoxL2vfn9O6nBDOLN7cMn/aZXBVMP13SpMs+eVvYSyZV5B1DshqgS2Gc2EAzu2oZ3fCFBaOlkDe5bJheMngpNPeFUTXfdpjcMr2sKVqK+FT2XtaXQ6MKYXrJJxl4BOOcxoFjum1o7Gckyx6DdzLajy2LdcXikiU+tiRLhnTg0TioGLydEx6lpD2NN87w53LgmEzWvGxK4VtZadRpPRTYIj4uKVu+NODVmWcwlSwqHAvTSFnw547wWLBfk0vxtfPumMXNnMZOymxDk6z4NPbcedHYeppwXJG1FbNLknllXU3Z8gUD31Syjxqa6LRictljtqVJB0JUUJUTmu1UnNZsO6aMpFmxDKVQOL6hae0IFTk+EIZV3hEWzPssOAiGOfOtBuOrUrg3OeS9kM7DiiJWdTakiA8zor0Z1oP5esh0W7jri1UPk1u8mQQtjb2EKoTmWweE44r5msfiSkl0mLFYMRRNyWiSzZj+GxOho55UdN8RyDhZUzR3c4ITQ3RaUjQ18/WA1uOU4HhO+5E7r1Mky5L9xLszlHXMt5vSfBgKRJfeSln9SoGy0L07l8O8cHQeVmR9j2xJ+g6mWx5Fy2PwbvEN/eq3RFvmn9aaS9vu2r/507Qfy8l39LJm8KaTSv6R5eQFRfs9zhuZktX32QBFSxp00iXF6lcLvKTi9JmQ9uOKo5c8Vr8s2K4uHOmyYuOzGWXDkCwZZlsKbwHJuqOxo4iPLfMNTXQq0cn0KvRuw+gZiA9k4+Rd+d6zZoaiBatfKcm6mvEtjT+Va3JaMoKiCbPLgtcHI43zHDoTiGX9czkHnwwoWo6yW7H6GUPelgfP1lmJ00hB6uWcwed9uvdyjl4KqWJIruRETwLifcf4KYftlCx/xidZU6x+KePkhZDFuiM6UYQjcRKzrbOuSKH86Vzw5dFN2XiNfUd8WlHGmmSgpOjpIBkosr4UwNIVx9Jrwq4AiEaWtKcFiugowlOJoCdXJeX2EphtC7Y5vqlY+6LgwMm6Iz5QDN4uGD7t40+FmXP0Cqx8uWYppI7DP5wx+OWI4TPQfg+Kjtz/5q4lWdVMr1c442i951FGsPYlodXu/LBPdKToPpC6wXRbky1bBq/JGpeROHwvlajRTyz7nxKH1HyiMKk4yskNhyoVzZ26W9FJBjS9LPunbEF0JKyPZNWx9LocRNMrirLhaD5WpMvQfuQ4+p4Kb2QIh3VKvwTNXYfJBPIYfn9G842I9kNL2pcGuGDiGD0lWcPgLaRx717J8Qseyc2MlV8PmG0pwlOBJZJVR/c2nP5Aztov+Rx+CvpvKE4/ajELTdmt6L3hkXcgHDkWG+BPhc7Z3HWEY8fuj1Zs/T3N6IYRiKwjsEdzR54jnclBYXLZU429+lDpKFo7lukVTXjqmF6D5mNZs3DsGF/TdB7KcwaSWQ2fd3TfVYyes6x8UXP4AyXtd3y8ucCZWVfR3LdMt7XU526XzNcNi1VFPrCsfAmOX1KsfNUxvSxQqs4BJTDY8msVi2XN6DnH4GtSID9+2bH0mtyj/ruWxapmtu24/Es5yYrP6QuKla9aRjcN0ZFw6E+fq9kvy5buU6fMv7KMP6+ZRr2S3qtyuPbuFex/KiA8gfGzFapS9N6SzGjvB6D7rsEGEJ2I39KFFOIn1xT5UwnRmzHJRkW8Lyyw8BOnlL8xIO86Bm+fwZ6KydMVD/+9/8OXnXOv/HZ+9dvCuUeb2+7mH//pOpJ2XP77GaNbIToXHLT1JOXk+RgUdTERyiZ4c9lgWV+x2HBUkcOfKXrvwvgmtB7DyacKNv++cGqTFXGYrSeWyRXN4nrB8mc9ug8ydn4wIhwKrcxkjvhU0v3dH4HlL2gWGwp/JphwuqzovCddieFIsNbGgaX9MGHv+5sALL1e8OT3GZqPNd0HJVnXUMbSVJQODOG44uEfs1z+24bTpz1pPY6he1+i6fBU3qe1Yzl9VrPx2YKdH/Ro7ii696V7Ne9I96r1YP3zKfufivCnsiaT6wrrOzZ/o2T4lC8deC3Z2N37JZPLksnMthS9e+JI8rawIQZvSRq92FDkHYcuwEsU8aE4bZM5JlcN2VJN5etIZLn0VsnwlsAywcTRv52y/6kYbwbNg4qDT2rKJYk2Vn7Tpwrls862NMFYDrQqgPm2Bc/RvmvIetC7Yzn4gYrtX1CMr8laFW0wiaSua78xJF9rcvJcyNoXZzz4I01w0H4o2UgwhsWGk3b2QtG5J46ojIVV0r9TsvNTBd7dGC+RTNJLxFkLFc5x5RcXHL3cZHrdsvLlGmsfyPXHh+J8l18TWGO+rvEXjvYjKUzqApbezhneDITC2VXMtyw2dLTvGYoWtJ5I4TY+dDSOKo5e9Lj0DxMOPx6Td+DSb6SMbob4c8d0W+PP5NlJ1hx513HlF0rBylcNeVdggN7divE1Q+PA0TgsqULFYtmIk3tNnoXT52Hr10oe/a8rbvxlx6Mfi4gPpcAfjGDwbi4snNOK2aZhfAuCkWLwboU/s4yveqRLtZRBBvGhXMeZJEPRPqN7vi/T0NwViNKGoDOYXRaq47W/M2P4bIujVyxLX9WcfsQRTDTpekn7tkfnoTSSzTd85puKzc8kPPyJiKXXpEaSdxXBWAKd/pvChkmWNUVb9lXnPcms/bljchPCE8Xal1Ie/2jI1qelF2Pv+zzM01O2/gvDw59o4C3kEA7GjvbjnNPnQpbeyHj04wGb/1Du09WfPeTtPzNg5XMSnNlAAianpRaSLkNjT7Kk9c/lOCOsp7wl8NPpM9KYt7iRs/RZH11B60nO5EpANBL4zOSOnT9YsvSbwu1v7QhF+rM/+23u3Nu9LffKJ/4U/iQnXY2kM/OdU8pBEzNNSTdaRHszaV5oevWmEf0UV9cUkhXBn1pPcvxRSj6IKRtCaey9M0PnFbPrbRpPFniPDkmf3+LwYyEbn5mTDUKyrqZ3e04VeeiiQpWWxaWGFFjqFuayoc+jOdGu0XiZJd5PMSczsu1+rSkjjSyzrYBwJC3rRUPjJ8LasUY45otVoeNNtz2SZcXWp2eooiLZaBKeZBQdn/jRmONPLQumnli6rx4B4BohR5/soUopFunCcvpcwMavjSl7IWZeML/cEO2QQPDPYJSTroSYzOLPhQmR9X1abxyRXRlIE1YJjU+/iX3+OtlSRBVr/El5vuYgzT7RaUk68CTVLiXd9mY5yWaMzh2NByNsM2R6rUnr4YKiE5Au+8w2NeHIsfzlEUef6NE8qIifzHGhwYYGVTr2v6dBc9fSepJRNj3GVz38ObR2coq2sKLKpqb1YEa62kBX0uUpdYfqXKNovuYRTi3xXkq2JPd4fENz9e8MUXlJttGR7uLdGYff12fwVspsKyRZ1gzezqR5pe8xvm7o3xYWxGwzYPDVIfObHRbLUtPQxRkNsmS+7tN7a4qNPJRzHL7SYvBWdl40HT4VCXc+dRIcDC3tRxneMGHybJdkWbPy5Rl5P6Tx7iGn37uJvxBNoGBa0XzniOT6EtHjMdPnlzh9xhAdO7r3c+J7x8yfXWVyxaN/W6C5pTfmHH6sxcanjzj5xDJOweQGbP9KymI1QDmID3IOPhmz+uWUou3RvD/m0R9eYuuXxlSdAP9wxuJajyrUZB1N47jEJJbwYEZ6qU3W86QRywrEFZ7mJKsh4bA4l+TIO4bGbkreDWg8mpCvNMkG0lk+2zS0d0oqX9H73A53/91ttv9BxmI9OA8kll7PqGJDvLfAHIxIn1pDl5bhzYjVX9/n+PvXhS008ES64b0Eb7hgcb1HvDNnfqVF2jf035qhCst7/0KH9c9KjadoeueSBv685OjFiLXPS1NHuhZiUkf8YEhytcdizcdkjsNXFFd+MSfveXgLy5Mf9rj2cwlVZAifjEmv9Igej3nyEysEY0fncSEkj5am8+6YZKtN4+4p5XKLohNIQ+YV0cfp3SuwvsKfCK315PmQtS/MOfpYk41fPaLqxuhZzugjPb7w1//jb2/nHm1uuxv/+k8TjiTVn21Lum59+f9syRIfaqkmrzuCsSJZtTSfaJJ1KVJ4c0XZdLQeQhVLR+Ppx0pad32BUvakmcBknKfD6eWc6HFA0ba0H4jQVBkJjlc2IL1U0LrrM38hxX8YUgws3lQTjBTpsj0Xqmo9EsGj6XWpaDsDRcfSf0MxflpSxHyjIHwSUDYtJnm/yq0rRbpegm9Z/ozPYq2+7lpoyaSQrFpsvyB8HNDcgdmWpLn55Rz/cYANoexUmE5O/GqDZNXSuaeY3HBUnQrv1MMGjt47itOPl6hcE+8a0jVL66EWiOGqfB5vpohO3he4OrsHAOmyJRxq8o7Dnyph+CSK5iNFukLNInI0nwikkg2kecN6ML8k8EzZcIQnmqLtKJZKoh2f6Fgi8bMms9lTBe23fWwgglfjT6REdyMRIZvC7GqFP9E0dhTj56taSMnhD03NtBGhudEPpMRvxuhcUueiX6fIb2qq6Kw5Su53FUF4CuNnSlShaexK80664ihvJrjDiP4bivmmOv8ci0tWdFzGmipw6EqRDSq67xi8RKLDYjsjuhNRNB3hSKE+NWK+20ZlivhQk6xawlOJxOdblsbNMelbPfyp1GiKjtQAvLmiih3RsaJofCAqfm5E/rW+wB4nML1m0YUiHCqSFxI6n4sZP10RHoumTRVC/PSI6vN9iq5D51C0nDRq+RLNWh/KF2e0fqXJfAv8iaLoSHOP9R3+RD6v01LnKhuSMVtPYMtwKJGyP4fpjRJ/bPAn7z/PjQPHbBuiY7nG8XMSmSerjt674P0rhxy9uYI/03gzyU4a+4qsJ0yq+NCRLQnTp2w6gokiWXE0a7jUpLI24Ugx36poPhZtpnSjpPnAE278lQzvKMAk0jCX9R1Ft6Lx2JOGw9jR2FXMLkvm4c8d41sCfeqpx82PPuH+l7bxJ4qy5eDaHPu4Sfs9KZaPnpWCub2WUE4CWvc8TCbXGh4Iwyw6FARisWmJDqW2YF4ck97rULUr9EITjDXdTx0y+a1VirZ8JoC8D1nf8vA//F04d6XUNvDfAmsIP+AvOef+S6XU/xn4t4Gj+lv/T865X6h/5s8B/xZQAf+hc+6XvtF7NNa23c2f+mmhM25pencrkQOIFM2DUooNA4kak2VNdCIpTnPX1iqKQlc8c07de5bZtiY6dpy+4Bi8LmnNYk3wuO57JaMbgvn23obGccnJ8z7hsG4qygRHTgZa8MDbgs2eKTBmfcEAkyVN737J9JKhtV9hUsfohsANvXslJ897BGMRgMrbUoQNp5Jt+HPLo5/QbP4aUsRsSErbOLYslrUcQANF+0nF6TOGpbcrjj9q6N4V3nYwLhjdiikjKcyuvFZy/LxHY1+gk3Qgh1VzV7oCQShh1hf641klPh1oOo9K5quGvCMP4MprBVnHsFgV2qFywljwEjlIg6llfN2cH5rOEwe+9GbB8ClfNFdOLeGwFF53Im3cw1uG5FKFWWh6b1MXo0TLxVvI5y5jxemLFm+i6d6FdEnRfmw5/ASsf9aRdnVdhKKGcqB3v6AKNItVQ+e9nINPhKJumAvEZjIpslnfoaxi5dWKoikNNdMrmqU3Sh7/hKLxyGDSWuHRE4hOVUKpXHqrJOsILLHyai1/4Ne860clRy97rH6ppGgJ5dbkwtwaPuVhUhi8LSJRyZIUQ5N1RdGSAEVZiE4syYpABsFE9mr/diFU4EuK1S8XzDY8modSsPQSwWuLlnyG5Tckck67huk1RXQoTJSzjtve3RynYXQzYL4NK1+x5C3N5AasfNXy5MctV34Ohrd8TCqiY/GR9H5YXxzWfNUwuyzYfv9uIRDUqqnlIeqO2MKJyJmS+3NWa5lviMie0/L8zdcMKIHlhs8o/Jli/XMp2cBn7/colr6mOH0e4iNFuiROP5xaUZSMNZNtw/rnZzz5kRYrr8o6lQ1FOHSMb0HnPsTHFZOrHtRc+f5t6WMIxwKjNfYV3XsFRy/5rLxWMF+TXpH5zYKn/nLG7g+0zruQ2zvSuzDb9Gjtljz6/Yb1z8L4umbtSznv/SHDyhdrSrESFVldOIZPG4q2o3NP9nLnPYsppKanS1FEPX0mQOeO8dOOxo4mPpK61/iqCB2Or4k+z84Pw9JXNWUsImNlpPjCX/v6zv13wpYpgf+9c+454HuAf18p9Vz9f3/BOfdS/efMsT+HaMk8D/w48P+qh3d8XVOlREjJsijrWV8q2elACQ0ykip8Y7+g+6Cs+b3inHrvzKQ9OhGFQWnllwe3//aibtKQrsNw6GjuV3gLSXd674hTOnxZRJyCqVT1844i6WuJ8ueKxpEVed8K8p4UnvKWondfCqn+HEkvNzzhkddNTCId68g6Bqekgabyhb968pxP/w1przdpjfFGwmVeejORLKIhqX587JhcMbQeyjUXLcNsKxKtjUActzXSzAJCIYxO6zBYyWcIx+5crkFoVu9L5xax0LDSFVfLEYuyXt4XnNKfyDotf2VCNLJMrhq6D4QWtvx6SjASJgbq/QjdGlWn60KzCyYVg3crovU5wUgOuc4D6SrWheD6i1XppA1WF9hAsoeiXTsLq5humzp6hN59gZW675XMNnwmV+Whm2/4eEld0D60zLegcVSy8rWS+EjhT4VJkg408UmJSeo1mgruH0wd2ZI4xHRZ5ACCsTQrnUWeaU8z33aUDemCPXnOI953JMuG+bo8fNYItbb/bilt4xrytqLzuKT7XknetVgfll/PUKX8X3PfCjX3MKe1U2E9RXOvJDpynDzvi7xwbmkcVkQjS9mE+OCMyisc7e79FGsc7Z2SZE2YMmVTpAQOXwlBSYFzuiUd3yJZ7PDaBXlbCnhectaIdcaBr5kzinMnPr7q1yqKjnTNUjbk8O+/k9b7QNrjnZF7i5ZDWBgrhmhoa8kJhaoUWd9x8kKEU7D0mqJ7b0F0Is9a555AcifPGrKeOZdKnm3HeHOoImHahCMpShYtx+D1Cf6sxHoiqqZLaVrzUoeyggwsv7pgseqJ+Fv1Aec7NoxuNc+DhyqWfXCmaTW+6tN7RzHd0pSxyEosvarPmUrB1BFMLc3djPhQyBJVJE2M6ZImGJWizxMoFqtyUAdTR+vamPYTy/yS9FSI7If4kfmqxoVW9KICYRnp4ncpP+Cc23POfaX+egq8jei1fz37I8DPOOcy59wD4C4yvOPrm4L+O47+7Rydi0MziaV/p2Tw5gx/Up5rQZexxp9berelmDa91kQ5J6yXZYlKW7s58ZFjdiUm6wllMRhLNoBS+KOU5p5lelXR3ilZ+2JO+z2RMe28Z+nfLhi8tZBmjGmtt3HsiE4tzV1L976ltV+R9kU3IxpWREcZvTsJzT1Lc8fR3MtoPqn51qOKYGbp36kIxxWVr9j47IJkRREfF6Ixb6Ud3B8XTK9EtHakXVw5ibY7D4UK2dwtaOxldO7PqXxFfGRp7Aulr4qheSgdrrqShzSY2XMd7t69iioUESV/Xgl3/8DSvTun/djSvQ3xkSM4StClo3tXCqsmc8RHjtGzbXThGLxdSgPUAqaXRREwOnHEO3OWvybX29zNaOxnmNyx8ppgiPM1TfW2KC3iJAtrHFoaRyLjMHhHBNfcnRbNHU37SUX3jnxvdKLov1sQjhyNQ8tiydA8EL5wa6+g/USK1r3bc8KRfN68I4wHibjMuZ55+0nG4B0poPlzR7y3QBW19nlL0XrkCMaO3h0rdMIGNA9EbdOfKVo7BWuftwQjOdBXvlZgA0Xv9oLWrqW9U9Hclwd4um3OO1a7D3JmG4bptkfziSbe14xuBAQzR+9+Qd6STV5G4sDinTl512B9xepXMuGcTwsRobOO+MCRDaQGEo5KWo9SklXhvpexpvlE9kV8ZImfTFl+vSCYSNbQv1vgpZLmOw36QUzzSSr3f2YZPiVF//6dFJNWtB+meIkTUoFzLL+R0H1ngilEori1I81ai/WAxr5l8LowkoKJiL+1HzqSJY+sq1n+0kQkNfYsjYMSk0L3Diy9kRIf5pw+B8mawHDth450RVHFho3PZbQep3TfntI4cLTvz6giaDwRJ+2ljpXXSlqPNNPrLVRpCWuGXXQiTt2fOeHbt2B6NaoPQ/AnOZ2Hst91qeg8SNCFsInaDy3hsEBnjqKh6d0rGD/lGLxT0tgXhdPh8/KsxycOfyF1trLpUUWKxkOP1k6FzoVQoaz0hDR3szo4rbvYX+0z39D0363wp3K4mlSgv8E7Gf6xR3OvoLlriU5LUN/EJial1FXgZeDzwPcBf0op9W8AX0Ki+yHi+D/3gR97wm9zGHxwWIfp99n/QYvKPFxc4r7os1hXZH1LdNSm+8AyuqFxnqTaZUORL1c0H3oiPtWD8JVTRqdN5sYx34rIbyS0vhSjPzni1PWoQsHnptcUoxtdFlcLzESx+/0e0ZFi8kJBcOAJfuYM0WGT1hNH4wePKP/uMsOXS4JDwePslRRzP8KfK/KOx+iFkmi/SXgCk6cqnG+xfoT9ySFH7/Rp7nioEhaXHO0HwtMe3WzgXpxyULZrnQ7H5Jaj91aDogXDZxTZRknzbiisjFPF5NmC+ZZP9450cFofjj/ucL4l/hWBp3Z+SNN/U3H8CWmzxnks1gV/nF2viPYUSWaoQinEDV+qGD7dqpXvCvy4IFnuUjYdxXaGyw0UkmYvf9Fw9KKsQdFyVEs59q2A2c0KM9cUjR7jT2aYwwB/4tHcdQyfc1RNxeCrhuFHKl5+4QFPpj3G1QpVAMmqIVsvCA88bKBRBVz73kcsioDdN9bwtmcs/80G3r94wkG4StmUSLCKHKcfFWy8d9cIB31DM19vM//UAq0cnV9psPMj4I8CioFFZQrbqsgGIc6D6Egx367I+h0Grxywvz7AG3qUXcHdXbNETT1cM8ef+YyedUSXJpwWHaYvp7jU0n7HZ3rNI7+cgWviDExvVXhTj/6b0jE9/Jhl9Tcihs/B2hcsk8uG9JU5QVhS/nqX0TOWY+XhTxQrX6uYr3ucfNxSxh2yviJZs6TLIcrBbKtJ0XLMCo90vaJ13zD/3gXOa1DGAV4C8ysleVe6TocvKPyxpgoGJCsS1aIdhy/7Us95OcGfR7z8e9/lzsOnOf1YhT8yBCPZS80nMTaQiH2x7igGJf7IsFiP8acxyZpDby0o5j7Bnk98qBm/UGBaJfZUUmanDYtnpW5SRY4H/1IHXSiygcWfeRTtiurlBbpsMb2iQEkWnzyfkLwgh/upjaXwue9YbMRkqxVFs8P8RsGua6MzOPpUhXKKcHVK8ist0kFMOlDkfU25ktN5NWR6syLe9UnWLcpqsk4sezZvUDQVk1sVt57fYfzGFsffU6JKjQss0U7M2hcL6UJuK6JDxcEnFcW1BC+JwEnH6/SaxXmalS/CYsmI2OCLMw76TcpuSftdn/jYMLskNNlgEpP3BA7+wR96jbf/wgscv6hZ/Ypj+DzMhz7xoWPnhyLaHznmMUsUSyWN9wLC4T8BUv+dFlSVUi3g14E/75z720qpNeBYlp7/K7DhnPuTSqn/B/A559x/V//cXwZ+0Tn3s1/vdzdWt90PbP1JstUG83Wf45ccm79ZY8JdzeS66F5PL0uiYVLoPBbcPF2SAmtz13HykmPly+9jWbvf5+HXBUKTCde6uSN4c/fugsf/sWX5v2uwWDGkA0X3gaX5JCHvBRRNzeErmt47cPypims/W3H80VAoSKWIQ82vSXGk/Z78ztm2pn+7wqTSSAPSeAE1F/pYsL+iJRjcYl04rosbOb2VGcv/ecT4RszpCwIZNQ8q5huG0xeFnxwdKVa+lpP2hdo5/H0paidi61cKDj8WYD82ZfMvBuz9npDl1wUjnlyTWkHec1z+5YKjFwOqUAqdqnLn4l0ms4SnBVWoyXsew1uGy3/3lCc/OaD1WK557wcFvvAS6TKNjx2nz0PvXWHsnD7rsfkbC/Z+T4POQ+ElZwPH9b8x5L1/cUAVOq78vZSjF2P8meP4+wtabwds/OacZCMSBtGSIT61RKc5kysR/dcnvPsfxKx+WgZKTK5KFjW9Ctt/P+HRj8f4M4lg0hVLMNSsfTEn7xj2vl/RfVei3KIta61/+JTob/RoP0h4/AeadO/WtDwf+rcLDj7hk26WLH/BsPzlEacv9jj+sRR1GNJ+INRXkwkf/+QFj/nVktY9j+hE4Key4bjy8zOm15siQ/uxGVf/a839Pxqz/Krj4EdL/Ljg8l8y7H1PxOKpjCs/K13C9/7VEBdVNO7WLJZDx/EnKykCRhLFeqk4PlPrp8//lTHzB12CsWbtC0KXNbn0Zcy3hWAw/FhJ72syGKRsWS4/dcD4f9xkftmx+eslJx/x6b9bcvxRj/ZDidzLf/sY/VeWmW0ZwlPH6GloPRLZDWmqkkh1fF2z9ekF2SBgfNVj8nTFzb+eYhYFR690iUaW8VUj67Mm+6Z/u2B62RPqbUeKudv/0yn3/rU+G5+piP70Lo9/7TLBWKDUkx9P8e7GRCcCbw3ezqkiLcNHOtB713L4BzPiN2JUBetfSHjywzHBUGpkUv8puPdTHtf+tmVy2Sf6YwccvLpGfPQBpce0hmbrmkH/3YKyqaXvxCgOX9EUvQp/bPjhH3mVV//rl2jt5uz8YMgnf/8bvPrfv0B06mgclRx+zMefQP79U9b+vxFpX2iSWS2/UMaw+Zmc8TWRhVisWzZ/w3Hyx+e0fr7N8BmEt39FM7tesvabMkjEm1UEo4zxUy0Ovs99Q5777yhyV0r5wN8C/ppz7m8DOOcOPvD//w3w8/U//6kGdYBgqNObbRYrotPhljLma+G5VG7RrxhfNxLBnoiGSnNfCi1FryI69hjfVFhfxL5wwssuVkrKliY6kW7Koi0cY6cV1mvSbR4yvNlBF5CsSzu99eJauleyhKItvHqRm4WpFkeQ9x2EFdkKeIlXa6g75quaaCiFruRSiX9qKFsWVaoaZ4OqaUmXDFXDkbUtfrPgWv+EBy/eomxC1Swp2h4zz7DYUDhPmiTKhc/o+llnraLbmTPVFl1KxrHSnjO60UJVMLwpU6PKhqPsl5ixx+SKTzYQfHG2BdGp1AH8KXQeiRzq6TMioJT3HKcf67PYtOhMWuBdI6cILdXMECIOxoaO6TWNyQxZ35Gshcy3pOU97zrypYrxsz2yvsXFFZPLEYt1J5rtUUm67DO+2SBZkWxkdgWCueL4IzFlA6qwQ29pSLI6kEk+XdHqyLYKjl9qULYsupSmGrtUkMSGk+flAMNUzLekjqAqKf6+sv6Yz24P8Och2UCm25SxBATjaz7ZcsXy1ojszjLDF7pMrilWlyfsz5YYP+Vo7BhaO4Ibzy+XqLhkvqUpY03ek3R8fKvJfFOT9Ry9dsLo5jJVv2B6JQDlWOrNmK+vUDYdcTtjsdym3PbAWnRQUTacOJtMES8v0Hc6zC/n+LMAkH3ffihqn5udCY8va5InbSZXPMp+if9ING3KpmW+pRmsj0nvL8OVBXFQst6cMK02KNZkQEreESpp1hdO9dLrilaQc7gpa1NuKoqVghneOb9+sY4wp7qO8fVYunqXwEUV2VJIuRUzuQHhV6Q4vdiQxrMqhvF1n3QJstUKF1e4PZ+TV/oUSyWnT/u80hxzt2/xFprZtuLa+jF3pxtQl+4mV6VbfX7Z4gY5i2HEUn/G6bJowM+ehJQNhzUQn4iuTxkpBpdOma8t4TR87+oD/lZrhazQOF9kkE0mMxryjlzjfF0kr9OBIW9DFVm8bk5hfHxlKeNas2ep4qnmIV+rRdmq0CPvOEyiaEQZVdhgvi41i2wgzKK8XzG8GbDYkBqV2UgYX2/SaaRkDWHLFE3NYtOi4pLpdkTjQGFXDSYLqCLwlxe/nTt932//DtgyCvirwKlz7k9/4PUN59xe/fWfAT7lnPsppdTzwF9HcPZN4FeAW8656uu9R3Np2z31L/8ZaeUOFOG4Oi84SIRSokrp+ptdCohGFcOnfJq7lsZBzvRySN4R2Vt/jrRKd0X69vSZkMaRJTopSJZFs6T5eMHw2RaLDcXy61Jpt0ZG353pyetS8LXZlqJx4M67RXXd8RsN5bPqUrRaGk8WLC41SAaGKqrHoW0YgplEW3lLRNHi00qKNwNDsqwYvFMwvu7XHa2WYCaYuTNSuFv9rRN2f3QZbyHFmu57wlIwqfDonVZ1IUgaVnr3hS9scsfwlkfvnhSPRc9asD0vlUr+2aCR9iOZGpX1hG2w9PoM52lOXmgQjkUK1UulSKQqR94V7fbJFU3vXs0i2PDo3cs4eimi/aiqVTitDDLwRE8jWfY4/rgjOtAM3hHtHJPL+nkL+R2dhzkP/5BP85EUOEVPH+aXFIO3K5KBfObWXlVTRWUeZxGLdr0/L1msBTLYoiP7p3s/l8aXS6LwN3hbIrIzBkj3vZydHxI1wzM9cG9eHwoWkhVF715FeFpy+DFpdZ+vi5SDPxetj6IpnykZGIK5FK2jo5zRrQgc9O6nJCsByUCfd+xWkWPlq/acOz5b96hixcpXF8y2IhqHOemSMGz8mTynnQcJybpkOeNrEpsFY0fnPRm86jTs/kDIyqsVi1VN+1HJ9LJH/3bGdCtEl47JNZGYjUaW0Q3D6pczHvwLHld+vmK26ctgiy1D/3aBDRXxbsJiq0ERK6ZXNJ33LMFUahnWKIbPSHexv5CMJhmINMPS2zn7nwikBb8lBe68JROaUFDWCqOnzxqiU5E17t6e8+gn21z69ZSjlyJ53qzs+3RgaO4W9eHi09gvWKz5NA4Lsp4nkh0tRbKsWP9Chj/JOfhUm+59ecbaj0V1VlmRxu48FIZb0dI0DvLzJrGTjyo2f70k6xuSZRlKs/TGnGwpJFmSNR/fUPRuW9IlzeCdnP1PBXTv2lriweI80X85fjEmXYbOPaGhhmNLYz8nW5IpWdZTzNd9/MSx/z3Qe1ey0PjEitz5QcHJCyG9OwVPfsTj8i/LtXqJ+J9v1MT0O2HLfB/wrwM/opR6tf7zk8B/ppR6XSn1GvDDwJ8BqIdy/E3gLeDvAf/+N3LsZ9Y4sucDqqeXPIJRIY4oqRjeCmWYRM+jcVCQ9kTKtIwV42syycQpcEq60vyZFDBHN8LzgbllwzC5ZvBSi4094hOJkOD9wcfxQS5Mk2FF80lad7MKth2fWOITSziWtDzta1HY64mqYboaYz0REYpOHSa15wNC8nrwBkoGhUyueIQTGeNXtIwo861L8Utnlqwr046CmWP2VA9lJR32EvBmsrnTJZlXmawolr+WkXU0ec/hzapz9cLGoaunCykZg5Y40p5s7qwjkYQuz8SJHK0dK5NnKstiIyI+FQ3xaCTMm+mWFANnm3JQtHbkYU37htZeSdkwdB+UohJpnUzD6Sii04rptkfRhMauNDF5iej5oCA+yiljTWtPIvnmI2FNtfZEuGr8lHRL5i2hDXYelyQDaa5arHpkbU3W08zXDONrYT0E3dU1B86HVUfH7rxTtbEna+YnQksLT0WUKuspiqYcgNFIpgjlPVmv0U0Z3mFyR2u3EjXRhiJZEdbIGbwjapIyVWq+oYjGltH1CG9hKZuKyXVp14/3lRQup8KSKRvSi7FYl7GPyooujcjeyv2qIo8ilolg7UcV80vCKptvSICwWPdp7p514CryrlBcnZIJUIt1ibaDqVBuoxPH+EZA+56RARUeNPYz6fiORZ43XY0pQzng249EaqIKFSapyLuise+lso5FQ9G7l4nk8ECYKLqSQqMoSUJ4kpJ1DVlH9GjCoTj2rKfJBxHZkjSLhaeO5l5Fsi7FWKcVyaqPN8txCpJVn6NXwCQlw6cMwUx6T+JDR7Lis7gU0zio0KWj/bjk5DmP5m6GP7PML9nzZ6MMpXYWTJzQjIeKrC+HdzBxNA8qik7AbN0j68o1ZJsFuoTo1IqW0JX8XB3V5JaioSlaHnlbulPjk5LGcSWYfdenaGgZQxloonE9V/hYM9uS7u6zwGex7pMN5CAMRjIwXpeOYCTzDb6R/RNhGefcb3LOVflH7Be+wc/8eeAbDuj4R0xJlBrMRanw6OOa1p4vME0nYHoVoqHQBqdbHiZxLNY84iOp/OuiVlecO/xJed62u1hTbP5Wyv4nI1pPxEHpwpEOgppvrETk6Ao0dhWL9YB0oKVoe8Nnet2y/FWkEakQR6pLKS6VTST1yhThVCQAxtc17UeOrKsYXw/oPLRkHRmakPUd8aEiHQg182jFY/m1ipNnDWXLUawVgOH0OZmlWTTVObxUNmH+fMryr4aULZ/xNY+irVjcyIkeBZw+GzLbdpTLBdnAZ7GqaO3IQOR0FaLDWhdkz5H3YP+yId6rtUT2HIu1gMW6iER1HlXSzdeT7MGfi+JlGUubuSnkuotDRTrQtZyqPHxlJIdQfCij66bb4siTFU8GW9yV5rF4AZMrHpOnS8AjOjUUTU3WrTf0hqP7QDjF/sKRr5a0H3jMtuWAK9oeJpWNny4p5peEftPYFXnb5oFI9R6/KHIN83Vf5H47AnmlPRl2UDTrsW9+cD4oOV1yOF+EsdTIUkVQ9CqGz2v6b8hem68Lg6WKJA1XFoqpSCFnfUfzQMYQTi9rshXLdGoomoDymDxTSNE2ln1QtCSLWqx55D1IruaMs4DmrhVoKgadS2Nf2dDoUobLZH2P6WVN1S3w7yrGtzROB4LfrglLZfKRnOa+x/xyxWkSkvfqw24rZb4TyzrfgekVoRAPnzG0HjsW6yFlpwKn5NnZkfqJlwK1WuF0yzBfEyVN4ZfL67MtLXNkVzTxoTyDRVN4//GRON/RM616GAlUTWl2C6aK6VVL+4lCL2Us1hs090Q+wCQKXdlaN0Zhskb9XgZ/AuMbDfK+I+1JNtx64kiWNLoUjHvwrmO66ZGsW6ZXQqxR2H7OYiUUquVDy+imNFGtf076bEa3jLDCYhFsM4E0JGIdzne0lucMn+3R3BE5bR1VzNdEaiI+tIyva8KhZnGtIFsyOC1d1uOnHEXTw3lg8pD5qjlvWrQ+lFdTprOYdNUS70svgPnomPlxV6ZRrQXgYHQrYr5lv6Fb/bZQhXRGCnL+tCJZNoQnMlDCn4uOiTevH8JA8G8QipKXSVR9pnc825JNH07ej7iOX4gIh1IkUiUsVrzzUXjZcoVJRSQqOhFdkGAi3+slDn+qhU+an434k/cVlUd5T11ItKILJ9o0tQSvl8jrZUOJBs5U1ePKBMtv7DrG10RxEEctL2qJTgTL8xJ5H+eJM/Ufh2QD0bj3FhCeOFQqN99L5GHGyfxLXUjbvEmlY7aSQJDmfikH0kJgG+nWdXipJTx1hEN3PibMeQI9Jaua2SVxjs6vlfkmtTqnEgy18kVOQVWysVEy8iwYS0YUnVboTDHdVgRTwTV1AXqhMYnwh4OZFc3tlhJ+cyyZi7KgZ+Y8Igvq9c879UT5vqO5o4mOxLGHQxn6kXdEDz86FSZC2RB4B0/2TTCWlNh5kr3kHUUVqXMFwsaxNIs5oyCqCI/l4BE6oCM6sVRBPRx7XI/zm0oGIIXqSno2mhXBWOQJZLMrnC/RbHQiWUTRFE6z9R3k0oKet2VPWk+07Bv7iuhIDgKUqAyGQ4eOSuZborMUn5bkben8LFpKRsG1FN5M1jk+EFVM41U0Di3eog4gFkI6OOtncBqIJLI9GxhhsjrDrZt6grGT8XKx/Kxo4avzsZSNA0vWl05Wkbl2dUAFzd38vGdA9rnMSYgPtGQkzfQ8C2gcWbIlS94S3Zhg4s6HfXhzRxW78+wz6wluLrNWpX/Gn0LWFnhUl3IN1gPtCTffn8scXGWhsadYrOjzRkmRF38fpo2OlMxcPtAEXnlesI2OFWEkkXx8amX+ak0/xiriA004lmw1PhCITecyge1sj5exRPi2lPsfDGsBtAzmpzFerQ56puYpsh/fmAr5beHclYXoOCU6XBANq1oQzBIfV8RHRZ22CcaqK5m01NwvydpyM4OJ3HTlEB77THjczV1xbPGJOBxnpHAWTCp6dzMAug8yWjsVRUsRDUtauxnB1NK7l+JP5TTVGTQOK8KhiDq1dkpaTxy6VAQjOQyCqcxUPYd19mQcXXzkiE8s0YkMwjgbNt15VIozOq01qDNNMMrkELJy2LV3SuITi0kV0XGtwHicCq97p8SbiQplfCoTZ1SuhY9biV56MJPRe439WvxrVtB+T5Qfmwf2PGX2ZxWt3YLWXklrryQY5qgS2g/mmNQRji3NfakV+DPwJ+580AdOuPThyIpY1sNUDslRKY02kaLxaCKNIo7zKT6C+4vqZHiSoQvJEJqHluhImqj8uaX1MBHxphRae2U9Uk4eiHg3ITqSAzk+cufa6M29Ai+15wemQGlS2KMSrf348VTggiP7AVG1utV8rMibivAkpbVToSb+ea1FWZH/bT1O6b8tr/l1XSU+tvX6CF/fS0DPDZ2HmQQR+yX+0NTZjsj+SrOTpXN3ii4U/shIo42jrnEAVuQUzvFcI2uuKrCJhzeXYrQ/KfFn0lHrJVJADqZS2ItPLSYRp5LP5AQLRvJ7GvtnGu3CLAkmFUpL30cwlUPOnwn3H1c3iNXPpj8Vdkg4eh95jY5z2g9TGoeWcCTBTjSsezEiRbg/F0eV189kLlx1uYaCNPdl1mz8/qAKkKlp8YklOJwTjCthwRwrGoeF3OuZo/3YEk5kr0YjmR8cDSs5bEeiz9M4rrBzISY0DoULH9d/RyPpQD93xscWL7EEE+HjezNh/Bjt6N0v5VmbOnxPDnN/LrWmYFT7pFwOP10IbBeMJfCTQyElPinP1TX9hYNEah3BWD5bMHUE+z6dRzn+zNHYTYlOc6n3TP85cO44KBs+RTeSiH3h8JJSxJYKSzSyMsShjjZBMKhobM8LOWct9mWo8GZSdPBn7nzQgSol6talw6QVZcPgTbVEAIkUhqyvqHwNzkHl8Kdyeocjdb7RVAnpkkyf9ycQTgTX1rklPHsYgWAqjRLS8efq9norzmzkzgXP/IXoZehUU8UewbiUpgYrDAZdiPMPR/JgVg2PYJgRnKb4Y4mAy1DTPJSW/aLhEQ5FJx0nnxfEIRZt/zwCw4nGu3TIVpjcUkWidW6yCpNDuhpL5EodKZ6eUeDq22Ykgisj+R4/Eb1pGeBRScReQtkXtUWTyuxZgXvk0AIoOoFkC3V3bNFRzNckw0rWI6JjUaz05lU94EH+lK2g1qe3xKe2lu1158W1YCxa2WcOwiSgClkX26g7WY0MtKgCqdmcHRzKQdnyJRJN5ADRVX0/pznpalhP9uG8JuFl0pVpQ4PJLdGoEu2Rpoycw0lkH55KRijrJ2tQNQJMIlH32fCVcJjj1x2huoBoLENG/Lk4C5M7vJH3gXb3Sgrfk/fXyOSuzmBygpl8rWYy8k46lKWmkvWlua0MZWiMPpbQ2ktlmIq/kEDgLHL3FhWqJmPkbUPRkubCYCzNO+nymV6+7LWzqUXhyFG1pfFNl9Td2Y50La7lpR3pSXwuA1HEGlWKT6gCGWbjIg8bKMLTUoKWeSEDXSqZ01o064E/c3vekVo031fS9OaiMWRS2YdnAYpfT5SyBqJjkbRwWkT/VOlqZyvP0vFJ+3yYeTBzTCcxfmLP/U3jWA4Vb6aphCRVU44lSzkLFmSojvi1ZEUTHXpUsUT6ykoBVgaEyF62gaGMZPxmOP7GbvXbwrkrC6fPhCSr/nk7vvU0s0se6SCgjKQg1DgoaByJtzobnhGf2nrGp6TtVQDZsvxMdGqJjh1ZrUeSd+oRXwqSJY/WI1E6PHnex3ly0yfXAuYbPtmycI0l1RetFi91pH3BarOeaECcCeqfKebNNgzja15Nt1TnI/e8zLFYFZpmFYqKZXzgMIU4+/BUk6wE2EDTPLAkA4/FqgzuPde8yR1VaJhea7K41JDCbe5IB9JFG56cDVCuHUYgG6+5XxJMhdKlbD1JaiTRZRkq8q7P0YsRp8/IGEPrCad2uuXR3BdtkayraRzVhdVtdc4Waj+RB79oSko9vWTw544qEkXOaCjFRFU5mvuWyS2JIK2niI/Oxt8Zsq6RYtmiYnqtEnw/s/XIRalxDJ8OsYaaRSAaI8FE0v3xVUNrV3TbnZbxfUF98HZuT2gcSrdvdGBYrAdMbjQJ667lM8rtmT69ySVNHj4VkvY1/kz2TdEQZtL4qSbJQB6d9qOK0U2Dt+BcRmC6HVC0RL0yPlBML4lMsTPqfJbm5Ko4jujEkXc0s+1QGDFOoL1wZMk7fq2fJLIXixUjhWIrejLJsiYYChxkPUW6HNHaLcl7kp3mbSnKCtyiWayJlHT7vmZ8VWbazi7Jvk027Ln2kPXkABKaqKZs1BO9OKtZyTVaI1j6+LoMa3FG0dqtyNsyStIa2Su6QogNudSjqoaU+vK2yFCUDcXouhQr815IvOPR3JfnXJeO1mNF60nOfM2Q9g1lW4bqpEuejFLsBgLZTQW+GV+X4SJeIppJQmpQ+FOpW2R9j9Z9w+Dd7LxID5AsKeLjEufBbCsQ2etVfb4vrEc9BxW83ZDxFZ/xNakFBg8iso6mjDRVqOt7JJDN/JJcv5dKEKpLgQaLlk868EVGO3FMr1f4EyEueIkl68q9sB4kyx6zK0IMmW775B0Pb/G7lB/4Z2GVXxcTQsX4hqb9OGO6HQh+llmaeyXjGwGzzYDFiiesBE846FlbC8tg4JhtiYhW3tIsVmVC0VlbcBELJjvbMOQdj3SgGL5YkXUMvXslVQCnz4aCxxUOk0q0nS2/zzyofClCWqNo7le18p2tDw9N925S8+iF5VO0agc7F1qTjAeUUzs+Kjn9qLBqqlARjmC6pcl6HrMNOf7LOpLO+sJUmF9SJEsyQu1MdElZcRrBTHRCkoE4w9PnPKbXIZhVNdVTyVSiJUV0UnL6jDiubCAb9yyqSJcU6WooEUtLMbxlGF/TorczkCHNy2+W8rNLjtENj9FNw+SqZBkmcyxWtLAdxsIOOGMRjJ7SOCOKeYsVGXHopcJDXqwK++j06RCTaLK+Y3LZq2fiijJmNHR1d6zM8Zxe8s5pkfGxk+HSby8Y3TRkA3U+zWr8TJfxdRnG4CXvM4QWK9LZ6k8rkq2SyRVN1hPOfBVJtpD1Bfrrv5NKf0PP4bQU1rO+TBBrP7JMrktk1Ti0lJEcBFUoe04yr5KsZpkUTWneKdqC9U+uyvjCKlLnWcNi1WAyYcLkXVj9UiKDalYCxtdFJA1ENTLvitR1FSpmGx46g5MXfHr3LJPLHtHIoktL5z3JpBYbrsamIVuq4ZKGpbmTMr0sk4eqUPZuYy8j7RnCYVFPE1KkywJ9mUIOBF3rskyu1AHOlpH3WTGUbZnrmg2ERpkuSz/FYrVuLosVi03Ryem8V5AsG7KBZb7hMdsWAbXJTcvpMyH92wJbZj1p/AnHFUXXUjakJpN1NY1jS951LFYMyUpA2YDhU/75M7RYER1168PxCyGNg4L5psxWDaaOo5cD0qsZ8UnJ6ClN2ZRnY3o5xBSiGtu7m1N0KroPC9GoupOQrYnA4XxdM70kM1TTgaiDnkl+zzc1rR1RMW3uCc01HJbvi9CVwh77YOep0xBMJbOo1jOZC9GQGcBnc52/nn1bOHdVn+qmcLWAlqk1UeRBApni4mXCuT6LIuLjsxmICBboy0YLZnIUmxxMLtGpyaUgoSpJaZUFfyQj8CSqkBRRMMW6uOa9r6aIksMkmDpsKA7V1umW0OMszhcOsy7A+jLZyBmhxunK0TiSoq6XuPMCpM6FWlk0pXbgJfZ8LYQKauvrtzL93UqGER0Jr1mVdbEwrR/Yok5154IPFk2DKaQDT9QgIet5RKfC0fbrgo6X1OuoQOdCWzsrQHlpvT4ZZLW6pTPUCpoCF3mL98WVvLSe3ZnZ899rMofOAKvwapnVKpbfoSoRNjNZPaQ6EDw+mLrzza5LVc/oPCvuyfc7JWvoLwRXF+EzcajKCraJqr+voG5YcudFX+tLtKpKceK6FGVDXdRKmAv5jGXTEzik/oxVwPnEH1PUa5DY8/c3OfhTgRadB15ayecqXV2UV+eKg8FEPrf16gO7jnR18f412UATjmWMYHTy/kPtzVRN95Qxj2cPvD91Eq3OZNawU4r4MK/3qlx7GSp0Jr0AKLChwUveP+jPdPHDscwU9hIRrQrGUmgsI3FKrv6dwVj27Bk06S9kXSRrkX0Zjmoxtsn799ufyuHmT4rzQqHo5FOz02Qv5D1PIBUrvzc4SgiGGlMHTFUggaJJ5ef9aVWPKZTC9dl+VrbuSM0FBpLB37rOmoBCOob9Kee/NxzLLAanhc5sEk3eMgLVeQKrnu23s/U1uUTqqnp/opozcj+znk8wq9CVPO9n8KfJ5HvCcYU1MjfBZLUfnPh1b4fo15w/s1/Hvi2cO0ihTTC7WgHPU4TDuktrzRMdkoGqueIS4SRLou4nQ2dVLTrmKCNN+7GV1D5R5xu+tWvr0XyGxqGlWJICXRVKc8sZn715IHhb3lUEQ+nibO1Y8raoQeoMcNJOnbVlCZ1WDG+FtTCRZbrtYX2ZrTm9JBBLGSpml6QxYrrlY3LF6GbA9Aqkq5aw5rdmPUnFgonAHVUEoxui6WIKh/U16UrA8GkZORgfOOZrhtlV4feXjTMMFrKORFuLNYGpgrFI7J5JKoOIsUWnVnjuJ/KgZx1Fc08Kaf5UsphkTQ60M8XL9kOBC/yZ4N7TyyHh2LFYldRzviHwWHO/FG50LNo6qhRHVrSo55DKYScFUEe8r2nuSJt952HF9KoiPFHn7KGiqc4jsawvVMcqEDbO5HpMdOoITx3Jau2Yw7pHYKFILkkjS3xckiwJtJYsewQnhvhYoqzh88LuaBxL01ayUXHynE8ZyrB0XbiaDfS+cJfMOBVVyOahOKDZpYC8L5z4oxdjUffbkilh4Yk4knSZ+r5UVDHMNwQCK9pQdDyJKicwvCVrWbSl29Krh8bkfUvel85siTBFgwmQcXilyB3PNwIOX4mZbyrKGyllJGvY3KnVDh95DG8JrcpbOBY3cto7JdPtgCpUHL4Uk6zo8zmseUdmFZexovXECoEgh+llGVcpA7ih9RCo4SdVvl8Dsr442Pm6oYqkEHryEVF286/OSPtKArMG5GuFSFgHirKGu6KhZfRcW2YPNEWipGhLVtR+KDBqOpA5q14K0ZGM+JPipSO9VJAOJBMyGfW8V4Fu/BOP6dWI9mMpNnuJBACzTUO6ohhf8/G25/gLKf4Pb0VE21PJ+kupweQ1zTZZdTR35RBTlUTwWVfm8zqlmFyOyDuiQx8faGaX5fMNnwoIx5ZkpZ505Sva9wzRSUn7ccli2TB8+hvz3L8tnLsuYXTLsFgRvLbzXkV0XDC7VE9xH1u6dxesfn5C724uMEtLpDw3f/WEcCSp8ODNs3RTxm6tf3ZO77ataZUCjbR2Sxp7Gcmy5tIvCd1odENGfrWflCzWDONrMjBa6JGw+tWS6ZbQo2QQhwxQXv9cgcmFDRNMCilathTzTU18Ys/nk3qJVL6TZU1zv6J3r6BsKFa+4mgeWvrvQPORpmjI5PmN35rjlNQIWo9SOg/EufZui7MpY4liB285GRqxLrTBMwnh9uOK+LisMwFH/07J8usV6UBLdrSA+KQiqJtnTG4ZXzMcf1TeMzxOWX5tweSqof1EmAdVCNt/b0R0Ktzl/h0Z27b986c0DyrKhqLzIGV0C7oPKskuRhWtXekmbu+UXPq1nOnHUuIDRedRTv9di7eQyCgaVpQxNHczkhcSFhuCqw9vidRxFcH4mtA7vYVj7QtSWV9+PUeXguVe/vvTOisS57H8mnyu3p0FK1/LiI4d7bseqnJMt3xWvzwnbykaR2UdtTtajy3Rgcg9Ty7X1L1HhuaeMC+KjjiQyVU5/Ld+dc5sU8YsmjNYatmgS0f/7RnLrwqHevm1FJPD8tcsl/9+TrIu2ci1/2Ek0q9rHoO3K5o7jt7tBatfzTGp5dJvJETDGqstoLmTsvRmJtiwgs49xeD1GpbzFFv/YIpT0L+dU0UyODs+crQep6hKZqT2Ph3J4fykIlmRwdWL6znNQ2FdBTPL5i95ZF1p5AlHJd2HZV0veF9/RVWicz58ToY/xycVl39xTN5SnHxUoMv5ljBPipZi+fWExqGlCjXd+7mMQtwpCYaK0U1dz6ataP1Ci7XPDIkPHN4c1n/FY+MfDpmvy/5GyYEqTUvybG9+pqT9qCIbKMY3YONXj+m9NcYGSiZB9WQ04BlK0Puaz9X/8YQyFGXV5n5B0ZAGOZPVAaESmDfrKeKDlM7DguXXSsKJpfHpFsOnRGs/Glqaf7cjBetMhr+3nxR078zo3hVue95WdU0IuncX8lw5mdvbu1sxeKcieT5h6TXR0Go/KaXYfVqd062n16TONLvk0Tiq6Dz454DnrqzIyHYf5PX4Nk14tKB5IG3sWUdjTucUgwjl5CHs3heIY3azW8vlOmkBf5ITHWZ0HubML4nmeTitCE8zlHWEwwyzyBm8kzG+bmgc5AJRTB3haUb/dk77UUl0Io6h+0BasQfvFgQz6bRr7jqw1FPIlYyhy0Vat/ugoPOerfnDnLfXnw17rkJN1pOhw6oS/YtkRZFsODrvZZjCkqxFhJOK9mOJAPN2PR9yVtF4NCc+LlAVTK7K9Jb+HaGJzi5D+94U50G8MyOs55JmHYkW2o+EMgZ1tFkIrdSflPTuVfRuiz65Gc7J+wGDt8WBt3cK2k8qxk93yNsabw7BpKDzsGT6dBddWFpPSrKBT++2QFXevDxnGvRvF9KR2PdovhEJxDbNhffsHL23p0QHCa3dumPvrZjeHYuXOfp3KpJVRWNfYC1TOOKhJe95dO5OyXoSppoMhs+0KBqaznsZ7R05zHThqCL5nvjUsthwxMcFvXsp6WpIa6+SKH3f0b09k+iw6YiHFYN3SuJjS96XbMfkjuaOpXFYylDrFEa3GlJDOS6lE9lB/90Fwbik6ARMrhnpJN0MMJllvm44/mhI/23RyDn+WJf2o5zug1Qy0RVFFXlUgcakFcNbEf5C4KjGUYmZyR4xSUX7iWW2LVBT3tSEJxnJRkw4ArMoBTLKBbevItGJSZaVzEGdSrdy7650UnfeDOpRkI7GkznDW5rW40Qi9UnOYkmg0mBSc/inQl2tfJlZ3HkoIfnomTb92xmDN9y5bLSyQjWsQk00LIlOckxS4s8h6RuCsWPpLaEjh3tTRs9CutGSw2ZkWaxrZtc7UkB0EO0taD/K34dsj1NOa6E+VYp8eLbRJl9q0NyriJ5MGbyVM7li6NybE45KJtcts1tdoQInlqIlPSfBaU7ziQQInXtzWjtChzTzXIqam4aspxk9I/TbwTsVRUNz+jz181QR78wp2gbrGxbriu67isaxzJzVpbDDioYm2l2gCynQpn1NcDdmckWE8ZKBof1YBNKqABqHJd13Nc33ZgzeTghPMhar39h9f1uM2Ys3tt31P/HThEPHfFOx8jWpcutCpq903hqy9yPLIiMQCTslG8hkl3AkvPDDT1CPJhM97sWaaEwf/kDJ5Z9TUmWvOyjbj6QDbbFd0X3LsPLqgsc/2iCYCqfdS+q0e1Lx8A8r1n9TM92W9m+TycPUeU8q8+HEsVjVNPeE0jS6IcyI9pOK/e/VRIeiTSO0SElZg1lF3jLs/VjJym/6zDfUOdbW3JU27GgoE+K7D4SN0b1fcfCKpvVY0X83Q1eO6VbI9LJEMhufzdj7nhB/Bt2H0mpdRY7lr4k2d2tHWA7+VKYiZR0pyIyvaboPJLtJ607a1a8IP31yTVM2HDqvKX+nQi/zF5ajj/pUsXTdFk2BP/q35bOaXJhLg9fHPP4DvXpYds7jHwsoloUDtvxbkh05o86HXZ8NdRg9V6JKRWNHOn/7dyx7P+RY+01p9a9C6uEqwv9e/a0heJq9H+ix9FbGkx8OhEN/UtcjEqQ7tSEj6wZvuPMJXtZXNA4q9v5gSXg/JBjLSL5gKhz0s2Hc658rmFzxmF6Fzc9UnDwno9JMKlnZ4Suw/jnZn1mvps4diY68KAzmTK749UB3Ke6W/ZLeqz55D4FHPGEyRcOKoxd91j+XcfKCiGF13hOF0GDsWGzIFLLpZSEW5D3L5V8qKdqG+aphsSlKqa0nIqdQBYqlNzPmGwHpsgyTX/mKvN/pc4rr/8OMO/+Rx9bP+By9LNPDsj40n8jhf1Z7mm+IkFX7gWSmwugwTC+r8wanYCSD3c/qCWVDmnPm24rGrmSdYQ0NopAg6akKf6jZ/E2Rkzh+2bH8VcXRxwVatLGjfdvQeVwR76dMrsdMtzVLb5cMb3p0H1RkXREHjE5kEtPS65INjq8KnJn1of+uPFOtHcvRS4rGgWLl1ZTd3xOx/SszplcajK9rihdnXP2vFDs/1JSh3pXAvf13E06fj2kcWfY/qdn6dMHe7wm48osz7vxvYi7/kmV40xdFzyPh2w9v+QLN7Ijg4fLXZEJZsuLXGbgwp/wZjF+UAdnhVA7GtCuD1lGAg/0fdAxe1TUJwBHMHZ/7G19/EtM/lZ77t8qEqyqO2ilNeJyjSsH64oMMG/t0HxR4i0oq5S3hSjcOKxqHOclKQHQk0qS6cjKaD4/GYUnjvo8uCuITEWbqPKxoPpyR9jtYY4iPLclaSDCR1vusraUR6bgQfvK+R3RakPakQ1EKZoL5Nw+l6NG7VxCeZNjQEExMTcvMiI4atHalYAqaKnLERwU6F3Gw5p2A5l5OGftSAKykQSaYmRqfU0SHGd56A6cV7fckjVUWVGHxE0s4NKClgBtM6tb7xNJ+JIeEt7A0d2uxJudJYWxRSzGUohPfepQyuhVLh92honVvDEqR9vtEx9IhqXNH40Cis6Itk5jm65rOw7qdv6No7qTMLjVlOMRxCaWl89Bijeh/9N4JOH7F0HhsaO0W5B2DspZiKsVAYQBYJtdldmTnYU2F9CA40ejS0jgQVpD1zopuDhf7pMsR3Qcl/jijuRNItHhsWazIZ8x6hrQvmU5c31v5f4/mkxR/p0HriaTV1tc094QFJVxmRTDKaUZCCzwrCBYtSbWrQNF+oPFnBbqUvRFMLeFJRt5qCJ99mNEKREuluSdqlN7Cp/OoZOoMjWMZ7pH2DdFhSu+uITie037sSft7LvTI1k6OrgLiw4IyDEhWFa2HGm9eoiqJOKvY0Ni3FE0JJoqmJtqdki4PatlchZdU6NzhT32cUbhhQHiaEh0ZmocWVRrioa054WesLB+UdFgG04roMEUXEcmyf95p2tqVZ69sKJp70oYfjS1l09A4tjX0WBLM5H6EI0veN3XhWtHczZlvhrSeZKRLIsVRBdCps1iA5p5cezAq0ZVHfJBh8gCTacpI4c8V7ccpJimZbTSJRg5daoEhEZpodOrTu1vW99phJinKxrSeOE6WG6hyTnwkxAIvcbSfyHMbH0th1Z8aeebGYKYZjd0WqrI094U8YTJHdJjibXl1s54MelEWguM5JgnJewG6sFRBQDi1TG94mAKKWJrOwqklGJWMbgYy5CM3NOshQc3dnLL5jTH3b4vIXSk1Bd79sD/Ht4ktIzr5F3axFh+0i7V43y7W4n274pxb+e3+49sicgfe/XqpxXebKaW+dLEWYhdr8b5drMX7drEWvzP7tiioXtiFXdiFXdg31y6c+4Vd2IVd2Hegfbs497/0YX+AbyO7WIv37WIt3reLtXjfLtbid2DfFgXVC7uwC7uwC/vm2rdL5H5hF3ZhF3Zh30S7cO4XdmEXdmHfgfahO3el1I8rpd5VSt1VSv3ZD/vzfCtMKfVXlFKHSqk3PvDaQCn1y0qpO/Xf/fp1pZT6r+r1eE0p9bEP/MyfqL//jlLqT3wY1/K7MaXUtlLq00qpt5RSbyql/qP69e/GtYiUUl9QSn2tXov/S/36NaXU5+tr/htKqaB+Paz/fbf+/6sf+F1/rn79XaXUH/iQLul3bUopo5T6qlLq5+t/f9euxTfFnHMf2h/AAPeA60AAfA147sP8TN+i6/xB4GPAGx947T8D/mz99Z8F/m/11z8J/CLSdPw9wOfr1wfA/frvfv11/8O+tn/KddgAPlZ/3QZuA899l66FAlr11z7w+foa/ybwU/XrfxH439Vf/3vAX6y//ingb9RfP1c/NyFwrX6ezId9ff8L1+Sngb8O/Hz97+/atfhm/PmwI/dPAnedc/edcznwM8Af+ZA/0zfdnHP/EDj9x17+I8Bfrb/+q8Af/cDr/60T+xzQU0ptAH8A+GXn3Klzbgj8MvDj3/IP/00059yec+4r9ddT4G3gEt+da+Gcc/XgN/z6jwN+BPjZ+vV/fC3O1uhngR9VSqn69Z9xzmXOuQfAXeS5+ufKlFJbwB8E/j/1vxXfpWvxzbIP27lfAh5/4N9P6te+G2zNObdXf70PrNVff701+Y5aqzqVfhmJWL8r16KGIV4FDpED6h4wcs7Vquf/yHWdX3P9/2Ngie+QtQD+78D/ETjTsV3iu3ctvin2YTv3C0OiOM7FeL/zTSnVAv4W8Kedc5MP/t9301o45yrn3EvAFhJhPvPhfqIPx5RSfwg4dM59+cP+LN9J9mE79x1g+wP/3qpf+26wgxpioP77sH79663Jd8RaKaV8xLH/Nefc365f/q5cizNzzo2ATwPfi0BPZ5pPH7yu82uu/78LnPCdsRbfB/yvlFLvIdDsjwD/Jd+da/FNsw/buX8RuFVXxQOkOPJzH/Jn+mdlPwecsTz+BPB3PvD6v1EzRb4HGNeQxS8Bv18p1a/ZJL+/fu2fG6tx0b8MvO2c+y8+8F/fjWuxopTq1V/HwI8hNYhPA3+s/rZ/fC3O1uiPAb9aZzk/B/xUzSC5BtwCvvDP5CK+Seac+3POuS3n3FXEB/yqc+6P8124Ft9U+7Aruggj4jaCN/4nH/bn+RZd4/8P2AMKBAf8txCM8FeAO8A/AAb19yrg/1mvx+vAKx/4PX8SKRLdBf7ND/u6/hesw/cjkMtrwKv1n5/8Ll2LjwJfrdfiDeA/rV+/jjiku8B/D4T161H977v1/1//wO/6T+o1ehf4iQ/72n6X6/J7eZ8t8129Fr/bPxfyAxd2YRd2Yd+B9mHDMhd2YRd2YRf2LbAL535hF3ZhF/YdaBfO/cIu7MIu7DvQLpz7hV3YhV3Yd6BdOPcLu7ALu7DvQLtw7hd2YRd2Yd+BduHcL+zCLuzCvgPt/w+LLP3cpU1azgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "plt.imshow(dists, interpolation='none')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "7855beeb-d7e2-4ea7-994f-1adfa5a2c886"
    }
   },
   "source": [
    "Let us now predict labels and run the code below: We use $k = 1$ (which is Nearest Neighbor)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "219d7522-e633-4136-aa98-9abe80ca7bf3"
    }
   },
   "outputs": [],
   "source": [
    "y_test_pred = classifier.predict_labels(dists, k=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "f083926f-4bd0-488f-8ba9-e77dc946fac8"
    }
   },
   "source": [
    "We compute and print the fraction of correctly predicted examples."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "f1ac90b4-5005-4940-9663-0bfd9574dc8c"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Got 137 / 500 correct => accuracy: 0.274000\n"
     ]
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "num_correct = np.sum(y_test_pred == y_test)\n",
    "accuracy = float(num_correct) / num_test\n",
    "print('Got %d / %d correct => accuracy: %f' % (num_correct, num_test, accuracy))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "7a33b48c-c106-4903-ba68-769ce91ccb8b"
    }
   },
   "source": [
    " Let us now predict labels and run the code below: We use k = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "7a4433f3-d7d4-4b7c-bd21-6f6d5272c837"
    }
   },
   "outputs": [],
   "source": [
    "y_test_pred = classifier.predict_labels(dists, k=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "8cede653-c157-4396-a534-b4a8741251e2"
    }
   },
   "source": [
    "We compute and print the fraction of correctly predicted examples."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "445220c9-4974-41a0-a36c-a309d395490b"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Got 141 / 500 correct => accuracy: 0.282000\n"
     ]
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "num_correct = np.sum(y_test_pred == y_test)\n",
    "accuracy = float(num_correct) / len(y_test_pred)\n",
    "print('Got %d / %d correct => accuracy: %f' % (num_correct, num_test, accuracy))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Confusion Matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 648x648 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "# utility function for plotting confusion matrix\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "def plot_confmat(y_true, y_pred):\n",
    "    \"\"\"\n",
    "    Plot the confusion matrix and save to user_files dir\n",
    "    \"\"\"\n",
    "    conf_matrix = confusion_matrix(y_true, y_pred)\n",
    "    fig = plt.figure(figsize=(9,9))\n",
    "    ax = fig.add_subplot(111)\n",
    "    sns.heatmap(conf_matrix,\n",
    "                annot=True,\n",
    "                fmt='.0f')\n",
    "    plt.title('Confusion matrix')\n",
    "    ax.set_xticklabels( classes)\n",
    "    ax.set_yticklabels( classes)\n",
    "    plt.ylabel('True')\n",
    "    plt.xlabel('Predicted')\n",
    "    \n",
    "plot_confmat(y_test, y_test_pred)    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "df615e0b-aeeb-4074-abef-075af4118640"
    }
   },
   "source": [
    "## Algebra and Performance of Distance Matrix Computation\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "04f92811-3067-4a08-8227-ed55c42fed50"
    }
   },
   "source": [
    "To ensure that our vectorized implementation is correct, we make sure that it\n",
    "agrees with the naive implementation. There are many ways to decide whether\n",
    "two matrices are similar; one of the simplest is the Frobenius norm. In case\n",
    "you haven't seen it before, the Frobenius norm of two matrices is the square\n",
    "root of the squared sum of differences of all elements; in other words, reshape\n",
    "the matrices into vectors and compute the Euclidean distance between them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "edecc2dc-bbf4-47bb-8902-6910fef3eae0"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Difference was: 0.000000\n",
      "Good! The distance matrices are the same\n",
      "Difference was: 0.000000\n",
      "Good! The distance matrices are the same\n"
     ]
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "dists_two  = classifier.compute_distances_two_loops(X_test)\n",
    "dists_one  = classifier.compute_distances_one_loop(X_test)\n",
    "dists_zero = classifier.compute_distances_no_loops(X_test)\n",
    "\n",
    "\n",
    "difference_two_2_one = np.linalg.norm(dists_two - dists_one, ord='fro')\n",
    "print('Difference was: %f' % (difference_two_2_one, ))\n",
    "if difference_two_2_one < 0.001:\n",
    "  print('Good! The distance matrices are the same')\n",
    "else:\n",
    "  print('Uh-oh! The distance matrices are different')\n",
    "\n",
    "difference_one_2_zero = np.linalg.norm(dists_one - dists_zero, ord='fro')\n",
    "print('Difference was: %f' % (difference_one_2_zero, ))\n",
    "if difference_one_2_zero < 0.001:\n",
    "  print('Good! The distance matrices are the same')\n",
    "else:\n",
    "  print('Uh-oh! The distance matrices are different')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "94c6dacb-929f-4378-b80f-4859256bd7f4"
    }
   },
   "source": [
    "Let's compare how fast the implementations are"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "1d3c6b0c-9a33-4f71-b283-0b1eb8061e77"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Two loop version took 62.240666 seconds\n",
      "One loop version took 75.840250 seconds\n",
      "No loop version took 0.912069 seconds\n"
     ]
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "def time_function(f, *args):\n",
    "  \"\"\"\n",
    "  Call a function f with args and return the time (in seconds) that it took to execute.\n",
    "  \"\"\"\n",
    "  import time\n",
    "  tic = time.time()\n",
    "  f(*args)\n",
    "  toc = time.time()\n",
    "  return toc - tic\n",
    "\n",
    "two_loop_time = time_function(classifier.compute_distances_two_loops, X_test)\n",
    "print('Two loop version took %f seconds' % two_loop_time)\n",
    "\n",
    "one_loop_time = time_function(classifier.compute_distances_one_loop, X_test)\n",
    "print('One loop version took %f seconds' % one_loop_time)\n",
    "\n",
    "no_loop_time = time_function(classifier.compute_distances_no_loops, X_test)\n",
    "print('No loop version took %f seconds' % no_loop_time)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "e55a0c49-3d30-47b3-bbfc-2ba53025a0eb"
    }
   },
   "source": [
    "#  3. k-fold cross validation\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "48a7d639-21bd-4b58-892d-c54a818111aa"
    }
   },
   "outputs": [],
   "source": [
    "num_folds = 5\n",
    "\n",
    "k_choices = [1, 3, 5, 7, 9, 10, 12, 15, 18, 20, 50, 100]\n",
    "\n",
    "X_train_folds = []\n",
    "y_train_folds = []"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "8b1aa44f-7099-4511-8b20-168c0f37edb9"
    }
   },
   "source": [
    "Split up the training data into folds. After splitting, `X_train_folds` and    \n",
    "`y_train_folds` should each be lists of length `num_folds`, where                \n",
    "`y_train_folds[i]` is the label vector for the points in `X_train_folds[i]`.     "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "ee7f2e26-fa37-45b0-af4c-c225369eedc2"
    }
   },
   "outputs": [],
   "source": [
    "num_train = X_train.shape[0]\n",
    "fold_size = np.ceil(num_train/num_folds).astype('int')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "235c4927-a8f9-475f-83c4-54fb4b1de699"
    }
   },
   "source": [
    "In the case of `num_train = 5000` and 5 folds, we obtain \n",
    "`X_train_folds = np.split(X_train, [1000, 2000, 3000, 4000])`\n",
    "`y_train_folds = np.split(y_train, [1000, 2000, 3000, 4000])`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "dd9d3e91-fb0d-4ea1-8e37-6282e1eea5f5"
    }
   },
   "outputs": [],
   "source": [
    "X_train_folds = np.split(X_train, [(i + 1)*fold_size for i in np.arange(num_folds)])\n",
    "y_train_folds = np.split(y_train, [(i + 1)*fold_size for i in np.arange(num_folds)])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1000, 3072)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "X_train_folds[1].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "99d20b22-bc30-49c6-85a1-86f153b21fe0"
    }
   },
   "source": [
    "A dictionary holding the accuracies for different values of $k$ that we find\n",
    "when running cross-validation. After running cross-validation,\n",
    "`k_to_accuracies[k]` should be a list of length `num_folds` giving the different\n",
    "accuracy values that we found when using that value of $k$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "a14b3164-b63a-49eb-980e-57c74b2304db"
    }
   },
   "outputs": [],
   "source": [
    "k_to_accuracies = {}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "369cc408-fb92-4899-9e37-92c02a9ef4c1"
    }
   },
   "source": [
    "We perform $k$-fold cross validation to find the best value of $k$. For each     \n",
    "possible value of $k$, run the $k$-nearest-neighbor algorithm `num_folds` times,   \n",
    "where in each case you use all but one of the folds as training data and the \n",
    "last fold as a validation set. Store the accuracies for all fold and all     \n",
    "values of k in the `k_to_accuracies` dictionary.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "6c869757-5e74-48cc-b7ef-14246b832a99"
    }
   },
   "outputs": [],
   "source": [
    "for k in k_choices:\n",
    "  \n",
    "  k_to_accuracies[k] = []\n",
    "  classifier = KNearestNeighbor()\n",
    "  for i in range(num_folds):\n",
    "      X_cv_training = np.concatenate([x for k, x in enumerate(X_train_folds) if k!=i], axis=0)\n",
    "      y_cv_training = np.concatenate([x for k, x in enumerate(y_train_folds) if k!=i], axis=0)\n",
    "      classifier.train(X_cv_training, y_cv_training)\n",
    "      dists = classifier.compute_distances_no_loops(X_train_folds[i])\n",
    "      y_test_pred = classifier.predict_labels(dists, k=k)\n",
    "      k_to_accuracies[k].append(np.mean(y_train_folds[i] == y_test_pred))\n",
    "  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "c10d6b24-607c-470b-bffd-614c8fa0be2c"
    }
   },
   "source": [
    "We print out the computed accuracies."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "d7c42393-850e-4329-91db-5c052fe247e0"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "k = 1, accuracy = 0.263000\n",
      "k = 1, accuracy = 0.257000\n",
      "k = 1, accuracy = 0.264000\n",
      "k = 1, accuracy = 0.278000\n",
      "k = 1, accuracy = 0.266000\n",
      "k = 3, accuracy = 0.239000\n",
      "k = 3, accuracy = 0.249000\n",
      "k = 3, accuracy = 0.240000\n",
      "k = 3, accuracy = 0.266000\n",
      "k = 3, accuracy = 0.254000\n",
      "k = 5, accuracy = 0.248000\n",
      "k = 5, accuracy = 0.266000\n",
      "k = 5, accuracy = 0.280000\n",
      "k = 5, accuracy = 0.292000\n",
      "k = 5, accuracy = 0.280000\n",
      "k = 7, accuracy = 0.261000\n",
      "k = 7, accuracy = 0.279000\n",
      "k = 7, accuracy = 0.268000\n",
      "k = 7, accuracy = 0.288000\n",
      "k = 7, accuracy = 0.276000\n",
      "k = 9, accuracy = 0.259000\n",
      "k = 9, accuracy = 0.283000\n",
      "k = 9, accuracy = 0.270000\n",
      "k = 9, accuracy = 0.285000\n",
      "k = 9, accuracy = 0.285000\n",
      "k = 10, accuracy = 0.265000\n",
      "k = 10, accuracy = 0.296000\n",
      "k = 10, accuracy = 0.276000\n",
      "k = 10, accuracy = 0.284000\n",
      "k = 10, accuracy = 0.280000\n",
      "k = 12, accuracy = 0.260000\n",
      "k = 12, accuracy = 0.295000\n",
      "k = 12, accuracy = 0.279000\n",
      "k = 12, accuracy = 0.283000\n",
      "k = 12, accuracy = 0.280000\n",
      "k = 15, accuracy = 0.252000\n",
      "k = 15, accuracy = 0.289000\n",
      "k = 15, accuracy = 0.278000\n",
      "k = 15, accuracy = 0.282000\n",
      "k = 15, accuracy = 0.274000\n",
      "k = 18, accuracy = 0.266000\n",
      "k = 18, accuracy = 0.275000\n",
      "k = 18, accuracy = 0.281000\n",
      "k = 18, accuracy = 0.284000\n",
      "k = 18, accuracy = 0.282000\n",
      "k = 20, accuracy = 0.270000\n",
      "k = 20, accuracy = 0.279000\n",
      "k = 20, accuracy = 0.279000\n",
      "k = 20, accuracy = 0.282000\n",
      "k = 20, accuracy = 0.285000\n",
      "k = 50, accuracy = 0.271000\n",
      "k = 50, accuracy = 0.288000\n",
      "k = 50, accuracy = 0.278000\n",
      "k = 50, accuracy = 0.269000\n",
      "k = 50, accuracy = 0.266000\n",
      "k = 100, accuracy = 0.256000\n",
      "k = 100, accuracy = 0.270000\n",
      "k = 100, accuracy = 0.263000\n",
      "k = 100, accuracy = 0.256000\n",
      "k = 100, accuracy = 0.263000\n"
     ]
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "for k in sorted(k_to_accuracies):\n",
    "    for accuracy in k_to_accuracies[k]:\n",
    "        print('k = %d, accuracy = %f' % (k, accuracy))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We plot the raw observations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "e81573f1-9d05-44e2-a581-ffa01100b7af"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "for k in k_choices:\n",
    "  accuracies = k_to_accuracies[k]\n",
    "  plt.scatter([k] * len(accuracies), accuracies)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "21f79bed-12f0-4e15-abdd-1105b4467cf0"
    }
   },
   "source": [
    " We plot the trend line with error bars that correspond to standard deviation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "c9af79e8-2cfa-42ed-84fe-efbdadcf65fd"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "accuracies_mean = np.array([np.mean(v) for k,v in sorted(k_to_accuracies.items())])\n",
    "accuracies_std = np.array([np.std(v) for k,v in sorted(k_to_accuracies.items())])\n",
    "plt.errorbar(k_choices, accuracies_mean, yerr=accuracies_std)\n",
    "plt.title('Cross-validation on k')\n",
    "plt.xlabel('k')\n",
    "plt.ylabel('Cross-validation accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "301c698f-4817-4bc5-8e35-ee37caebacba"
    }
   },
   "source": [
    " # K-Nearest Neighbor with L1 distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "ce60718f-a584-4026-8071-292b5943eca4"
    }
   },
   "outputs": [],
   "source": [
    "class KNearestNeighbor_L1(KNearestNeighbor):\n",
    "  \"\"\" a kNN classifier with L1 distance \"\"\"\n",
    "\n",
    "  def __init__(self):\n",
    "    super().__init__()\n",
    "    \n",
    "\n",
    "  def compute_distances_one_loop(self, X):\n",
    "    \"\"\"\n",
    "    We overwrite the compute_distance_one_loop method of the parent class \n",
    "    KNearestNeighbor. \n",
    "    Compute the distance between each test point in X and each training point\n",
    "    in self.X_train using one loop and the L1 distance measure.\n",
    "\n",
    "    Input / Output: Same as compute_distances_two_loops\n",
    "    \"\"\"\n",
    "    num_test = X.shape[0]\n",
    "    num_train = self.X_train.shape[0]\n",
    "    dists = np.zeros((num_test, num_train))\n",
    "    X = X.astype('float')\n",
    "    for i in range(num_test):\n",
    "      dists[i, :] = (np.sum(np.abs(self.X_train - X[i,:]), axis = 1))\n",
    "    return dists \n",
    "  \n",
    "  def compute_distances_two_loops(self, X):\n",
    "    \"\"\"\n",
    "    Compute the distance between each test point in X and each \n",
    "    training point in self.X_train using a nested loop over both \n",
    "    the training data and the test data.\n",
    "\n",
    "    Inputs:\n",
    "    - X: A numpy array of shape (num_test, D) containing test data.\n",
    "\n",
    "    Returns:\n",
    "    - dists: A numpy array of shape (num_test, num_train) where \n",
    "      dists[i, j] is the L1 distance between the ith test \n",
    "      point and the jth training point.\n",
    "    \"\"\"\n",
    "    num_test = X.shape[0]\n",
    "    num_train = self.X_train.shape[0]\n",
    "    dists = np.zeros((num_test, num_train))\n",
    "    X = X.astype('float')\n",
    "    for i in range(num_test):\n",
    "      for j in range(num_train):\n",
    "          dists[i, j] = np.sum(np.abs(self.X_train[j,:] - X[i,:]))\n",
    "        \n",
    "        \n",
    "     \n",
    "    return dists\n",
    "       "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "d5745a61-1071-4704-8b71-6c0d175de9fc"
    }
   },
   "source": [
    "We create an instance nn form the class `KNearestNeighbor_L1`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "235c3d13-a428-4dae-a286-6ea912f8a0b2"
    }
   },
   "outputs": [],
   "source": [
    "classifier = KNearestNeighbor_L1()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "94df5594-5eff-4354-bc83-889aca850336"
    }
   },
   "source": [
    "Call the method train of the `KNearestNeighbor` class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "627b4ca8-b0df-473d-8e53-3bcc2e31acd8"
    }
   },
   "outputs": [],
   "source": [
    "classifier.train(X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "b96d32ad-0526-4a52-a91e-dffb4a9e634a"
    }
   },
   "source": [
    "We test our implementation with one loop."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "f6ecd69e-e8b4-44a5-8ec1-8aeb47fbc5b5"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(500, 5000)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "dists = classifier.compute_distances_one_loop(X_test)\n",
    "dists.shape  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "cd4c75ed-d9f1-4f3f-8990-2259f4f2f0d5"
    }
   },
   "source": [
    " Let us now predict labels and run the code below: We use $k = 10$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "606e2720-6672-45f3-ae46-761df5c2066d"
    }
   },
   "outputs": [],
   "source": [
    "y_test_pred = classifier.predict_labels(dists, k=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "3408b28c-0781-4186-b1cc-f8d0040ecf8f"
    }
   },
   "source": [
    "We compute and print the fraction of correctly predicted examples."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "1919eb5a-988f-4bee-a646-d110372bbca6"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Got 139 / 500 correct => accuracy: 0.278000\n"
     ]
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "num_correct = np.sum(y_test_pred == y_test)\n",
    "accuracy = float(num_correct) / len(y_test_pred)\n",
    "print('Got %d / %d correct => accuracy: %f' % (num_correct, num_test, accuracy)) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The confusion matrix looks as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 648x648 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "source": [
    "# utility function for plotting confusion matrix\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "def plot_confmat(y_true, y_pred):\n",
    "    \"\"\"\n",
    "    Plot the confusion matrix and save to user_files dir\n",
    "    \"\"\"\n",
    "    conf_matrix = confusion_matrix(y_true, y_pred)\n",
    "    fig = plt.figure(figsize=(9,9))\n",
    "    ax = fig.add_subplot(111)\n",
    "    sns.heatmap(conf_matrix,\n",
    "                annot=True,\n",
    "                fmt='.0f')\n",
    "    plt.title('Confusion matrix')\n",
    "    ax.set_xticklabels( classes)\n",
    "    ax.set_yticklabels( classes)\n",
    "    plt.ylabel('True')\n",
    "    plt.xlabel('Predicted')\n",
    "    \n",
    "plot_confmat(y_test, y_test_pred)    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "09892b80-b73f-41f3-8671-04ebc8f58ece"
    }
   },
   "source": [
    "# k-fold cross validation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "4d4d5599-4959-4aa9-8250-7ccd99c0eef6"
    }
   },
   "outputs": [],
   "source": [
    "num_folds = 5\n",
    "\n",
    "k_choices = [1, 3, 5, 7, 9, 10, 12, 15, 18, 20, 50, 100]\n",
    "\n",
    "X_train_folds = []\n",
    "y_train_folds = []"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "eeb5aeda-0ce5-4581-9fbe-e7605376384a"
    }
   },
   "source": [
    "We Split up the training data into folds. After splitting, `X_train_folds` and    \n",
    "`y_train_folds` should each be lists of length `num_folds`, where                \n",
    "`y_train_folds[i]` is the label vector for the points in `X_train_folds[i]`  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "50f9138b-3378-411f-96a1-5e3fe013e396"
    }
   },
   "outputs": [],
   "source": [
    "num_train = X_train.shape[0]\n",
    "fold_size = np.ceil(num_train/num_folds).astype('int')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "267d72f8-6485-4abd-a1d7-d26b4be5a6cc"
    }
   },
   "source": [
    " In the case of `num_train = 5000` and 5 folds, we obtain \n",
    "`X_train_folds = np.split(X_train, [1000, 2000, 3000, 4000])`\n",
    "`y_train_folds = np.split(y_train, [1000, 2000, 3000, 4000])`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
Mirko Birbaumer's avatar
Mirko Birbaumer committed
   "metadata": {
    "nbpresent": {
     "id": "ca3a1d8c-4b8a-42d6-94e7-793e87cebdea"
    }
   },
   "outputs": [],
   "source": [
    "X_train_folds = np.split(X_train, [(i + 1)*fold_size for i in np.arange(num_folds)])\n",
    "y_train_folds = np.split(y_train, [(i + 1)*fold_size for i in np.arange(num_folds)])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "e1be1d21-0776-4587-9b88-d38e804eab71"
    }
   },
   "source": [