Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@rohan-paul
Created October 7, 2020 17:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rohan-paul/de3999b34b480d5ee26acc9105bf50a9 to your computer and use it in GitHub Desktop.
Save rohan-paul/de3999b34b480d5ee26acc9105bf50a9 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD4CAYAAAAXUaZHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy86wFpkAAAACXBIWXMAAAsTAAALEwEAmpwYAAAvD0lEQVR4nO3deVzU1frA8c8BNbMUFUwFJARyQ1GUkjCvZqtLLrfdNK+ZC26ZLZb3ll7rZ9mtTNNA1DQhy8rrUra5QRpFQSjmGkOKiAu4oKnXVM7vj+/MNMPiAgzDDM/79fLlLN9hvt/XVx+Pz3nOc5TWGiGEEO7Fw9knIIQQouJJcBdCCDckwV0IIdyQBHchhHBDEtyFEMIN1XD2CQD4+PjowMBAZ5+GEEK4lLS0tHytdaOS3qsSwT0wMJDU1FRnn4YQQrgUpdS+0t6TtIwQQrghCe5CCOGGJLgLIYQbkuAuhBBuSIK7EEK4IQnuQgjhhiS4CyGEG5LgLoQQznDmDEyaBPtKLVUvFwnuQghR2TZsgHbt4I034MsvHfIVEtyFEKKynDgBw4fDHXeAhwckJkJ0tEO+SoK7EEJUhlWroE0beP99eP55yMiAbt0c9nUS3IUQwpGOHIFHHoH+/cHHB1JSYMYMuPZah36tBHchhHAErSEhAVq3hv/+F6ZNg9RUiIiolK+vEl0hhRDCrezfD6NGGZOlkZGwcKGRkqlEMnIXQoiKUlgIMTEQGmpMls6cCZs3V3pgBxm5CyFExfjtN3jySfjuO7jzToiLg+bNnXY6MnIXQojyuHDBqFcPC4OtW40UzLffOjWwgwR3IYQou61boXNnY6XpvffCjh3wxBOg1CU/FptkItmUb/dasimf2CRThZ2aBHchhLha587BSy8ZlS85OfDpp0ZFjK9vqR+xDehh/l6MXZrO/E0m6+tjl6YT5u9VYacowV0IIa7GDz9AeDi8+io8+qgxWn/ggcuO1i0BPdmUT1SwD9Hdg5i+Zhe7D51i7NJ05gwMJyrYp8JOU4K7EEJciT/+gAkToEsXOH0avvoKliwBb+8r+nhUsA9zBoYzdmk6b3+7m5jELPqH+7Ei/QCDOgdUaGAHCe5CCHF5a9cajb5mzYIxY+DXX40cexFFc+mxSSZr6gWMAN+tRSNmb8ikWwsfkvbkMb5HCAkp2cVy8OUlwV0IIUpz/LgxQXr33VCrFmzaBO++C3Xrlni4beoFwNMDpq/Zhac50s7fZGJl+gFuC/FhZXou0d2DmHh3S+uIviIDvNS5CyFESVauNDo25uXBiy/Cyy9D7drFDotNMhHm70VUsI819TIyPo12fl7sOnSKyb1bEZOYxY7ck6xMz2Vy71ZcLIRuLX2IScwi1NfL+rmMnIIKS89IcBdCCFuHD8O4cUYFTIcOsGYNdOxod4htQLeM1qO7B3Gx0Bi9n79YSLLpKON7hDC8azCnzl5g9oZMBoT7MrxrsPXnhPp6WQO65VdFuWxaRin1vlLqiFLqV5vXGiql1iqlfjP/3sD8ulJKzVZKZSqlMpRSHUv/yUIIUYVobUyQtm4Nq1fD9Onw00/FAjtcuvJlZHwaNT09rLn0+ZtMJKRkM75HCEl78u1SL1HBPozqFlzs51eEK8m5LwaKzhy8AKzXWt8ErDc/B+gJ3GT+NQKIqZjTFEIIB9q3D3r2hCFDjOC+ZYuRiqlZs8TDL1X5cv5iIfMGd2Li3S2tQd+RufXSXDa4a62/A44Vebkf8IH58QdAf5vXl2jDj0B9pVTTCjpXIYSoWIWFMHcutG1rNPh6911j0rRVq8t+NCrYh0GdA+wqX7oEe1PT86+werEQa47d8hlLbt3Ryppzb6y1Pmh+fAhobH7sB+y3OS7H/NpBilBKjcAY3RMQEFDG0xBCiDLavdto9LV5s1ENExcHN954xR9PNuWTkJLNgHBf60Tp8K7B1tWmcwaGl5hyqejcemnKPaGqtdZKKV2Gz8UBcQARERFX/XkhhCiT8+fhrbdg6lSoUwcWL4bHH7euMLWdLLU8Boj7LosRfwsC4POtuXyz/TDR3YP4PvOotSLGUZUvZVHW4H5YKdVUa33QnHY5Yn79ANDM5jh/82tCCOF8W7YYdevp6UbLgHffhSZN7A6xTJbOGRhOmL8XI+PTABh/R4j1cZ+wpkR3DyImMcvaNsCRlS9lUdZFTKuBIebHQ4BVNq8/bq6aiQQKbNI3QgjhHP/7H/zzn0ajr9xcWL7cKHU0B3bblaW2tepzNmRaf8Spsxesjxtdf41dYLd8zlGVL2Vx2ZG7UuojoDvgo5TKAaYArwOfKKWGAfuAh8yHfwn0AjKBM8BQB5yzEEJcue+/h2HDjBz70KFGSqZBA7tDbEfrlmBtW6sOMHtDZrHHzh6dX8plg7vW+tFS3rqjhGM1MKa8JyWEEOV26hRMnmxUw9x4o7GBxl13lXiobWnjoM4BLEreS01PD0Z0DWJR8l4AxvcIsXuckJJNZLB3lQ3w0ltGCOF+vvnGKG+cO9dYbbptW6mB3cK2tNFSqx4Z/FfHx7rX/jUWjgz2rtSa9bKQ9gNCCPdx7BhMnAgffGDUqm/eDFFRJR5qWxUDRmnjouS93NiwDsfO/AlARk4B8wZ3AoxqGcvjjJwCRnULrhJVMaVRRibFuSIiInRqaqqzT0MI4cqWLzfa8ebnwwsvwL/+VazRl21At9SjR3cPIivvNF9kGLUflgDuiA00KppSKk1rHVHSe5KWEUK4toMH4f77jdJGPz9ITTV2SSqhg2NpPWEsK0bnDe5k192xMlaSOoqkZYQQrklrYwHSxIlGqeOMGcbjGqWHtaITpwkp2daeMEWrX6pCrXp5yMhdCOF69u6Fe+4xFiS1awdbt8Lzz5cY2IvujlSZuyE5kwR3IYTruHgRZs+G0FBjo+r33oPERGjRolgQB2OSdN/R03ZVLZW5G5IzSVpGCOEadu40Gn0lJxvteWNjwabpoO1CpIycAjw9sK4iva+9LyPj0whoWIcduScrbTckZ5LgLoSo2s6fhzfegGnT4PrrIT4eHnvM2ujLwjaf3q2Fj7VTo6Uy5vzFQrbnnqzU3ZCcSYK7EKLqSkszWgds3QoPPWQ0+rrhhlIPt12INCDcl5jELE6dvWC34tSSW7ftCeMuAd2W5NyFEFXP2bNGrXrnznDkCKxYAcuWFQvsRfPsloVIUcHeJO3Jt06c2u6O5G659dJIcBdCVC3ffQft2xuljUOHwo4d0L9/iYfa1q0nm/KtLXnH9gghunsQK9MPEOpbz253JHeoYb8SkpYRQlQNJ08ao/WYGGjeHNatgzvuMK8qvVBs8wxLC4Do7kEMW5xKx4D6wF8rTGMSs6wTp0W7PrprKsaWBHchhPN99RWMHAk5OfD00/DKK3DddUDpm2fMG9yJZFM+MYlZ3Nu2id1CpNgkU7HWAe5UCXMlJLgLIZzn6FGYMAESEqBNG6PMMTLS7pCiq0otfjQdJSEl27ojkm0bXmfuXVpVSHAXQlQ+rY2dkMaOhePH4eWXibvtYdo2uoEoKDH9Ypkctd0ww1IRYxmlRwZ7u0TDr8ogwV0IUblyc2H0aFi1ytj2bt06CAujrblLY0npF8uq0gHhfnYbZszf9DsT777JrqyxuqVfSiPBXQhRObSG99+HZ56Bc+eMhUlPP23tB1Na+uXT1P3WBUmhvl6s23kYMDbMsIzULStMLT+nugd2kFJIIURlyMoydkJ68kno0MHYGem554j9fl+pTb2GRgUyNCqQFem59DevKrVsnjFvcCfr6Lw6lDWWhYzchRCOc/Gisar0n/8ET0+jH8zw4eBhjCuLliiWln6xrCq1nSiVkfqlSXAXQjjG9u1G64CUFOjd2wjs/v52uyFZRt5Fm3qVln6RidIrJ2kZIUTF+vNPo8lXeDiYTLB0KXz+Ofj7A/arSi0sTb0k/VJxZA9VIUTF+flnY7S+bRs88ojRe71Ro2KHWfYvHdQ5wJp+GRoVSEJKtozOr4LsoSqEcKwzZ+C554wFSMeOwerV8NFH1sB+qd2QqmNTr8ogwV0IUT6JiRAWBm++aYzat2+H++6zO6RoKsYycVpdm3pVBplQFUKUTUGBsW9pXBwEB8OGDcR6BBCWf54or+KrTEuaOB3eNdiaoqlOTb0qg4zchRBX74svjH1MFyxgy0PD+HHlBrj9dusIff4mE/uOnmZkfBoj49OsQb7oxCnIaN1RyhXclVJPK6W2K6V+VUp9pJSqrZRqrpRKUUplKqWWKaVqVdTJCiGcLC8PBg400i4NGsAPP3Bm+uuMXrHburtRdPcgpq/Zxf/OF1o/9qPpKCPj06jp6cH4HiEk7ckvloMvqdmXKLsyp2WUUn7AeKCN1vqsUuoT4BGgFzBTa/2xUioWGAbEVMjZCiGcQ2v4+GMYP95Ix0ydCi++CLVqEQV2bQMSUrLpH+5nbcELRpOv2jU9eP8fN0uDr0pS3rRMDeBapVQNoA5wEOgBfGZ+/wOgfzm/QwjhTDk50K8fDBzIKb8A+OUXYrsPInn/SZJN+cQmmeyqX7q18CFpTx7je4SwKHkvi5L30iXYWyZOK1mZR+5a6wNKqTeBbOAs8C2QBpzQWl8wH5YD+JX0eaXUCGAEQEBAQEmHCCGcqbCQpOdfo8u8GdS4eIHfX5zGg9fczMjj17Lv6GnmbswE7Ls23hbiY9fky1LDPsY8gpeJ08pTnrRMA6Af0Bw4AXwK3Huln9daxwFxYCxiKut5CCEcIDMThg+nW2IiPzdvj8eC+XTqcTMjN5mYvmYX/cP/GrPZdm28WAjdWvoQk5jFPaGNrVveWXqySzveylOeUsg7gd+11nkASqn/Al2A+kqpGubRuz9woPynKYSoFBcuwDvvwEsvQa1aEBfH+dv7M/ajLQy6sLvUfPoAm+oXgFBfL7sgLk2+Kl95gns2EKmUqoORlrkDSAU2Ag8AHwNDgFXlPUkhRCXYts1YhPTzz9C3L7z3Hvj5EQUM6hxgDeK2+XSw79ooQbzqKPOEqtY6BWPi9Bdgm/lnxQGTgIlKqUzAG1hYAecphHCUc+dgyhTo2BH27jWqYlauBD8j9ZJsyichJZsB4b6sTM8lunsQkcHe1o9HBntL24AqSBqHCVGdpaTAE0/Ajh0waBCLHnyKlqGB1lF3simfkfFp9Alryo3e1+HpgTWffl97X+CvfHqyKd/6WFSOSzUOk/YDQlRHp08befV33uEPn8ZkL1hKm2GP0tLcCiC6exAXC2Hf0dMA3Nfe1xrwJZ/uGqT9gBDVzfr10K4dzJwJ0dFs/zaZQbk+xVaY7j50im+2H2be4E52QVtWk7oGGbkLUV2cOAHPPgsLF3LCP5Ccpato+2hfOgNz6tZlZHwa7fy82HXolF1FjIzGXZOM3IWoDlat4nRIS/TixTBpEru+/o7HM69l/iYTsUkmwGjqlWw6arfC1FIFI1yPBHch3NmRI/Dww9C/PzRqxKDhs0ge/iyRoc3s0i+Wpl62FTGyeYZrk7SMEG4mNslEmF89olK+5ezocVxz9jT7J77IN70eZ0ygT4npF0tTr4ycAib3rkdMYhahvl52PWAkPeNaJLgL4WYiPP7gbK+B8NtPXOgQwSNRw8mqeyPzAo3gbEm/WBYkdQn2JuOA0cDLMlFqWxEjVTCuSYK7EO6isBDmzSNi0iQuXrjIG72iqTl2LFkp+wGjp/qi5L3U9PSgZ9sm1n4wshuSe5LgLoQb+ChhHb1mv4TXzz/CnXfiGRfHwZ8KWJH0e4k91SX94v4kuAvhyi5cgLff5qGXp3Ba1SDz9VmEPD+O+ZuzWJl+gAHhftYeMJJ+qV4kuAvhqrZuNVoH/PILngMGsPu5aYxcd5Bun2yx66m+budhQHqqVzcS3IVwIbFJJto3qs2tH8Vy8bXXudigAVlz3iex7d8YdWsw3bIvsCL9gLUFb2ySSXqqV1MS3IVwIV2O7Ob6B0ZB/n6ODniIATc9yMm8uszz97LuhjQg3I+kPXkkm/Lt2gRID5jqRRYxCeEK/vgDnnqKdg/3wbeWZszg6SSMmsbJa+sCxm5I09fsYnLvVsx8uIMsPhIS3IWoimKTTH8F5m+/hbZt0e++y6/9HuOaXTsIHvR3Zm/IZGhUIEOjAlmRnkt/m92QZANqIcFdiCoozN+LFxd+x+EHB8I993BCezLsibc4+eZMko+cY1HyXqKCvVmUvJdFyXsZ3yOEpD35diN16d5YvUlwF6KKsB2tR239jrULovFevoxldw6i84NvcuuQvgCMjE8D4PZWjayfld2QRFEyoSpEFRHm78WUeev5OCMB72++4M/WbRnc7yXSvZszINyXmMQsWjcxcuzzBnciI6dAKmFEqWSbPSGqAq1hyRLOPzWBwtOn+XnQGMb538kFzxoMjQokISWbbi0aWXusT7y7pbPPWFQBss2eEFXZvn0wahR8/TU1o6JYNPRf/DuzkNp48L55F6S619Zg+ppdDAj3IyElm8hgbxmdi0uSnLsQzlJYyKYJU7kYGgqbNsHs2SQvXsHbOR7c2LAONT2Nv57JpnxiErOY3LsVLZvUldy6uCIycheiksUmmbjlzzw6TnuOrps3kxwSwb7pb5HhWZ8vPkwH4LX72wFGq4B7Qhtb2wVYSG5dXI4EdyEcLDbJRJi/0XmR8+fp+fkimrzzBmeuvZY6ixezvXkXpn+5mza+CsBuQ+rSgrisMhWXI8FdCAcL8/di7NJ0FrX3pP3UZ7kxPZ1v29zG9J6j6du0IwlJv5e6IbUEcVFWknMXwgHsatb9rmd17hpC+9/FcVM2zz7yMtevXkHfuzsye0OmbEgtHEKCuxAVxDagW0brq+cu43iLUPxjZ7Eq7A66DZ2L79CBACSkZMuG1MJhypWWUUrVBxYAbQENPAHsBpYBgcBe4CGt9fHyfI8QrsAS0OcMDCfqhmuIT19C6IoEjvk0ZcSg6fwQ3JGhUYHWlgGWhUiyI5JwhPLm3GcBX2utH1BK1QLqAJOB9Vrr15VSLwAvAJPK+T1CVHmWwPzhv+fT9ps5tM47SFLPgUS3GkDhdddZa9bz/jjHFxkHAdkRSThOmVeoKqW8gC1AkLb5IUqp3UB3rfVBpVRTIFFrfcnldLJCVbgqu0qYo0dh4kRYsoTMhv6seeoVPlB+tG5Sl4wDBXZVMMmmfGvLACHKylErVJsDecAipVR7IA14CmistT5oPuYQ0LiUkxoBjAAICAgox2kI4Txh/l6M/fAXPmqYQ8tXXqTw6DHm3vowaYPHkLTvJJN7BzG8azDJpnzZ3k5UqvJMqNYAOgIxWutw4DRGCsbKPKIv8b8GWus4rXWE1jqiUaNGJR0iRJUXVec8a7+fTctxw9h/XUP6PP42tWf8H5FtfJncuxUxiVkkm/Klv7qodOUZuecAOVrrFPPzzzCC+2GlVFObtMyR8p6kEFVJbJKJML96RG36AiZOxPt//+PzgU8xwa8HfTs1s26YAZJLF85T5pG71voQsF8pZcmn3wHsAFYDQ8yvDQFWlesMhagCbMscb6YAde+98MQT5AbcxCcLP2d8s7vo2ylANswQVUZ5q2XGAR+aK2WygKEY/2B8opQaBuwDHirndwjhFLaTpWH+XoxPSGX2sWRujnsLrRT/uns0++4fxOaMY0zu3arE3LoQzlKu4K613gKUNFN7R3l+rhDOUjSgj12aTnT3IOr+nsmaTyfTeHs6Ozp04dke0bS8JZRN6QcYUMrepRLchTPJClUhbFgCumUSdPRtzSj45795YNh9XJOVScKYV+l19wu0vKWNtWWApGJEVSSNw4SwYRl5j12azsSGJ/nbK8/T4nAWX7TqSsrTU1hzuJABLXxYmZ5rTcVEBntLKkZUORLchSgiyvc65m37hPDP3ud0/YZMfHQKul8/a0C/WIi0DBBVngR3Ue3ZrTJNSuLsP57g5r1ZfBPZm+c6D2bc/RF2Ad0yQpcyR1GVSXAX1YZdEDdLNuWz7+hpPvx2G5/uXUWTpYs5Wr8JUwe/RqP+vRjX6DoJ6MIlSXAX1YZt18aMnAI8PSAmMYsE33ymvv8sNQ8d5JPb7ufNroN5Z1gXa+CWgC5ckQR3UW3YTpZ2a+FD0vc7WbZrGTetXc2ZkJYMHvosP93QgvHdZTck4fokuAu3VjQVExXsQ7ebfLjw4Ud8lzifa06f4ofHRjMm8F7O16jF+KhAElKyiQz2loAuXJoEd+F2SluIdLEQ6h49RK+XnuGuzBS2+7ZgzUtxvHe0DrWVh7XfupQ2Cncgi5iE2ym6ECm6exDTv9hJjYULuO/Ru7k9ewu88QY/JKwm5mgdQn3rUdPzr78K0sFRuIMyb9ZRkWSzDlHRLD1eBnUOYONXKby1di4ttv9EZutOhKz+mGRV325Eb7dFnozWhYtw1GYdQlQJJZU4ArS+oQ6nZ7zJ8s0JnFMerB0/lRcaRvKuqk9GTkGxQC4LkYQ7keAuXF7RUXeyKZ//vLWcqavfof2BXawPvpnDM95m4P23cd0lujZKVYxwJxLchUuyHa1bcuQj49Po0LgOkcvi+GTTx+DlxbqXZvL7nX2ISfqdwA72OyJJIBfuTIK7cEkl5chb7t/FP+fOpFX+PvL63k+jBTHcad7CMdSvvixEEtWKTKgKl1E0t55symdkfBqdfK6h+9I5DP5xBWe8G/HS3aN5aNpoCeDC7V1qQlVKIYXLsC1xtOhoSmfqSwP5xw/LyXtkMHUzd/PQtNHFjhOiupHgLqoc2/1KLZJN+dYKl7FL05mzIpUDDz3OBwkvUrumB0OHzCDrlTfBy0vq1IVAcu6iCiqtwZclvz761A76PD6NRqdPcGD4WPzemcHwg2fscvCSVxfVnYzcRZVj2+Br96GTTF+zi+juQUTV02Te1Zcn/zOBs3Xr89iwmeybNAXq1JHRuhBFSHAXVVJUsA+DOgewIj2X/h2a8vvsBfwR3IKADV+ROmwCzffuZPwLA+1y67J3qRB/keAuqoSiefZkUz6LkvfSp+FFBkwZzfTPXue36xszc8ZHRCyYCbVqyWhdiEuQnLuoEmzz7ACjlvzMg2lfMTlxEfriRab1GM6JJ0eSmHmMruaGYCCrSoUojQR3Ualsa9UtjwFrJczI+DTancljwaf/4Za9GZy4tSuDOz9J37934YZCeOCWG6XBlxBXQIK7qFS2I/Qwfy9GxqcBMG9wJ7hwgcGbP2V8UjyqVi2YP5+PQ7rzYrP60uBLiKskwV1UKttKmEGdA6yvZ65NpuMrz/J87m9kRvZgzG1PMuX2uxhVQgCXVIwQlycTqsIhbCdILY+TTfnEJpmMre5aNGL2hkyejPAlLnM1j475O01PHGH3rDhCktcxZdRdsspUiHIod3BXSnkqpdKVUl+YnzdXSqUopTKVUsuUUrXKf5rC1di2CrCkX0bGpxHm78X8TSZWph9gwvVH6f1EH2798D1Sbr6LfmPmc7T3AFBKKmGEKKeKGLk/Bey0eT4DmKm1DgGOA8Mq4DuEi7FNv/xoOmp9/dPU/cxcsYXVvy/nqZf/wXXnzjJ64DQ8PoznjZG3S926EBWkXMFdKeUP9AYWmJ8roAfwmfmQD4D+5fkOUbWV1gfGkn4Z1DmA2RsyGRoVyNCoQA6v+JJNHz5Fu08WsaPvo2QnpTBoWrR1glRG60JUjPJOqL4DPA/UNT/3Bk5orS+Yn+cAfiV9UCk1AhgBEBAQUNIhwgVcqg+MZSFSVLA3n234lWe+nc/E9G/Y5+3HwaWraPtoX+vPkbp1ISpWmUfuSqk+wBGtdVpZPq+1jtNaR2itIxqZN1QQrqe0PjCAtczxH3lbWDl3BP22rOXAiHEcTPqBxzOvlclSIRyoPCP3LkBfpVQvoDZQD5gF1FdK1TCP3v2BA+U/TVGVFN00w1L9siL9AAPCfYlJzKJ1k7p4/3Gcz3Z+jM+XqzjdOpTtr33CD/UDGRXajDm1r5VadSEcqMwjd631i1prf611IPAIsEFr/RiwEXjAfNgQYFW5z1JUKUU3zbBUvwwI9yNpTz7dbvKh0erP+CpuFD7rvoJXX+W6rem073eHdYJUJkuFcCxHLGKaBHyslHoVSAcWOuA7RCUrbUPqgIZ12JF7ksm9WzG8azBLP9tE00nDuT0rja3N2lA4fz7h90Q5+/SFqHYqZBGT1jpRa93H/DhLa32L1jpEa/2g1vpcRXyHcK6Strg7f7GQ7bkn6R/uy/AuzTFN+w/9HruH23J38P3Yf3F63QaG/XRacutCOIG0HxAlKimvHt09iGGLUxnetTmLkvdS09ODEV2D+G5NMgVvjSH45x840aUb18Uvokvz5oD0gRHCWSS4CyvbgG4ZqUd3D+JioTFyj0nM4t62TZi9IZPaNT14f1A4UauW8NS8KZxWNch87R1CJo0Hpaw/U0obhXAO6S1TzdkuQrIE9PmbTGTkFBDdPYjpa3ax+9Apa6BP2pNHl2BvQvP2EvbAvTBpEp69erJ7ww+su7WPXWAXQjiPjNyrOdtFSJbUy/Q1u+gf7kfSnjz6h/vZlTjOvb81ty6NpXDhDI7VrkvOnPdpNWYoNwM3O/tihBBWEtyrodIqX9r5ebHr0Cm7gJ60J4/xPUKYv+l3Xm96ilvvvwt27cJjyBCyxv2TX/7woJWzL0gIUYykZaqh0ipfkk1H6dbCh6Q9eQwI92Vlei7R3YOYGOXH+v3/5b6xD3Pu5B/w9deweDG3dLpJatWFqKJk5F4NFd0ww1L50rNtE1am5zK5dysuFsLk3vX4ZcGn/G9DDL4H9nNw0BN8+eg4ht3T3tmXIIS4DAnu1URpLQOslS//uJmMnAIm965HTGIWMb2b0/nd/4MlizneLIja331H09tuk/7NQrgICe5u7FKljZ4esDL9AKG+9cg+dgbAmmLpum0Tze56DAqOwYsv0uDll6F2bWdeihDiKklwd2OlVcJ0CfHh+8x8a8uAZFM+Y5emM+8uX25+cwqtli+HDh1g4dfQsaOzL0MIUQYS3N3M1VTCDO9qbuIV5M2y2rtpdveD8Of/4LXX4JlnoGZNJ1+NEKKspFrGzVxJJcz4HiEk7TE2rGbfPujZk5ueH0ftsLawdSu88IIEdiFcnIzc3cyVVMIM7xpMZPMGbHpqKp03LsLTwwPmzIHoaPCQf++FcAcS3N3A1VbCRJw9QtS054j6/nuyb+5KwKfxcOONTr4KIURFkmGaGyht84xQ33rU9DRu8ahuwQyPDGDFiUTC+nSDHTvggw8ISEmSwC6EG5KRu4u60s0zLJUwi8I8aD/1WW7csgUeeMBIwzRu7OzLEEI4iAR3F3K5lryWzTPsKmH8rmd17hp8p86BGxrB8uXw9787+UqEEI4maZkq7kpb8o6MT6Omp4d9JczmzdC+Pf6xs/D4xxAjFSOBXYhqQUbuVdyVtuS1TJxGBfsQ1fga9g0cBj+thsBAWLsW7rzT2ZcihKhEEtyroKttydsl2JuMAwXGh7/6isiRI+mck8O2+4fQbvEcuP56516QEKLSSVqmCrralrwfDo9kYZ/mHLv/UejVC66/HvX997T7bLEEdiGqKaW1dvY5EBERoVNTU519Gk5VtFY92ZRvHa1vM4/K72x9g11LXk8PiNlo4qMG+2n56mQKjx0j/ZERdFrwNlxzjTMvRwhRCZRSaVrriJLek5F7FXGp0fr5i4XMG9yJlk3qMbl3K2ISswjz92J4SB3Wbp5Fy/FPQrNmeKSm0il+rgR2IYTk3KuK0toGdApoYM2nW1ryhjatx7m4BTDvdbzPnYM33oCnn4YacjuFEAaJBk5SNA1j0apJXbu2AVHBPtaFSHMGhhPlcYqo6BGwbh387W8wfz60aOGkqxBCVFWSlnGSomkYS45924ECugR7W9sGgHlU/3AY+p1Z0LYt/PgjvPcebNwogV0IUaIyj9yVUs2AJUBjQANxWutZSqmGwDIgENgLPKS1Pl7+U3V9lypxtEyazhvcqfho/dwRop58En74AXr2hHnzoFkzJ1+NEKIqK8/I/QLwjNa6DRAJjFFKtQFeANZrrW8C1pufV1ulrTCNTTIBf02ahvl5WQM7GKP1uQ+2pcb06RAeDnv2QHw8rFkjgV0IcVllDu5a64Na61/Mj08BOwE/oB/wgfmwD4D+5TxHl2abfrFdYVq0ZcDOQ6fsP5iWxq0P38st7880Wgbs2AGDBoFSzrkQIYRLqZAJVaVUIBAOpACNtdYHzW8dwkjblPSZEcAIgICAgIo4jSrjSleY2k6aRgZ7M3ZpOu/9vRWRS+bAm29CkyawahX07evsSxJCuJhyT6gqpa4HlgMTtNYnbd/TxgqpEldJaa3jtNYRWuuIRo0alfc0qpQrWWFa0qTpkuAztL6nq1HaOGwYbN8ugV0IUSblGrkrpWpiBPYPtdb/Nb98WCnVVGt9UCnVFDhS3pOsqkoqZ0w25ZORU3BFW91ZJk1j7guh87w3aBsbC0FBsH499OjhxCsTQri68lTLKGAhsFNr/bbNW6uBIcDr5t9XlesMqzDbjo0ZOQVGO4DELGsHx0ttdRfqa/yj8GHTPJrd/TgcPQITJ8Irr0CdOs6+NCGEiyvPyL0LMBjYppTaYn5tMkZQ/0QpNQzYBzxUrjOswmxXlXZr4WMdlUcF+9htdZd97Axgs8LU14s9v/5O1JQJtP7wQwgNhc9XQufOTrwaIYQ7KXNw11pvBkor3bijrD+3KrJNv1geA2TkFDCqWzDdWjSytuCNScxiR+7JEtMvcwaGExXkTVTqeqLGjYMTJ2DKFJg8GWrVcu5FCiHciqxQvQK2E6Rh/l6MjE9jZHwaYf5e1hH6gHA/kvbkmwN9Lv1tt7ozj/BN6buhf3945BFjE420NJg6VQK7EKLCSW+ZUlyqnNHi09T9diP0+ZtMTF+zyxzo86y17WhN1IYVRD37LJw/b5Q5TpgAnp7Ou0AhhFuT4G7jSjagTjYdZXyPEABmb8i0bkadbMonJjHL2mv9wQh/YzVql/p0enWS0Qeme3ej0VdIiHMvVAjh9iS427jUfqVzN2ZS09ODEV2DWJS8F4DxPUJISMm2K3+0lkVevMjysz/i32s6XFML4uLgySdlhakQolJIcLdRtKd6Qkp2sdWkgDW4RwZ7W1eW2gX2X3+FYcNo/tNPcN99EBMDfn5OuiohRHUkE6pFRAX7MKhzALM3ZJa4mjQjp4B5gzsxb3AnMnIKrP8gZOQUwJ9/wr//DR07QlYWfPSR0T5AArsQopJVy5H7pVaWhvl7kZCSbd2AusRyRpvOjZbfo45mQaf+xqj90Udh1ixws7YKQgjXUS1H7raljbFJJuZvMjF2aTqeHlgnUY+fOW/dr9RS9WIdods6cwaefRZuvRWOH4fPP4elSyWwCyGcShm9vZwrIiJCp6amOvQ7io7WLTsfBTSsw47ck9Yql6ItBCwjesvqUjsbNxqTpFlZMHIkzJgBXl7FjxNCCAdQSqVprSNKeq/ajNxL69S4Pfck/c0rS8+cu2AX2MFIuRQL7AUFRjDv0cOoftm4EWJjJbALIaoMt865X25bO0tpY0JKtrXJ1/geIcU2rbbz+ecwahQcOgTPPWesMJVGX0KIKsatR+6X6qt+/mIh8wZ3YuLdLYnuHmRtIWCpWy8mL8+YKO3bF7y9ISXF6LsugV0IUQW5dXC3rVt/+9vd1m3tbEsbbVeWtmxS13q8NcBrbUyQtm4Ny5fDtGmQmgoRJaa5hBCiSnCrtExJJY4ArZrUteurbpkoHbs0nXtCG9svQAJrVUxUrbMQHW1sSh0ZCQsWGO15hRCiinOrkXvRNIylImbbgYISt7WbMzCcG72vK/aPQVTzhozaudYI5Bs3wsyZsHmzBHYhhMtwu1JIy4jcsr0dwLzBnexG60VH6nZ++w2GD4ekJLjjDqMnTFBQhZybEEJUJLcuhYxNMtlNgNpubxfm52UN7Jb3SlyIBHDhAvznPxAWBlu2wMKFsHatBHYhhEtyyZz7pVrzenpgs3lGXrHPWsoi7WRkwLBhxkRpv37w3nvg61tJVyOEEBXPJUfutrl129a8m3/LZ/qaXUzu3YqZD3coXvlS1Llz8PLL0KkT7NsHy5bBihUS2IUQLs8lg3vREseYxCz6h/uxOTO/xO3tSkzD/Pij0b3xlVeM+vWdO+Ghh6TfuhDCLbhkcIeSW/OO7xFC0p78Yjl4u/YBp0/D009DVBScOgVffglLlhgLk4QQwk24bHBPNuXbteaN7h7ExLtbXjoVs349tGsH77xj1K//+iv07Fnp5y6EEI7mksHdtqSxZZN6l2/Ne+KE0b3xzjuhRg2jzHHuXKhXz2nXIIQQjuSS1TK2+5VaKl9Cfb2sOyPZVcSsXAmjR8ORIzBpEkyZAtde67yTF0KISuCSwb2k3urFShwPH4Zx4+DTT6F9e6ObY6dOlXiWQgjhPC6ZlrkkrSE+Htq0MfYv/b//g59/lsAuhKhWXHLkXqrsbGMTja+/NqphFiwwujkKIUQ145DgrpS6F5gFeAILtNavO+J7mDDBaBWgNeTmwu+/G49DQoyJ0+hoh3ytEEJUmA4djAq+ClbhwV0p5QnMBe4CcoCflVKrtdY7Kvq7AGOD6t274eRJaNAAWrSA2rUd8lVCCOEqHDFyvwXI1FpnASilPgb6ARUf3MPCjL1L69SBxYvh8cdlhakQQuCYCVU/YL/N8xzza3aUUiOUUqlKqdS8vOINvq5IixbQpw/s2AFDhkhgF0IIM6dNqGqt44A4MPq5l+mH3Hab8UsIIYQdR4zcDwDNbJ77m18TQghRSRwR3H8GblJKNVdK1QIeAVY74HuEEEKUosLTMlrrC0qpscA3GKWQ72utt1f09wghhCidQ3LuWusvgS8d8bOFEEJcnvu1HxBCCCHBXQgh3JEEdyGEcEMS3IUQwg0prcu2fqhCT0KpPGBfGT/uA5Swp57bq47XXR2vGarndVfHa4arv+4btdaNSnqjSgT38lBKpWqtI5x9HpWtOl53dbxmqJ7XXR2vGSr2uiUtI4QQbkiCuxBCuCF3CO5xzj4BJ6mO110drxmq53VXx2uGCrxul8+5CyGEKM4dRu5CCCGKkOAuhBBuyKWDu1LqXqXUbqVUplLqBWefjyMopZoppTYqpXYopbYrpZ4yv95QKbVWKfWb+fcGzj7XiqaU8lRKpSulvjA/b66USjHf72XmltJuRSlVXyn1mVJql1Jqp1Lq1mpyr582//n+VSn1kVKqtrvdb6XU+0qpI0qpX21eK/HeKsNs87VnKKU6Xu33uWxwt9mIuyfQBnhUKdXGuWflEBeAZ7TWbYBIYIz5Ol8A1mutbwLWm5+7m6eAnTbPZwAztdYhwHFgmFPOyrFmAV9rrVsB7TGu363vtVLKDxgPRGit22K0Cn8E97vfi4F7i7xW2r3tCdxk/jUCiLnaL3PZ4I7NRtxa6z8By0bcbkVrfVBr/Yv58SmMv+x+GNf6gfmwD4D+TjlBB1FK+QO9gQXm5wroAXxmPsQdr9kL+BuwEEBr/afW+gRufq/NagDXKqVqAHWAg7jZ/dZafwccK/Jyafe2H7BEG34E6iulml7N97lycL+ijbjdiVIqEAgHUoDGWuuD5rcOAY2ddV4O8g7wPFBofu4NnNBaXzA/d8f73RzIAxaZ01ELlFLX4eb3Wmt9AHgTyMYI6gVAGu5/v6H0e1vu+ObKwb1aUUpdDywHJmitT9q+p416VrepaVVK9QGOaK3TnH0ulawG0BGI0VqHA6cpkoJxt3sNYM4z98P4x80XuI7i6Qu3V9H31pWDe7XZiFspVRMjsH+otf6v+eXDlv+mmX8/4qzzc4AuQF+l1F6MdFsPjFx0ffN/28E973cOkKO1TjE//wwj2LvzvQa4E/hda52ntT4P/Bfjz4C7328o/d6WO765cnCvFhtxm3PNC4GdWuu3bd5aDQwxPx4CrKrsc3MUrfWLWmt/rXUgxn3doLV+DNgIPGA+zK2uGUBrfQjYr5RqaX7pDmAHbnyvzbKBSKVUHfOfd8t1u/X9Nivt3q4GHjdXzUQCBTbpmyujtXbZX0AvYA9gAv7p7PNx0DXehvFftQxgi/lXL4wc9HrgN2Ad0NDZ5+qg6+8OfGF+HAT8BGQCnwLXOPv8HHC9HYBU8/1eCTSoDvca+DewC/gViAeucbf7DXyEMadwHuN/acNKu7eAwqgGNAHbMCqJrur7pP2AEEK4IVdOywghhCiFBHchhHBDEtyFEMINSXAXQgg3JMFdCCHckAR3IYRwQxLchRDCDf0/idRjx0CK8t4AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import random\n",
"from matplotlib import pyplot as plt\n",
"\n",
"\n",
"# below function will update the Linear Regression\n",
"# co-efficient beta and return the updated beta\n",
"def gradient_descent(x, y, beta, alpha, m, iterations_num):\n",
" # Variable to hold is the transpose of x\n",
" x_transposed = x.T\n",
"\n",
" # .T and the transpose() call both return the transpose of the array.\n",
" # In fact, .T return the transpose of the array,\n",
" # while transpose() is a more general method, that can be given\n",
" # axes (transpose(*axes), with defaults that make the call transpose() equivalent to .T\n",
" # .T is just a convenient notation,\n",
"\n",
" for i in range(0, iterations_num):\n",
" hypothesis = np.dot(x, beta)\n",
"\n",
" # hypothesis - y is the first part of the square loss' gradient\n",
" # (as a vector form for each component), and this is set to the loss variable.\n",
"\n",
" loss = hypothesis - y\n",
"\n",
" cost = np.sum(loss ** 2) / (2*m)\n",
"\n",
" # Now calculate the Vectorized Gradient from our earlier defined formulae\n",
"\n",
" vectorized_gradient = np.dot(x_transposed, loss) / m\n",
"\n",
" # now with above gradient update beta\n",
" beta = beta - alpha * vectorized_gradient\n",
"\n",
" return beta\n",
"\n",
"\n",
"# Now generate a Matrix form of training data\n",
"# num_of_training_data_points => Number of rows of the generated Matrix\n",
"# And the Matrix will have 2 features or coefficients\n",
"def gen_data(num_of_training_data_points, bias, variance):\n",
" x = np.zeros(shape=(num_of_training_data_points, 2))\n",
" y = np.zeros(shape=num_of_training_data_points)\n",
"\n",
" # above will generate a data for a straight line\n",
" for i in range(0, num_of_training_data_points):\n",
" # bias feature\n",
" x[i][0] = 1\n",
" x[i][1] = i\n",
"\n",
" #our target variable\n",
" y[i] = (i + bias) + random.uniform(0, 1) * variance\n",
"\n",
" return x, y\n",
"\n",
"def plot_model(x, y, w):\n",
" plt.plot(x[:,1], y, \"x\")\n",
" plt.plot(x[:,1], x * w, \"r-\")\n",
" plt.show()\n",
"\n",
"def test_gradient_descent(model_function):\n",
" # gen 100 points with a bias of 20 and 10 variance representing noise in data\n",
" x, y = gen_data(100, 5, 2)\n",
" m, n = np.shape(x)\n",
" num_of_iterations = 100000\n",
" alpha = 0.0005\n",
" beta = np.ones(n)\n",
" w = model_function(x, y, beta, alpha, m, num_of_iterations)\n",
" plot_model(x, y, w)\n",
"\n",
"test_gradient_descent(gradient_descent)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "PyCharm (pro-machine-learning-algorithms-master)",
"language": "python",
"name": "pycharm-8ad3ec83"
},
"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.8.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment