From bc1fe04f5b8b5c341331929e469742911a5717d5 Mon Sep 17 00:00:00 2001 From: Kevin McGuinness Date: Tue, 26 Apr 2016 14:12:07 +0100 Subject: [PATCH] Basic gradient descent examples --- notebooks/GD_Classification.ipynb | 475 ++++++++++++++++++++++++++++++ notebooks/GD_Regression.ipynb | 382 ++++++++++++++++++++++++ 2 files changed, 857 insertions(+) create mode 100644 notebooks/GD_Classification.ipynb create mode 100644 notebooks/GD_Regression.ipynb diff --git a/notebooks/GD_Classification.ipynb b/notebooks/GD_Classification.ipynb new file mode 100644 index 0000000..fbf9d69 --- /dev/null +++ b/notebooks/GD_Classification.ipynb @@ -0,0 +1,475 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Logistic regression with gradient descent" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + } + ], + "source": [ + "%pylab inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Generate some data\n", + "\n", + "\n", + "Synthetic data. `y` is generated by flipping a fair coin. `X` is generated from a mixture of Gaussians with fixed cluster centers.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "np.random.seed(42)" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def generate_data(n=100):\n", + " # y generated using fair coin flip\n", + " y = (np.random.rand(n) > 0.5).astype(np.int8)\n", + " \n", + " # x location is cluster center + gaussian noise\n", + " centers = np.array([[1, 5], [5, 1]])\n", + " X = centers[y] + np.random.randn(n,2) * 0.8\n", + " \n", + " return X, y" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "X, y = generate_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 115, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbgAAAHCCAYAAACdc9wUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4jff/x/FndkgIEQQhRBB7zxixR1G7Rq1Wq3tqfx2U\n6vi2WtVSRY0WrdYoahclRmrPVCJCEJsIkSXrnN8fJ0JqJZHkJMfrcV255NznHu87OK98xn3fICIi\nIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiL5yDBgWybWPwW0zZFKRHKJtbkLEDGj/sAuIAa4BOwEXjRr\nRffnDzybi8czpn5lhAHwysFaRLJEASePq7eBb4EvgZKpXy8AvoB9Ltdim4F1Mho25mJl7gJERARc\nMLXaej5kPQfga+A0cBGYBjimvucHnAXewtT6O4+pGzAz274LXADmAkWAVcBlIBJYCZRJXf8zIBmI\nB6KByanLfYANwFXgKND3juMXA1YAUZhaqZ/w4C7Kwam1RgAfACeBNqnvNQJ2ANdSz3MKYJf63lZM\nLbiY1Nr6PuRcREQkB3UCknh4D8YkYDmmD2xnTIHxeep7fqn7GAfYAJ2BWEzhmdFt/4cpKBwBV0yB\n65i6/iJg2R21bAaeueO1E3AGGJp6HnWAK0DV1Pd/T/0qAFTHFKhb73Oe1TCFU3NMrdeJqfXdCrh6\nmELOGvAEgoDX79j+v12UDzsXERHJIU9jajnd6R9MLZQ4TB/0VphaJXd+cDcFwlK/90td986QvIQp\nCDKybQIP7gqtg6n1c8tm0o/BPcXdgTUD+AhT4CYCle947zPu34L7CFhwx+uCqfW1uffqvAEsveP1\nw8bg/nsuIrkiI33/IpbmKuCGKZwMqcuapf55JnV5cUwf9Pvu2M6K9IF29Y7twRR4zhnc9gqmELql\nIKZWX0egaOoy59Ttbo2/3TkO5wk0xhTKt9gC81LPzTb1XG4J5/5KYWrh3XkeV+94XRn4BqifWqct\nsPcB+8vIuYjkOE0ykcfRDkwtlB4PWCcC05hXNUwf0kUxdTcWzsD+M7Ltfz/o38YUJI0wdXO2whQI\nVvdZPxzYcsf+iwKFgJdTj58MlLtj/XLc3wWg7B2vC2Iaw7tlGqZuSe/U2j7kwZ8dDzsXkVyhgJPH\n0XXgY+AHoDemYLg1juWUuo4BmIlppmXx1GVlgA4Z2H9WtnXGFIpRmMawxv7n/UtAxTter8IUIk9j\nGsezAxpimniSgqkLcRymMbhqmMbq7td6WgJ05fYM0vGk/2xwxjRGF5e6//9eSvHf2h52LiIiksMG\nYpphGItpxt9OYAS3Zwg6YBq7OoHpwzoIeCX1PT/u7va7c+ZhZrcthWmcLRrTjMjnMQXVraBpAoRg\nGsv6NnVZZW7PVowANgK1Ut9zwzR7MSr1vMZz/0kmAENIP4sy7I5zaQEEp9a2FdMvB3fuaySm2ZXX\ngD4ZOBcRizMH0296gXcsc8U0zfkYsB5TN46IiMgjy83fqH7CND37Tu9hCrjKwN+pr0VERPKd8qRv\nwR3FdAcJAPfU1yIiIo/M3H3iJTF1W5L6Z8kHrCsiIpJh5g64O2Xm5q4iIiIPZO4LvS9h6pq8iGnm\n1eX/rlCxYkXjiRMncrsuERHJ205gujbzvszdgluB6focUv9c/t8VTpw4gdFozDdfY8eONXsNllhr\nfqtXtare/FZrfquX9Nde3lNuBtxvmO73VwXTLYSGA18A7TFdJtAm9bWIiMgjy80uygH3Wd4uF2sQ\nEZHHhLm7KC2On5+fuUvIsPxUK+SvelVrzslP9eanWiH/1fsw+eHmp8bU/lYREREArKys4CEZphac\niIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhY\nJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWc\niIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhY\nJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWc\niIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWciIhY\nJAWciIhYJAWciIhYJAWciIhYJAWciIhYJAWcPJJz585x6tQpjEajuUsREUlHASdZcuHCBVq2bkm1\nmtWo27AuderXISQkxNxliYiksTJ3AcD7wNOAAQgEhgMJd7xvVOsg72neqjk2FW1oOaIl1tbW7F26\nl+BlwRwPOY61tX5vEpGcZWVlBQ/JMHN/EpUHngPqATUBG6C/OQuShwsPD+ffI//SckRLbGxtsLK2\nokHvBiRbJ7Njxw5zlyciAoCtmY9/A0gCCgIpqX+eM2tF8lCJiYnY2NlgbXP79yMrKyvsHO1ISEh4\nwJYiIrnH3C24SGAiEA6cB64DG81akTxUxYoVKVm8JAdWHkhbdmLnCW5cvIGvr68ZKxMRuc3cY3AV\ngZVACyAKWAwsAX69Yx2NweVBR44codMTnbBxssHOwY5rZ6+x7I9ltGjRwtylichjICNjcObuomwA\n/ANcTX29FGhG+oBj3Lhxad/7+fnh5+eXO9XJfVWvXp2Tx0+yfft2kpKSaNmyJQ4ODuYuS0QslL+/\nP/7+/pnaxtwtuNqYwqwhcBP4GdgNTL1jHbXgREQknfwwi/IQMA/YCxxOXfaj+coRERFLYe4WXEao\nBSciIunkhxaciIhIjlDAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLA\niYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiI\nRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAiYiIRVLAPaaMRiOT\nvpuEh6cHDgUc6NC5A0ePHjV3WSIi2UYB95iaPGUyk6ZP4olPnuDN1W9i7WNNq9atiIqKMndpIiLZ\nQgH3mPp60td0eq8TpXxK4ejsSJMBTShVoxSLFi0yd2kiItlCAfeYirwSSdHSRdMtK1SqEJcuXTJT\nRSIi2UsB95hq1boVB1YeSHudEJNAyOYQ2rVrZ8aqRESyj5W5C8gAo9FoNHcNFic0NJSWfi0pUaUE\nhUoX4pj/Mfr06MPUKVOxssoP/yxE5HGW+jn1wA+r/PBJpoDLIdHR0SxZsoSLFy/Spk0bGjdubO6S\nREQyRAEnuSIwMJAPP/qQ/Qf2U6VKFT4Z+wnNmjUzd1kiYsEyEnAag5NHEhYWRqvWrUjySqLn1z0p\n1LgQT3R/gr1795q7NBF5zKkFJ4/kjbfe4EDkAVq/1Dpt2e7FuykYXpAlC5eYsTIRsWRqwUmOO3Hy\nBMUrFU+3rKR3ScJOhZmpIhEREwWcPBK/5n6Ebg7lzlZ2yOYQWvm2MmNVIiLqopRHFB0djW9LX1Kc\nU/Bs4smFwxeIDI1k1z+7cHd3N3d5ImKhNItSckV8fDwLFixg556d1KxWk6FDh+Li4mLuskTEging\n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\nt8fX15cWLVrQsmVLnn766VyZcXfjxg2uXr2ablzM1taWMmXKpLtZ8u+//46npyeFChXC09OThQsX\npsLuAuMAABfySURBVL3XsmVLgoKCGDJkCF26dGHdunXs2LGDgQMHsm3bNlavXk29evVYv379YxNu\nYJrB2rRpU/z8/BRuWZAf/qWoBSePhUaNGlG8ePG0SRVAWvfU2rVr77udv78/w4YNo2PHjumWL1my\nhBUrVmSqqzErUlJScHd3p1WrVmm39TIYDKxcuZIlS5bQvHlztm7dSo8ePWjRogUlS5bk4sWLbNu2\njRUrVtCiRYscrU8sk1pwIvmIu7v7XRdTx8TEpJtocS/FihUjJiYm3Z33k5OTiY6OpnPnzg+9A8mj\nsrGx4dNPP2XLli0cP36cs2fP4u/vj4+PT1q4fvfdd1SvXh13d3esrKwoVaoU1atXZ/LkyTlamzze\nFHAiecSoUaMIDAwkPDyc5ORkwsLCCA4O5tVXX33gdjVq1OD/27vz4CjrPI/j7xydDSAJIFdCEsgF\nSLgPQYwksCMjBlQGKK5BV9FBpWbXkdFltPAYsVhqWUPV1mg5IIImInLpCopyJATCsgSVJNByBBIS\nSEgC5ODIQdK9fzzYmOFIIMfT3XxeVVSSx87TH2Lobz+/3/f5/cLDw9m3bx9VVVVUVlaye/duunXr\nxsiRI5k5c2aDNw69U3PmzGHFihV4eHhQWFjI008/zbfffusYTjx37tx1q4i0bt2as2fPNmsuubup\nwIk4iVGjRrFy5UpycnL49NNPKS4uZvLkycTFxeHv78/MmTMpLCy87vs8PDzYvHkzfn5+fPrppyQm\nJuLh4UFsbCwhISFcunSJrKysRuez2WycO3fupvN6EyZMYNu2bezfv5/XXnutznY5TzzxBFlZWY5C\na7PZOH78OBMnTmx0LpGb0RyciJOaP38+q1evZujQofj6+mK1WqmsrOTgwYM3vHVg3759TJgwgcce\ne8yx+kVNTQ1r1qxp9M3RGzdu5I9//COlpaVYLBZef/115s2b1+CGj6qqKsaNG4fVaqVr166cOXOG\nqKgovvnmmxZre9+1axdLly7l7NmzPPHEE7zwwgv1dqeK89JKJiIuqrq6mo4dOzJhwgTH6h52u50t\nW7awfPlyxo4de9332O12+vfvj4+PDwMGDKC2tpb9+/cTFhbG119/fcdZ0tPTiYmJYdSoUXTt2pWy\n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\ndhAREREREREREREREREREREREREREREREREREREREREREREREff3/7hYonR3G0kwAAAAAElFTkSu\nQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "figure(figsize=(7,7))\n", + "scatter(X[:,0], X[:,1], c=y, cmap=cm.Accent, s=30)\n", + "title('Generated data')\n", + "xlabel('$x_1$')\n", + "ylabel('$x_2$')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Define the model, loss, and gradient\n", + "\n", + "The model is a sigmoid of a linear function:\n", + "$$\n", + "f(x, w, b) = \\frac{1}{1 + e^{-(w^T x + b)}}\n", + "$$\n", + "\n", + "We use the cross entropy loss:\n", + "$$\n", + "L = \\frac{1}{N} \\sum_{i=1}^{N} y_i \\log f(x_i) + (1-y_i) \\log (1 - f(x_i))\n", + "$$\n", + "\n", + "The gradient of $L$ wrt. $w$ is simply:\n", + "$$\n", + "\\Delta_w L = \\frac{1}{N} \\sum_{i=1}^{N} (f(x_i) - y_i) x_i\n", + "$$\n", + "\n", + "And wrt. the bias:\n", + "$$\n", + "\\Delta_b L = \\frac{1}{N} \\sum_{i=1}^{N} (f(x_i) - y_i) \n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sigmoid(x):\n", + " return 1.0 / (1.0 + np.exp(-x))\n", + "\n", + "def predict(X, w, b):\n", + " return sigmoid(np.dot(X, w) + b)\n", + "\n", + "def cross_entropy(y, p):\n", + " return -(y * np.log(p) + (1 - y) * np.log(1.0 - p)).mean()\n", + "\n", + "def loss(X, y, w, b):\n", + " p = predict(X, w, b)\n", + " return cross_entropy(y, p)\n", + "\n", + "def d_loss(X, y, w, b):\n", + " p = predict(X, w, b)\n", + " dw = ((p - y)[:, np.newaxis] * X).mean(axis=0)\n", + " db = (p - y).mean()\n", + " return dw, db" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Gradient descent" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradient_descent_optimize(X, y, loss, d_loss, lr=1e-3, epochs=2000):\n", + " \n", + " # initialize weights and bias\n", + " w = np.zeros(X.shape[1]) \n", + " b = 1\n", + " \n", + " # set the initial learning rate\n", + " alpha = lr\n", + " \n", + " # save learning curves to losses\n", + " losses = []\n", + " \n", + " for i in range(epochs):\n", + " \n", + " # compute loss\n", + " L = loss(X, y, w, b)\n", + " \n", + " # print loss\n", + " if i % 10 == 0:\n", + " print('Epoch {} Loss: {}'.format(i, L))\n", + " \n", + " # compute gradient of loss wrt parameters\n", + " dw, db = d_loss(X, y, w, b)\n", + " \n", + " # update parameters\n", + " w = w - alpha * dw\n", + " b = b - alpha * db\n", + " \n", + " # save loss\n", + " losses.append(L)\n", + " \n", + " return w, b, losses" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0 Loss: 0.843261687518\n", + "Epoch 10 Loss: 0.15815950984\n", + "Epoch 20 Loss: 0.0929673859345\n", + "Epoch 30 Loss: 0.067494521187\n", + "Epoch 40 Loss: 0.0537544726815\n", + "Epoch 50 Loss: 0.0450843658663\n", + "Epoch 60 Loss: 0.0390782047348\n", + "Epoch 70 Loss: 0.0346513003311\n", + "Epoch 80 Loss: 0.0312409198845\n", + "Epoch 90 Loss: 0.0285251949433\n", + "Epoch 100 Loss: 0.0263062799546\n", + "Epoch 110 Loss: 0.0244556328915\n", + "Epoch 120 Loss: 0.0228859796066\n", + "Epoch 130 Loss: 0.0215359024771\n", + "Epoch 140 Loss: 0.0203608743405\n", + "Epoch 150 Loss: 0.0193277925645\n", + "Epoch 160 Loss: 0.0184115135761\n", + "Epoch 170 Loss: 0.0175925810668\n", + "Epoch 180 Loss: 0.016855693185\n", + "Epoch 190 Loss: 0.016188642043\n", + "Epoch 200 Loss: 0.0155815636197\n", + "Epoch 210 Loss: 0.0150263967258\n", + "Epoch 220 Loss: 0.0145164858843\n", + "Epoch 230 Loss: 0.014046285234\n", + "Epoch 240 Loss: 0.0136111346071\n", + "Epoch 250 Loss: 0.0132070879929\n", + "Epoch 260 Loss: 0.0128307805832\n", + "Epoch 270 Loss: 0.0124793246066\n", + "Epoch 280 Loss: 0.0121502269101\n", + "Epoch 290 Loss: 0.0118413231493\n", + "Epoch 300 Loss: 0.0115507247967\n", + "Epoch 310 Loss: 0.011276776136\n", + "Epoch 320 Loss: 0.0110180191066\n", + "Epoch 330 Loss: 0.0107731643684\n", + "Epoch 340 Loss: 0.0105410673357\n", + "Epoch 350 Loss: 0.0103207082085\n", + "Epoch 360 Loss: 0.0101111752399\n", + "Epoch 370 Loss: 0.0099116506441\n", + "Epoch 380 Loss: 0.00972139866611\n", + "Epoch 390 Loss: 0.00953975543691\n", + "Epoch 400 Loss: 0.00936612030721\n", + "Epoch 410 Loss: 0.00919994841371\n", + "Epoch 420 Loss: 0.00904074427725\n", + "Epoch 430 Loss: 0.00888805626863\n", + "Epoch 440 Loss: 0.00874147180744\n", + "Epoch 450 Loss: 0.00860061318256\n", + "Epoch 460 Loss: 0.00846513390195\n", + "Epoch 470 Loss: 0.00833471549471\n", + "Epoch 480 Loss: 0.00820906470129\n", + "Epoch 490 Loss: 0.00808791099741\n", + "Epoch 500 Loss: 0.00797100440639\n", + "Epoch 510 Loss: 0.00785811356112\n", + "Epoch 520 Loss: 0.00774902398293\n", + "Epoch 530 Loss: 0.00764353654941\n", + "Epoch 540 Loss: 0.00754146612731\n", + "Epoch 550 Loss: 0.00744264035007\n", + "Epoch 560 Loss: 0.00734689852224\n", + "Epoch 570 Loss: 0.00725409063572\n", + "Epoch 580 Loss: 0.00716407648463\n", + "Epoch 590 Loss: 0.00707672486737\n", + "Epoch 600 Loss: 0.00699191286594\n", + "Epoch 610 Loss: 0.00690952519406\n", + "Epoch 620 Loss: 0.0068294536062\n", + "Epoch 630 Loss: 0.0067515963613\n", + "Epoch 640 Loss: 0.00667585773501\n", + "Epoch 650 Loss: 0.00660214757563\n", + "Epoch 660 Loss: 0.00653038089906\n", + "Epoch 670 Loss: 0.00646047751891\n", + "Epoch 680 Loss: 0.00639236170812\n", + "Epoch 690 Loss: 0.00632596188912\n", + "Epoch 700 Loss: 0.00626121034966\n", + "Epoch 710 Loss: 0.00619804298185\n", + "Epoch 720 Loss: 0.00613639904228\n", + "Epoch 730 Loss: 0.00607622093115\n", + "Epoch 740 Loss: 0.00601745398874\n", + "Epoch 750 Loss: 0.00596004630767\n", + "Epoch 760 Loss: 0.0059039485594\n", + "Epoch 770 Loss: 0.00584911383389\n", + "Epoch 780 Loss: 0.00579549749108\n", + "Epoch 790 Loss: 0.00574305702338\n", + "Epoch 800 Loss: 0.00569175192806\n", + "Epoch 810 Loss: 0.00564154358876\n", + "Epoch 820 Loss: 0.00559239516544\n", + "Epoch 830 Loss: 0.00554427149193\n", + "Epoch 840 Loss: 0.00549713898064\n", + "Epoch 850 Loss: 0.00545096553371\n", + "Epoch 860 Loss: 0.00540572046013\n", + "Epoch 870 Loss: 0.00536137439845\n", + "Epoch 880 Loss: 0.00531789924448\n", + "Epoch 890 Loss: 0.00527526808379\n", + "Epoch 900 Loss: 0.00523345512851\n", + "Epoch 910 Loss: 0.00519243565813\n", + "Epoch 920 Loss: 0.00515218596407\n", + "Epoch 930 Loss: 0.00511268329768\n", + "Epoch 940 Loss: 0.00507390582142\n", + "Epoch 950 Loss: 0.00503583256309\n", + "Epoch 960 Loss: 0.00499844337272\n", + "Epoch 970 Loss: 0.00496171888207\n", + "Epoch 980 Loss: 0.00492564046661\n", + "Epoch 990 Loss: 0.00489019020955\n" + ] + } + ], + "source": [ + "w, b, losses = gradient_descent_optimize(X, y, loss, d_loss, epochs=1000, lr=0.1)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\naf4/XGHsNdK1TlAAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(losses)\n", + "title('Training loss')\n", + "xlabel('epoch')\n", + "ylabel('loss')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Plot the decision boundary" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def plot_decision_boundary(X, y, w, b):\n", + " x1 = np.linspace(X[:,0].min(), X[:, 0].max(), 200)\n", + " x2 = np.linspace(X[:,1].min(), X[:, 1].max(), 200)\n", + " X1, X2 = np.meshgrid(x1, x2)\n", + " pts = np.c_[X1.ravel(), X2.ravel()]\n", + " f = predict(pts, w, b).reshape(X1.shape)\n", + " figure(figsize=(7,7))\n", + " scatter(X[:,0], X[:,1], c=y, cmap=cm.Accent, s=30)\n", + " contour(X1, X2, f, 1, levels=[0.5])\n", + " xlabel('$x_1$')\n", + " ylabel('$x_2$')\n", + " title('Decision boundary')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAa4AAAHCCAYAAAC3wy27AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdUFFcbx/EvHRERRVAERUUQBXuvKPbYSzRFYwUUS4xG\nE99ooklMU2PsPdZoNBgr9oJd7A0bNkBFLAhIL7vvH0uIRCxIGZZ9PudwArNTniG4v7137twBIYQQ\nQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIoeW2A33fYr3nQLlcOP5doGUu7DerJgGrlC5CiMwY\nKl2AEO/gLmADpACpwBVgJbAIUGdz3++95XpFsnmcV1GT/XPICfmhBiEypa90AUK8AzXQEbAAygI/\nAV8AS5UsSqST9xWRq+QPTGi758BWoDfQD3BNW24CTAOCgYfAfMD0he26AOeBKOAm0CZtuT8wKO37\nisBBIBJ4DPz5wvYqoELa90XRtPgeoWkNfgXopb3WHzgCTAUigNtAuzecUz0gMG3939PO5R+eQBDw\nFNgM2KYtL5dW04v/pl88lzfVUT7tXKOB3UCJ/9T0FxCG5ndxEKjywmvL0fx+twMxwGg0v/MXa+mO\n5vcthBA66Q7gkcnyYMA77fsZwCbAEjAHtgA/pL1WD80b8D/XkkoDldK+PwAMTPt+LTA+7XtjoNEL\nx3oxuFYCG4HCgANw/YV99AeS0ASIHjAEuP+ac7sLXATsgGJowua7tNc80ARojbR6ZqEJEcg8uF48\nlzfVcRxN0BsBTdEE2MoXXu+fdn5GaH635154bTma32fDtJ9N0ATvi8G4EfjsNecthBAF2quC6zia\noNFD88m/wguvNUTTygBYCEx/xb5ffLNfkbauXSbr/RNcBkAi4PLCa15p+wHNG37QC6+ZpW1r84rj\n30nb/h/t0bQIQdMV+tMLrxVGE0ZlebvgelUdZYFkoNALr//BqwdnWKZt+891vuVpXy/6Alid9n1x\nIBYo+Yr9CZEl0lUoChJ7NN1gJdC8MZ8BnqV97eDf7i974NZb7G8cmhA8CVwGBmSyTgk0rZDgF5aF\nkDHsHr7wfVzaf81fc9zQ/+yrdNr3tv85TiyaLsPMgjUzr6qjNJrfUfwLr794HAM0gXkTTdfqnbTl\n//w+1f+pGTTB1wnN/4dewCEg/C3rFOK1JLhEQVEXzRvwETRv5vForsMUS/uyRDOYAzRvshXfYp/h\naFo/dmi6IOeRsRUH8ARNa6XcC8vKAvfe4Rxe3P7F7//p0nvwn+MUBqzSXo9NW2b2wuul3vJ4YWh+\nRy9u68C/Iws/Ajqj6VotiuZ6GPx7HS8z94ATaK5t9UGG1oscJMEltNU/b5oWaEYYrkXz5hiIphtr\nMfAbYJ22nh3/DsBYiqb15IHm34Ad/17jetH7aFpnoLmGo07b94tSgfXAFDStFwc013JW8270gGFp\nNRVHM9BjXdpra9Pqro7mOtIPaMIhBM21r/to7kEzQNNF6PiWxwwGTgOT0bQem6D5nf7DHE13aASa\nsPzhP9u/KsBWoukydAP+fstahHgjCS6hrbaiGUAQgua61nQyduV9gaZr6wSa7q09gHPaa6fS1p2B\nJpD8ydjK+UedtO2foxnBNxLN4AnIeJ/TCDQtntvAYTTdZMteWO+/90S97h4pddr2u9F0ZwYB36e9\ntg+YCGxA0/oqD3zwwraewFg0rcAqwNH/7Pd1dXwE1EcTTl+jub73j5Vowu0+mi7T4//Z9lX3nv2N\n5ve6EUjI/HSFEEKI/CWIzAfSCCGEEPlOd+CG0kUIIYQQb8MfzSjG1grXIYQQQgghhBBCiLf2uvsw\n8oy7u7v64MGDb15RCCGELjkINP/vwnwxHP7gwYOo1eo8/frmm2/y/JhyLrp3PnIu+ferIJ1PQT0X\nwD2zzMgXwSWEEEK8LQkuIYQQWkVng6t58+ZKl5BjCtK5QME6HzmX/KsgnY+unUu+GJwBqNP6M4UQ\nQggA9PT0IJOc0tkWlxBCCO0kwSWEEEKrSHAJIYTQKhJcQgghtIoElxBCCK0iwSWEEEKrSHAJIYTQ\nKhJcQgghtIoEl8jg8uXLfPzJx9SqX4uhw4YSEhKidElCCJGBBJdId+nSJZq6N+Wx5WOqD6xOYEwg\ndRvU5eHDh0qXJoQQ6fJqyqfxQB9ABVwCBgCJL7wuUz7lA70/6k2kdSQNP26YvmznLztp49aGbyd9\nq2BlQghdpOSUT+UAT6AWUBUwAD7Ig+OKLAq8GkiZ6mUyLLOrbselwEsKVSSEEC/Li+CKBpIBM8Aw\n7b/38+C4Iovq1q7LreO3Miy7c/wO9evUV6giIYR4WV51FXoB04F4YBfQ9z+vS1dhPnD79m3qN6xP\npZaVsHWz5fax20TeiOR0wGmKFSumdHlCCB2jZFehIzAKTZdhacAc+DgPjiuyqEKFCpw7c47GZRsT\nfzKebg27cerEKQktIUS+YpgHx6gDHAOepv38N9AI+OPFlSZNmpT+ffPmzQvUg9G0ib29PT//9LPS\nZQghdJC/vz/+/v5vXC8vugqrowmpukACsBw4Ccx9YR3pKhRCCJGBkl2FF4CVwGngYtqyRXlwXCGE\nEAVQXg3OeBNpcQkhhMhAyRaXEEIIkWMkuIQQQmgVCS4hhBBaRYJLCCGEVpHgEkIIoVUkuIQQQmgV\nCS4hhBBaRYJLCCGEVpHgEkIIoVUkuIQQQmgVCS4hhBBaRYJLCCGEVpHgEkIIoVUkuIQQQmgVCS4h\nhBBaRYJLCCGEVpHgEkIIoVUkuIQQQmgVCS4hhBBaRYJLCCGEVpHgEkIIoVUkuIQQQmgVCS4hhBBa\nRYJLCCGEVpHgEkIIoVUkuIQQQmgVCS4hhBBaRYJLCCGEVpHgEkIIoVUkuIQQQmgVCS4hhBBaRYJL\nCCGEVpHgEkIIoVUkuIQQQmgVCa4CIjo6mr1793Lp0iWlSxFCiFwlwVUArFi5AnsHe3y+9MGjnQdN\n3Jvw7NkzpcsSQohcoad0AWnUarVa6Rq00p07d6hRuwZ95vXBuoI1qlQVO6fupEqxKixfulzp8oQQ\n4p3p6elBJjklLS4tt3HjRip7VMa6gjUA+gb6NB3cFN+/fBWuTAghcocEl5YzNDRElaLKsCw1ORVD\nI0OFKhJCiNwlwaXlevbsyfWD1wk+FwxAUnwSB+YeoG+fvgpXJoQQuUOucRUA27dvZ8DgARiYGvA8\n4jlt27Zl5bKVmJmZKV2aEEK8s1dd45LgKiBSUlK4du0aJUqUoFSpUkqXI4QQ2SbBJYQQQqvIqEKR\nZWq1mlOnTrFu3Tru3LmjdDlCCAFIi0u8QmxsLB27duTqjavYOtty+8xtPAd7MvXnqf98ChJCiFz1\nqhaXjJkWmZrywxQi9CLw+tMLfQN94qPjWeW5irat29K6dWulyxNC6DDpKhSZ8t3oS72P6qFvoPkT\nKWRRCLfObvy14S+FKxNC6DoJLpEpMzMzEmMSMyxLik3CvLC5QhUJIYSGBJfI1BDPIRyaf4io8CgA\nQi+FcmHzBQYOGKhwZUIIXSfXuESmvL28uf/gPjM/mYmhkSGmJqYsWbAENzc3pUsTQui4/DI8TEYV\n5lPx8fE8efKE0qVLY2BgoHQ5QggdIjcgCyGE0CpyA7IQQogCQYJLCCGEVpHgEkIIoVUkuIQQQmgV\nCS4hhBBaRYJLCCGEVpHgEkIIoVUkuIQQQmgVCS4hhBBaRYJLCCGEVpHgEkIIoVUkuIQQQmgVeazJ\nWzp//jyXLl3Czc2NmjVrKl2OEELoLAmuN0hJSaH3R705dOQQDjUcCL4QTJOGTVi/dj1GRkZKlyeE\nEDpHgusNli5dysXbF/Fe742hsSEpSSmsH72exYsX4+Pjo3R5Qgihc+Qa1xv4bvKlZo+aGBprMt7Q\n2JCaPWriu8lX4cqEEEI3SXC9gUURC+Kj4zMsi4+Ox6KIhUIVCSGEbpPgegMfbx9OrDzBwxsPAQgP\nCufEihMMGzJM4cqEEEI3vfRIZIWo1Wq10jW80pKlS/jfhP+RmJiIsbExU76bgpenl9JlCSFEgaan\npweZ5JQE11tKSUkhIiKC4sWLY2goY1qEECK3SXDpsHPnznHixAkqVKhAq1atMDAwULokIYR4o1cF\nV141HSyBJYAroAYGAify6Ng6S6VSMWDwAPx2+uHYwJFHNx5hWciSA3sOYGlpqXR5QgjxTvKqxbUC\nOAj8jiYsCwNRL7wuLa5csHnzZkZ8MYK+i/piZGqEWq3Gb4of7s7uTJ82XenyhBDitV7V4sqLUYVF\ngaZoQgsghYyhJXLJ5m2bce3gipGpZoYPPT09avWoxeZtmxWuTAgh3l1eBFd54DGwDDgLLAbM8uC4\nOs+qmBVxT+MyLIt5GkPx4sUVqkgIIbIvL4LLEKgFzEv7byzwZR4cV+d5DvbkwtYL3DhyA7VaTfjN\ncPzn+vPZiM+ULk0IId5ZXgzOuJf2dSrtZ18yCa5Jkyalf9+8eXOaN2+eB6UVbM7Ozviu82XEqBH4\njvfFsrglX/3vKz788EOlSxNCiJf4+/vj7+//xvXyanDGIWAwcAOYBBQCvnjhdRmckYvUajXx8fGY\nmpqiry+TpQghtIPS93FVRzMc3hi4BQxARhXqJLVazf379ylatChFihRRuhwhRD6m5KhCgAtAXTQB\n1h0ZVaiTjhw5glNlJ9xquGFrZ8sgr0EkJiYqXZYQQsvIzBkiTzx9+pSKzhVp+2VbKjWrREJ0An7f\n+9G6TmtmTJ+hdHlCiHxI6RaX0HG+vr6Ur1ceF3cX9PT0KFS0EK0+a8WyZcuULk0IoWUkuESeiIuL\nw7iwcYZlJuYmxMfHv2ILIYTInASXyBOdOnXi6oGrPHvwDNAM0ji+6jgdO3VUuDIhhLaRa1wiz8yb\nN48v/vcF5WuUJ/JhJBYmFuzdtZdSpUopXZoQIh9Sejj8m+hMcKnVavz8/Fizfg0mxiYMHjCYxo0b\nK10WALGxsXwx/gv+WPMHarWa3r16M+2XaTk6bP3x48ccPHgQGxsbmjRpIveVCSFeSYIrnxj7xVjW\nbFhDjR41SElM4cy6M0yZPAVvL+9cPW5UVBTz5s/jwOEDOFVwYtTIUTg5OWVYp0uPLgTHBOM+1B19\nfX0OLTqEVaoVu3fsztXahBAFw507z/j993N8+22Lf0InWyS43kFKSgq7d+/m0aNHeHh4ULZs2Wzt\n7969e1R2q4zPXz4UKloIgMd3HrPGZw1h98MwNTXNibJfEhsbS90GdTGxM8G5hTOPgh5xftN5Duw9\nQI0aNQAIDQ3FrbobIzaPwNBEMxNYakoqc7vO5eSxk1SsWDFXahNCaL+UFBW//XaCn346wuefN2Ls\n2EYYGGS/N0XpB0lqndDQUJq3bI5+YX0sSlkw8rORTJwwkbFjxr7zPi9cuEBZt7LpoQVgXd4a0yKm\n3L17FxcXl5wo/SWrV69Gv7g+nSd3Rk9Pj8otKlOoWCEmfDOBbZu3ARAeHk5R66LpoQVgYGhAMdti\nPHz4MFeCKygoiCdPnlCrVi1MTExyfP9CiNx3+vQDvLy2YmVlRkDAYBwdc//pExJcr+AzwgeH5g40\nG9wMgOjwaKYMmELnjp2pVKnSO+3TycmJB9cfkJKYkh4Qz588JyYyBjs7uxyr/b9OnztN2XplMzTd\nHes7ssl3U/rPVatWJTYilgdXH1C6cmkAwm+G8yRUEyw5KTIykm7vd+PCxQsULVGU6EfRLP99OZ06\ndcrR4wghck9MTBITJ+5nzZrLTJ3amr59q+VI9+DbkOB6hV07djFmx5j0ny1KWuDSwgU/P793Di5n\nZ2daebTir7F/Ub9PfZITkzm29Bgjho/I1Xn7qrlW49SWU/D+v8uCzwdTuXLl9J9NTExYOH8hg7wG\n4dLCBT0DPa7uvcrc2XMxM8vZx6cNGzmMuCJxDN84HH1Dfe5dvsfHn3zMjas3ZIShEFrAz+8GPj7b\ncXd3IDDQhxIl8vYRizp9jSs+Pp5nz55RqlSpl0a3FStRjL6L+lLc/t9m7+YJmxnWaxiDBw9+52Mm\nJycza/Ys1qxbg4mJCV4DvejXr1+uflKJjo6meq3q2FS3oZJHJcKDwglYFcCu7buoX79+hnWDg4Px\n9fVFpVLRo0cPKlSokKO1qNVqTM1M+XTLp5gV/fePfdu32xjccTBDhgzJ0eMJIXLOw4cxfPrpTs6c\necDChR1p2TJn3x/+S6Z8eoFKpWLcl+OwsbWhSrUqlHMsx/bt2zOs4+3lzZ5pe3j+5DmqVBUXd1wk\n5FwIPXv2zNaxjYyMGDN6DGcCznDs0DH69++f681rCwsLTh4/iXtFd66vvU6JiBL47/N/KbQAHBwc\nGDNmDGPHjs1WaO3atYta9WpRpGgRGjVrxJEjR9Jf08vk85Jarc6zboa3pVarOXToEKtWreLWrVtK\nlyOEYlQqNYsWnaFatflUqGDJpUtDcz20Xie/vFPkaYvr1xm/MmfFHLpN6YZ5CXPunrnL5ombOR1w\nOn0QQnJyMmO/GMvSpUtJSUmhkkslli5aSu3atfOsTm117NgxOnTpQNtxbXGo4cDNEzfZ99s+jh46\niqurK3379+V69HXaft4WA0MDQi+F4vu5L0HXg7CxsVG6fEBzHa5Vu1aER4Rj42jDzZM38fb05ucf\nf853AStEbrp69THe3ttITExl8eJOVKtWMs+OLcPhX+BcxZmmo5tSplqZ9GV7Z+7Fo6IH307+NsO6\niYmJxMfHY2lpmWf1abtuPbuR5JhE3R5105cd/v0wTvpOLJi3gMjISHr27smZs2ewKGFB7NNYlv++\nnI4d88/0T8NHDicgJID3xr+Hnp4e8VHxLB+0nPWr1uPu7q50eULkusTEFH788Qhz5pzkm2/c8fGp\nmyND3LNChsO/IC4uDlPzjPdMGRU2IiYm5qV1TUxMZKh2Ft0Pu09lj8oZlhUvW5yQEyEAWFpasnfX\nXm7dusXTp0+pUaMGxsbGme1KMZu2bKLLT13SW1eFihbCrYMbGzdtlOASBd6hQ8F4e2+jUiUrzp8f\ngr29hdIlZaCT17i6delGwJoA1CpNKy/2WSyB2wPp3q17rhxPrVZz5MgR5s2bx6FDh8iPN1vnpNYe\nrbm8/XL6eapVaq7svELblm0zrOfo6Ei9evXyXWgBmJubExcVl2FZYnQiFhb56x+wEDnp2bN4vLy2\n8tFHG5gyxYNNmz7Id6EFOtpVGBUVRdsObQl5EIJNBRtun7nNyBEj+f7b73P8WElJSXTu1pmLVy9S\ntlZZQs+H4lLBBb8tfrk2U4bSIiMjadysMalmqZSqVorQk6FYF7Zm/579OT60/l2EhYVhZGREiRIl\nXrnO7Nmzmb5oOl2/70rRUkW5FXCLbZO3cebkGRwdHfOwWiFyn1qtZv36QD77bBfdurnwww8tKVpU\n+fcnucb18gE5ceIEISEhNGjQAAcHhwyvq1QqVq5cyeo/V2NoaMjg/oPp0aNHli/Mz507l9mrZ/P+\n9PcxMDRAlaLir3F/4dXDi88++ywnTylfSUxMZMOGDVy5coWaNWvSuXNnjIyMFK3pxo0bfNjnQ4KC\ngkhNTaWZezNWL1+NlZXVS+uq1Wq+nvQ1s2bPQqVSYW1jzfzZ82nbtm0mexZCewUHRzJs2Hbu3o1k\n0aJONGpU5s0b5REJriwaMmwIuw7tos5HdUhNTiVgZQBen3jxzdffZGk/rdu3pph7Map4VElfdv3w\nde5vv8+hfYdyuux8Ra1Wc//+fQoXLkyxYsUUrSU1NRVHZ0dcu7tSu3ttUpNTOTDvABbPLdjpt/OV\n2yUlJREVFUWJEiVkNKEoUFJSVMyeHcCUKYf57LMGjB3bGGNjA6XLykDu48qC0NBQ1qxZwwczP8C1\npSvV2lWj92+9mfbrNKKjo7O0L6viVsQ8zTjoI+ZJDCWKv7qb6kXBwcH0H9Qfx0qOeLTxYP/+/W99\n7AcPHnD8+PEs15wTzp8/j1t1N1yru2LvYE+PXj14/vx5ntfxj8OHD6NXSI+679dF30AfI1MjPIZ5\ncPTIUR49evTK7YyNjbG2tpbQEgXKuXNhNGiwhK1bb3D8+CC++qpZvgut15HgysS1a9ewq2SHifm/\nowktbCywtLHk7t27WdrXCJ8RBKwKIPhcMGq1mtCLoRxffpwRPiPeuG1ERAQNGjfgjvoObb5ug2Vj\nS3p+0JO9e/e+druUlBT6D+pPpSqV6OPdB7uydvw267cs1Z0d8fHxtGnXBufuzozyG8WnWz4lOCEY\nb5/cfXTL68TFxWFilnF0qIGRAQZGBiQkJChUlRB5KzY2ic8/303btqsZNqwu+/Z9gpPTy13l+Z1O\nDod/kypVqnDv2j0SnidgWkRzgTLqYRRRj6MoX758lvbVuHFj5s2ax7jx4wi7F0ap0qWYOX0mLVq0\neOO2y5cvp3T10rQYolm3pFNJ9A31mTxlMq1atXrldjN+m8Hxy8cZsWkExmbGPHvwjAkDJ/DFuC9w\nruzMlMlT6Ny5c5bOIyvWrVtHUfuiVH+vOgDGZsa0+rQVMzvPJH5RPIUKFXrDHnKeu7s7D289JORC\nCGWrax5Pc27rOcqUKUOZMvmnT1+I3LJz502GDvWjUaMyXL7sg41NYaVLemcSXJmws7Ojf//+rB2x\nltq9NddDTv5xki/HfflOk+H27tWbXu/3IiEhAVNT07fudrpy7QrJ6mQOLTtEmaplKFe7HKVdSnNs\n4bHXbrdi9QoaDW2EsZlmmHmx0sWo/0F9IsMicXF3ob9nfzYU2fDK8AwLC+Po0aOULl2ahg0bZqmb\nbM3aNQzxGUKZGhnDwNDEELVaTXJysiLBVbhwYdatWUfvj3pT2rk0SfFJxEfEs3vHbukGFAVaeHgM\nn322ixMn7rFgQQfattX+Z+tJcL3CrBmzaPRnI1b/uRojQyMWzVqUrcdu6OnpZekNOzw8HL/tfhiV\nMKKIVRG2T92OjaMNpSuVpkGDBu90fAMjA5waORHjFcPP03/ONLimTp/Kt99+S4VaFXgS+oRSVqXY\nvX13piPv/isiIgLvod58OOND/hz7Jw9vPKSUs2a295PrT1Kvfj1F74Nq27Yt94LvsX//fgoVKkTz\n5s0VH+koRG5Rq9UsW3ae8eP30b9/dZYs8cHMrGD8veeXj5r5blSh0ryHenMp8hJtPmsDQEpSCov7\nLybucRynT55+7aNVfpn6C0t9l9Lj5x7pXYXLvZfT4/selK1eluBzwawft55pP01j6NCh6dtdvHiR\n5q2a039pfyxKWqBWq9k1fReVLSqzbMmyN9b8119/8d3c7+j+S3cC9wWy7adt2FWxI/JBJOaG5uzf\nsz/HZ5sXQrzsxo2neHtvIyYmicWLO1GjhnY+LkhGFeaiixcvMshrEO06tmPmzJnEx8dne5+79+ym\neqfq6T8bGhtSq0stOnd+84MsR382moZuDZnTbQ5LP1nK/A/n0/CjhpStXha1Ws35bedx8XDh6+++\n5vDhw+nbbdq0iSptq2BRUtMq0tPTo2GfhmzatOlVh8qgSJEi6bNNuLZ05dONn1KtfTViHsVw/sx5\nCS0hcllSUirffXeQRo2W0qVLJU6cGKS1ofU6ElzZ5O/vj7uHO8FGwVg0tmDRhkV4tPEgJSUlW/u1\nKWlD5IPIDMuiw6JxrPDmWRsMDQ1ZvnQ51wKvsWrBKurWq8u5LefYv2A/q4avIuxaGK18WlG7d22W\nLFuSvp2ZmRnJsckZ9pUYm/jWXZwtW7YkKTKJgHUBpKakolapuRtwl649uuarSYqfPHnCxo0bOXr0\naIGffkvojmPHQqlZcyEBAfc5e9abUaMa5PmkuHlFugqzYM+ePaxeq5lJo3/f/jRt2pQ6DepQvkt5\nXFu6App5+VZ7r2b65Ol07dr1nY+1YcMGho4aSseJHSnlXIorB65waO4hzp89T9myZbO0r9TUVFxc\nXShUvhDOjZ1xae6CobEhZzaewSzYjHVr1gFw79493Kq50XFSRxzrOxIfFc+Wb7bQu21vJk+a/FbH\nCgoKot/Afpw7ew6A7j26s3DeQszNzbP2C8gl8+fPZ9z4cZSrXo5nD55hZWHFnh178s3jVITIqqio\nBMaP38fmzdeZMaMt779fpcAMOJLZ4bNp8reTmb90PjV71kSVoqJ77+5MGD+BK5eu0PqH1unr6enr\nYV/bngsXLmQruHr06EFMbAzfTfmO0JBQatetzc7tO7McWgAGBgb4ePuw4M8FuLhrQis+Op5zvueY\nO21u+nr29vb4rvdlkPcg/KL9SElKoe8nfZnw1YS3PpaTkxPHDh8jMjISY2PjfDE34T9u3rzJlxO+\nZOCygRSzK4ZarWbfrH2M+GwE6/5Yp3R5QmSJWq3m77+v8umnO+nQwYnAQB8sLZWfXzAv5JdYztct\nrsePH1O+YnmG/DkEcytNyyEiNILlg5fjUM4Btz5uVGqque6kVqtZO3wtU8ZN4f33339pX4GBgYSE\nhFC3bt3XTvKa05KTk+nTrw+79+zGzsWOkMshDB40mOlTp7/06UylUnH//n2KFSuWb1pKOWH69On4\nBvjS9vN/5xuMi4xjdtfZxMdl/7qkEHklNDSK4cN3cOPGUxYv7kSTJln/QKsNpMWVDZcuXcLO2S49\ntACKlymOpY0l3oO8mTh5ItGPoiluX5zLOy5jmmpKly5dMuwjNjaWbj27cfb8WWzK2RB6NZRvvv6G\nz0d/nifnYGRkxLo16wgKCuL69evUqFEDe3v7TNfV19cvkDflFipUiOS4/1zDi0vE1Ew3PqUK7Zea\nqmLevFNMnnyQkSPrs359T0xMdO9tXPfO+B04Ojry8NZDkuKTMC6kuak3LiqOZ+HP+PDDD6lVqxbT\nf5tO0LEgurTqwujPRr/0jKlJkyfxSPUInw0+6BvqEx0ezY9eP+Le1J26detmdthc4eTkhJOTU54d\nLz/p2bMn/5vwP24cuYFTYycSniew77d9DBwwUOnShHijixfD8fTciqmpIUeODMTFJe96bPIb6Sp8\nS3369eHk1ZM06NcAVYqKY78fo6NHR2bNmPVW25cpX4ZOP3TCxvHfQQD+i/2pU6wO036Zlltl51uJ\niYlM+HomTeQSAAAgAElEQVQCK1auIDUllZ49ezL156m5foPywYMH6T+4P1HRUSQlJNGrVy/mz5kv\nT7kW+VZcXDLffXeQpUvP8cMPLRk4sCb6+vnlrTt3SVdhNi1fupzZs2ezasUqDAwM+HzI5wzxHvLW\n2xsbGZOcmLGbKjUpFRNj3XzDHOQ1iHN3z9FrVi8MjQw58vsROnfvjP9e/1w9rru7O7dv3CYkJARL\nS0uKFi2aq8cTIjv27r2Nt/c26tYtzcWLQylVquBcc86O/BLb+b7FlV0//PgDKzatoOuUrhSyKMSD\nqw9YP2Y9J46cwMXFJdePr1KpCAoKwtzcHDs7u1w/3us8fvyYChUrMHzTcEwKa4Jblapifo/5HNh9\nADc3N0XrE0Jpjx/HMmbMbg4dCmbu3Pfo0MFZ6ZIUIS0uhY0bO47g0GDm9ZyHuaU5KfEpLJy7ME9C\n6+TJk3zw8Qc8j3tOYlwiDRo0YN2adYo93PHRo0cUKV4kPbQA9A30sbK34sGDBxJcQmep1WpWrrzA\nuHF76dOnKpcv+2BubvzmDXWMtLjeUVhYGF9P+pq9+/dia2vLl59/+VaPComIiCA8PBxHR8eXBnDk\nhri4OMqWK4vHaA8qt6hManIqe2fuxRZbNv61MdePn5nk5GTsytrR6btOlKmmGb0YERrBskHLCL0b\nmq9m2RAir9y8GcGQIduIiIhn8eJO1K5dWumSFCctrhwUFxdHwyYNsW9gT7vJ7YgIjWDQ0EHMTZhL\nr169Xrtt8eLFKV68eB5VCjt27KCkU0mqeFQBNHMetvBpwW8dfyM2NpbChfP+mTxGRkYsWbiEvv37\nUrllZQyMDAjcHci0X6ZJaAmdk5ycyrRpx5g+/Tjjxzfh008bYGhYMKdqyikSXO9g/fr1FLEvQqtP\nNQ9zLFmxJCaFTZj0/aQ3BldeS05OxsAo4yO5DQw1P6empipREgCdO3fm4rmLrFu3jqSkJJZ+vTRP\nuk2FyE9OnLiHp+dW7O0tOH3ai3Ll5IPb25Dgege3bt2ieMWMrSbbSraE3A1RqKJXa9euHd4+3ty7\ndA/7qvao1WqO/3Gcho0aKvpsLAAHBwfGjRunaA1CKCE6OpGvvtqHr+9VZsxoS+/ergVmfsG8IMH1\nDho1asSK0StoNqhZeuvlyoEr1KlXR+HKXmZpacmaVWvo068PJRxKEBcZh2VhS3b67VS6NCF00qZN\n1xgxYgdt2zoSGOhD8eJ5/0RwbZdfIl6rBmeoVCo6dunItdBruLR2IepeFFf3XGXv7r3UqlVL6fIy\nFRcXx7Fjx7CwsKBu3bry6U6IPHb/fjQjRuwgMPAxCxd2pHnzckqXlO+9anBGfnn30qrgAkhJScHX\n15c9+/dgX9qewYMGKzq/X2xsLD/98hObtmyiSJEijPQZyQcffKBYPUIIDZVKzYIFp/nmG3+GDq3D\n//7XFFNT6ex6GxJcGQ/Grl27Mjxbq3nz5nl2/JymVqtp5tGMaMNoaveqTVxkHIcXHmb0sNGM+WyM\n0uUJobMuX36El9dW9PT0WLSoI66u8ty3rHhVcOnkmMtJkycxYOgAImwieFj0Ib369GLGzBlKl/XO\njh07xu2Q23T9ritlq5fFxd2Fbj9044cffsj2k5iFEFmXkJDChAn7adFiBZ98Up3DhwdIaOUgnWuv\nPn78mF9/+xXvtd7pjymp1LQS3wz8Bs9Bnlr5/KmgoCBsK9ui98LEm1YOViQmJhIVFYWVlZWC1Qmh\nWw4cuIO39zaqVSvJxYtDsLUtonRJBY7OtbguXbpEaafSGZ6tVcyuGMVKFiMoKEjByt5dnTp1uH3q\nNknxSenLgs8FU7xEccWmdRJC1zx9GseAAZvp128T06a1wde3l4RWLtG5FlfFihUzfbZWxMMIHBwc\nFK7u3bi5udG1c1dWe6+mapeqJEQlcHbDWX5f9Dv6+jr32USIPKVWq1mz5hJjxuymVy9XAgN9KFJE\nN5/6kFe0fnBGUlISCxYs4K9Nf2FRxILhQ4bTvn37127Tb2A/jl06RoO+DVClqji27BhdW3dlxvSs\nXee6e/cuSUlJODk5KT68XKVSsWnTJtZvWI+xkTGjRo7Kt0PzhSgobt9+xtChfoSHx7BoUSfq1VP2\nyQsFTYEdnNGjdw/mrZ2HfQd7jGoY0d+rP/Pnz3/tNksXLWVE3xFcW3uNWxtuMX74eKZPnf7Wx7x/\n/z4NmzSkRp0aNHJvRJVqVQgMDMzuqWTbqTOn8PPzY9uObXTo3IENGzYoXZIQBVJKioqpU49Sr95i\nWrYsz6lTnhJaeUirW1xnzpyhfZf2eK/zTp+PL/xmOL6f+RJ2PwxDw9zpCW3crDHGlYxpOqApegZ6\nnNt6jvN/nOfOzTsYGBi8eQe5YO7cuUxbOI3uP3aniHURQi+F8veXf3P04FGqVKmiSE1CFESnTt3H\n03MrNjaFmT+/A46OeTdptq4pkC2uK1euULZa2QyTyJasWJKk5CQiIiJy5ZghISEEXgmk6YCm6Bvq\no6enR63OtdA30+fYsWO5csy3MX/xfNyHulPEWnMxuEzVMlTrWI1ly5cpVpMQBUlMTBKjRu2kU6e1\nfP55I3bt6iOhpRCtDq5q1apx99xdUhL/vVfpwdUHmJqa5toQ8JSUFPQN9DMMPQcwNDIkOTk5V475\nNuLj4zM8mBHAqLARsXGxClUkRMGxbdsNXF3nERmZQGCgD336VFP8urYu0+rgql69Oi1btGTtyLVc\n2nWJk3+d5O8v/+bnH3/OtS678uXLY1fajjMbz/BP92bQ0SCiH0bTpEmTN26flJTE6dOnCQ4OzrGa\n1Go1TRo2Yd/sfSTFaYbEx0XFcXnrZd7v8X6OHUcIXRMW9pxevf7is8928fvvnVm+vCtWVmZKl6Xz\n8stHhnceVZiSksLKlSvx3eSLRRELhnoNxd3dPYfLy+j69eu079ieFP0UDE0MiX0cy8YNG2nUqNFr\nt9u6dSsDBg3ArJgZ0U+jadiwIevXrKdIkXe/1+PevXu079SeJ8+egBE8vfcU+0r2PAl+gs9QH36c\n8qN8MhQii1QqNUuWnOWrr/bj6VmLiRObUaiQkdJl6RyZqzCHqVQqAgICSExMpHHjxhgZvf6P+sGD\nB1R2rUzPaT0pU7UMKUkp7Ph5BzVsa7B00dJ3rqNV21aoHFQ0HdQUPT09Qs6HsP7z9Rw/epyqVau+\ntP69e/cICwvDzc2NQoXy1+MUkpKS8PPzIzQ0FHd3d6pXr650SUIHXb36GC+vbaSkqFi0qCNVq5ZU\nuiSdVSAHZyhJX1+fhg0b0rx58zeGFsDff/+Nc1NnylTVzCBvaGxI86HN+XPNn+9cQ3R0NEePHKVR\n30bpraqyNcpSvmZ5rly5kmHdhIQEen3QC9dqrrzf731s7W1ZuWrlOx87p4WFhVGlahW+/OFL1hxa\ng0dbD3xG+KBtH2iE9kpISOGbbw7QrNlyPvjAlaNHB0po5VM6N3OGUtRq9UsDOvT19V96Y1ar1cyc\nNZNZc2YRFRlF23Ztmf7LdGxtbV/a5z+zYqhSVRmWq1JUL90KMGnyJK6EX2H4puEYmRrx6NYjRo4Y\nSb269XBxccmJU8yWcePHYVvflpbDWwLQwqcFywYuo3fP3rne9SvEwYN38fbeRuXK1pw/742dnbJP\nBxevJy2uPNKtWzeuH7xO2LUwQBMuBxcd5P3e75OamsqBAwf4+++/+WriV/y2+Dc8xnvwydJPCNUP\npWnzppmOWDQ3N6d1m9b4L/AnNTkVtVrNtYPXeBj0kHbt2mVYd9WaVTTzboaRqaZ1aONog1s7N9b+\nuTb3T/4t7Ny5k9rda6f/bGJuQuU2ldm+Y7uCVYmC7tmzeDw9t9Cnz0Z+/LElGzf2ltDSAtLiyiP2\n9vYsXbwUzyGeFLMtRuSjSGpUq8HYb8dSpWoVEknE3Mqc66euM2T1EKzKaobztxzWkj8u/8H27dvp\n0qXLS/tdtmQZvT7sxewuszE1M8XE0AS/LX4ULlw4w3pqlRq9/3YV65FvuuKKFStG9ONoLEtbpi+L\nfRyLVUWZ2V7kPLVazbp1gYwevYtu3VwIDPTBwkLmF9QWElx5qGfPnnTo0IGzZ89ibW2Ns7Mz7Tq0\nw66pHc0GNSMlKYUfW/xIMbuMM7oXdyjO/fv3M92nlZUV+3bvIyQkhOfPn1O5cuVMJ9b9+MOP2bVk\nF50ndcbQ2JAnd58QuDOQhf4Lc+Vcs+rTEZ/y0/Sf6DypM1Zlrbi89zI3D9+k77y+SpcmCpjg4EiG\nDvUjNDSaDRt60bChck8uF+9GgiuPFSpUiMaNGwOQnJzM/r37GbtnLKAZsGFbyZbAvYFUbasZEZjw\nPIGgI0G4f/f66zxly5Z97evfTv6WG31uMLfrXKzsrHgU8ogZ02fg6uqaA2eVfT5DfYiNi2Xqp1OJ\neBpBzTo12eG3I9Nre0K8i5QUFbNnBzBlymFGj27I2LGNMDJSZoo2kT0yHF5BqampFLEogo+vT/rz\nwe5dvseqEatw83DD3Nqcq3uu8nGvj7M8c/2r3Llzh/v371OjRo1sPzQzIiKC777/jh27d2Btbc3n\noz7PtDszK9RqNampqbk2z6TQTWfPhuHpuZWiRU1YuLAjTk7SBa0NdG44/K1bt+jRqwclS5ekZt2a\n+XKmdAMDAz7u+zF7Z+wlISYBtUpNZFgkZqZm9GjYg8a2jdn458YcCy3QzPzRpEmTbIdWcnIyTZs3\n5ejdozT9vCm2bW3xGu7FipUrsrVfPT09CS2RY2JjkxgzZhft2//BiBH12LfvEwmtAqBAtriePXtG\nZdfKuHZxpWrbqjy+85jd03cz/7f59OzZM8eOkxPi4uLwGurFpo2bMDAywLaULSuXraRevXpKl/Za\nf//9N19M+YKP5n2Ufg9Z6MVQ9v20j7s37ypbnBDAjh1BDB3qR9OmDvz6axusrQu/eSORr7yqxVUg\nP9quWrWK0jVK03RAUwAsS1uip6/Hdz9+l++Cy8zMjNUrVhM1K4qYmBhKly6tFVM03bp1CxsXmwy1\nlq5SmtA7oZp71rTgHETBFB4ew6hRuwgIuMeiRZ1o08ZR6ZJEDiuQXYXBocEUK5dxZJ51BWvu38t8\nZF5+ULRoUezs7LTmDb9evXrcOX6H1OTU9GXXDl6jeu3qWnMOomBRq9UsXXqWqlXn4+BQlMuXfSS0\nCqgC2eJyb+qO75e+NOrTCANDzaihwN2B6aP5RPY1a9aMejXrsXroalzfc+X5w+dc2HqBLRu3KF2a\n0EHXrz/B23sbcXHJ7NnTl+rVSyldkshF+eWjcY5e40pNTaVL9y5cvnmZii0qEhkcScipEI4cOoKz\ns3OOHUfXpaam8tdff+G3049SNqXw8vTCyclJ6bKEDklKSuXnn48wc2YAEyc2Y/jwehgYFMiOJJ2k\nc7PDp6amsnXrVvwP+lO2TFn69euXaw+XzA8SExMJCgqiVKlSlChRQulyhMh1R46E4O29DUfHYsyZ\n8x5lyxZVuiSRw3QuuHTJmrVrGDFyBKYWpkQ/iaZX714smLvgrWatF0LbREYm8OWXe9m69QYzZ7aj\nR4/Kcl21gNK5+7h0xZUrV/AZ4UPPX3viudaTYX8P48jFI/z8y89KlyZEjlKr1fj6XsHVdR4AgYE+\n9OxZRUJLB+Xl/3ED4DRwD+j0n9ekxfWOvprwFYdDD+MxzCN92YOrD9g3ZR+3btzKkxoeP37MyZMn\nsbe3l4c/ilwRGhrFsGHbuXkzgkWLOtGkyeunOBMFQ35ocX0KXAEkoXJQUnIS+kYZ/zcaGBmQnJKM\nWq1myZIl1G9cnxp1avDzLz+TlJSUo8f/9bdfKV+xPON+GEfrDq1xb+lOdHR0jh5D6K7UVBWzZgVQ\ns+ZC6tQpzblz3hJaIs9aXPbAcmAKMBppceWYM2fO0KZDGz5Z9AlFSxUlNSWVLd9soW2ttujp67Fu\nyzoaD26MoYkhAasDcLV3ZcP6nJn+6vz583i08aDfkn4ULVUUVaoKvyl+NKzQkDmz5uTIMYTuunDh\nIZ6eWzEzM2Lhwo5UqiSDjnSN0oMz/gJ+ACyAz5HgylG//vYr30z6BjtnOx6HPKZe3XosW7wMJxcn\nvNd6p0/gm5KUwrzu8zhx5ESO3BYwYeIEDoUewsPn327KpyFPWT9yPeEPwrO9f6Gb4uKSmTzZn2XL\nzvPTT60YMKCGXMfSUUp2FXYEHgHnMitAZN/oUaO5e+sus6fM5qj/UXZs3UFkZCTmlubpoQWax6aU\ndi5NUFBQjhzXxNiElISUDMuSE5IxNjHOkf0L3bN79y2qVp1PSEg0ly4NZeDAmhJa4iV5MXNGI6Az\n8B5giqbVtRL45MWVJk2alP598+bNad68eR6UVnBYWVnRunXr9J/LlStHQkwCj28/xrqCNQBxkXEE\nXwqmZs2aOXLMjz76iGl1p1G5VWXKVCtDfHQ8/nP9GTRgUI7sX+iOx49jGT16N0eOhDBv3nu0by83\nsusif39//P3937heXn+UcUe6CvPM4iWLGT9xPDV71sTQxJDzG87T78N+/PTDTzl2jM2bN+Pt443a\nQE1sVCwffvgh82bPy7F7yFQqFWvWrOFP3z8xK2TGEM8heHh4vHlDoRXUajUrV15g3Li99O1bjcmT\nm1O4sLTYhYbS17j+4Q6MQdMCe5EEVy45fvw4v6/4ncTERD7s9SHt2rXL8a6XlJQUbt++jbW1NcWK\nFXvzBlkwYPAA/AP8cevsxu2Ttwk+HUzn9zqzeNFiChf+9zEVAQEB/DL9F+6G3MWjmQdfjPtCZhDJ\n54KCnjJkiB+RkQksXtyJWrXkadcio/wSXK8iwSVecuPGDeo1qkf/pf1ZPXI1No42ONRy4PrB6xjH\nGXPi6AksLS3x9/en2/vdaDSgEdYVrLm65ypPLz/lwtkLGcJN5A9JSalMm3aMX389zv/+15SRI+tj\naChzIYiXSXDlMHnmVO7z9fXl+wXfU6RMEeIi4+g0XtPDrFar2fLNFno268lX//uKJs2bULJlSaq2\nrZq+7YYvNjDiwxF4eXkpVb7IxIkT9/D03Iq9vQXz53egXDlLpUsS+Vh+uAG5QNi4cSPOlZ3R19fH\nxdWFrVu3Kl1SgVW5cmVCL4cSeiEU15au6cv19PSo1LIS/kf8Abh+7Tpla2S8KdW2qi2BVwLzslzx\nGlFRCQwb5kf37uuYMKEp27d/JKEl3pkEVxYcOXKEwUMG02B4AyYem0gd7zr0G9SPgIAApUsrkFxd\nXWnZoiXRD6MJuxGW4bVHQY+oWL4iADVq1ODm8Zvpr6nVakICQqhTu06e1isyt2nTNdzc5pOUlEpg\noA+9e7tJb4XIlqz+9ZgDMYARoAJSX7/6W9OKrsKevXsS7xBP3Z5105edWHuCEhElWL1itYKVFVwp\nKSlMnDiRGbNm0GZUG8rVKsetgFsc+/0YJ46eoFKlSpw5c4ZWbVpRo1sNrMpbcX3vdYxijDh+5Dgm\nJiZKn4LOuncvmhEjdnD16mMWLepEs2YOSpcktExOdBWOA74GfgWKAgtypDIt8ujJI4qWyvjMn6K2\nRQkLD3vFFiK7DA0N+fHHHzm4/yCJ5xP5e8zf6F3XY/+e/VSqVAmA2rVrE3A8ALfCbiScSmBg54Ec\n9j8soaWQ1FQVc+eepGbNhVSrZsP580MktESOysoNyAFpX8lAb3Swm7Fju46s3LISp0ZO6OnroUpV\ncWnLJbzf91a6tAKvfv367PLb9crXnZ2dmT1zdh5WJDJz6VI4Xl7bMDDQ49Ch/lSubK10SaIAepuu\nwgpAGOAK1OHfllY/YEUO1aEVXYVxcXG0bteae0/uUaZmGULOhlDOthy7t+/G1NRU6fKEUEx8fDLf\nf3+IxYvP8v33HgweXAt9fbmOJbInO8Ph56KZJNcfaIrm2tbRHKwNtCS4QDOTw+7du7l8+TLVqlWj\nVatW6OvrXONTiHT79t1myBA/atYsxcyZ7bC1LaJ0SaKAyE5w9UPTLegP3AG6ARtzsDbQouASQmg8\nfRrHmDG7OXDgLnPmtKdTp0pKlyQKmOwMzigDJKJ5jtYBoHaOViaE0CpqtZo//riIq+s8LC1NuXx5\nqISWyFNvMzjjNrABWAOUALrnakVCiHzr1q0Ihgzx4/HjWLZu/ZC6de2ULknooLdpca1DMzADoDxQ\nMvfKEULkR8nJqfz88xHq119CmzYVOHXKU0JLKCa/DPuRa1xCqyQmJrJlyxaCg4Np1KgRDRs2LLCz\nQZw6dR9Pz63Y2BRmwYKOVKiQs08AEOJVZJJdIXJIeHg4TdybYFDUACtHK24dvYVHMw9Wr1hdoEaY\nPn+eyMSJB/jzz8tMm9aGjz+uWmDDWeRPElxC5JDB3oO5En2FNp+1ASA5IZlVXquYN20eHTt2VLi6\nnLF163WGDdtOq1YVmDq1NVZWZkqXJHSQBJcQOaRM+TJ0/qkz1uX/nRXi2OpjVFRVZN6ceQpWln1h\nYc8ZOXIn588/ZOHCjnh4lFe6JKHD5LEmQuSQEiVKEBUelWFZzKMYStpo77gllUrNggWnqVZtAc7O\nxbl4cYiElsi3sjJXoRACGPPpGMZOHEuhbwpRyqkUgXsDubr3KuumrlO6tHdy5cpjvLy2kpqq5sCB\nfri52ShdkhCvJcElRBb16dOHmNgYpkyawoPQB9SuX5sd23ZQpkwZpUvLkoSEFH744TDz559m8uTm\nDBlSR+YXFFohv/yVyjUuoZXUarVWjrTz97+Lt/c2XF2tmT27PXZ2FkqXJMRLXnWNS1pcQmSDtoVW\nREQ848btYdeuW8ye3Z6uXV2ULkmILJPBGULoALVazdq1l3B1nUehQoYEBvpIaAmtJS0uIQq4O3ee\nMWzYdu7di2bTpt7Ur2+vdElCZIu0uIQooFJSVEyffoy6dRfTtGlZzpzxktASBYK0uIQogM6ceYCn\n51aKFy/EiRODqVixuNIlCZFjJLiEKEBiYpL4+usD/PHHJX75pRWffFJd6waQCPEm0lUoRAGxfXsQ\nbm7zePw4jsuXh9KvXw2dCK2QkBC6deuGubk59vb2TJs2DZVKpXRZIhfll79quY9LiHf08GEMo0bt\n5NSpByxY0IHWrR2VLinPJCYm4uTkRKlSpahUqRJxcXEEBAQwdOhQvvrqK6XLE9kkcxUKUcCoVGqW\nLDlLtWrzKVfOkkuXhupUaAFs2bIFIyMjatasiZmZGSVKlKBx48ZMnz4d+TBccMk1LiG00LVrT/D2\n3kZ8fDJ79vSlevVSSpekiLCwMMzNzTMss7CwICoqitTUVAwN5S2uIJIWlxBaJDExhW+/PUjTpsvo\n2bMyx48P0tnQAmjRogUhISEkJiamLwsKCqJOnToSWgWY/J8VQkscORKCl9dWnJysOHvWizJliipd\nkuKqVq3KwIEDWb58OQ4ODiQmJhIWFsa+ffuULk3kIhmcIUQ+FxmZwBdf7MHPL4iZM9vRvXtlnRgt\nmBUBAQHs3LmTEiVK8MEHH2BlZaV0SSIHyBOQhdAyarUaX98rjBq1i86dnfnxx1ZYWpoqXZYQeUZm\nhxdCi4SERDFs2HZu337G+vU9ady4rNIlCZFvyOAMIfKR1FQVM2eeoFathdSvb8e5c94SWkL8h7S4\nhMgnzp9/iKfnVgoXNuLYsUE4O8t1GiEyI8ElhMLi4pKZNMmf5cvP89NPrRgwQDemahLiXUlwCaGg\nXbtuMnSoHw0bluHyZR9sbAorXZIQ+Z4ElxAKePQoltGjd3H0aCjz53egXbuKSpckhNaQwRlC5CG1\nWs2yZeeoWnU+trbmXL48VEJLiCySFpcQeeTGjacMGbKN6OhEdu78mJo1bZUuSQitJC0uIXJZUlIq\nU6YcolGjpXTq5MyJE4MltITIBmlxCZGLjh8PxdNzKw4Olpw544WDg6XSJQmh9SS4hMgFUVEJjB+/\nj02brjFjRlt69XKVIe5C5BDpKhQiB6nVav7++yqurvNITk4lMNCH3r3dJLSEyEHS4hIih9y7F83w\n4du5du0Ja9b0oFkzB6VLEqJAkhaXENmUmqpizpyT1Ky5kJo1S3HhwhAJLSFykbS4hMiGixfD8fLa\nirGxAYcO9adyZWulSxKiwJMWlxDvID4+mfHj99Ky5UoGDqyJv7+ElhB5RVpcQmTRvn238fbeRu3a\npbl4cQi2tkWULkkInSLBJcRbevIkjjFjduPvf5d5896jQwdnpUsSQidJV6EQb6BWq1m16gJubvMo\nXtyUwEAfCS0hFCTBJcRr3LoVQZs2q/n11xNs2/YRM2a0w9zcWOmyhJb7888/cXR0xMDAgBo1auDv\n7690SVpFgkuITCQnp/LTT0eoX38Jbds6cuqUJ3XqlFa6LFEA7Nq1i2HDhlGlShUGDBiAtbU1Xbt2\n5erVq0qXpjXyy+38arVarXQNQgAQEHAPL69t2NqaM39+B8qXL6Z0SaIAadWqFSqVCicnp/RlZ8+e\npX79+syZM0fByvKftBlnXsopGZwhRJro6EQmTNjPX39d4ddf2/DBBzJVk8h54eHhVKhQIcOywoUL\nExYWplBF2ke6CoUAtmy5jpvbPGJjkwgM9OHDD6tKaIlc0aFDB27evMk/vUwqlYq7d+/SqVMnhSvT\nHvnlX6Z0FQpFPHjwnJEjd3DxYjgLF3akRYvySpckCrjIyEiaNm3K8+fPKVasGOHh4VStWpVt27Zh\nZGSkdHn5yqu6CiW4hE5SqdQsXHiar7/2Z8iQ2nz1VTNMTaXnXOSN5ORktm3bxvXr16lTpw4eHh7o\n60sH2H9JcAmRJjDwEV5e21Cr1Sxe3AlXVxulSxJCZOJVwSURL3RGQkIKEyfup3nzFfTpU5UjRwZK\naAmhhaRvROiEAwfu4O29japVS3LhwhBKl5b5BYXQVhJcokCLiIjn8893s2fPbebMaU+XLi5KlySE\nyCbpKhQFklqtZs2aS7i6zsPc3JjAQB8JLSEKCGlxiQLnzp1n+Phs58GD52za1Jv69e2VLkkIkYOk\nxY/YpiUAACAASURBVCUKjJQUFVOnHqVu3cW4uztw+rSnhJYQBZC0uESBcPr0A7y8tlK8eCECAgbj\n6Fhc6ZJEPhUVFYWvry8RERG0b98eNzc3pUsSWST3cQmtFhOTxMSJ+1m79jJTp7amT59qMlWTeKWL\nFy/i4eGBtbU1JiYm3L17l1GjRjFp0iSlSxOZkBuQRYGzfXsQPj5+uLuXY/r0NpQoYaZ0SSKfq1+/\nPqampri4aAbqxMfHs3nzZk6dOoWzszwcNL+RG5BFgfHwYQy9e/sycuQOli7tzIoVXSW0xBslJiZy\n9uzZDAFVqFAhHBwc2Lt3r4KViayS4BJaQ6VSs3jxGapVm0+FCpZcujSUli0rvHlDIQAjIyPMzMyI\niYnJsDw2NpaSJUsqVJV4FzI4Q2iFq1cf4+29jaSkVPbu/YRq1eSNRmSNvr4+w4cP548//qB+/fqY\nmZlx9epVEhMT6dixo9LliSzIi+AqA6wEbAA1sAiYlQfHFQVAYmIKP/54hLlzT/H1183w8amLgYF0\nFIh38+2332JkZMScOXOIjo6mZcuWrF27FhMTE6VLE1mQF4MzSqV9nQfMgTNAV+DqC+vI4AzxksOH\ng/Hy2oaLSwlmz26Pvb2F0iUJIfLQqwZn5EWL62HaF0AMmsAqTcbgEiLds2fxfPHFXrZvD2LmzHb0\n6FFF6ZKE+H979x0W1Zn+f/xNVUC6ioAQULAhKqKIWIIRe1u78WuM0UVj+SabqKvJJhtN74masvq1\nrEZ/mqBxYwETcUVFBcWCCBYsdERCFenM+f0xCRvWGAsDh4H7dV1ewmE45zMic89znufcRzQg9X3O\nxQ3wAaLr+bhCDyiKwnffxePl9RXGxobExy+QoiWEuEd9Ls5oAewEXkQ78qrhtxcABgYGEhgYWF+5\nRAOQnJzPwoWhJCXls2vXFPr2dVE7khCPpaysjKqqKszN5RKNRxUREUFERMQDH1dfFyCbAPuAMODz\n3/m6zHE1UZWVGtasieadd47x0kv+LF3aD1NTI7VjCfHI7t69y/z58wkJCUGj0dC3b182bdqEu7u7\n2tH0lpqdMwyAzUAO8NJ9HiOFqwk6dy6T4OC9WFo2Y+3a0XToYK92JNEA5ebmsm3bNtLT0wkKCmLw\n4MENsq3XtGnTiI2Nxc/PD2NjYxISEsjKyiIxMREjI3kz9jjULFz9gaPABbTL4QFeAQ785jFSuJqQ\nu3fLWbEigi1bLvD++4OZNatHg3whEuq7dOkSAwcOpHXr1piZmZGWlsbgwYPZunVrg/o/U1BQgJOT\nE1OmTMHU1LR6e1hYGJs2bWLw4MEqptNfaq4qjEQ6dIhfHDhwjQUL9tO3rwtxcfNp3dpC7UiiAXvx\nxRfp0KFDdQf37t27s2/fPo4cOdKg5sGLi4sxNDTExMSkxvbmzZtTUFCgUqr6VVVVxdatW9m1axe2\ntrYsXLgQPz+/OjmWFBRRL7Kyipg+fRcLFuzn669HsW3bBCla4oGOHz+Oh4dH9efGxsY4Oztz5MgR\nFVPdq02bNri6unLt2rXqbXl5eWRmZjJo0CAVk9WfqVOn8vrrr3Pnzh2uXr3KsGHDCAkJqZNjScsn\nUacURWHTpvMsXx7OrFk9iIubj4WF6YO/UQjAwcGB/Px82rRpU72tpKQEZ2dnney/vLyckJAQDh8+\nTPv27ZkzZw6tW7d+5P0YGBiwdetWhg4dSmpqKqampiQnJ/OPf/wDW1tbnWRtyM6cOUNERATjxo3D\n2FhbVlq3bs1LL73EpEmTdH5aVwqXqDNXr+Ywb94+iorK+fHHGfj4OKodSeiZ5cuX8/rrr+Pn54e1\ntTWJiYnk5+czderUWu+7oqKCwYMHk5aWhpOTE9HR0Xz66aecOHECT0/PR96fj48PycnJ7N+/n7t3\n7zJixIgm07z33LlzODk5VRct0L7pyMnJobCwEGtra50eT04VCp0rL6/i7bePEhCwgXHjOhIVNUeK\nlp76+eefmTVrFvb29ri4uPDuu+9SVVVVb8cPDg7m3Xff5cqVK+zfvx9HR0eOHz+OpaVlrfe9c+dO\nUlNTGTJkCF27diUgIIB27drx6quvPvY+zc3NmTx5MrNmzWoyRQugU6dO3L59G41GU70tJyeHFi1a\n6ORn9d8ayrIcWVXYSJw4kUpw8F7atbPlyy9H4uqq23daov5oNBp69NCu+PTy8qKsrIyYmBgmT57M\nxx9/rHa8Wnv++ee5cOEC3t7e1dsKCgo4evQoGRkZKibTP4qiMGjQINLT0+nQoQMlJSVcuHCBd955\nh3nz5j32fuVGkqJOFRSUMn/+PiZN+o4VK55kz55pUrT03NGjR8nJyaFPnz5YWlrSsmVLBgwYwNq1\nayktLdXZcS5fvsyMGTPo3r07s2fP5vr16zrb9x/x8PCgsLCwxracnByeeOKJejl+Y2JgYEBYWBiz\nZ8/m9u3bGBkZ8c9//rNWReuPSOEStaIoCrt2JdCly1doNArx8QuYPNmrQV1jIx5Peno6NjY2NX6W\nv7Yx0tUS76tXr9K3b18SExNxc3MjLi4OPz8/kpOTdbL/P/Lcc8+RnZ3NuXPnyM/P5/r168TExPDG\nG2/U+bEbIzMzM1555RVOnz7NwYMH6/QeZ1K4xGNLTS3gT3/6ltdfP8yOHRNZu3YMtrZmascSOjJg\nwABSUlIoLi6u3paamkrr1q0fa+Xd7/nggw/w9PSkR48etGnThp49e+Lm5sZnn32mk/3/EXt7e06e\nPEn79u05ceIEpaWl7Nixg+HDhwNQWlrK9u3b+eCDD4iMjOS/pzMqKyuJjo7m4sWL93xN1K2G8rZY\n5rj0SFWVhi+/PM2bbx7hhRf6sGxZP5o1kwWqjdHKlStZtWoVbm5uVFZWkpyczL/+9S+dXZvUp08f\nWrVqVWN5e1JSEpWVlRw6dOgPv7eoqIg1a9Zw4MABXF1defnll/Hx8dFJroyMDAICAjA2NsbS0rK6\n3dTWrVsxNDTk+PHjTJw4ESMjI8rKynB2dmb//v20bdtWJ8cXWmq2fHoYUrj0RGzsLYKD92JmZsLa\ntaPp1Kml2pFEHTtz5gy7d+/G0tKSGTNm6OwaKoAXXniBY8eO1eiwcPLkScaOHcvbb7993+8rLy/H\nz8+P0tJS3NzcKCgoICEhgQ0bNtCyZUs6d+5cq1V9zzzzDAkJCfTq1QvQjq5CQ0PZuHEjgYGBODs7\n06dPH1xdXVEUhfPnz9OsWTOOHTv22McU91Kz5ZNoBIqLK3jzzSNs3HiOd98dzOzZPhgaNpT3PaIu\n+fr64uvrWyf7XrhwIdu3b0ej0dCqVSuysrLIy8vjxRdf/MPv+9e//kVBQQFDhgypnoOzsLBgxowZ\nODk5cfv2bebPn8+HH374WPOtBw8erNFSytjYGFdXV8LCwqiqqsLW1hZXV1dA++LarVs3tm/fTnZ2\nNq1atXrk44lHI3Nc4oHCw2/QrdvXJCXlc+HCfP78555StEStVFRU8Pzzz9OzZ0/KyspITk6muLiY\nSZMmcf78+Qe++MfGxmJvb1+jKDk7O6MoCkOGDGHixIls27aNnTt3Pla+li1bcufOnRrbSkpKaNOm\nDQYGBjKnpTIpXOK+srPvMnPmbubM2cPq1SPYsWMSbdq0UDuWaARWrFjBwYMHmTRpEtOmTSMgIID4\n+HiCg4Np2fLBp5+7detGTk5OjQKSkZGBnZ0doG1u27FjRzZv3vxY+f76178SExPD7du3qays5PLl\ny6SmpjJr1iwGDx5MYWEhSUlJgPZ6t9jYWHr16iWjrXoihUvcQ1EUNm8+T9euX9OqlTnx8QsYOfLR\nW+AIcT/r16/H19eX5s2bY2BggIuLC66urnz77bcP9f3jx4/HysqKo0ePkpKSwoULFzh27FiNU5qK\nojz2fbBmzpzJm2++SUxMDFu2bKGiooLw8HCcnJxo3rw5+/bt4+LFi+zZs4ddu3ahKArbt29/rGOJ\nRydzXKKGa9dymTdvH3l5JYSGTsfX10ntSKIRKi0tvecWIEZGRjWW3v8RU1NTIiMjWbNmDWFhYdWr\n/35taHv37l0uXbrEunXrHjvjvHnz7rmANjU1lZSUFLy9vUlJSSE2NhZzc3M6der02McRj66hTFTI\nqkKVVVRU8fHHJ/jkk5O88kp/XnzRH2NjGZCLujFz5kxiY2Pp06cPBgYGFBUVsX//fiIjI6vvvfUo\nFEXh1VdfZc2aNdja2pKXl8fSpUv5+9//rpOL4cvLy5k5cyb79+/Hzs6O3Nxc3n//fRYuXFjrfYv7\nk+Xw4r6io9MIDt6Ls7MVX389Cjc3G7UjiUYuJyeHoKAgbt26hZWVFenp6bz55pu8/PLLtdpvXl4e\n169fx8PDAxsb3f0/XrlyJVu2bCEwMBBjY2MKCws5cOAABw8epHv37mzevJnvv/8eOzs7Fi1ahL+/\nv86O3ZRJ4RL3KCws49VXD7Fr1yU++2wYU6dKqybxaIqLi/niiy/YuXMnLVu25N1336VHjx4P9b2K\nonDy5Elu3bpFQEBAjXtuNTQeHh54e3vX6Bhy9uxZAgICuH79OhcvXqR9+/aUlJSQkJDA+vXrmTRp\nkoqJGwe5jkvU8MMPl1m0KIxhw9oTH78AOztp1SQeTVlZGT179qSoqIiOHTuSkZFB7969WbVqFQsW\nLHjg9xsYGBAQEFAPSetOVlYWp06dYuzYsdULQezt7Vm8eDETJ06UN4J1RCYxmpj09EImTPiWv/41\nnG++Gc/69WOlaInH8t1335GXl8fIkSPx8PCgT58++Pv7s2TJEsrLy9WOp1PPPvssFy5coKKiAtA2\nGb527Rru7u44OjrWWL3o6OjIrVu3HnqhSUOUl5dHSkpKg71eTQpXE6HRKHz11Wl69FiLt3drYmOf\nJzDQTe1YQo8dOHAAd3f3GqMKV1dXKisrOXXqlIrJdG/58uX4+/sTEhJCWFgYoaGhvPvuuwwfPvye\nGyhmZ2djb29f3UlfnxQVFTF58mTatm2Lt7c3HTt25PTp02rHuoecKmwCLl68zdy5ezE0NODIkVl0\n6SIXSYra69KlC0ePHqV79+7V227duoWRkRFWVlb1nqeyspLdu3dz5MgRPDw8ePbZZ6uXxyuKQklJ\nCWZmZo91+s7ExIRt27aRnp5OWloaXl5etGjRAkVR6NChAxEREXh6elJcXExcXByffPKJXp4mXLhw\nIfHx8UyZMgUTExNu3LjBsGHDSElJoUWLhtN8oKH8y8rijDpQUlLB228fZd26s7z11iDmzvWVVk1C\nZ4qKinBwcMDV1ZUOHTqQm5vL6dOnadu2LYmJifX6wl1RUUFQUBBJSUk4Ojpy584dcnJyOHnyJCdO\nnGDZsmXcvn0bBwcHPvroI6ZNm6azY5eUlLB69Wp2796NnZ0df/nLXxg6dKjO9l9fKioqsLKyYsqU\nKTRv3rx6++HDh1m5ciVPP/10vWeSxRlNzOHDN5k7dx/duzsQG/s8Tk6WakcSjUyLFi2IiYlhzJgx\n/PjjjyiKQvfu3fnhhx/qfbSxc+dOkpOTGTp0KIaG2hmQs2fPEhwczNmzZxkwYAAODg5kZWUxf/58\nnJ2dGTBggE6ObWZmxrJly1i2bJlO9qeWqqoqqqqqMDauWRZMTEwoKSlRKdXvayhvv2XEpSM5OcUs\nXXqQ8PAbfPHFSMaO7ah2JNEEFBUVoSgKlpbqvEEKDg4mISGhxsXL+fn5hIaG4uPjQ+fOnau3x8fH\n4+joSEhIiBpRG7QhQ4ZQWFhI9+7dMTAwIDc3l7CwMK5du6bK5Qoy4mrkFEVh27Y4liz5ialTvYiP\nX4ClZTO1Y4kmojbzH6dPn+bQoUM4OjoyceLEx9qXu7s70dHRNbbl5uZiamqKmVnNVbPm5ubk5OQ8\ndt7GbMOGDQQFBREaGoq5uTmZmZmsXbu2wV1jJyOuRuDGjTzmz9/PrVtF/N//jcHPT3c3+hOiriiK\nwsKFC/n2229xdXWluLiYwsJCIiMjad++/SPtKysrCy8vLzw9PXF3dycnJ4dTp04xZcoUwsPDeeqp\npzA0NESj0XDo0CFefvllFi1aVEfPTL9pNBoiIyPJy8vjySef1GkHkkd1vxGXLIfXY5WVGj766Dh+\nfv/H4MHuxMQES9FqhPbu3UuXLl0wMTGhW7duHDx48JH3cfHiRUaMGIGtrS09evTghx9+qIOkjyYq\nKoqQkBDGjh2Ln58fgYGBPPHEEw+8ieTvcXBw4Pjx4zg4OHDo0CHy8vLYunUrq1evxs3NjT179hAV\nFcWePXvw8PBg7ty5dfCMGgdDQ0MGDhzIuHHjVC1af0RGXHrq9Ol05s7dR6tW5nz99Sjat7dTO5Ko\nA5GRkYwePZqAgAAcHR1JS0sjOjqaw4cP4+Pj81D7yMjIoGvXrnTp0gU3NzdycnKIjo7mm2++YdSo\nUXX8DO7vzTffZPfu3fj5+VVvKy0tZefOndy9e/eex/96w0knJ6dHOp2oKAqRkZFcvHgRb29v+vXr\np5dL1ZsiGXE1EnfulPHSSwcYM2Y7ixf35ccfZ0jRasQ++eQTunXrhouLC8bGxri5udGpUydWrVr1\n0PtYv349Li4ueHl5YWFhgaurK76+vrzzzjt1mPzBHBwcKCsrq7Htzp072Nvb3/PYDRs20KZNG/r3\n74+joyOvvvrqQ3d1MDAwYMCAAcyfP5/+/ftL0WoEpHDpkX37rtK169fk5ZUSH7+AGTO6yS9hI5eZ\nmXnP6MLS0pKMjIyH3kdSUtI9+7C1tSUlJUUnGR/X1KlTyc7OJj4+noqKCn7++WeioqJYvHhxjcdF\nRUWxZMkSgoKCGD9+POPGjWPz5s1s3LhRpeRCbVK49EBm5h2mTAnhL385wMaNY/nnP/+Evb3+tZMR\nj27UqFHcuHGjenShKAo3b95k9OjRD72PIUOGkJaWVqMt0dWrV8nOzmbIkCFkZWXpPPfDsLGx4ciR\nI5iamvLNN99w8uRJlixZwgsvvFDjcRs2bKBjx47Y2WnPLFhYWNCtWzf+8Y9/qBFbNAAN5e26zHH9\nDo1GYf36s/ztb/8mOLgnr78+EDMzkwd/o2g07ty5w5NPPklOTg729vZkZ2fj6upKeHj4Pcu876ei\nooLhw4dz9epVHB0duX37Njk5OYwcOZJr167RvHlzjh8/XsfP5PE988wz3Lx5Ey8vr+ptGRkZJCcn\nc+HCBRWTibom9+PSM5cuZTN37j4qKzWsWzcab28HtSMJlVRWVrJv3z4SEhLo3r07w4cPx8jIqHoU\n9jCni6uqqvj8889544036NGjB56enpiamqLRaAgJCeHcuXO4u7vX9VN5LPv372fOnDkMGzaM5s2b\nU1VVxeHDhwkODmb58uVqxxN1SBZn6InS0kreeOMwAwf+k2nTvIiMfE6KVhNnbGzMn/70J1599VVG\njRpFWloaI0aMwMTEBBsbG5YuXVp9u437MTIyonfv3tjZ2eHl5YWpqSmgfWEwNTVt0LfgGDlyJM88\n8wy7du0iIiKCXbt24e3tXeu7JQv9JSOuBuTIkSTmzdtH586t+OKLETg713+HbdGwVVRU4OnpiYOD\nA15eXpSUlHDq1ClGjRrF6tWr//B7y8vLcXJywt/fH2dn7fV+N27cIDExkRs3blT3+NOFs2fPsnTp\nUs6cOUO7du14++23GTlyZK32mZaWxrlz5/D09KRTp046Slo7WVlZhISEUFJSwtixY+nYUVqs6ZKc\nKmzA8vJK+OtfD3LgwHXWrBnBn/7UMH4pRcOzf/9+Fi1aVKP7eHFxMd9//z15eXnVI6n7OXz4MOPH\nj6dVq1ZoNBoKCwsJCwujV69eOst48+ZNevbsibe3N0888QS3b9/m1KlTfP/99wwaNEhnx1FbREQE\n48aNw8XFBSMjI5KSknjnnXekI4cOSa/CBkhRFL77Lp6XXvqRCRM6Ex+/ACsr6S8o7i87O/ueGxT+\nOu9TUlLywMI1aNAg0tPTCQ8Px9jYmKCgIJo10+3/ua+++op27dpVN7Z1c3OjvLyc9957r9EULo1G\nw7PPPktAQACurq4AeHl5sXz5cqZOnUqrVnLPu7okhUslycn5LFgQSkpKAbt2TaFvXxe1Iwk9MHjw\nYP73f/+XoqKi6muzrl27RseOHbG2tn6ofVhYWDBu3Lg6y5icnHxPl3gbGxsuX75cZ8esb2lpaRQU\nFODi8p/fW0tLS5ydnTl27BgTJkxQMV3jJ4sz6lllpYZPPz2Jr+86AgLacvbsXCla4qG5uLiwYsUK\n9u7dy8mTJzl69CgXLlxg06ZNakerNnToUFJSUmp0trhx4wZBQUEqptItGxsbKioqanT+UBSFwsLC\nBtdJvTGSOa56dPZsJsHBe7G2bsbataPx9Ly3tY0QD+Pq1auEhoZibW3NhAkTHnq0VR/Kysp46qmn\nSEtLo3Xr1hQWFlJWVkZ0dDQODtoVsrdv38bExARbW9t6z6fRaLh8+TIWFhY88cQTj72f2bNnc/To\nUXr16oWpqSlxcXFoNBrOnz8vHW105H5zXA2F0pgVFZUpixf/qLRu/ZGyadM5RaPRqB1JiDpVUVGh\n7Ny5U1myZImyfv16paioSFEURbl69arSq1cvxcLCQjEzM1NGjhyp5OTk1Fuu6OhoxdXVVWnZsqVi\nZWWlDBgwQLl9+/Zj7ausrExZsmSJYmtrq5ibmytTp0597H2J3wf87oimoVSyXzI2PmFhiSxYEEr/\n/q58+ulQWrWyUDuSEKqoqqqiffv2tG3bls6dO6PRaIiJicHR0ZEDBw7U+fFLSkpwcXHBx8cHd3d3\nFEUhJiaGNm3aEBYWVufHF49OLkCuZ1lZRTz99C4WLgxl7drRfPPNeClaokk7duwYVVVVeHl5YWho\niLGxMb169eLYsWP1snDjp59+wsbGhnbt2mFgYIChoSE9e/YkIiKCgoKCOj++0B0pXDqmKAobNpzF\n2/trXFysuHhxAUOHPtrdXIVojO7cuUNVVVWNbUZGRlRWVuLj48PEiRMpKiqqs+NXVlbec5G1gYEB\nBgYG9+QSDZsULh26cuVnBg3azNq1Z/jpp2f48MMhmJtLU1whQHthcnZ2do1u9FeuXKF58+ZMmzaN\ny5cvM3/+/Do7/tChQ8nKyqq+JYyiKMTFxVW3whL6Q+a4dKC8vIoPPohk1apoXn99IIsW+WFkJO8J\nhH6prKzk559/pmXLlhgb6/4Sz8DAQAoLC0lISKBVq1ZUVFRQUFCAra0tY8aMobS0lG+//ZbCwsIH\nXkj9uMLDw5kyZQqWlpaUlpZib2/PgQMHqi8iFg2LdM6oI5GRKcybt4/27W05e3Yerq4NZ1myEA9r\n48aNLFu2jLKyMkxMTHjrrbdYsGCBTo9hbm6OgYEBTz/9NOnp6RgbG1NYWMitW7cAbTNhjUZT475h\nuhYUFERmZiZRUVG0aNGCnj17ytJ1PdRQfmJ6N+LKzy9l+fJw9u69yqpVw5k4sbP8Agi9FBERwcSJ\nEwkMDKRly5bk5uZy+PBhtmzZUuvGuL+1d+9e5syZw1NPPYW1tTX5+fmEhoYycOBAnJ2diY2NxcrK\nioMHD+rsmEK/SZNdHVEUhV27LvHiiwcYM6YD778fhI1Nc7VjCfHYpkyZQmZmJl26dKneduXKFczN\nzQkNDdXpsT799FNWrlyJiYkJpaWlVFVV0bZtW4qLi2nRogXh4eE12iiJpk0Klw6kphawcGEo167l\nsm7dGPr3l/PiQv8NHz6ciooKPDw8qrclJSVRXFzMsWPHdH680tJSMjMzcXJyorS0lKNHj2Jra0tA\nQIBOb60itPbt28fKlStJSkrC39+fDz/8sLoBckMn13HVQlWVhlWrovDxWUuvXk6cOzdPipZoNKZM\nmcK1a9eorKwEtBcKX716lSlTpjzyvkpKSggNDeXHH3+kvLz8dx/TvHlz3N3dadasGdbW1owZM4b+\n/ftL0aoDYWFhPPPMM9jZ2TFkyBBycnLo379/9byivpIR1wPExt4iOHgvZmYmrFs3mo4dW6odSQid\nqqqqYvr06Rw8eBAnJycyMzPp168fu3btwsTk4S/niIyMZOzYsdja2qLRaCguLiY0NBRfX986TC/+\nSL9+/TA3N6ddu3bV26Kiopg8eTKvvfaaiskejpwqfETFxRWsXBnBpk3nef/9IJ57rocsvhCNWlxc\nHLGxsXh5eeHj4/NI31tRUUHbtm3x9fWtnqO6fv06165d0/ndlcXDc3V1xd/fv0Yz44sXL9K5c2fW\nr1+vYrKHI6cKH8HBg9fx9v6a1NRC4uLmM3u2jxQt0eh5e3szY8aMRy5aAKdOncLU1LTGwop27dpR\nXFxMfHy8LmOKRzBw4EBu3rxZ/blGoyE9PV3vb+gp13H9Rnb2XV5++SciI1P46quRjBjhqXYkIfSC\nmZkZ5eXlKIpS/SZPURQqKiruuWOzqD/vvPMO/v7+3L17FysrKzIyMnB3d3+s+cuGpKEMI1Q9Vago\nCps3x7JsWTgzZnjz5puDsLComyv3hWiMFEWhS5cu2NjY0LVrVxRF4fz58xgZGREdHa12vCYtPz+f\nLVu2cO3aNQYMGMD48ePrpDNKXZA5rvtITMxh3rx9FBSUsW7daHx9nVTJIYS+S0pKYtq0acTHx6Mo\nCr6+vuzYsQNHR0e1owk9JYXrv1RUVPHxxyf45JOTvPrqAF54oQ/GxjLlJ0RtZWZmYmhoWH23YyEe\nl/Qq/I2TJ1OZO3cfLi5WxMTMxc3NRu1IQjQa/z3CunXrFsXFxbi7u8siJx357VxiU9SkhhiFhWUs\nWhTKxInf8dprA9i/f7oULSHqSG5uLkOHDsXDwwNfX186derE+fPn1Y6ltzQaDe+99x6tWrXC2NiY\nwMBALl26pHYsVTSZwrV79yW6dPmS0tJK4uMXMHVq1yb9jkWIujZz5kyysrKYOnUqkydPxtnZmWHD\nhlFWVqZ2tDoXFRXF2LFj8fLyYsGCBdX3AKuNjz76iC+//JLAwEBmzZpFZWUlTz75JIWFhTpIHo8q\niwAADQRJREFUrF8afeFKTy9kwoRveeWVQ2zbNoH168dia2umdiwhGrX8/Hz+/e9/4+vri7GxMQYG\nBnh6emJhYUF4eLja8erUsWPHGDZsGPn5+Xh6enLy5El69+5Nfn5+rfb7+eef4+/vj52dHcbGxnh5\neWFnZ0dISIiOkuuPRlu4qqo0fPnlKXr0WEu3bg7Exj7Pk0+6qR1LiCbh176HRkZGNbYbGxs3+hHX\n3//+d3r27Ennzp1xcHDAz88PGxsbNm3aVKv95ubmYmlpWWNb8+bNyc7OrtV+9VGjLFxxcVn077+J\nHTviOXJkFitWBNKsWZNchyKEKlq2bEm3bt2ql8YDZGVlkZWVxZAhQ1ROV7cSExNp3bp1jW02Nja1\n7iAyaNAgLl++XP15WVkZKSkpjf7f8/c0qlfzkpIK3n77KOvWneXttwcRHOyLoaHMYwmhhm3btjF0\n6FBSUlJo1qwZOTk57Nix455RQ2PTq1cvUlNTsbHRLvxSFIWsrCzmzJlTq/1+8cUXDBgwgNzcXMzM\nzEhJSeG5555rkk2MG8qreq2v47py5WdGj95Ojx5tWL16OI6OjfuXQzycxMRE4uLi8PLyomPHjmrH\naXI0Gg0nTpygqKiIgQMHNon2T/Hx8QwYMAA3Nzesra1JT0/HzMyMqKgozMxqN79+9+5dvv/+e7Ky\nsggKCqJHjx46St0wNfoLkEtKKjhyJJnhwz0e/GDR6Gk0GmbPns3u3burb9UxYsQIvvnmG71pdyP0\nV3JyMl9++SWJiYkMGjSIOXPmYGFhoXYsvdPoC5cQv7Vlyxb+9re/MWTIEExMTKisrCQ8PJxXXnmF\n559/Xu14ogHIyspi48aNpKamEhQUxLhx4+5ZTCLUJYVLNCkjRoygvLy8xu3ob968SVlZGUeOHFEx\nmWgI4uPjGThwIM7OzlhYWJCWlka3bt3Yu3ev3DusAZH7cYkmxczMjIqKihrb5BYb4leLFy+mU6dO\n9O3bl27dujF8+HDOnz9PWFiY2tHEQ5DCJRql559/noSEhOqLPgsKCoiPj2f+/PkqJxNqSUpK4rXX\nXiM4OJjIyMgat7M3NDTEycmJY8eOqZhQPCyZpRaN0tChQ1mxYgWvvfYaxsbGVFRU8PrrrzN27Fi1\nowkVnDx5khEjRuDu7o6ZmRkajYbc3NwaI/CioiLc3d1VTCkeVn3NcQ0HPgeMgPXAB//1dZnjEnWi\nrKyMjIwMHB0dad68udpxRB3TaDS/O0fVq1cvrK2tq+c8ExMTiYqKYuDAgdjY2HD9+nXS09O5fPky\nVlZW9R1b3Ieac1xGwBdoi1cX4Gmgcz0cVwiaNWuGu7u7FK1GTFEUPvjgg+qu6f7+/jW60CuKwrlz\n52qMpjw9PXFwcODSpUscOXKkuqegFC39UB+nCv2Aa0DSL5/vAMYBTbMfvxBCp1atWsXq1asJDAzE\n2tqaxMREBg8ezNWrV7G3t8fAwAAnJydycnJqtGIyMDDgk08+YdKkSSqmF4+jPkZczkDqbz5P+2Wb\nEEIPKIrCDz/8wMyZM3nhhReIi4tTO1INn332GX5+ftjZ2WFkZESnTp1o06YN27dvr37MG2+8wfHj\nx0lOTiY3N5eoqCiMjIxkzlNP1ceI66Emr1asWFH9cWBgIIGBgXUURwjxKObOncv+/ftxd3enoqKC\nLVu2sGXLlgbzop+Xl0eLFi1qbGvWrFmNrul//vOfsbKy4qOPPuLSpUuMGDGCt956C1NT0/qOK/5A\nREQEERERD3xcfSzO8AdWoJ3jAngF0FBzgYYszhCiAUpISCAgIIAJEyZgYmICQEZGBufPnyc5OblB\nXKw7fvx40tPT8fHxAaC8vJy9e/eyZ88eAgICVE4nauN+izPqY8QVA3gCbkAGMBXtAg0hRAN36tQp\nXFxcqosWgKOjI//+97/Jy8vD3t5exXRaq1atol+/fuTl5WFhYUFKSgr/8z//Q9++fdWOJupIfRSu\nSmAR8CPaFYYbkIUZQugFDw8Pfv75ZxRF+fXdLwUFBZiammJtba1yOi1XV1cSExP54YcfyMjIYNCg\nQY2+a3pTJ70KhRD3pSgK/fr1Izc3l06dOlFaWkpsbCwvv/wyS5curfc8J06cYPHixVy4cAEPDw/e\ne+89Ro4cWe85RP2QXoVCiEdmYGDATz/9xMSJE7l8+TK5ubl8/PHHLFmypN6zXL58mREjRmBmZsak\nSZNwdHRk+vTp0qapCZIRlxBCLyxYsIDTp0/Ts2fP6m2XL1/G0tKSffv2qZhM1BUZcQkh9Fpqauo9\nnS2srKxIT09XKZFQixQuIYReGD58OMnJyfx6dkZRFG7evMmwYcNUTvZgd+/epby8XO0YjYacKhRC\n6IXS0lKeeuop0tLSaN26NXl5eZiYmHDixAns7OzUjve7EhMTmTVrFjExMRgZGTF9+nTWrFmDmZmZ\n2tH0gtwBWQih9yorK9m7dy9nzpyhc+fOTJw4scE2UC4vL8fd3R03Nzc6d+5MeXk50dHR9OvXj40b\nN6odTy9I4RJCiHq0d+9eXnzxRYYMGVK9rbS0lJCQEHJycmTU9RBkcYYQQtSjgoKCe0aDpqamaDQa\nysrKVErVOEjhEkKIOhAUFERKSgoFBQXV265cuULXrl2xsbFRMZn+q4+WT0II0eS0adOGzz//nJde\neglXV1fKysooKiri0KFDakfTezLHJYQQdSgjI4MDBw5gZWXFqFGjZG7rEcjiDCGEEHpFFmcIIYRo\nFKRwCSGE0CtSuIQQQugVKVxCCCH0ihQuIUSTdfHiRZ5++ml69OjBvHnzSElJUTuSeAhSuIQQTdKF\nCxfo378/SUlJPPHEE8TExNC7d29u3bqldjTxALIcXgjRJE2ePJn09HS8vb2rt0VFRTF27Fjeeust\nFZOJX8lyeCGE+I2EhAQcHBxqbGvZsiVxcXEqJRIPSwqXEKJJ6t27N2lpaTW2ZWZm4u/vr1Ii8bDk\nVKEQokm6ceMGfn5+uLi4YG9vT2ZmJiUlJZw5cwZbW1u14wnkVKEQQtTQrl07zp8/z9ChQ2nWrBnT\np0+XoqUnZMQlhBCiQZIRlxBCiEZBCpcQQgi9IoVLCCGEXpHCJYQQQq9I4RJCCKFXpHAJIYTQK1K4\nhBBC6BUpXEIIIfSKFC4hhBB6pckWroiICLUj6Exjei7QuJ6PPJeGqzE9n6b2XKRwNQKN6blA43o+\n8lwarsb0fJrac2myhUsIIYR+ksIlhBBCrzSU7vARwJNqhxBCCNGgHAEC1Q4hhBBCCCGEEEIIIYQQ\nQgghhHh0w4HLQCKwTOUstbURyALi1A6iAy7AYSAeuAi8oG6cWmsORAPngQTgPXXj6IQRcA7Yq3aQ\nWkoCLqB9LqfUjaITNsBO4BLa/2v+6sZ5bB3R/kx+/VOA/r8O6IQRcA1wA0zQvqh0VjNQLQ0AfGgc\nhasN0OOXj1sAV9Dvnw2A+S9/GwNRQH8Vs+jCy8A2YI/aQWrpJmCndggd2gzM/uVjY8BaxSy6Yghk\non1D+7tfbEr80BauJKAC2AGMUzNQLR0D8tQOoSO30L6RAChC++7RSb04OlH8y9+maN805aqYpbba\nAiOB9TScy2hqozE8B9AWqQFoz74AVKIdqei7IOA6kPp7X2xqhcuZmv8Qab9sEw2LG9qRZLTKOWrL\nEG0xzkJ7GjRB3Ti18hmwFNCoHUQHFCAciAGCVc5SW+5ANrAJOAv8H/8Z6euzacD/u98Xm1rhUtQO\nIB6oBdrz9S+iHXnpMw3a059tgYHo74WUo4HbaOcdGsNIpR/aN0YjgIVoRyz6yhjoCXz1y993geWq\nJqo9U2AMEHK/BzS1wpVOzXOmLmhHXaJhMAF2AVuBf6mcRZcKgP1AL7WDPKYAYCzauaHtwFPAFlUT\n1U7mL39nA7vRTiHoq7Rf/pz+5fOdaAuYPhsBnEH78xFo351cR3sqyhT9X5wB2ufSGBZnGKB9MfxM\n7SA60hLtai8AM+AoMFi9ODrzJPq9qtAcsPzlYwvgODBUvTg6cRTo8MvHK4AP1IuiEzuAZ9UO0dCM\nQLti7RrwispZams7kAGUoZ27e07dOLXSH+2ptfP8ZznscFUT1Y432jmH82iXXi9VN47OPIl+ryp0\nR/szOY/2sgt9fw0A6I52xBULfI9+ryq0AH7mP28uhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ\nQgghhBBCqKAx9B0TQp8ZAVOBdmgvIvcDPgFuqBlKiIbMSO0AQjRxPsARwBFtr8bjaG90WqlmKCGE\nEOJB1qBtR/Srcej//ciEqBNNrTu8EA1Nb7QNebui7b7eH3BA22RUTuUL8TvkVKEQ6poDuAKFaJuj\n3kV79+dOaJv03lEvmhANk7HaAYRo4t5SO4AQ+kZOFQrR8LQGOgKD1A4ihBBCCCGEEEIIIYQQQggh\nhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQlf+P57MRSIyywMyAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_decision_boundary(X, y, w, b)" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1.75098391 -2.20772945] 0.926579281609\n" + ] + } + ], + "source": [ + "print w, b" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/notebooks/GD_Regression.ipynb b/notebooks/GD_Regression.ipynb new file mode 100644 index 0000000..d8798cb --- /dev/null +++ b/notebooks/GD_Regression.ipynb @@ -0,0 +1,382 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Linear regression with gradient descent" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + } + ], + "source": [ + "%pylab inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Generate some data\n", + "\n", + "Uniformally sample x from 0 to 1. Generate y from x using a fixed linear transform:\n", + "$$\n", + "y = 2.5 x + 3\n", + "$$\n", + "and add some Gaussian noise." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "np.random.seed(42)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def generate_data(n=100):\n", + " xs = np.random.rand(n)\n", + " ys = 2.5 * xs + 3.0 + np.random.randn(n) * 0.2\n", + " return xs[:, np.newaxis], ys" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "X, y = generate_data()\n", + "scatter(X.ravel(), y)\n", + "title('Generated data')\n", + "xlabel('x')\n", + "ylabel('y')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Define the model, loss, and gradient\n", + "\n", + "The model is a linear function:\n", + "$$\n", + "f(x, w, b) = w^T x + b\n", + "$$\n", + "\n", + "We use square (Euclidean) loss:\n", + "$$\n", + "L = \\frac{1}{2N} \\sum_{i=1}^{N} (f(x_i) - y_i)^2\n", + "$$\n", + "\n", + "The gradient of $L$ wrt. $w$ is:\n", + "$$\n", + "\\Delta_w L = \\frac{1}{N} \\sum_{i=1}^{N} (f(x_i) - y_i) x_i\n", + "$$\n", + "\n", + "And wrt. the bias:\n", + "$$\n", + "\\Delta_b L = \\frac{1}{N} \\sum_{i=1}^{N} (f(x_i) - y_i) \n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def predict(X, w, b):\n", + " return np.dot(X, w) + b\n", + "\n", + "def mean_square_error(p, y):\n", + " return 0.5 * np.mean((p-y)**2)\n", + "\n", + "def loss(X, y, w, b):\n", + " p = predict(X, w, b)\n", + " return mean_square_error(p, y)\n", + "\n", + "def d_loss(X, y, w, b):\n", + " y = y.ravel()\n", + " p = predict(X, w, b)\n", + " dw = ((p - y)[:, np.newaxis] * X).mean(axis=0)\n", + " db = (p - y).mean()\n", + " return dw, db" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Gradient descent" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def gradient_descent_optimize(X, y, loss, d_loss, lr=1e-3, epochs=2000):\n", + " \n", + " # initialize weights and bias\n", + " w = np.zeros(X.shape[1]) \n", + " b = 1\n", + " \n", + " # set the initial learning rate\n", + " alpha = lr\n", + " \n", + " # save learning curves to losses\n", + " losses = []\n", + " \n", + " for i in range(epochs):\n", + " \n", + " # compute loss\n", + " L = loss(X, y, w, b)\n", + " \n", + " # print loss\n", + " if i % 10 == 0:\n", + " print('Epoch {} Loss: {}'.format(i, L))\n", + " \n", + " # compute gradient of loss wrt parameters\n", + " dw, db = d_loss(X, y, w, b)\n", + " \n", + " # update parameters\n", + " w = w - alpha * dw\n", + " b = b - alpha * db\n", + " \n", + " # save loss\n", + " losses.append(L)\n", + " \n", + " return w, b, losses" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0 Loss: 5.311218477\n", + "Epoch 10 Loss: 0.435240816531\n", + "Epoch 20 Loss: 0.0827178676335\n", + "Epoch 30 Loss: 0.0527678697662\n", + "Epoch 40 Loss: 0.0464127358886\n", + "Epoch 50 Loss: 0.0422957158306\n", + "Epoch 60 Loss: 0.0388232615013\n", + "Epoch 70 Loss: 0.0358177256171\n", + "Epoch 80 Loss: 0.0332107091357\n", + "Epoch 90 Loss: 0.0309489698596\n", + "Epoch 100 Loss: 0.0289867502559\n", + "Epoch 110 Loss: 0.0272843832327\n", + "Epoch 120 Loss: 0.0258074569195\n", + "Epoch 130 Loss: 0.0245261166902\n", + "Epoch 140 Loss: 0.0234144615116\n", + "Epoch 150 Loss: 0.0224500203681\n", + "Epoch 160 Loss: 0.0216132980306\n", + "Epoch 170 Loss: 0.0208873809805\n", + "Epoch 180 Loss: 0.0202575955187\n", + "Epoch 190 Loss: 0.0197112111517\n", + "Epoch 200 Loss: 0.0192371832573\n", + "Epoch 210 Loss: 0.0188259298277\n", + "Epoch 220 Loss: 0.0184691377797\n", + "Epoch 230 Loss: 0.0181595949129\n", + "Epoch 240 Loss: 0.0178910441229\n", + "Epoch 250 Loss: 0.0176580569196\n", + "Epoch 260 Loss: 0.017455923696\n", + "Epoch 270 Loss: 0.0172805585279\n", + "Epoch 280 Loss: 0.0171284165808\n", + "Epoch 290 Loss: 0.0169964224551\n", + "Epoch 300 Loss: 0.0168819080193\n", + "Epoch 310 Loss: 0.0167825584769\n", + "Epoch 320 Loss: 0.0166963655744\n", + "Epoch 330 Loss: 0.0166215870072\n", + "Epoch 340 Loss: 0.0165567112002\n", + "Epoch 350 Loss: 0.0165004267528\n", + "Epoch 360 Loss: 0.0164515959301\n", + "Epoch 370 Loss: 0.0164092316652\n", + "Epoch 380 Loss: 0.0163724776062\n", + "Epoch 390 Loss: 0.0163405908058\n", + "Epoch 400 Loss: 0.0163129267039\n", + "Epoch 410 Loss: 0.0162889260977\n", + "Epoch 420 Loss: 0.0162681038387\n", + "Epoch 430 Loss: 0.0162500390254\n", + "Epoch 440 Loss: 0.0162343664953\n", + "Epoch 450 Loss: 0.0162207694437\n", + "Epoch 460 Loss: 0.0162089730195\n", + "Epoch 470 Loss: 0.0161987387697\n", + "Epoch 480 Loss: 0.016189859819\n", + "Epoch 490 Loss: 0.016182156688\n" + ] + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "w, b, losses = gradient_descent_optimize(X, y, loss, d_loss, lr=0.1, epochs=500)\n", + "plot(losses)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 2.37666051] 3.05889975013\n" + ] + } + ], + "source": [ + "print w, b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Plot the regression line" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nRESi4n/m6WU8FAs2RQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "scatter(X.ravel(), y)\n", + "\n", + "def plotline(w, b, x0, x1):\n", + " y0 = w * x0 + b\n", + " y1 = w * x1 + b\n", + " xs = linspace(x0, x1, 100)\n", + " ys = linspace(y0, y1, 100)\n", + " plot(xs, ys, 'r')\n", + " \n", + "plotline(w, b, -0.1, 1.1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}