{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import matplotlib.pyplot as plt\n", "import matplotlib.patches as patches\n", "import numpy as np\n", "import pandas as pd\n", "\n", "from matplotlib import gridspec\n", "from mpl_toolkits.axes_grid.axislines import SubplotZero\n", "\n", "plt.xkcd()\n", "\n", "None" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAR4AAAEDCAYAAADjgWuTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt01PWd//Hn3O8zmSRDLgKCS0y8AHLVIhbtKkfxsopW\n6rpVf1XXX7Wtrf15um57oNr+Wtfbz27d/qxr24NyXLas2oogDSilepDlpoioiBa55EYml8ncv3P7\n/ZHffE3IJIAk8wmZ9+OcnJCZb2beEzKvfL6f29eQy+VyCCFEERlVFyCEKD0SPEKIopPgEUIUnQSP\nEKLoJHiEEEUnwSOEKDoJnlNMLpdjw4YNhMPhIY9rbm4mFAod87HC4TCZTGbQ+2Ox2BeuVYjBSPCc\nYjZt2sRll13G9ddfTzabHfS4L3/5y9x4440F72tqauIb3/gGLpcLr9eL3W7n0ksv5emnnyadTuvH\nPfbYY7hcLvx+P/X19Zxzzjk0NDQwZcoU6uvrmTNnDpdddhmLFy9m165dw/5axdglwXOKSSaTAKxf\nv54nn3xy0OPKy8t54403SCQS/W7/zW9+Q11dHb/73e+YOXMmX//617nkkkvYvHkz3/zmN1myZAn5\nOaWXXnopX/3qV/mbv/kbDAYDHR0d7N27l1QqhdlsprW1lS1btrB69Wr27ds3ci9ajD05cUrZsWNH\nDsgBOavVmtu9e3fB4+69994ckNuyZYt+22uvvZYzGAy5SZMm5f70pz/1Oz4SieSuvPLKHJDbunVr\nwcd8+eWXc0BuxYoVw/eCREmSFs8ppqysDIDrr78et9vNzTffTDweH3BcbW0tAEeOHAEgkUhw1113\n4XK5aGxsZOHChf2Od7lc/PjHPwZg5cqVQz73sfqXhDgWCZ5TjMViAeCMM85g+fLlvPfee3z3u98d\ncFwgEADQO4cbGxs5ePAgDzzwAHV1dQUfe9asWTgcDvbs2VPw/srKSgA6OztP+nWI0qY0eF5//XXO\nOedclSWccsxmM9AbQFdddRX3338/zzzzDM8991y/4zweDwCapgHw4osvAvAP//APgz62wWDAYrH0\n62Duq6KiApDgESfPrOqJc7kcV1xxBalUSlUJp6R8i8dkMgHws5/9jN27d3PnnXcyefJkLrroIgCs\nVisARmPv35Y33niDadOmMXHixEEfOxgM0tPTQ3V1dcH788HT1dU1PC9GlCxlLZ41a9Zg8wWwu318\n9NFHqso45eT+/4hT/rPZbGblypVMmTKFa6+9lr179wIDAyoYDHLaaacN+diNjY0AA/p/8qxWKzab\nje7u7pN/IaKkKQmeZDLJ3d/5Ho4Fd+CcfjmPP/kLFWWckvKnTn1bij6fj1dffRWj0cjChQv57LPP\n9BZPPnj8fj8HDx7UA6uQ559/HoPBwKJFiwY9xuFwDBiiF+JEFT14UqkU1y1eTHNzM0a7B1N1Pc/+\n+mn5K3qc8vN4jj5FnTx5Mi+//DKtra1cfPHFtLS0AJ+fai1ZsoQ9e/awfv36go/7n//5n6xbt44l\nS5bonciFuFwumc0sTlrRg+fPf/4zr61di9ftomLPSrx7XgJ6R1TEseVbPIVmLc+fP5/ly5dz6NAh\n7rzzTuDzFs+9996Lw+Hga1/7GsuXLycajQIQj8dZtmwZt9xyC1VVVTz22GNDPr/H45HOZXHSih48\n5513Hr/97W/pDB5hzzvb+eTD3fzud7+jpqam2KWckvLrr1wuV8H788GSbxnlh9UnTZrEK6+8gsFg\n4LbbbiMQCFBfX09VVRUPPfQQZ555JmvXrj1mP1AikcDn8w3jKxKlyJAb6qS/CLZv387s2bNVlnBK\n+eyzz5g1axZr1qzhggsuGPS4tWvXsnbtWh5//HFsNpt+e0dHB7///e958cUXaWpqIhAIcPPNN3P7\n7bfrQ/VD+ctf/kIgEOCss84altcjSpPy4Hn44YcxmUzcf//9Kss4peRyOQwGg+oyhPjClM9cdrlc\nHDhwQHUZpxQJHXGqGxXBE4lEVJchhCgi5cHjdDoLLnIUQoxdyoPH7XbLamchSozy4LHb7frQrxCi\nNCgPHunjEaL0KA8eu90ua3+EKDHKg8fr9dLT06O6DCFEESkPHhnVEqL0SPAIIYpOefDYbDYJHiFK\nTNGCJ6EV3sd3sD1+BzteCHHqK0rwvLR5P9O//SKfNA+8pK7BYBiwK94nzSGmf/tFXtq8vxjlCSGK\nbMSD56XN+7nliY0cbI+wcOnaAeFz9ILHT5pDLFy6loPtEW55YqOEjxBj0IgGTz50MtneFk1LZ2xA\n+PTdSS8fOi2dvVtrZrI5CR8hxqARC56EluaB5Vv10Mk7OnxyuRxGo3FA6ORlsjkeWL5V+nyEGENG\nLHjsVjNrll1OTblzwH19wyebzWL0VBcMHYCacidrll2O3arsEmBCiGE24jsQDtaSgd5QeeJ/zOam\n//0K2MsK3t/40CKm1Moev0KMJUXZ+nSo8BnMUKHz3//931RUVDBlypThLFMIUSRFGU6fUuuj8aFF\nBU+7Cql0m/n5tdV0NX3M/v37+00wzOVy/NM//RP/9m//NlLlCiFG2Ih3nJSVlemXZDG4xmG96H4M\nDv/g35DopqnxEb72/JF+NzudThwOB6FQiHQ6zfTp00eybCHECCpqj20ueoTUO89hnXfvoMd85ysB\nHnntCD/5yU+45ppr6OzspKOjg66uLjRNo6ysjMcff1w2PBfiFFbU4DG4xmGZccuQx6z6yMLd/2sZ\nH374IT/60Y8KHrNz507GjRs3EiUKIYqgaNfVOpEOZhnNEmJsK0rn8omOahWa4SyEGDtGPHiONY/n\n+wsc2Bi49amEjxBj14gGz7FCp/GhRUywh7nc/9ExZzgLIcaOEV2rdeWD64YMnSm1PoLBIGdUeQad\n59PSGePKB9fJWi0hxpARXav181vnYjL2H/Y+uuO4q6uLsrKyQScZmowGfn7rXFmrJcQYMqKnWovn\nTea5+y7Rw6fQaFUwGKSyshIYOMPZZDTw3H2XsHje5JEsUwhRZCPeuZwPn4kBd8Eh8mg0itvt1r/O\nh8/EgFtCR4gxqijnL4vnTWbR7AkFT5dCoRBer7ffbVNqfez65fVyeiXEGFW0zd4HC5Hm5mZqa2uP\n+3ghxKlP+eVtjhw5QiAQUF2GEKKIirZkopBkMonH4yEej2MymVSVIYQoMqUtnu7ubsrKyiR0hCgx\nSoOntbWV6upqlSUIIRRQGjzt7e1UVFSoLEEIoYDyFk9NTY3KEoQQCigNns7OTmnxCFGClAZPJBLp\nN2tZCFEalLd4/P4hNn4XQoxJSoMnGo3icrlUliCEUGBUzOMRQpQWpcHT09ODzycbugtRapQGTygU\nkuARogQpDZ5kMonNZlNZghBCAaXBo2kaFotFZQlCCAWUBk8sFsPpHLjBuxBibFMaPPF4XIJHiBKk\nvI/HarWqLEEIoYDyUy2ZQChE6VHe4pFRLSFKj9LgyWQysvugECVI+WbvBoPh2AcJIcYUCR4hRNEp\nD55sNqu6BCFEkSkNHoPBIMEjRAlSGjxGo1GCR4gSpDR4TCYTmUxGZQlCCAWUBo/ZbCadTqssQQih\ngNLgsVgsEjxClCBp8Qghik5p8FitVpLJpMoShBAKKA0eh8MhwSNECVLexyPBI0TpURo8NpsNTdNU\nliCEUEBp8LhcLiKRiMoShBAKKO/jicfjKksQQiigNHjcbjfRaFRlCUIIBZQGj9frpaenR2UJQggF\n5FRLCFF0SoPHbrdL8AhRgpQGj9PplOARogTJqZYQouiUdy6Hw2GVJQghFFA+nC4TCIUoPcr7eCR4\nhCg9SoPH5/MRCoVUliCEUEBp8NTU1NDS0qKyBCGEAkqDp6ysjO7ubpUlCCEUUN65LGu1hCg9yrfF\nkOARovQYcrlcTtWTZzIZrFYrqVQKo1H51ZSFEEWi/IJ+LpdLJhEKUWKUNzNkawwhSo/y4CkrK6Or\nq0t1GUKIIlIePDKJUIjSozx4ZIW6EKVHefDInjxClB7lweP1euVUS4gSozx4qqqqaGtrU12GEKKI\nzKoL8Hg8MntZCMWy2SzxeJx4PE4sFiMej5NKpdA0jXg8TjgcJplMkkgkiEajhEIhotEosViMdDpN\nOp0mlUqRyWTIZDJks1n6zk02GAwYDAaMRiMGg2F0BE9zc7PqMoQYdTKZjP7mzb+Z85/zb/T8Z03T\n9I9EIoGmaaTTaf22eDxOIpEgkUgQi8UIhULE43GSyaT+OCaTCZPJhMViwWw2YzQaMRqNmEwmrFYr\nJpMJs9mMxWLBZrNRVVWFxWLRv89kMunfA+ghk8vlBnwoDx6v18uHH36ougwhRp2f/OQntLW1kU6n\n9RZD35ZD34/8m/7oAMh/5APDbDZjt9vx+/1YrVbMZrP+PYAeDH3/fTwfqVSKVCrF8azAGhUtnnHj\nxnHkyBHVZQgx6ixbtow777yTq666ql8Y5B19W98gKHR733/nW099W1XFMipaPBUVFQSDQdVlCDHq\n9A2MsTbyq3xUSzYDE2JoCjeQGDHKg8dut5NIJFSXIcSok81mx+x2Mcpflc1mI5lMqi5DiFEnlUph\nMBhUlzEilAePw+GQFo8QBSSTScxm85g81VLeuWy1WqXFI0QB+WH04ebz+fB4PKRSKYLBIJlMZlgf\nv6ysDKfTSWdn56CNCuXBY7FYSKVSqssQYtTRNG1YWzxVVVXMmTOHyspK/bZEIsHu3bvZs2fPST++\nw+Fg3rx5TJgwAeg9VVy/fn3B6TLKT7VMJtOwJ64QY4GmaRiNxmEJnpkzZ3LFFVdQWVlJS0sLr732\nGrt27cJutzNnzhxmzJhxUo9fU1PDNddcw4QJE+jq6mLz5s1YLBbOPffcgscrDx6z2SzBI0QBwzWq\nVVdXx7Rp00gkEixdupQzzjiDRYsWcd5553HNNdeQTqc599xzcblcX+jxy8vLufTSS3E4HLz++uuc\nc845/PSnPwV6z2gKUR48Y7XXXoiTlR/VOpEWz9HvJ5vNxpw5cwC44447ePbZZ1m5ciXRaJQnnniC\n1atXs2rVKkwmE2eccYb+fXa7nYaGBmbMmMHMmTOZMWMGM2bMoKGhAavV2u856urqMJlMPPPMMyxc\nuJC2tja9BdXR0VGwTuV9PGOxx16I4RCLxY67j6e+vp6zzz4bn89HIpHg/fffJ5vNMnfuXADWrVvH\nypUr2blzJ9OmTQPgu9/9LitXrmT9+vXcdNNN+Hw+oHc1weWXXz5oa2Xq1Km88sor+qCQ2dwbI5WV\nlWzYsIHLL79cD7HBriCjPHjG8iQpIU5GIpHQF28OxmAw8OUvf5nJkycDvUPwNpuN2bNn9ztu+fLl\n3HDDDUybNo1wOIzJZMLpdFJdXU17ezvQ2zoCmDFjBhaLhTVr1rBlyxYymYy+MPXaa69l1qxZnH76\n6Xz88ccAfPTRR9TV1bF48WJ27NiBpmnMmjULYNALOSh/x2cymWP+cIUoRYlE4pgtnpkzZzJ58mS6\nurq44YYbcDqd3HDDDeRyOTRNY8mSJbS2ttLY2Mhll10G9AZFLBYDoLW1laqqKv35AP39uHHjRt55\n5x12797Nrl272LlzJ5FIBOh/StfR0cEnn3wCwFtvvYXP52Pq1KlkMpnRe6qVyWSkxSNEAYlEYshR\nLZPJxNlnn00mk+Hqq6/GaDTyH//xH/z93/89S5cuJZvN8uabb9Le3k5nZ6fe19PV1cXMmTNJp9Ps\n27eP2267DUC/vl1HRwc1NTU89thjg9b117/+td9t+X6fLVu2MH/+fEwmE21tbYMOHI2K4JEWjxAD\nxWIxLBbLoMHjcDj0N3hNTQ3PPvssPp+P1tZW7rvvPrxeLy+//LK+w2e+D2fChAmYTCY2bNhAV1cX\nl1xyCdDb+jEajZx++ulD1vXZZ58NmHtXUVEBwLZt27j99tv1xxuM8qZGKpUa0EsuhDj2qVYkEqGz\ns5OqqipWrVqlB8t3vvMdOjs7aWtrY8GCBfj9fgB9b/OzzjoLgN/85jdceOGFNDQ0EI/HCQaD1NTU\n4PF4ePfdd5k7dy51dXU0NDQwdepUvvGNbwCfhwz07jI4a9YsXC4XyWSS/fv309DQAPQOsw9GeYsn\nnU4P2nsuRCnr6enBarUO2cezfv16zjvvPNxuN01NTXR3dzNnzhw9bAAmTpxIRUUF//zP/0xjYyMG\ng4FHHnmE3//+96xbtw6Ajz/+WN9JEHpnOd9xxx3Y7XYymQypVIqpU6cC/fcGmjt3rh40TU1NZLNZ\nxo8fD/S2rAbb9kZ58CSTSQkeIQoIhUKUlZWRzWYHPSYej/P222/3u+2Pf/wjVquVTCbDxRdfzIQJ\nE3j44Ye588479ZDYt28fjz76KJdddhmJRELffri9vZ3m5mZqa2v5x3/8xwHPF41G2bVrl/71pEmT\nAPjKV76i13HBBRewYsUKbrrpJsaNGzc6gycej+N0OlWXIcSoE4lEqKqq+kJz3TRNA2Dr1q3U1tZy\n++23M3HiRBobG/H7/dx4443U1dWRzWbZtGmTPqKVy+VYv349tbW1uFyufkPpmqZx6NChfh3GiUQC\nu93OsmXL9IAxGo387d/+LTD4cLry4EkkEvr8ASHE53p6erDb7Se1e0M4HGbTpk1cdNFFLFy4kIUL\nF+r3RSIRNm/eTEtLS7/vyeVyNDU1Hdfjb9u2jYsvvpgFCxYMuO+DDz7Q5wgdbVQEj91uV12GEKNK\nJpMhkUhgsVhOetuYgwcPsmrVKiZNmoTP5yOdTtPW1kZLS8tJrxxoamriv/7rv6isrOw3Laa7u3vQ\nWcswCoInFArpvfFCiF6hUEi/ttVw0DRNn2k83JLJ5HG3kPKUD6dHo9EvvCpWiLEqHA5jtVqH7Fj+\nooxG44h0bxgMBn1u0bEob/F0d3f3G/oTQhzfUPqJMplMnHfeeTQ0NGCxWOjo6GDDhg3E4/GTelyf\nz8esWbMYP348RqORTCbDoUOHeOeddwa9LI/y4Onp6cHr9aouQ4hR5XjWaZ0In8/HggULKC8vJ5vN\n0tnZSUVFBdOnT2fLli1f+HGnT5/O9OnT9cBpa2ujvLycSZMmMX78eNatW1fwunnKT7WkxSPEQMda\np3UiPB4PixYtory8nH379nH++efrs5BPppvjrLPOYsaMGWSzWX71q19RVVVFdXU1EydOZMWKFZjN\nZr70pS8V/F7lwRMOh3G73arLEGJUiUajQ67TOhHnnnsuNpuN1atXM2PGDLZv387MmTMBBkzuM5vN\nenjkPyZMmDBgAMjtdjN79mxyuRw333wzP/zhD3nooYfYuHEj9fX13HHHHbS0tFBRUcG4ceMG1KT8\nVCscDuuzH4UQvU5kEzCAQCBAQ0MDfr+feDyubwRWU1NDfX09AO+88w4/+9nP+N73vqdv1NW3D6am\npoYFCxYMOr1l9+7d7NixA4Czzz4bk8nEihUrePXVV9m5c6f+PKtWrWLixIm88sor3HXXXZSXlw/Y\n8F158LS1ten7hAgheoVCIex2+3GNap177rkDNv467bTTBhy3dOlStm3bRjabZfr06frz5M2bNw+7\n3c62bds4fPgwuVwOg8GA2Wzm0ksvZerUqXz00UdEo1F9PdZTTz3F3XffTX19vd5fGwgEqKqq4vDh\nw0DvKvqjKQ+efCeXEOJz0Wj0uHZtmDJlCrNnzyaTyfDoo4+ycuVKvvrVr/LDH/6QXC7Ho48+yl13\n3aWfKr311luUlZVxzjnnkMlk6OzsBHqHwt1uN7FYjMWLF+vLIrLZLBaLhTfeeIO6ujrsdjtGoxGv\n10swGGTr1q08/PDDAOzYsYOLLroIk8lEMBjU+27zyzf6Uh48+YVwQojPxeNx3G73kKdaRqNR72e5\n44472LhxIzfeeCM/+tGPOPvss4nH4zz44IPcc889+ve8/fbbzJ8/H6PRSGtrqx4wuVyOcDiM1+vl\n0KFDBZ+vq6uLjo4OvWvkzTffxGAwcP755+s1m81mjhw5QjQa1S9tk9+1sK9RETzSuSxEf9FolPLy\n8iGDx+FwYLfbaW5uZtOmTWzYsIEpU6bQ2dnJ4sWLMZlMPP300/1GrrZu3crdd98NfL4/D/ReVeJY\n01ry/Tv5yYdHjhzB6/XicDjQNE0/vVu9enW/Ea2+z5OnPHja2tqorq5WXYYQo8rxXDc9Ho8Ti8Wo\nra3ttxXpM888w6233qp3OOdFo1EOHDigt0T6rjI/88wzAdi0aRPLly/Xdz80m81ce+21/N3f/R2B\nQIDDhw/r3+d0OolEImSzWaxWq95vtGLFCq677jo8Hs+glzFWOpyeXwgn22II0d/xXH0lm83yxhtv\nEAwGSSQSfPrpp7z77rtks1kuuuiifqEDvVuWQu/GYNC7UXy+Hyn/XJ2dndhsNqqqqvB4PFgsFr0P\nNr9JWH4r1fr6etLpNL/+9a+B3tO1f/3Xf+Uvf/kL3//+9wHYu3dvwdqVtnhisRhOp1M2exfiKOl0\nGqPRSDqdHvK4YDDIq6++2u+2Dz74gIqKClKpFFdccQVGo5F77rlH36jr61//Or/85S+ZP38+NTU1\nHDhwgM8++4ypU6dy3XXXcd111w14nlgspi8ybW9vR9M05s6dy9VXX819993H9u3bOXz4MI2NjTz6\n6KOcf/75xGIxPv3004J1Kw2eUCgkyyWEKOBkrr6iaZq+x042m8VgMHD66adTWVnJ1Vdfjclk0k+t\n8uu0uru7Wb16NVOmTMFisejPbzAYiEQi7N27Vx+dSqfT7Ny5kwsuuIB///d/55FHHmH79u1MnDiR\njRs3cvHFF+sbjA0WnEqDp729nUAgoLIEIUalfIvnZL333nvMmjWLH/zgBwPuO3jwYL+Jfd3d3Wzf\nvv24Hnfv3r1UVVUxefJkHn/88X73aZrGW2+9VbBTOU9p8EQiETwej8oShBiV0uk0JpPppJdM7N69\nmyNHjlBVVdUvyDo7OwcdNj8euVyOTZs28emnn3LGGWfgdDrRNI2mpib2799fcO5OX0qDp7u7WzYB\nE6KA/CnScGhraxuy9XEyDh8+rM9QPhFKe3XzE5aEEP3llyuMVUqDJx6Py37LQhQgwTOCZKN3IUqT\n8hZPoZWrQoixTWnwdHR0yMp0IQYxnPstjzZKgycSicgCUSEKGI6h9NFMRrWEGIXMZrN++eCxSPk8\nHtmLR4iB8ssWTkX5pRb5z/nwzP/baDSqDR65mJ8QheWDx+fzkc1myeVy/T6AAbcVur/Q50L6hkP+\n89H/Pvq2owOm7/cfi9Lg6erqkkvbCFFA3xbPqbR7QyaTIZPJoGka8XicVCqFpmmk02n9vkwmo351\nuiyZEGKgM888k507d2IwGDCZTFgsFkwmE2azWW9lGI1GzGazfrvVatWPM5lM+nH5r/Pf07fl0reV\nlM1myWaz/UIinU6TzWZJpVL615lMhmw2SyaTIZVKkU6n9XAxGAzY7Xbcbjd+vx+v14vH48FqteJ0\nOrHb7TgcDgw5hV3np59+Ops2bZLL2whRQC6XI51Ok0qliEajaJpGIpEglUqRSqVIJpPE43Hi8TjR\naJRwOEwymdSPSafTpNNpkslkv+DIn7rB56dMZrMZo9GIxWLBbrdjtVr1D5vNpm+zarPZcLlcWK1W\nPWBcLhcejwebzaYH47EobfGkUiksFovKEoQYtQwGAxaLBYvFMuZ26VR68phKpTCblW/7LIQoMqXB\nk06npcUjRAlSGjyapknwCFGClAfP8VwtUQgxtigNnmw2i8lkUlmCEEIB5cFzKk2OEkIMD+Xvegke\nIUqPvOuFEEWnPHjG8p4jQojClAdPNptVXYIQosiUBk9+syMhRGlRGjwWi+WYF6UXQow9SoPHbrfr\nF40XQpQOpcHjcDiIxWIqSxBCKKA0eFwuF9FoVGUJQggFlJ9qJZNJlSUIIRRQ3rmsaZrKEoQQCigN\nHqvVKsEjRAlSGjw2m02CR4gSpHxUS4bThSg9SoPH7/fT2dmpsgQhhALKg6erq0tlCUIIBSR4hBBF\npzR4vF4v4XBYZQlCCAWUBo/T6ZQlE0KUIKXBU1FRQTAYVFmCEEIBpcFTWVkpwSNECVIaPOPHj+fw\n4cMqSxBCKKA0eAKBAO3t7SpLEEIooDR4PB4P4XBYNnwXosQoX6tlMplk2YQQJUb5VSZ8Ph89PT2q\nyxBCFJHy4KmpqaG5uVl1GUKIIlIePJWVldLBLESJUR48tbW1tLS0qC5DCFFEyoOnrKyM7u5u1WUI\nIYpIefDIlSaEKD3Kg8fv90uLR4gSozx4pMUjROmR4BFCFJ3y4CkrKyMUCqkuQwhRRMqDx+FwSItH\niBKjPHhcLpfsQihEiVEePLL9qRClR3nwSItHiNKjPHg8Ho+sTheixCgPHrvdTiKRUF2GEKKIlAeP\n2WwmnU6rLkOIEZHQTux3+0SPP1UpDx6r1UoymVRdhhDD7qXN+5n+7Rf5pPn45ql90hxi+rdf5KXN\n+0e4MvUMOcUbHqfTaWw2G5lMRmUZQgyrlzbv55YnNpLJ5qgpd9L40CKm1PqA3kmzefl1ip80h1i4\ndC0tnTFMRgPP3XcJi+dNVlJ7MSgPnlwuh9FolA3fxZjRN3Ty+oaPwWDQb8/lcv1CJ2+sh4/yUy0h\nxpKEluaB5Vv7hQ5AS2eMhUvXDjjtKhQ6AJlsjgeWbx2zfT7KgyeTyWA0Ki9DiGFht5pZs+xyasqd\nA+7Lh4/BNQ4Ag2tcwdCB3hbSmmWXY7eaR7xmFZSfaiWTSTweD5qmqSxDiGE1WEsGIBfvIvXOc1hm\n3ILB4R9w/9F9QicqHo+TSqXwer1f6PuLQXlTQ9M0rFar6jKEGFZTan00PrSoYMvH4PBjnXfviIQO\nwNRp0/D5fLz77rtf+DFGmvLgSSQS2Gw21WUIMeyGCp9ChiN0AD7YsweACxd8hW9+6zt0dHSc1OON\nBOWnWocOHeKCCy6gqampKM+XTCYJh8O0t7dz+PBhgsEgHR0dxGIxenp66Orq0j/i8TjJZBJN00il\nUiQSCaLRKPF4nEQiQSqVKjj50Wg0YjQasVqtWK1WzGYzFosFi8WC1WrF5/Ph9/txuVyUlZXh8Xhw\nu91UVFQonjqKAAAHU0lEQVTgcDiw2+04HA48Hg9lZWW43W4CgQA+nw+n04nJZCrKz2o4ZTIZ4vE4\n0WiUSCRCd3c3LS0thEIhYrEYkUiEnp4e4vE4sViMRCJBPB6np6eHSCSif28ymSSVShGPx9E0jXQ6\nrf8/ZDIZstnsgBFSk8mEzWbD6XRis9lwOBw4nU6sVis2mw2fz4fX66WsrAyXy0V5eTlut5vy8nKq\nq6sJBAJUV1fj9/u/UOt8qNOuvOEKHej9WVusVk6753nib79Act9m7vmfd/Hggz8eNX/kT6rnaurU\nqXz88ce4XC4CgQBut1t/QzmdTrxeL36/X/9PraysxOPx4HK58Pv9TJ06lUgkgtvtJp1OE4/HsVqt\nmEwm/c2VyWRIp9P6L1kikSAcDhONRonFYnoQdHd3E41GiUajdHV1EY1G6e7uprm5mWAwqP+SZzIZ\nPB4PgUCA8ePHU1lZSWVlJU6nE4/HQ0NDA36/n/LychwOhx4e+V/S/GtzOByYzWZMJhNGo1EfIs1m\ns2SzWTKZjB5Y+TdGKpVC0zRCoVC/GvNvrubmZj3UEokEPT09hEIhPSh7enqIxWLY7Xaqqqrw+Xz4\nfD7Ky8upqqrC4/HoYdX3jeTz+bDb7Xqg2Ww2PQzzP+u+ryOXy+lv5HzN+RBOJBJ0d3fT0dHBkSNH\n6OnpIRwOEw6HaWtr02uMx+OEQiH99UWjUex2Oy6XSw/cmpoafD4fbrcbt9uNx+PB5/NRXV2Nw+HA\n4XDg9XpxuVw4HA7cbrf+/5D/MJvN+kf+NeQ/crkcuVyOTCZDMpkkGo2iaRqxWIxYLEYqlSKZTBIK\nhfRa878/LS0tdHR06J9bW1vp7u6mrKyMcePGUVtbi8/nw+VyUVlZid/vp7KykvLycv1n7/F4sFgs\n2Gw2frrkbG7/v9sHfS89ddc8xpfb9CDO/yHM/7FLJBJ6AGuaRjKZJBaL0dHRQTAYpKmpifb2dnbs\n2EEymcRssYLBSM5TRSTUxb/8y8MkEnGefPLJk3nLD5uTCp5du3bp/6Ht7e36X7J8KORbEKFQiIMH\nDxIMBolEIkSjUSZNmsTzzz+PpmnYbDY++OAD5s2bh6Zp+l8u6G095P9imc1m7HY7Xq8Xp9Opf+Tf\nXH1/qauqqvRf7kAgQG1tLV6vF7vdPqKjaPlferPZPCJ/XXK5HNFolNbWVv3nnX9j5FsT+/bt03/2\n0WiUUChEIpHQf1nzYdj3Z933Zw7oYZR/49jtdv1z/o/IuHHj8Pl8eDweqqurmT59Oj6fTw+NfMvO\n6/XidruL3lIzGAwYDAaMRiMWiwW3231Sj5fNZmlra6O9vZ3m5mb9D0YwGKS7u5sDBw7Q2dmp/+wj\nkUhvaBvcdNffBrbBO3sXL11Fdsv/wZGN9Atdu92O2+3GZrPh8Xj0PyBWqxWn00llZSX19fWcdtpp\n1NXVYTQaeeGFF0glE3T89i6uvPIq/teWLZx//vkn9dqHm/JTra1bt3LPPfewbds2lWUIMSKO5zQr\nbzhOt5LJJHa7nYqKCt5//32qq6u/8GONpFHRuWy321WXIcSwO5HQgcEnGZ4Im81GLpcjGAyO2tAB\nRcGTzWb585//DEA0GsXlcslCUTGmDBU6TqPGhbb3hpxkeDLhcypQEjz33nsvK1asACAcDuN2u1m3\nbh3xeFxFOUIMq6FCx5KJ0rXux7hinw061F4K4VP04Nm1axdPPfUU3/rWtwAIBoNUVlZy6NAhXnjh\nhWKXI8SwSmhprnxwXcHQKXMYOL3tj8w5ZxKapg05z6elM8aVD66TtVrD5Q9/+AN1dXVMnz4dQB+i\nDAQC/OEPfyh2OUIMK7vVzM9vnYvJaOh3e025kzcfvZ7dW16ntrYWs7l3QHmw8DEZDfz81rljdq1W\n0YPn7bff5ktf+pI+76Wnpwefz4fNZuPAgQPFLkeIYbd43mSeu+8SPXyOHq3q6OigoqJCP/7o8Bnr\nW2KAguCJx+P95lN0dXXh9/v1uSVCjAX58JkYcA8YIu/o6KCqqqrf8fnwmRhwj/nQgZOcQPhFBAIB\nOjs79a97enrwer0Eg0HGjRtX7HKEGDGL501m0ewJA06Xurq6Cv6uT6n1seuX14/Z06u+it7imTRp\nEu+//77+dSwWw+l08sEHHzBnzpxilyPEiCoUIolEAqez8MLRUggdUBA811xzDe+//75+vfT8PJ5d\nu3Zx4YUXFrscIYrO4/Hov/+lqujBM3/+fC688EIOHjwI9DY782uqrr766mKXI0TRfPLJJ/zgBz8g\nGo2ycuVKfvGLX6guSZmit+uMRiN/+tOf9KtK5Fen/+pXv9KHGIUYi/7617+ye/duZs2aBaD/8S1F\nyheJlpeX8/HHH1NZWamyDCFEESlfJJrv4xFClA7lwXPmmWfKnstClBjlp1pCiNKjvMUjhCg9EjxC\niKKT4BFCFJ0EjxCi6CR4hBBFJ8EjhCg6CR4hRNFJ8Aghik6CRwhRdBI8Qoiik+ARQhSdBI8Qougk\neIQQRff/AHsWW3H0takUAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(1)\n", "fig.set_size_inches(4,4)\n", "ax = SubplotZero(fig, 111)\n", "fig.add_subplot(ax)\n", "\n", "for k,v in [(\"xzero\", \"\"), (\"yzero\", \"\")]:\n", " ax.axis[k].set_axisline_style(\"-|>\")\n", " ax.axis[k].set_visible(True)\n", " ax.axis[k].set_label(v)\n", " ax.axis[k].set_zorder(-20)\n", "\n", "ax.xaxis.set_ticks((0,1))\n", "ax.yaxis.set_ticks((1,))\n", "\n", "for direction in [\"left\", \"right\", \"bottom\", \"top\"]:\n", " ax.axis[direction].set_visible(False)\n", "\n", "ax.scatter((0,1), (1,0), marker=\"x\", s=250, lw=5, facecolor=\"#08519c\")\n", "\n", "ax.text(1.1, 0.4,\n", " \"~0 = 1\\n~1 = 0\",\n", " style=\"italic\",\n", " bbox={\"facecolor\": 'grey', 'alpha':0.5, 'pad': 10})\n", "plt.title('NOT')" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def sigmoid(z):\n", " return 1. / (1 + np.exp(-z))\n", "\n", "activate = np.vectorize(sigmoid, otypes=[np.dtype('float64')])" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def threshold(a):\n", " if a >= 0.5:\n", " return 1\n", " else:\n", " return 0\n", "\n", "h = np.vectorize(threshold, otypes=[np.dtype('int8')])" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def create_training_set(Truth, m):\n", " rows, cols = Truth.shape\n", " \n", " train = np.ones(shape=(m, cols+1))\n", " train[:, 1:cols+1] = np.vstack(Truth[np.random.randint(0, rows, size=m)])\n", " X = train[:, 0:cols]\n", " y = train[:, cols:cols+1]\n", " \n", " return X,y\n", "\n", "def predict(theta, X):\n", " z = X.dot(theta.T)\n", " a = activate(z)\n", " return h(a)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def cost(theta, X, y):\n", " theta = np.matrix(theta)\n", " \n", " m = X.shape[0]\n", " \n", " z = X.dot(theta.T).sum(axis=1)\n", " a = activation(z)\n", " y_hat = h(a)\n", " \n", " cost_simple = np.add(np.multiply(y, np.log1p(y_hat)),\n", " np.multiply(1-y, np.log1p(1-y_hat)))\n", " \n", " reg = (LAMBDA/2) * np.square(theta[:, 1:X.shape[1]]).sum()\n", " \n", " cost = (-1./m) * (cost_simple.sum() + reg)\n", " \n", " return cost" ] } ], "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.0" } }, "nbformat": 4, "nbformat_minor": 2 }