{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Linear Fitting - Exercises\n", "\n", "1. Try to extend the model to fit a polynomial of order N." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD8CAYAAACfF6SlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJztnXl8FEX2wL+VixDClQQCBDLcIogg4fQE3PXA+z4i4rWIqOuuuj912V3X3WU91l1vxVskCO56IuJNUBERCYfcpwQIciThCgFyvd8f3UMmk+7JHJ3MJFPfz6c/M9NdXfWmu/p11atXr5SIoNFoNJroIibcAmg0Go2m4dHKX6PRaKIQrfw1Go0mCtHKX6PRaKIQrfw1Go0mCtHKX6PRaKIQrfw1Go0mCtHKX6PRaKIQrfw1Go0mCokLtwB2pKWlSdeuXR3J69ChQ7Ro0cKRvJwiEmWCyJQrEmWCyJQrEmWCyJQrEmWC0OXKy8srFJF2dSYUkYjcsrKyxClyc3Mdy8spIlEmkciUKxJlEolMuSJRJpHIlCsSZRIJXS5gsfihY7XZR6PRaKIQrfw1Go0mCtHKX6PRaKIQrfw1Go0mCtHKX6PRaKIQrfw1Go0mCtHKX6PRaKIQrfw1Go0mCmnayn/6dEhLg7w8UMr4Pn16uKXSaDSasBOx4R1CZvp0uPFGKC+v3ldUBDfdZHzPzg6PXBqNRhMBhNzyV0olKqUWKaWWK6VWKaUeskjTTCn1tlJqo1LqB6VU11DLrZNJk2oqfjdlZcYxjUajiWKcMPscBUaLyABgIHCOUmq4V5qbgb0i0hN4AnjUgXJ9s3VrcMc0Go0mCghZ+ZuxhErMn/HmJl7JLgKmmt/fAc5USqlQy/ZJZqaHjPbHNBqNJhpxZMBXKRWrlFoG7Aa+EJEfvJJkANsARKQC2A+kOlG2LZMns7F9V0699RWWl3mER01IgMmT67VojUajiXSU1GoWh5CZUm2A94E7RWSlx/6VwDkist38vQkYJiKFXuePB8YDpKenZ82cOTMkeY7uKea2vAR+nV7ONVWbIS4OunSBlJSQ8nWCkpISkpOTwy1GLSJRrkiUCSJTrkiUCSJTrkiUCUKXa9SoUXkiMrjOhP7EfQ5kA/4C3Ou17zNghPk9DijEfPHYbU7F8x/z1Ddy7mNzHMnLSZpqLPH6IBJlEolMuSJRJpHIlCsSZRJpRPH8lVLtzBY/SqnmwK+BtV7JZgHjzO+XA3NNIeudQZlt2byvisqqBilOo9FoGgVO2Pw7ArlKqZ+AHzFs/rOVUn9TSl1opnkVSFVKbQTuBu53oFy/GORqw5FK2LD7YEMVqdFoNBFPyJO8ROQn4CSL/X/x+H4EuCLUsoLhpC5tAViSv48+HVqFQwSNRqOJOJp2eAfAlZpEy3hYunVvuEXRaDSaiKHJK3+lFN3bxLJEK3+NRqM5RpNX/gA928Swac8h9pWWhVsUjUajiQiiRPnHArBs274wS6LRaDSRQVQo/26tY4hRsGSrVv4ajUYDUaL8E+MUx3VopQd9NRqNxiQqlD/AoMw2LNu2jyo92UujCY3p06FrV4iJMT71AkmNkqhR/idltuXgkQo27impeUBXZI3Gf6ZPh/HjIT/fCJebn2/81s9NoyNqlP+gzDYALMn3MP3oiqzRBMakSVBaWnNfaaleIKkREjXKv1taC1JbJLDYU/nriqzRBIbdQkh6gaRGR9Qof6UUWa62LN5SXL1TV2SNJjDsFkLSCyQ1OqJG+QMM6ZrClqJSdh88YuzQFVmjCYzJkyEpqea+pCS9QFIjJKqUf1ZXI8hb3hbT9KMrskZjjacjRFqascXEGCbRcePA5QKljM+XXoLs7NDK0M4WDU5UKf8TOrWmWVxMtd0/O9uouE5UZI2mseKthCdOrOkIUVRkbG6niKlTjQZSVRVs2RK84tfOFmElqpR/QlwMA7q0qWn3z842KnAoFVmjaaxYKeEpU2o7QnjihFOEdrYIO1Gl/AGGdG3Lyh0HKC2rCLcoGk34sVLC/iyyF6pThHa2CDtOLOPYRSmVq5RarZRapZS6yyLNSKXUfqXUMnP7i1VeDcHgrilUVgnLdJwfjSZ4ZRuqU4R2tgg7TrT8K4B7RKQvMBy4XSnV1yLdtyIy0Nz+5kC5QTEosy1KUdPfX6OJVoJRtk44RfjjbKEHhOuVkJW/iPwiIkvM7weBNUBGqPnWF62bx3Ncekt+9LT7azTRip0STk62Th8bG5hThFuB5+XVVOB1OVvoAeF6x1Gbv1KqK8Z6vj9YHB6hlFqulPpEKdXPyXIDZXDXtizJ30tFZVU4xdBowodbKY8dC82bQ2pqTSV86JD1eVVVgSl+twKH2grcl7OFHhCud5T4M7jjT0ZKJQNfA5NF5D2vY62AKhEpUUqNAZ4SkV4WeYwHxgOkp6dnzZw50xHZSkpKSPZoySzYUcFLPx3loZMTcbWKdaSMUGWKFCJRrkiUCSJTLr9kKi42FHGVR+MnJsZQ/Ckpxu8VK6DMYuW7hATo3786n4ICI11CAmRkVJ/vlUdJ584kb99eOy/vc9zk5dnLn5Xl+//5SSTePwhdrlGjRuWJyOA6E4pIyBsQD3wG3O1n+i1Amq80WVlZ4hS5ubk1fm8rPiSu+2bLa/M3O1ZGoHjLFClEolyRKJNIZMrll0wul4hhTKm5uVzVaXJyRJKSah5PSjL2+3NcRESpY8dyH3/cukzvcwKRMUQi8f6JhC4XsFj80MNOePso4FVgjYj8xyZNBzMdSqmhGOamolDLDpbObZPIaNOcHzZru78mCvHHzbIum7w/Zhl/BpPtTDl69n2944TN/xRgLDDaw5VzjFJqglJqgpnmcmClUmo58DRwtfmGChvDuqewaEsxYRZDo3GW4uK6PWT8dbP0ZZP35wVipcDrOsezbD37vl5xwttnvogoETlRql0554jIFBGZYqZ5VkT6icgAERkuIgtCFz1AvNzGhu/aQPGhMjbsLqnzVI2mUTB9umHLr8tDxolWtT8vEE8FDoanUCB56dn39Up0zPAtLq7lNjbsn/cB8MPmsFmfNBpnmTSp5iAuWJtVnGhV+/sCcSvwrCwjJpA25UQM0aH8Cwpq2Sczd/5Mh9K9LPxZ2/01TYRAQiaE2qoO5gWiTTkRRXQofwuXNQUM27KcHzZru7+miVCfIROsZtsG8wLRppyIITqUf0KC5e5hh3ZQWHKUzYU2E1o0msbE5MmGcvbECbOKnm3bJIkO5Z+RYWlrHJ59PoB2+dQ0DbKzDVOK02YVPdu2SRIdyj8lxdLW2O3Gq2nXshk//KwHfTVNhJQU580qDRF+WQdxa3Diwi1Ag5GdXetBUMCwbinH7P7mPDSNpukwfbrRQt+61bD9T54c+AshM7M6Po/J7hZtWTbgVNbP3cD6XSXs2HeYA0fK2X+4nMoqISkhjhbN4khLTqBX+5ZU7SsnrWA/fTu2IibG6zlzm5XcvQu3WQn0mEA9Ej3K34Zh3VOZ/dMvbC0uxZXaItziaDTOYadUv/sO5syp/UKwe1FMnoyMH8+PKd34otcwvu16EmvbdzPy/Hw9GW2ak5mSRI92ybRKjCc2VnHoaAWHjlay88BhZizayuHySt5YNZ+05Gac0bsdZ/dLZ3Sf9sTFxvg2K2nlX29Ep/L3qOTDTxgKY/7Mws1FWvlrIptAW/F2SnXKlOrVujxfCFOn1npR7ChT/LfLEN67ZwZby2JJqChnSOEm7u9wmKGXnknveXNI/svtPmWqqhLe/TSX2A69mbduD1+u2cW7S7bTsXUi1w7N5OrCA7Szkl+v6lWvRJ/y92oN9VzxA+3O2MuCL/O4aoheRUgToQRjGrFTnt6uzaWlxphYZeWxXevSXLw47DJmrWlB5foNjOjent9ldebsfh1o0SyuWqbb6pYpJkbRLimGkYM6c+mgzlRUVjF37W6mLczn31+s57kJr3LLove49Yd3aVl2uFouvapXvRIdA76eeLWGFHDyluUs2HkYydGDTpoIJRiPm0CUp6n4N7ftxISLH+Dsm5/jk94nM3bJx3zT+wBv/WY4lw7qXK34g5UJiIuN4ax+HZh28zDm3nMGZ6XCsydfzRm3vkLOwHOpQhmOGfn5+jmsR6JL+btjn3hxSv5y9jRvzYYH/qZ9mTWRgbf3i0W9BXybRqxCMNg4NRQnt+HBX93KWTc/z7ddT+Ku+W+x4IUbefCrl+ny0AOBle29f/p0I7a/RaOqe7tknn7gEmb1OEjvg7v409m3M/aqv1OQnGYk0M9hvRE9yt/dbbZgRP5yAL5LP67mAe3LrAkHVpOq7DzRROxbx1bhFCZMqPFCEOCdQecy+rbXyDlpDFf99DnzXhrP7797i7ZHDhqJPJW550vJe0KZG88eh/u/lJXZN6qmT+fEyfczY+o9PPzZsyzr2Jtzbn6W9/qNMo7r57BeiB6bv1UX1aRLRQmZe39hQeaJ3Jj3Uc2DetBJ09BY1VURQ4FbhSLxtLVneC2fbeHizCmnwKRJbN1/lD9edA/zOxxPlqstD//7Nnpv+ql2/m5l7j3u4DFGcAzvGcV1efJ45KmAa5Z9yqk/L+WeMb/j7vPvYUWHnkya+ypx+jl0nOhp+fuqPC+9xCnFm1iY2Z8K5XVJ9KCTpqHxNVDrDo/sTQCtY7n2Wt55dz7n3vk6y1z9+fvFJ/C/W0fQ+6H/8x11064BFRtrP6O4LtOQRZ5d9u/irZmTuOnHD3h98EXceMVf2d/jOItMNKEQPcrfTom7XJCdzckjT+JgYjIrO/SsPqbDzWrCga+6umWLvQnIj9bx/sPl3DljKff+bzn9Mlrz2e9PZ+xwlzHxqq6om3b5V1XZzyiuK9icTZ5xUsVf5r7CY3OeYmHmiVx67aPsfOMt/x0y9IzhOnFiGccuSqlcpdRqpdQqpdRdFmmUUupppdRGpdRPSqlBoZYbMHXEHx8x7iIAFgw4XYeb1YSXumLlBxm9c80vB7jgmfl8snInfzj7OGb8ZjgZbZrXTOQr6mYw5Qb7X8zexJUH1pPT6zC7ymO4auFhCopL63bI0IHo/MKJln8FcI+I9AWGA7crpfp6pTkX6GVu44EXHCg3MOpo1aQlN6NPh5YsuOwWHW5WE17qaoEHsRLXh8sKuOT57zhaUcl/bx3O7aN6EusdZqEuglkBzP1fEhIC+y9Tpx57DoeNv5ppnz5OcWIyV2Y/Qn6bDkY6O1OX3TjDuHG6J+CBE8s4/iIiS8zvB4E1gNeoExcBb5qLyy8E2iilOoZadsB4tmomTzYqiUdlOLlHGj9uKeZIucVAlkbTkPhqgQewKEpVlfDPOWu4a+YyTsxow0d3nkqWK6U6QSDmkWAXY8nOhv79Q/ovJy37hhkzJ3EooTnXXPNPdianGgeszEZ25qnKypo9geLojubrqM1fKdUVOAn4wetQBrDN4/d2ar8gGg6bbuEp21dwtKKKJVv3hk00jcYv/FgU5Uh5JXfMWMJL32xm7HAX038zjPYtE6sTBGMeqY/FWOpolAGQmckJuzaRM/NPHGiWzA1X/JX9zVpYm438cdIoLTVW+ItilFOrWCmlkoGvgcki8p7XsdnAIyIy3/z9FXCfiCz2SjcewyxEenp61syZMx2RraSkhOTk5OodK1ZYru51OK4Zd+zsxrnd4rm8t/UCME5RS6YIIRLlikSZIDLlcst0sEx4askRNu2r4uo+CZzliqsdtdbmOSAhwWip14NcPikuNl5AnusQx8RUeziZx1aXJfHv/V3oFX+YewbEEp+WUnc+VjJ17kxyenoQ/6Z+CbVejRo1Kk9EBteZUERC3oB44DPgbpvjLwLXePxeB3T0lWdWVpY4RW5ubs0dSokYbZ2am1JyxZQFct7T3zhWtt8yRQiRKFckyiQSmXLl5ubKlsISGfmvXOk1aY58/NMO+8Q+noOQyMkRcbmMfFwukZwc/66Vy2Utj8tVK98PTrtUXPfNljveWiJVVVW1y01NNTalRGJjLfPNffrp0P5nPRFqvQIWix962wlvHwW8CqwRkf/YJJsFXG96/QwH9ovIL6GWHTQ+vBZO75XGyoIDFJYcbViZNBo7ArDL5x+o5JLnF7CvtIy3bhnGmP4+htbqY81fO1OSP/Z1X3MCvCKaXnTrpdx3Th8+Wr6Dl7/dXLvcoiI4fBimTTMGj60Glb0nxEUZTtj8TwHGAqOVUsvMbYxSaoJSaoKZZg6wGdgIvAxMdKDc4PHhtXB6byO47PwNhWEQTKPxIgC7/NKte3l00RGax8fy7m0nM7hrikWGHgTjvVMXdp42/tjX7V46KSmW12DC9oWc178jj3yylgVPveF7JrHVoHJKHdenieOEt898EVEicqKIDDS3OSIyRUSmmGlERG4XkR4i0l+8bP0Njg8PgxM6tSalRQLfrN8TVhE1GsDvyJk/bilm7KuLaBGvePvW4XRv54fNOFjvHSvcvRO7AHRWYwveWL2M4uNh717La6BuGMejN59G932/cOewG9jRMq12nu7eRH0MVDdyomeGrzc2lSEmRnFqzzS+2VBIVZUzg+EaTdD4ETlzwcZCrn91Ee1bNeOPwxLp3DbJ+hwrnFCKnr0TO+K8wohZmbK8X0apqcan3cBtZSXJR0uZ8t+HOBqXwO0X3a/DswRA9Cp/H5zWK43CkqOs3Xkw3KJomjL+2PLrsMt/vX4PN77xI5kpSbw9fgRtE8PwSPsImniMykqYONH4n0rB2LHWpizPl1Fysl89hp7F23n402dYmtGH50ZcWX1Ah2fxiVb+Frjt/t9s0KYfTT3hry3fh13++01FjH9zMT3aJTNj/HDatWzWcPJ74k/ETRFj+Uh378BqNTHv2boBRPK8YO23XLwql6dPuYZlHXvr8Cx+oJW/BemtEunToaW13V8HjNI4gb+rYNnY5ZecNoabpxot/pxbhpHSon7npfjEX9NKXXOKvJV9gCabh9Z+THrbFvz+7hcpXb9RK/460MrfhtN6pbF4y15Kyyqqd+qAURqn8HcVLKhll1816nxueG0R7Vo2Y/otw0j54H/VDZIVKxq+Pk6ebB9pNBC8lb1dr+e22yxXKGu9cS3/fv8RthSW8M85a0KXp4mjlb8Np/duR1llFd9vKqreGeSapRpNLYL0sd+4+yDXv7qI5GZxTL9lGO0/erdmg6SsrOEbJNnZxgphobwArOzzdt5Izz9fvR9qLHIz4scvuWnpx+Qs3MqPW/yYWxDFPXmt/G0Y0jWF5vGx5K7bXb0zkNaaJrqpS6kE4WO/fW8p2a/8gFKK6b8Zbnj1REqD5PnnjQlVnp46bm8dlwvatbNfT9iXfd7OG8m93+WqZU66J/d1Mg4V88f3VlBW4SPEQ3FxVPfktfK3ITE+llN6ppG7do87JEX9zIjUND38MQ8G6GO/91AZ17+2iMNlleTcMpRuaS2MA3YNj/z82i+e+m7leirqwkJjcyvtzMza/3faNOP6hOJ3b/H/k8qP8rdPn2XD7hJj9q8dBQWR8eIME1r5g+1Dcebx7SnYd5j1u0qMdPUxI1LT9AhkMNcPH/sj5ZXc8uZitu89zCvjhtCnQ6vqg74aHp4vnokTw9/KrY+JVjb//8zyXYzp34GnvtrAlsJD1ufauZFGSU9eK38frbRRx7UHYO5a0/Tj5IxITdPFQfNgZZXw2xlLWbJ1L09eNZCh3bxCElg1SLwpLYUXXmiarVwfDbIHL+hHQmwMf/5wZXXv3bOhZ0eU9OS18vfRSuvQOpG+HVsxd+2u6kozdqyRZto0PU1cY00w5kGL3qeI8NdZq/h89S4ePL+vdZA27wZJoDSFVm5zj6UoU1OPNcjSWyVy96978+2GQqMB593QsyKKevJa+dfRShvdpz15Pxez7ze3Re3AkCZAAjUP2vQ+X3jyXaYtzGfCGT244ZRu9uV5mlMSAvT3b8ytXPd1K/LwyDt8uEaSsSNcdG/Xgslz1lD+pz/7nons8eKIBrTyr6OVNnrrUqqU4uuuJ9U83hS6zBpn8G61Q2DmQYve5yedB/LYruZc1LqM/7vtXP8HaTMy6jYDuUlIaNytXD/GVuJjY5g05ng27zlETmodC9R4vTiaOlr5W7XSlDJaX127MuCPd5JSup+5PYbWPrcpdJk1oWE3ZgT+D2561aMV6T34/fl3M6hgDY8+fCMx+Vv873GmpBgvmtjYumVv2bJxt3L9HFsZ3ac9p/RM5cnTstmX6CPaaZQ16LTy97SZQo0JI+TnE1tYyMjNeXzdfRCVOmKgxhsn/Ow96tHO5FRuuewvpJYe4MUPHybx4P7A887Otl7AxJvGuoC5u6dlZ7f3ei6VUvzpvL4cbJbE06eP9Z13FDXotPIHnxNGAEZvWsS+5q1Y0qlP9U6ljF5DFM8Q1OCMZ4/Z+zwc14zfXPonShKa8+q7f6PdQRvl7M7bV93zbtRY0RgbL3WFj7YZWzm+YyuuHJLJtEFj2H78SRYnmjTGaxIkjih/pdRrSqndSqmVNsdHKqX2e6z09RcnynUcmwf2tJ+XEldZwZc9TdOPUsZ0dgi/77QmvDgx8S87m6oXX+LuK//Eyg49eHr24/TZs8V3mf4sl+hu1OTkNJ35Kb7CR9cxtvLbM3uhYmJ59u9vGNfE292zsV6TIHGq5f8GcE4dab71WOnrbw6V6yw2D2zr5ERG7NnA571HIO6Zic8/HzlT6zXhw6GJf0+0H8wnXU5i0rL3OXPjIvuE7rwDWS6xKc1PsetRKVV7bMWrZ9Tp4/e4dlgm/8vbzpazLzauQ1O4JkHiiPIXkW+ARmpA9MDHhJmzBrn4OSWDjT+sqK4gOtaPxpdi9dMk+OGyAp6Zu5GrBnfh5i/esC/LM2+7OmY3a7WpLGPob0/Lpmc0sXg58bGKp77aYAyON4VrEiRK6oqx7W9GSnUFZovICRbHRgLvAtuBHcC9IrLKIt14YDxAenp61syZMx2RraSkhORkP9Y0BaPbvG0bVFTU2L1XEvh9YXcu6xXPBT1MX+oVK6wftoQE6O/brSwgmRqQSJQrEmWCOuQqLjYUjucShDExhgL3WDg8/0Al/1h4hO6tY/jDkETiVq30r07Z1L2SLl1Ibt8+2L9Ubzh2D/28rrbPJvB2bE8+3RnHHwcJvdo3snrlB6NGjcoTkcF1JhQRRzagK7DS5lgrINn8PgbYUFd+WVlZ4hS5ubmBneByiRjthRrbhbc8Kxc+8211upwckaSkmumSkoz9TsvUQESiXJEok+TkSO7TT4soZdQX73tuU4fE5TqWpKjkqJz88Fcy/J9fyp6DR47l67NO5eRU561UzXRKSe7jj1vLE2YcvYfua2B37UVqXxuPrSglXfo+8JFc/sQnzsnkIKFeK2Cx+KGzG8TbR0QOiEiJ+X0OEK+USmuIsoPCpkt91sqvWb59P7/sNyeDNCVbqsZ/3CaFsjL7gX5f0TanT6eisorfzljKnpKjTLkui7RkcwnGusxInp4uItUhHbxclJu044E/JiwfA+4pxbu4YcE7LN5Zwcb+w5rudaqDBlH+SqkOShm1VCk11Cy3yPdZYcSm4pxdYjx0X67eVb2zqdhSNf7jz0C/L2+f8eP51xPvM39jIf+4+AQGdGlT87hdnbIqV8SY0OXPmrjRRB0B72788QPiEF7sMqL6RRllbttOuXrOAL4HjlNKbVdK3ayUmqCUMv0huRxYqZRaDjwNXG12TyITGw+Onvf/lu7tWvC5p/LXRB/+DPT7UD6zMwfxYmEi1w3P5MrBXUIvt7IysPTRgLsHZTPTOa10P6cn7uf9fqPYEZsEd90VdW7bTnn7XCMiHUUkXkQ6i8irIjJFRKaYx58VkX4iMkBEhovIAifKrTd8dL3P6tuB7zcVsb+0PNxSasKFPx4n7jrkxbo0F/937l1kbV/NX87v50y5dqEcomjC0jE8W++TJhkK3OYlfG6SYXx4eeglRnA4q97cddc12V6AnuFrh03X+6x+6VRUCXPX6dZ/VOGpVEpKakfPtFuD1mOG7f5mLRh/6SRalB3m+cU5JMQF+PjZzSmwUnBRNmEJsHbvnDoVxo2rbsh5vCjTYiu4cPXXzDzxbIqbt7LPt4n2ArTyD5CBndvQsXUiH/+0M9yiaBoKb6VSVGR8xsXV7ds/ZgwkJVGF4ncX3MuOVu144cNHSB99SuBy+LugebQ6HtiNxcyZU92Q84p5dNsP73A4IZE3Tr3Sd95NcAwlLtwCNDZiYhRj+ndk2vf5HDhSTqvE+HCLpKlvrJRKebmh4D39zd0vCXdad8tzxAieLOtIbo8h/P2z5xi8fTVM3QKnnBK4gs7Otl/oPDsb5s0zFF004s9YjOfgOdArOYZftyrnzSEXctsP79D8wL7A82+k6JZ/EIzp35GyyqqaXj+apou/s2ltWp5fbS3h6ZOv5oqfvuC6ZZ8c29/UWpJhx9/Zv26TblYWbNnCzVefxr7KGD74RxMMhOcDrfyD4KQubejUOpE5K34JtyiahsDuofe2+1u8JLa1as/d5/6Ovrs28ffPn0fVkV4TAkHGWRrWLYXjO7bi9Yr2yM8/N61AeD7Qyj8I3Kafb9YXsv+w9vpp8tgplYyMmvu8XhJlMXHccdH9VMXE8MIHD5NYWe4zvSZEgpx0qZTixlO6sn5XCQs2FUXN5E2t/IPkvBO16SdqsFMGnrFkoNZL4p+jbmJ5p978q3ItrrIDNdO6W5JRNrGo3gly0uWFa74h9chBXr//6eqlOJv45E2t/INkYJc2ZLRpzsfa9BMd+KNUPF4SH/c5lTcGX8hNqUc45+m/WL88IOomFkUk06eTOGE81y75mK96DCF//9GouA9a+fvCR6tMKcWY/h34dsMebfqJZiwWb9/840ruu/JPnJTZhvt/f4mRzurlodeDiAzM+3Dd0jnEVlXxRtYFUXEftPK3w26lJI8XwHkndqK8Uvhslfb5j0qKi2vVkSO33c7E5+YSH6t47tpBvidy6fUgIgPzeqeXFHPe2vm80/9XlMY3a/L3QSt/O/xolQ3o3BpXahIfLrNYPUnT9CkoqFVHHjzletYeieU/Vw2kU5vmvs93YglITeh4XO/sZZ9wsFkLZvc53XihN+FxGK387fCjVaaU4uKBGSxqBpxwAAAgAElEQVTYVMTO/UcaSDBNvRDMwKuXn/87J4zm7QFnc8eCtxl1nB8Lqlh5ESll9CSasNKJODzuw5Dtq+hZuJW3Bp5tHMvPh7FjjfvSxO6JVv52+NMqmz6di3+fjQjMuvL2JlUxogo/THyWePj5r0tz8aezJjI8/yd+t22+f+V6ehFBdMXkjyQ87oMCrln+Kcs69WF1u27G8SZ6T7Tyt6OuCSOmwui2ajEDd6zl/U4Dm1TFiCqCHXjNyICkJEoSmnPbxfeTfPQwT3/5DHH/+Lv/ZbsHgl0uHZM/nLjvg1JctnIuCRVlvDXwnNrpmtA90crfjromengojEtWzWNNenfWJrVrMhUjqgh24DUlBXnxJR649D62tO3EM4um0v7JfwXnE64HfyODzEzaHCnhvLXz+aDfKA7FJ9ZO00TuiVb+vvDl2+1RAc5f8w2xVZV80G9kk6kYUUUIA685PU/lI9dg7jm3LyMWfeGf4rcaX9CDv5GB2eO/dtmnlDRLYvbxp9VO00TuiVMreb2mlNqtlFppc1wppZ5WSm1USv2klBrkRLlhxaMCpB4+wBmb8/iw70iqMn0EhtJEJnarbpWU1DTjeSntLdv28vePVjPyuHbcdkYP/8qyG18wQz/XoAnGk4l4zB7/4LhD9CrM560BXqafJnRPnGr5vwFYGMiOcS7Qy9zGAy84VG748FIYF6+exy+t2rHwgUfCKJQmKNwmvtTUmvuLimqu7+qhtPfvLOS5tZAWU8ETVw4kJkZZ5+2Nr5jzURBPplGQnY3asoWrxp3D8k7HsaH/sLrXbWiEY31OLeP4DVDsI8lFwJtisBBoo5Tq6ETZYWH69OqH2FwZ6NdHd9AyRninzXFhFk5TC38e1OxsSE6uvd89wOehtAW4d8zvKK6M59k5/6Zti4Ta59mRn2+9f+vWoOPSaOqHiwZmEBujeOfR12vek2C9wyIM5dQ66kqprsBsETnB4ths4BERmW/+/gq4T0QWe6Ubj9EzID09PWvmzJmOyFZSUkKy1YMdDMXFxs32XMQjJgZcLt74pQULCip4clQSSfGq5jkFBYZfeEICZGRQkpDgnEwO4ui1coiQZPJxv2oFZsvL8yvLT0pTePtQey7LOMoFZT8bceH9leXnn62PJSRA//7+5eODSLx/EJly+SPTE3lHyD9QxX9GNidGmc/0ihW113KAiLmHo0aNyhORwXUmFBFHNqArsNLm2GzgVI/fXwGDfeWXlZUlTpGbm+tYXuJyiRjv+5qbyyXLtu4V132zZdr3W6rT5+SIJCXVTJuUJLnvvuucTA7i6LVyiJBksrtf5j2TnJy607pcx479mHG8dP/Dh3LrxQ/I3H89buwPVRalasoRApF4/0QiUy5/ZPr4px3ium+2zFu3u3qnUvb3sYHk8gWwWPzQ2Q3l7VMAdPH43dnc1/jw4ZJ3YufW9OnQkv8u3la9387GW9A4/36jw5f3lXd33deM25ISilqnccdF99F5/y4em/MUKjYmsME/O1lEtIknQjnz+Pa0bh7Pu3nbq3c2Ec+shlL+s4DrTa+f4cB+EWmcsZB93HilFFcO7sJP2/ez5hczfru/SwBq6oe6HkjPSTs+ZtxWFRXzu3Puorh5K57/8BFadWxnpAtEadvJ4mvpQE1YaRYXy4XNS/gsbwsHEpONMaMm4pnllKvnDOB74Dil1Hal1M1KqQlKqQlmkjnAZmAj8DIw0Ylyw0IdM38vPimD+FhV3fr3dwlATf1g58bpifcC3xYzbp85+Sq+7XoSf136Dv12bjLSeI8ZBCNLI1QaUcX06Vw25a8cjUvg4z6nGr3AqVNh3LhG75nllLfPNSLSUUTiRaSziLwqIlNEZIp5XETkdhHpISL9xWugt1FRx8zflBYJnNW3A+8vLeBoRaX/SwBq6gfv1rwVVi9ojxfCfNcAnjz1Wi5dOZdrcmdUew/l5QXm5hclywM2KSZNYsDPK+hZuJV3Txht7HO75jZyzyw9wzcY7FzyTKVw5Z9/w77Scj47+UIjImDz5oYPua8lADXOYbHAClu2BLYwt/lC2Jmcyl0X/IFehdv4x+fPoVJSqt38IHA3P+3O2bjYuhUFXLIql8Wd+1HQst2x/Y0drfydwsP399Qty+iybyc5PU8zTAdFRXD4MEybph/4+saXD3YgLe/JkylPbskdF/0fh+Ob8fwHD5MUb8zp0KtvRRFmI+CCNd8A8NHxp9fY35jRyt8pPLx6YqWK65bOYVFmf9ammeYGrSAahroidFq1vK0mgWVn89iDr7O4cz8e+fQZeraMNV4UxTZzGbdubRKzPjVemGbbzP27GLhjLR8df1qTGafRyt8pvLqBV/70Bc3KjzJt0Hm2aTT1QCDRMadPh7Q0uO66Wj2FT5//Ly8XJnL9CBcXrv66+kVh1+LzNAc14lmfGi88eosXrPmWVR16sumZV5pE710rf6fwUgptjxzkgrXf8H6/URxISLJMo6kH/PXBdpuHiopqJc1PaMUfNsYwoHNrJp13fM2DdgP4oM1BTRWzt3j+VzNRCmZ18XNGd4Sjlb9TWCiFsUvmUJrQnPdPGN1kuooRj7/ulFbmIeBIXAK3XfwAMZUVPHvtIJrFxdZM4O095B438GUO0jQJ0lslMrxbKh8t3+GOVNCo0crfKSwmCA3YuYEBO9YzbfAFyIvapa9B8HdQ10YpP3TmeFan9+CJRdPokmIzP8A9bpCVVbc5SPf2mhQXDOjE5sJDrNpxINyihIxW/k6SnV3d8jRbBmOXzmZj2wwWHIoLs3BRhD/ulBZK+d1+o5kx8BwmLn6f0XdcG1iZegJXVHDuCR2Ii1F8tHxHuEUJGa38ncbLnHD+mm9JO7SXV+fbRHPUhIcxY4yegcnaNBeTzp7I8B1ruLt3M+M+BuK1oydwRQVtWyRweu92zP7pl0Zv+tHK32m8zAmJleVcv+Rj5mb0Z8Oug2ESqgkTjHvl9OnGFH3z4T2Y0JyJFz9Ay1h4enQn4qa+EZzXjp7AFRWce0IHCvYdZkXB/nCLEhJa+TuNhTnhuqVzSKwo45VvdevfUYJdVKPWwiy/J79tR57JfYH2f/2j9trR+OTXfdOJi1F8snJnuEUJCa38ncbC9puiKri8vfD+0gJ2HzwSJsGaIHYTusaN8/0C8OidvTDscj477mQeyH2N4XlzA5snoIlK2iQlMKJHKp+u3NmoTT9a+TuNje335pvOpryqimnf2yzjp7GnuNjatGOnkCsrffcAzN7ZN11P4vHTx3LB6q+5efGHxn7ttaPxg3NO6MDPhYdY14hNuVr51wcWtt9uaS349fHpTFuYT2lZRbglbDxMn26Yc6xMO74Usi9TzeTJbEt38dsL/0Cvom08+unTKLdnjvba0djhMb501vXnoxA+WdF4TT9a+Tcg40/vzr7Sct7+cVvdiTUGkybVXH8XqhV7XbH6bXoGR668mgkTnqIyNo4X3/8nSZ06VHvmePfcUlONqKxjx+p4PdGM1/hSu/UrGVKwhk/nr62drpHEd9LK3ynsbrrH/sEjBzG0oogpby+gbPGSiK8cEYEvG7xbUcfGWqex6BmICH98bwWrj8bx1PjT6VpcUNszx91zmzbNiMZaVKTj9UQ7FuNL56yZz7qjsWzeU2LsCNYBIUw4tZLXOUqpdUqpjUqp+y2O36CU2qOUWmZutzhRbsRgd9MnTqy1/653/sOupDbMP9K6ZuVoRC2GBsWXDX76dOOhrKys4bMP2Jpqpi3M572lBfzuzN6M7pPuu+y6IoRqogeLRsg56xcAVHv9NLL6ErLyV0rFAs8B5wJ9gWuUUn0tkr4tIgPN7ZVQy40o7G76Sy/V2n9y/nKytq9mdmkqZTFxxvG77rJvMUT7S2HyZOO/e5KUZEzS8lxURaT6BWAzweqHzUX87aPVnNmnPXeO7ll32drzR+PGohHS6WAhA4q28Klb+Tey+uJEy38osFFENotIGTATuMiBfBsPvrxOvFDAXd/NoLgqnnf7n2nsLCqyfnn4eilEC9nZhjL3njk7Z07tayZiHLeYYLWtuJQJOXlkpibxn6sGEhPj1VOwQnv+aNzYOAKc3TedFQX72bn/SKOrLypUP1Wl1OXAOSJyi/l7LDBMRO7wSHMD8DCwB1gP/F5Eao16KqXGA+MB0tPTs2bOnBmSbG5KSkpITk52JC9LVqyAsjK/k4vAQ6W9KDlSySMpm4nzQw/VICEB+vcP8CT/qPdrFQSWMuXl2Z+QVTPk7uEKYfLCw+w9Kvx5eHM6tPCzzVNcbLxwPQecY2KMF0xKSuO5VhFAJMoVsEzFxVBQYDzrCQmQkUFBfBsmfXeYcX0TGJV80Gd9qTe5vBg1alSeiAyuM6GIhLQBlwOvePweCzzrlSYVaGZ+vxWYW1e+WVlZ4hS5ubmO5WVJTo5IUpKIodeNLSlJ5Lbbau83tycnvyCu+2bLW0MuEElOtkxjuylVb3+l3q9VEFjK5HJZXxuXq0ayisoqufmNRdL9gY/l2/V7Ai88J8fIUynjMyfHt1xhJhJlEolMuZyQqaqqSk57dK7c8NoPxg4f9aWh5AIWix+62wmzTwHQxeN3Z3Of5wumSESOmj9fAZrGaghu7IJ6Pf987f233QYuFycmHGJQwVqeHHI5h4+UB1ZehHYjAyLUsQw//fEf/3wdX67ZzYMX9OXUXmmBy6nj9Wg88aq36q23+JUq5rvVOyht1rzaBbkR1BcnlP+PQC+lVDelVAJwNTDLM4FSqqPHzwuBNQ6UG1nYKQnv/c8/D5Mno2JjuH/e6+xqmcprgy/0vxyljK5lYx78tfKOGjvW+G8ORtF8f+l2Xpi3iexhmYwd7qq//6OJDqzq7Y038qsX/0lZbDzfugY2qnG5kJW/iFQAdwCfYSj1/4rIKqXU35RSbq32W6XUKqXUcuC3wA2hltuoMScuDd2+il9t+IEpwy9nb2LLus9T6lgkysZUyWph5R0VzP/y0SpfsnUv9727guHdU/jrhf1Q3q6gGk2gWNXb8nKG/LyclkdK+LLnMGNfBLt3euKIn7+IzBGR3iLSQ0Qmm/v+IiKzzO8PiEg/ERkgIqNEZK3vHJs4Ht5Bf/jmTQ7FJ/LciCvt07tcxkxT78H5RlLJalGX61uI/6tg32FunZZHh1aJvJCdRXysnsuocQCbehtfVcmozYuZ22MIlcqsa/n5Ee+erZ+KcOBhsz+uMJ/LVs7lzUHns61V+9pp3T7tFguNAxHrQ+wTf8Ysgvxf+w+Xc+PrizhSXsmr4wbTtkVCUPloNLXwUW/P3LiIohZtWNaxd/XOCHfP1so/HHhNXPr9/OnESBUPj7rJaOGnptb2abejMQ7+1hWTB4L6X2UVVUyYlsfPhYd4cWwWvdL9MKVpNP5iVW/j4wEYuTmPuMqKatOPJxHaQ9fKvyFxewqMHWsof1PJd0ppwcSMKub0OZX536+FwsKadmxfrWDvEAae3ghpacYWad1Pi8XuaxBEFE0R4b53f+L7zUX86/IBnNwjCM8ejcYXVk4Gr78OQOujhxi6bRVf9RxqfW4E9tC18m8ovD0FKiqMoGHTpsGWLYy/8xIyU5J4cNZKyiq8oljatYJTU2u6knmXUVQUuUHJ3IO1IsY1CHHt2/98sZ73lxZw71m9ufikjPqRWaPxdDKYPLlGi37U5sWsb+diR0uLhkcE9tC18m8ofK06FRNDYq8ePNhyN5v2HGLqgi010/nobtZo1VuV4V1eQ3c//fHnD9GXfsairTwzdyNXD+nC7aO8YvZEe2wkTf3g2dAyGbl5MQDzuntNY4rQ9SC08m8ofMX/MVvmZ957E6NblvPkl+vZdcBjuUerGPNK1W7Ve1REv+XwVo7FxcH+w9o0QIjbOSt+YdL7Kxh5XDv+fvEJNV06G1mIXU0jwqKh1bNoGxn7dzOvz8m1x+0icLKXVv4NhT/dvtJSHpzxDyrKK/jzxH8jnq1Vz9ZxcnLtWEKlpfZx7e3ksFKO+fnOKcd6DnH7zfo93DVzKYMy29Z26Zw+3ehVNaIQu5pGhEVjTgFn/JzHd72HUrZzd8TP8tXKv6Hwx8MFcK3K4+5vc/i880A+6nOadWvVVy/CVxne3U8r5VxV5ZxyrMcQt3n5e7l1Wh4927fk1RuG0DzB48XnfqlZRFV1qnxNlGPTmBt5cCuHyipZnO9gD7qe0Mq/ofA23dgRG8stC/7HgB3rePBXt1KY1Lp2a9WuF+HuYnqah3x1PwNVzn6sVlZjfz2FuF3zywFufH0R6a2a8eZNQ2ndPL5mgrrGPiJw8E3TyLCJLXXyrVcRH6v4et2e8MgVAFr5NySepptu3awDk1VWEitVPD7nSQ4lJPHgrycYxzwVsq+gZp5lFBbWdhv1JBDlHMBqZcd6KvWwGPqmPSVc/9oikhLimHbzMNq1bFY7ka+WfYQOvmkaGTaxpZKvz2ZI1xTmaeWvsSUlxTowmen73qtoG3d99xYf9znNMP94KmQ/gpr5hZVyjomxVo4BrFZ2rKfilJwmm/aUcM1LCxERcm4ZSpcUGxOX3UtNKb0Yu8Y5bLzURh7XjnW7DrJj3+GwilcXWvmHE6vK46GQxy96j5MK1vLHc+5k64MPV5/nduvcutVQdO4WfzDle5uJYmKslWMAq5XVSB+sG6enKWnFCja+OoOrX1pIlQgzfjOcnu19zN61c42Nj4/ceQ+aJsPI44wwLV+vj+zWv1b+kYaHQo6XKp5eMh3VPJE7DnUxJn857b7oVs7TphmTzioqapt1unatHVTOjZ2HUSh2da//uKMUrllagezaxYynbqFXv26+Zy5b9ThatbL2kNKePxqH6dU+mU6tE5m3bne4RfGJVv6RiEdrucuqJTx27WB+2r6fxz5dW3/uk3b5TpliP38gKclQ0g7b9T1l2ZjamUf2ZSIoZr51P70Kt/o3c9m7x2E3f0F7/mgcRinFGce1Y8HGIioqq+o+IUxo5d8IOOeEjlw/wsUr83/m02adrBOFqsTszrdr8aemGvbzKVOMTycntZiyLOvYmyuufRSAmTMfoGfRduv0/rz8Gtni2prGzak923HwaAXLt+8Ptyi2OKL8lVLnKKXWKaU2KqXutzjeTCn1tnn8B6VUVyfKjSb+OOZ4BnRuzd3n38uq9t1qJwhViQV6/uHD1a3voqIacYpCntSSmcm8boO45up/0vJoKZPa5tsrfjdbt/oO5VAPnkcajR0n90hFKZi/oTDcotgSsvJXSsUCzwHnAn2Ba5RSfb2S3QzsFZGewBPAo6GWG20kxsfy8vWDaZ0Uz28uf5DdLdpUH3RCiVkpR7v5CLGx9Tpz9oN7H+OWy/5Ct70FvDP9D6TH+rHGcUqK77EQhz2PNBpftG2RQP+M1szfGLmDvk60/IcCG0Vks4iUATOBi7zSXARMNb+/A5yp9Lp6AdO+VSIvTzidva1SGX/13zkS38w5JeZWjgkJ1cpxwgTrF0I9zpx95dvN/G57C4a0Et7+9nnal+6HuDhDLjvcMtb1QtKLsWsakFN6prF06z5KjlbUPBAhwQadUP4ZwDaP39vNfZZpzDV/9wOpDpQddZyQ0ZonsgezvF03Jr70LWV/N8PKOlGRsrOhf/+ai82PG1ezByBi3yMIwfRUXlnFpPdX8I+P1zCmfwdev/8CWm5ca8gyYAC89prvmct6QFcTYZzWM42KKuGHzR6r8EVQsEEldgN6/mag1OXAOSJyi/l7LDBMRO7wSLPSTLPd/L3JTFPoldd4YDxAenp61syZM0OSzU1JSQnJycmO5OUUoco0d2s5b64uY3Czg9zWsoBYtz6OiTEUYkqKM3KtWFHbRdKKEMotKROeXXaEtcVVjOlYweVqKzHlZUaLHyjp0IHk3bshI8M+fzs5ExKMF1o90BTrVX0RiXLVt0xllcIdX5VyRpc4so83Z6L7UU9DlWvUqFF5IjK4zoQiEtIGjAA+8/j9APCAV5rPgBHm9zigEPPFY7dlZWWJU+Tm5jqWl1M4IdPLv75BXPfNlt+dd7dUokSMtoSIy+VfBjk5RlqljM+cnNpyKY98vTevc4NhxfZ9ctqjc6XXpDny3jNviyQl1Son9/HHje9JSfbl5OTUPtdXegdoqvWqPohEuRpCputeWShn/nte9Q6750kpx+QCFosfutsJs8+PQC+lVDelVAJwNTDLK80sYJz5/XJgrimkJgRu+XIq93wzjfdPGM1vL/wDR2ONlnKdni9g3/30Np/4CiIXgv1cRMhZmM+lLyygrKKKt8cP55LH/y/4xWj0gK4mAjmtVxobd5fwy34z1EMEuRyHrPzFsOHfgdG6XwP8V0RWKaX+ppS60Ez2KpCqlNoI3A3UcgfVBEFmJnd8/zb3577O7ONP54YrHuJAQlLdni9gP6mroKDmvnpwkdxfWs6dM5bypw9WMqJ7KnPuOo2TMtv6Z5/3lUYP6GoijFN7tgM8XD4jyOXYET9/EZkjIr1FpIeITDb3/UVEZpnfj4jIFSLSU0SGishmJ8qNeiZPRiUlMWHRu/xn9r/5sXM/rhz7GDtapNTt+WKnRL3tkaG0qC16H/PW7easJ7/mk5U7+cPZx/H6DUNIaWF68vjT+tGTsjSNiD4dWpKWnMB3G03lH0E9VD3DtzHjUZEuXT2P1759ge3tXZx30UPkdrcY7/FU+HZK1MqlMpgWtZdZaf/OQu6fmccNr/9Iq8R43p94MreP6knMjLeqXxAlJXW7dI4ZExFuchqNP8TEKE7ukcb8jUUcs3S7AzhmZhrP5KRJYanHWvk3djwU8+kLP2XW70fS4egBbrzirzxyxjjKYzwCr3kqfLvuZ4a3l26QmGalKhQzTzyLUeNf4r/Hj+TWNZ/z0Z2ncmLnNrXHHdwzht1unG6XTjBaSOPGwdSpEeEmp9HUidnzHfHoAxSWHGXTazOr90eAu6dW/pFMEJNBurdL5v1Tk7l2xRdMGX4F593wNIs696ttV7TrfgbpIuqNbN3Kd64BXDL239x/7m/pUbSd2W/8jgc+eobEePOFZDXuUF5urFHsuRhNVpbxgpszR6/Jq2kceCj4Efk/AfD9y/+tDsceAfU4rkFL0/iPu/K4K4m7dQB1ml0Sx2bzzxgY/dwLPDjgUq7MfpTL2x7l3vPH0MGdt+d6ANOmVec5b15IYosIP/xczH9u+A+L2veiw8FCnvjocS5ePQ8FxxarAQJfRrIe1wTWaBzFQ8G79v1CxwN7WNjhOMa6nzsrGrgea+UfqfhqHfhjc8/O5lfZ2ZxcVsEzczfy8jebmfVYLpe1PsyEJ/6Ma6cZpjmAl4ovDpdV8uGyAt78Pp/VvxygfacePPTVq1z142wSK83YPN69j8xM63DRvtzhAkmv0YQLD0WugBFbV/B1t0HIrMdQEVKPtdknUnGodZCUEMd95/Qh996RXDmkM+/uiWHU2Ce5/oqHeLffaA4mNA+6y3mkvJLPV+3k7reXMfSfX3L/eyuorBL+cfEJfPPgGMbdcRmJnTvZezUE6vYWQW5yGo1PvBT58K0/UdSiDev7D4uYeqxb/pGKw62DLilJ/OPi/vx27EjePGkMH/QdyT3n301CRRkDd6wja8daBq3exe6DVew/XE6rxDjcsfdEhP2HyynYd5htxaUs27afJVv38tP2fRwpr6J183jO6tuBq4Z0YUjXtqi33oKrbcxKnrj3+bskZaDpNZpwMXlyDbPtMbv/TXdzXPYVRppJk4xn3B0l190Ac8rpog608o9UvCoP4EjroH1qS+79Nod7vs1hSac+fHLcKfzYuS8vD72UijcXAzDpu89JjI8hLiaGKhEqqsRYQtIkPlbRt1Nrrhmayeg+7RnePZX4WLMTGehYRXZ2YMo70PQaTTjwaqh0aduczvGVfJ/SjRs8j1s9K9OmNYiIWvlHKvXVyjVfKqq0lKwda8nasRaSkjgy5SVWnT6GLxbkkZrRnd0Hj1AlEKMMX+X2LRPJaJNIpzbN6Z3estpjx5tQxyo0mqaCV0NlxP+W88WaXVRVCTExyv9Z9vWEVv6RjL+tXG/vnSBMJ4nZ2WQBB3+OY+Tp3YOXOUI8GTSaSGN491T+l7edNTsP0K9Ta/9n2dcTesC3sRPMhJH6jIFjNyaRkqJn5mqimhE9jAmL328y4/sHMsu+HtDKv7Fj13UcNy48CtbKkyE+Hg4erPmCGjsWJk5sePk0mjDRqU1zXKlJLHQv7lLfs+zrQCv/xo5d17GyMjyhD6xmDrdqVbsrKwJTpugegCaqGNE9lUU/F1NVJfU+y74utPJv7Phy/QxH6AOr8Qe7JRZFdGgGTVQxpGsKB45UsG7XQWNHGMOQa+Xf2LHqOnriz8IuweKd78SJ1uMPvloyeiBYE0UM7WY8Cz9usWkQNSBa+Td23F3HWBvXS38WdgkGq4HmKVOsxx/Av0Xf6+slpdGEC6863XnO+3Rsnciinxu58ldKpSilvlBKbTA/29qkq1RKLTM37yUeNaGSnW2EOrYaPIL6iSBoNdBstzJncTFMmFD7BeA5aS1CwtxqNI5hUafV9WMZ8v2nLPphDZIT3rodasv/fuArEekFfIX98oyHRWSguV1ok0YTCnaDR3b29lDNLYGcn5kJzz9vzFy0W8EoQsLcajSOYdNAGrJtFbubt2HrH/4c1sZNqMr/ImCq+X0qcHGI+WlCwWrwqL4WjLY731fr3tfglp4cpmlq2NTdYdtXAbAorXv1Kl6e5k67BpvDhKr800XkF/P7TiDdJl2iUmqxUmqhUkq/IBoSfyMIuitgXp5ve7s7XX6+taKfMKHu9UmtbPv19ZLSaMKFTd3tWbiNNocPsKjLCdXmTU9zZ35+g/QIlNjZad0JlPoSjDVAvJgETBWRNh5p94pILbu/UipDRAqUUt2BucCZIrLJIt14YDxAenp61syZMwP6M3aUlJSQnJzsSF5O0aAyFRcb8ULKyozZgxkZNT1wimbQn8UAAAq5SURBVIuNCldVRUnnziRv3159zDO9R7paWOVrJ4t3HjExxnKNRUW197tclCQkRNz9A12vAiES5ap3mXw8L0/tz2BHZTMeTdlcW67OnUnevRv69w+q2FGjRuWJiMUi3l6ISNAbsA7oaH7vCKzz45w3gMvrSpeVlSVOkZub61heTtHgMuXkiLhcIiASG2t8ulw194PkPv74se/HtqSkWulqbC6X/3L4ysNdhlLVvyUy759IZMoViTKJRKZcDSJTTo5Iamqt+v7i0EvEdd9s2dWiTa1juY8/bjwDQQIsFj/0d6hmn1nAOPP7OOBD7wRKqbZKqWbm9zTgFGB1iOVqAsHT6wCM2b9Qs8vpC/fAqxN2eV95hHHCi0ZTL2RnG2tSezF0m2H3//GkkdbnNYC5M1Tl/wjwa6XUBuBX5m+UUoOVUq+YaY4HFiullgO5wCMiopV/Q2LldeCmtNR+joAn7hm7VgRSUbVtXxNtWDR4+u3aRPOyIyy6cGztMbmYmAZZ1Ssk5S8iRSJypoj0EpFfiUixuX+xiNxifl8gIv1FZID5+aoTgmsCoK6WeWWl71nCUB2qIdTl5yJkCTuNpsGwaNjEV1UyqHgLixLa1XbRdrkapNerZ/hGA3W1qt1eOS6X8dvOXdNuLkGgK3GFmodG05iwafAMPrEr63Ye4OBlV9Y0d+rAbhrH8BX/x1Oxb9kCWVm+J2PZ2eUDCc2gbfuaaMKmwZN1/ulUCSzftj8sYumVvKIBz1m07gWjKyuNSmi16pf3al/uWbZ2SjrQdXs1mmjDYlW+gUfKUQry8vdyaq+0BhdJK/9oIZCFzwNV5nrdXo0mYFolxnNcekvytu4NS/na7KOpTaBxdnRoBo0mKAa52rI0f6+xuEsDo5W/pjaBKnPtvqnRBEVWZlsOHq1g/e6DDV62Vv6a2gSqzLX7pkYTFIO7GtFw8vIb3vSjlb+mNoEqc+2+qdEERWZKEmnJCWFR/nrAV1Mbb28f9wQvX8o8kAFljUYDgFKKQZltWaKVvyZi0Mpco2kQslxt+Xz1LgpLjpKW3KzBytVmH41GowkjWS7D7t/QrX+t/DUajSaMnJDRmvhY1eD+/lr5azQaTRhJjI/lhIzW5G1pWOWvbf4ajUYTZs4/sRMFew83aJla+Ws0Gk2YufnUbg1epjb7aDQaTRQSkvJXSl2hlFqllKpSStkuGKyUOkcptU4ptVEpdX8oZWo0Go0mdEJt+a8ELgW+sUuglIoFngPOBfoC1yil+oZYrkaj0WhCICSbv4isAWOWmg+GAhtFZLOZdiZwEXoRd41GowkbDWHzzwC2efzebu7TaDQaTZhQIr7jSCulvgQ6WByaJCIfmmnmAfeKyGKL8y8HznEv6K6UGgsME5E7LNKOB8YDpKenZ82cOTOwf2NDSUkJycnJjuTlFJEoE0SmXJEoE0SmXJEoE0SmXJEoE4Qu16hRo/JExHYM9hgiEvIGzAMG2xwbAXzm8fsB4IG68szKyhKnyM3NdSwvp4hEmUQiU65IlEkkMuWKRJlEIlOuSJRJJHS5gMXih95uCLPPj0AvpVQ3pVQCcDUwqwHK1Wg0Go0NdZp9fJ6s1CXAM0A7YB+wTETOVkp1Al4RkTFmujHAk0As8JqI1LnKh1JqD5AftHA1SQMKHcrLKSJRJohMuSJRJohMuSJRJohMuSJRJghdLpeItKsrUUjKv7GglFos/tjAGpBIlAkiU65IlAkiU65IlAkiU65IlAkaTi49w1ej0WiiEK38NRqNJgqJFuX/UrgFsCASZYLIlCsSZYLIlCsSZYLIlCsSZYIGkisqbP4ajUajqUm0tPw1Go1G40GTUP6hRhc15yD8YO5/25yP4IRcKUqpL5RSG8zPthZpRimllnlsR5RSF5vH3lBK/exxbGBDyGSmq/Qod5bH/nBeq4FKqe/Ne/2TUuoqj2OOXau6otAqpZqZ/32jeS26ehx7wNy/Til1drAyBCnX3Uqp1ea1+Uop5fI4Znk/G0CmG5RSezzKvsXj2Djzfm9QSo1zSiY/5XrCQ6b1Sql9Hsfq61q9ppTarZRaaXNcKaWeNmX+SSk1yOOY89fKn5lgkb4BxwPH4XumcSywCegOJADLgb7msf8CV5vfpwC3OSTXY8D95vf7gUfrSJ8CFANJ5u83gMsdvlZ+yQSU2OwP27UCegO9zO+dgF+ANk5eK1/1xCPNRGCK+f1q4G3ze18zfTOgm5lPrEPXxx+5RnnUndvccvm6nw0g0w3AszZ1fbP52db83rah5PJKfyfG/KN6u1ZmvqcDg4CVNsfHAJ8AChgO/FCf16pJtPxFZI2IrKsj2bHooiJSBswELlJKKWA08I6ZbipwsUOiXWTm52++lwOfiEipQ+U7IdMxwn2tRGS9iGwwv+8AdmNMMHQSy3riQ9Z3gDPNa3MRMFNEjorIz8BGM78GkUtEcj3qzkKgs0NlBy2TD84GvhCRYhHZC3wBnBMmua4BZjhUti0i8g1G486Oi4A3xWAh0EYp1ZF6ulZNQvn7iV100VRgn4hUeO13gnQR+cX8vhNIryP91dSuhJPNLuATSqlmDShTolJqsVJqodsMRQRdK6XUUIxW3SaP3U5cK3+i0B5LY16L/RjXpj4j2Aaa980YrUg3VvezoWS6zLwv7yilugR4bn3KhWka6wbM9dhdH9fKH+zkrpdr1WjW8FV+RBcNB77k8vwhIqKUsnWtMt/w/YHPPHY/gKEIEzDcv+4D/tZAMrlEpEAp1R2Yq5RagaHkgsbhazUNGCciVebuoK5VU0QpdR0wGDjDY3et+ykim6xzcJSPgBkiclQpdStGj2l0A5TrL1cD74hIpce+cF2rBqXRKH8R+VWIWRQAXTx+dzb3FWF0r+LMVpx7f8hyKaV2KaU6isgvpsLa7SOrK4H3RaTcI293S/ioUup14N6GkklECszPzcoI2X0S8C5hvlZKqVbAxxgv/YUeeQd1rSywqydWabYrpeKA1hj1yJ9zg8WvvJVSv8J4mZ4hIkfd+23uZ6gKrU6ZRKTI4+crGGM77nNHep07L0R5/JbLg6uB2z131NO18gc7uevlWkWT2ccyuqgYIyq5GPZ2gHGAUz2JWWZ+/uRby+5oKkG3rf1ijGUz610mpVRbt9lEKZUGnAKsDve1Mu/b+xh20Xe8jjl1rfyJQusp6+XAXPPazAKuVoY3UDegF7AoSDkClkspdRLwInChiOz22G95PxtIpo4ePy8E1pjfPwPOMmVrC5xFzV5vvcplytYHYwD1e4999XWt/GEWcL3p9TMc2G82aurnWjk5mh2uDbgEww52FNiFuX4AhkfIHI90Y4D1GG/xSR77u2M8pBuB/wHNHJIrFfgK2AB8CaSY+wdjRD11p+uK8XaP8Tp/LrACQ5HlAMkNIRNwslnucvPz5ki4VsB1QDmwzGMb6PS1sqonGCakC83vieZ/32hei+4e504yz1sHnOtwPa9Lri/N+u++NrPqup8NINPDwCqz7Fygj8e5N5nXcCNwY0NeK/P3X4FHvM6rz2s1A8NDrRxDX90MTAAmmMcVxnrnm8yyB3uc6/i10jN8NRqNJgqJJrOPRqPRaEy08tdoNJooRCt/jUajiUK08tdoNJooRCt/jUajiUK08tdoNJooRCt/jUajiUK08tdoNJoo5P8BYar9a7cnZK8AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# here we are going to use Keras and numpy\n", "import numpy as np\n", "\n", "# polynomial coefficients\n", "a0 = 1; a1 = 4.; a2 = -2; a3 = -4;\n", "\n", "# generate training inputs\n", "x = np.arange(-1, 1, 0.01)\n", "# ideal (target) polynomial function\n", "y_target = a3 * x**3 + a2 * x**3 + a1 * x + a0\n", "\n", "noise_amp = 1.0 # noise amplitude\n", "y_train = y_target + noise_amp * (np.random.rand(len(x))-0.5) # actual measures from which we want to guess regression parameters\n", "\n", "# plot training and target dataset\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.plot(x, y_target)\n", "plt.scatter(x, y_train, color='r')\n", "plt.grid(True); plt.show()" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "dense_27 (Dense) (None, 4) 8 \n", "_________________________________________________________________\n", "dense_28 (Dense) (None, 1) 4 \n", "=================================================================\n", "Total params: 12\n", "Trainable params: 12\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "import tensorflow.keras as keras\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense\n", "\n", "\n", "model = Sequential()\n", "model.add( Dense(4, input_shape=(1,), activation='tanh'))\n", "model.add( Dense(1, use_bias=False) )\n", "\n", "# compile the model choosing optimizer, loss and metrics objects\n", "# optimizer=keras.optimizers.SGD(lr=0.1, decay=0.001)\n", "optimizer=keras.optimizers.Adam(lr=0.1)\n", "model.compile(optimizer=optimizer, loss='mse') #, metrics=['mse']) # metrics is optional here\n", "\n", "model.summary()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "# Plot estimated Y from current training status\n", "import tensorflow as tf\n", "from IPython.display import clear_output\n", "class PlotCurrentEstimate(tf.keras.callbacks.Callback):\n", " def __init__(self, update_freq=10):\n", " self.epoch = 0\n", " self.update_freq=update_freq\n", " def on_epoch_end(self, epoch, logs={}):\n", " self.epoch += 1\n", " if self.epoch%self.update_freq:\n", " temp = self.model.predict(self.validation_data[0])\n", " y_curr = list(temp[:]) # convert numpy array into list\n", " clear_output(wait=True) \n", " eplot = plt.subplot(1,1,1)\n", " eplot.clear() \n", " eplot.scatter(self.validation_data[0], y_curr, color=\"blue\", s=4, marker=\"o\", label=\"estimate\")\n", " eplot.scatter(self.validation_data[0], self.validation_data[1], color=\"red\", s=4, marker=\"x\", label=\"valid\")\n", " eplot.legend(); plt.show()\n", "\n" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r", "200/200 [==============================] - 0s 2ms/step - loss: 0.0867 - val_loss: 0.0051\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# we have to choice the batch_size and epochs\n", "batch_size=100 # defaults to 32\n", "epochs=2000\n", "\n", "trainplot = PlotCurrentEstimate()\n", "earlystop = tf.keras.callbacks.EarlyStopping(monitor='val_loss',\n", " min_delta=0, patience=100, mode='auto')\n", "\n", "model.fit(x, y_train,\n", " batch_size=batch_size,\n", " epochs=epochs,\n", " callbacks=[trainplot, earlystop],\n", " validation_data=(x, y_target), # used to evaluate the loss and any model metrics at each epoch\n", " verbose=1, # 1 get a line per epoch reporting loss and metric data\n", " )" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.plot(x, y_target, label='valid')\n", "y_pred = model.predict(x, batch_size=batch_size)\n", "plt.scatter(x, y_pred, color='r', label='predicted')\n", "plt.legend(); plt.grid(True); plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How many layers do you need?
\n", "You need at least two layers: first layer with as many neurons as the polinomial degree (this layer will output a vector of degree shape), one last layer to match required dimensionality (1D dimension) and codomain range values of Y samples.\n", "\n", "Can you make good prediction using a non-linear activation function?
\n", "No, you can't, because each neuron with no activation function is able to perform only linear transofrmation, so you can't combine linear transforms to resamble a non linear behaviour. You need to apply an activation function in order to alter/deform the linear transformation output space.\n", "\n", "Can you identify the meaning of weights?
\n", "Not so easily guy! :-) You might be tempted to interpret first layer's weights as the polinomial coefficients. Yet, even with a very simple model with 2 layers (Dense(3),Dense(1)), identification is pratically unfeasible as weigths go through activation functions which alter their mapping with the polynomial coefficients" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for l in model.layers:\n", " w = l.get_weights()\n", " print(\"weigths\", w[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Try to extend the model with at least two layers and fit a 2D Gaussian distribution or a simple trigonometric 2D function such as f(x,y) = sin(x+y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# here we are going to use Keras and numpy\n", "import numpy as np\n", "\n", "# f(x,y) = sin(a0*x + a1*y) \n", "a0 = 1; a1 = 2.;\n", "\n", "# generate training inputs\n", "X = np.arange(-1, 1, 0.01)\n", "Y = np.arange(-1, 1, 0.01)\n", "X, Y = np.meshgrid(X, Y)\n", "Z = np.sin(2*X**2 + 4*Y**2)\n", "Z_train = Z + (np.random.rand(len(Z))-0.5)\n", "\n", "# Plot the surface.\n", "from mpl_toolkits.mplot3d import Axes3D\n", "import matplotlib.pyplot as plt\n", "from matplotlib import cm\n", "fig = plt.figure()\n", "ax = fig.gca(projection='3d')\n", "ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,\n", " linewidth=0, antialiased=False)\n", "#ax.plot_surface(X, Y, Z_train)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.6" } }, "nbformat": 4, "nbformat_minor": 2 }