{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Fundamentals of Machine Learning with Python - Part 1: Simple Linear Regression" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook covers a Python-based solution for the first programming exercise of the machine learning class on Coursera. Please refer to the [exercise text](https://github.com/jdwittenauer/ipython-notebooks/blob/master/exercises/ML/ex1.pdf) for detailed descriptions and equations.\n", "\n", "In this exercise we'll implement simple linear regression using gradient descent and apply it to an example problem. We'll also extend our implementation to handle multiple variables and apply it to a slightly more difficult example." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Linear regression with one variable" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the first part of the exercise, we're tasked with implementing linear regression with one variable to predict profits for a food truck. Suppose you are the CEO of a restaurant franchise and are considering different cities for opening a new outlet. The chain already has trucks in various cities and you have data for profits and populations from the cities." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start by importing some libraries and examining the data." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PopulationProfit
06.110117.5920
15.52779.1302
28.518613.6620
37.003211.8540
45.85986.8233
\n", "
" ], "text/plain": [ " Population Profit\n", "0 6.1101 17.5920\n", "1 5.5277 9.1302\n", "2 8.5186 13.6620\n", "3 7.0032 11.8540\n", "4 5.8598 6.8233" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import os\n", "path = os.getcwd() + '\\data\\ex1data1.txt'\n", "data = pd.read_csv(path, header=None, names=['Population', 'Profit'])\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PopulationProfit
count97.00000097.000000
mean8.1598005.839135
std3.8698845.510262
min5.026900-2.680700
25%5.7077001.986900
50%6.5894004.562300
75%8.5781007.046700
max22.20300024.147000
\n", "
" ], "text/plain": [ " Population Profit\n", "count 97.000000 97.000000\n", "mean 8.159800 5.839135\n", "std 3.869884 5.510262\n", "min 5.026900 -2.680700\n", "25% 5.707700 1.986900\n", "50% 6.589400 4.562300\n", "75% 8.578100 7.046700\n", "max 22.203000 24.147000" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot it to get a better idea of what the data looks like." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\na6eTRiJEt6WUcrHWeqrtdowr/Tt4+niw9O/g6ePB0r+Dp48Hr60+Vs4BAAANCdEAANCQEL29N7bd\ngDGnfwdPHw+W/h08fTxY+nfw9PHgtdLHaqIBAKAhI9EAANCQEA0AAA0d+BBdSnm4lPLBUsqlUsrF\nTa4vpZT/vZTy8VLKQinlb7fRzlFVSvmbvb5d//pMKeV1t5zz0lLKpzec88/bau+oKKW8pZTyqVLK\nQxuOfUEp5XdKKR/rfZ/Z4rbfUEr5s95z+gf3r9WjY4v+/alSykd7rwNvL6U8c4vbbvuawpot+vj1\npZTLG14LXr7FbT2Hd7BF//6bDX37cCnl0ha39RzuQynluaWUd5dSPlxK+VAp5Qd6x70W74Ft+ndo\nXosPfE10KeXhJKdqrZsu0t17Ef/+JC9P8uIk/6rW+uL9a+H4KKUcSnI5yYtrrZ/YcPylSf5ZrfUV\nbbVt1JRSvibJcpJfrbV+We/YhSR/XWv9yd4L8kyt9fwttzuU5D8k+W+TLCb5kySvqrV+eF//AUNu\ni/79+iT311qvl1LuSZJb+7d33sPZ5jWFNVv08euTLNdaf3qb23kO92Gz/r3l+p9J8ula649vct3D\n8RzeUSnlOUmeU2v9QCnlriQPJPmWJN8Vr8W7tk3/zmVIXosP/Eh0H745ay9Ctdb6viTP7D2wNPd1\nSf58Y4Dm9tRa/zDJX99y+JuTvLV3+a1Ze7G51YuSfLzW+h9rrU8m+fXe7dhgs/6ttf5/tdbrvR/f\nl7UXcm7TFs/hfngO92G7/i2llCTfmuTX9rVRY6bW+mit9QO9y08k+UiSY/FavCe26t9hei0WopOa\n5HdLKQ+UUl67yfXHkjyy4efF3jGa+7Zs/aL9lb2PZv5dKeVL97NRY+TZtdZHe5f/MsmzNznH83lv\n/IMk/26L63Z6TWF73997LXjLFh+Dew7v3lcn+WSt9WNbXO853FAp5e4kX57k/fFavOdu6d+NWn0t\nFqKTr6q1nkzyjUm+t/cRGHuslHJHkjNJfmOTqz+Q5Hm11hNJfj7Jb+9n28ZRXavTOti1WgNSSvnh\nJNeTvG2LU7ym3L5fTPL8JCeTPJrkZ9ptzth6VbYfhfYcbqCUMp1kPsnraq2f2Xid1+Ld26p/h+G1\n+MCH6Frr5d73TyV5e9Y+YtnocpLnbvh5rneMZr4xyQdqrZ+89Ypa62dqrcu9y+9KMlFKObrfDRwD\nn1wvNep9/9Qm53g+70Ip5buSvCLJq+sWE0r6eE1hC7XWT9Zab9Rau0l+OZv3nefwLpRSDif5H5L8\nm63O8RzuXyllImsB72211t/qHfZavEe26N+heS0+0CG6lHJnr1g9pZQ7k3x9koduOe2+JH+/rHlJ\n1iZiPBqa2nLko5TyX/Rq9FJKeVHWnpdL+9i2cXFfktf0Lr8myb2bnPMnSb6klPI3ep8OfFvvduyg\nlPINSc4lOVNr/c9bnNPPawpbuGW+ySuzed95Du/Of5Pko7XWxc2u9BzuX+/v1puTfKTW+rMbrvJa\nvAe26t+hei2utR7Yr6x9bPhg7+tDSX64d/x7knxP73JJ8oYkf57kg1mb6dl620fpK8mdWQvFz9hw\nbGMff1+v/x/M2iSBr2y7zcP+lbU3JI8mWc1aLd13J5lN8ntJPpbkd5N8Qe/cL0ryrg23fXnWZoX/\n+fpz3ldf/fvxrNUwXup9/dKt/bvVa4qvvvv4/+y9zi5kLVA859Y+7v3sOXwb/ds7/ivrr70bzvUc\nvr0+/qqslWosbHhdeLnX4oH379C8Fh/4Je4AAKCpA13OAQAAt0OIBgCAhoRoAABoSIgGAICGhGgA\nAGhIiAbYZ6WUG6WUS6WUh0opv1FK+bw9/v3fVUr5hR3OeWkp5Ss3/Pw9pZS/v5ftABhnQjTA/rta\naz1Za/2yJE9mbd30/fbSJE+F6FrrL9Vaf7WFdgCMJCEaoF1/lOR4kpRS/klvdPqhUsrresfuLqV8\ntJTytlLKR0opv7k+cl1KebiUcrR3+VQp5fdv/eWllG8qpby/lPKnpZTfLaU8u5Ryd9aC+//cGxH/\n6lLK60sp/6x3m5OllPeVUhZKKW8vpcz0jv9+KeWeUsofl1L+QynlqwffPQDDSYgGaEkp5XCSb0zy\nwVLK30nyPyZ5cZKXJPlHpZQv7536N5P861rrf5XkM0n+pwZ3854kL6m1fnmSX09yrtb6cJJfSvJz\nvRHxP7rlNr+a5Hyt9UTWdhD80Q3XHa61vijJ6245DnCgCNEA+2+qlHIpycUkf5HkzVnb4vbttdbP\n1lqXk/xWkvWR3kdqre/tXf6/euf2ay7Jvy+lfDDJ/5LkS7c7uZTyjCTPrLX+Qe/QW5N8zYZTfqv3\n/YEkdzdoB8BYOdx2AwAOoKu11pMbD5RStju/bvHz9XxuMOTIFrf9+SQ/W2u9r5Ty0iSvb9TSp1vp\nfb8Rf0OAA8xINMBw+KMk31JK+bxSyp1JXtk7liTPK6V8Re/yt2etRCNJHk7yd3qXz27xe5+R5HLv\n8ms2HH8iyV23nlxr/XSSKxvqnb8zyR/ceh7AQSdEAwyBWusHkvxKkj9O8v4kb6q1/mnv6j9L8r2l\nlI8kmUnyi73jP5bkX5VSLmZtZHgzr0/yG6WUB5L81Ybj70jyyvWJhbfc5jVJfqqUspDkZJIf382/\nDWAclVpv/ZQQgGHRW0njnb3l8AAYEkaiAQCgISPRAADQkJFoAABoSIgGAICGhGgAAGhIiAYAgIaE\naAAAaOj/Bx2CAHZLVRXDAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's implement linear regression using gradient descent to minimize the cost function. The equations implemented in the following code samples are detailed in \"ex1.pdf\" in the \"exercises\" folder." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we'll create a function to compute the cost of a given solution (characterized by the parameters theta)." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def computeCost(X, y, theta):\n", " inner = np.power(((X * theta.T) - y), 2)\n", " return np.sum(inner) / (2 * len(X))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's add a column of ones to the training set so we can use a vectorized solution to computing the cost and gradients." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": true }, "outputs": [], "source": [ "data.insert(0, 'Ones', 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's do some variable initialization." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# set X (training data) and y (target variable)\n", "cols = data.shape[1]\n", "X = data.iloc[:,0:cols-1]\n", "y = data.iloc[:,cols-1:cols]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's take a look to make sure X (training set) and y (target variable) look correct." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
OnesPopulation
016.1101
115.5277
218.5186
317.0032
415.8598
\n", "
" ], "text/plain": [ " Ones Population\n", "0 1 6.1101\n", "1 1 5.5277\n", "2 1 8.5186\n", "3 1 7.0032\n", "4 1 5.8598" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.head()" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Profit
017.5920
19.1302
213.6620
311.8540
46.8233
\n", "
" ], "text/plain": [ " Profit\n", "0 17.5920\n", "1 9.1302\n", "2 13.6620\n", "3 11.8540\n", "4 6.8233" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The cost function is expecting numpy matrices so we need to convert X and y before we can use them. We also need to initialize theta." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": true }, "outputs": [], "source": [ "X = np.matrix(X.values)\n", "y = np.matrix(y.values)\n", "theta = np.matrix(np.array([0,0]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's what theta looks like." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[0, 0]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "theta" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's take a quick look at the shape of our matrices." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((97, 2), (1, 2), (97, 1))" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.shape, theta.shape, y.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's compute the cost for our initial solution (0 values for theta)." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "32.072733877455676" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "computeCost(X, y, theta)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So far so good. Now we need to define a function to perform gradient descent on the parameters theta using the update rules defined in the text." ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def gradientDescent(X, y, theta, alpha, iters):\n", " temp = np.matrix(np.zeros(theta.shape))\n", " parameters = int(theta.ravel().shape[1])\n", " cost = np.zeros(iters)\n", " \n", " for i in range(iters):\n", " error = (X * theta.T) - y\n", " \n", " for j in range(parameters):\n", " term = np.multiply(error, X[:,j])\n", " temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))\n", " \n", " theta = temp\n", " cost[i] = computeCost(X, y, theta)\n", " \n", " return theta, cost" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initialize some additional variables - the learning rate alpha, and the number of iterations to perform." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": true }, "outputs": [], "source": [ "alpha = 0.01\n", "iters = 1000" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's run the gradient descent algorithm to fit our parameters theta to the training set." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[-3.24140214, 1.1272942 ]])" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g, cost = gradientDescent(X, y, theta, alpha, iters)\n", "g" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally we can compute the cost (error) of the trained model using our fitted parameters." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4.5159555030789118" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "computeCost(X, y, g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's plot the linear model along with the data to visually see how well it fits." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtEAAAHwCAYAAABg0TMJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4lFX6xvHvIUYIRSKIaEIVMYCgBKKC2FtcXTGi4qJi\nFysKSiju7s+y7goEKdIULIAiiyJmdUURARXsYNBoIIAKSII0iYBECcn5/XEmGNh0MvNOuT/XxeXk\nzZRnJkjuOfO8zzHWWkREREREpPJqeV2AiIiIiEioUYgWEREREakihWgRERERkSpSiBYRERERqSKF\naBERERGRKlKIFhERERGpIoVoEQlKxphWxhhrjDnM9/XbxpgbA/C4jxhjXvL34/geK8EYs8IYs8sY\nc58x5mljzN8D8djBxhizzhhzQTVve6YxJruma6rE40bsz0tEFKJF5BD4gk++MWa3MWazMWaaMaa+\nPx7LWvsna+30StZUrTBWifs+xxhT5Hu+u4wx2caYmw/hLgcDi621Day1T1lr77TW/qPEY22smcor\nz/cmosD3HPOMMR8bY7oHuo7y+N5cHV/8tbV2ibU2wU+PdasxZpXv573ZGDPPGNPA97j7f14iEnkU\nokXkUF1mra0PdAGSgL8dfAXjhMu/N7m+53sEMASYaozpcPCVilfQK9AS+LaG66sJs33PsQmwFJhr\njDEe1xRwxpizgX8Bfay1DYD2wGxvqxKRYBEuv9RExGPW2hzgbaAjgDHmfWPMP40xHwF7gOOMMQ2N\nMc8ZYzYZY3KMMY8bY6J8148yxowyxmwzxnwPXFry/n33d1uJr283xqz0rRBmGWO6GGNeBFoAb/pW\nUgf7rtvNt6KaZ4z5yhhzTon7aW2M+cB3PwuAoyr5fK21Nh3YAXQo0X5yqzFmA7DId/89jTHf+h77\nfWNMe9/xRcC5wARfrSf4VvIfN8bU872Wcb7v7TbGxB30epxmjPmp+PXzHbvCGPO17/Kpxphlxpid\nvhXU0ZV5Xgc9xwJgOnAM0NgYU8sY8zdjzHpjzBZjzAxjTEPf4xU//37GmFzfz3hQidqmGWMeL/F1\nmSvtvto/8b1mm4wxE4wxh/u+96Hval/5XpdrDr4vY0x732ud53vtex5Ux0RjzFu+n/lnxpg2ZbwE\npwCfWGszfK/Hz9ba6dbaXQc/J2NM8d+54j9FxpibfN9rZ4xZYIz52bhPL3pX6QchIkFJIVpEaoQx\npjlwCZBR4nBfoB/QAFgPTAP2AccDicBFQHEwvh34s+94EnBVOY91NfAIcANuRbgnsN1a2xfYgG91\n3Fo70hgTD7wFPA40AgYBrxljmvju7mVgOS48/wOoVN+1L1BeAcQCmSW+dTZuxTLZGHMCMAsYgFvV\nnYcL+Idba88DlgD3+mpdXXwH1tpfgT/hW/X2/ckt+fjW2s+AX4HzShy+1vd8AMYB46y1RwBtgFcq\n87wOeo61gZuAH62123yXb8KF/+OA+sCEg252LtAW97MdYqrXWlMIDMT9TLoD5wN3A1hrz/Jd52Tf\n63LAyrAxJhp4E3gXOBroD8w0xpRs9/gL8ChwJLAW+GcZdXyG+zk+aozp4Xs9SmWtLf47Vx+4GvgJ\nWOh7Q7QA93M52vfYk0wpn16ISGhRiBaRQ5VujMnDfez/Ae7j72LTrLXfWmv34QLsJcAAa+2v1tot\nwBhcqADoDYy11v5orf0ZeKKcx7wNGGmt/cK3IrzWWru+jOteD8yz1s6z1hZZaxcAy4BLjDEtcKuN\nf7fW/m6t/RAXwMoT53u+24CHgb7W2pIntT3ie375wDXAW9baBb5V3VFADHB6BY9RWbOAPgDG9ele\n4jsGUAAcb4w5ylq721r7aRXut7fvOf4IdAWu8B2/Dhhtrf3eWrsbGAb8xRzYuvKo7/lnAi8U11cV\n1trl1tpPrbX7rLXrgGdwb04qoxsu3A+31u611i4C/ntQHa9baz/3/b2cCXQuo44lQC9cq9JbwHZj\nzOiSq/8H871xmg70ttb+iHtjuM5a+4Lv+WQAr+GCtoiEsMr07ImIlCfFWvteGd/7scTllkA0sMn8\n0V5bq8R14g66flmhGKA58F0l62sJXG2MuazEsWhgse8xd/hWfks+bvNy7i/XWtusnO+XfA5xlHge\n1toiY8yPQHwla6/Iy8DHxpi7cGHvyxJvJm4FHgNWGWN+wIXb/1byfl+x1l5fyvEDno/v8mFA0xLH\nDv4ZdqrkY+7nC6KjcZ9I1PU9xvJK3jwOt3JedFAdJV/zn0pc3oML3aWy1r4NvG1cT/+5wKtANi7Y\nH1x3Q+A/wN+stUt9h1sCp/nelBQ7DHixks9HRIKUQrSI+JMtcflH4HfgKN8K4ME2cWB4bVHO/f6I\na1Go6DGLr/uitfb2g69ojGkJHGmMqVciSLco5T6qouRtcykRIo1799AcyKni/ZR+BWuzjDHrca0f\nJVs5sNauAfr4wl8vYI4xpvFBbxiqKhcXCou1wLXnbAaK31g0B1aV+H5xG8qvuEBc7JhyHmcyri2o\nj7V2lzFmAOW095RSY3NjTK0SQboFsLqc21TId18Lfb3sHQ/+vu91fhk3bWVKiW/9CHxgrb3wUB5f\nRIKP2jlEJCCstZtwfapPGmOO8PUUtzFuAgK4nt37jDHNjDFHAkPLubtngUHGmK7GOd4XiMEFuuNK\nXPcl4DJjTLJxJy/W8Z2I1sy3arsMeNQYc7gx5gzgMmrOK8Clxpjzfb26D+LeSHxcidtuxp3M17CC\n670M3A+chVslBcAYc70xpokv/BWvghaVcvuqmAUMNO5kzPq41p3ZB70p+rsxpq4x5kTgZv6YZrEC\n10LTyBhzDK5PvCwNgJ3AbmNMO+Cug75/8M+4pM9wq8uDjTHRxp1Eehnw70o/Sx9jzOXGmL8YY470\n/T07FddWUlprzD+BerifRUn/BU4wxvT11RNtjDnF+E4wFZHQpRAtIoF0A3A4kIWbajEHONb3vanA\nfOAr4Etgbll3Yq19FRdaXgZ2Aem4nmtwvdR/801mGOTrS70ceAjYilsZTOWPf/+uBU4Dfsb1OM+o\niSfqqzMb15M9HtdDfRnupMe9lbjtKlxo/d73XOLKuOosXLBb5Dv5r9jFwLfGmN24kwz/4uvTxjc9\n4sxqPKXncW0IHwI/AL/hTtwr6QPcyXoLgVHW2nd9x1/E/WzX4d5MlTcqbhDu57IL9/fi4Os+Akz3\nvS4HTLrwvbaX4VbntwGTgBt8r2dV7cCd8LoGF+pfAtKstTNLuW4fXD/2jhITOq7zTfK4CNf7n4tr\nJRkBlHmSooiEBmPtoXxqKSIi4kbc4YJ1dBntOiIiYUUr0SIiIiIiVaQQLSIiIiJSRWrnEBERERGp\nIq1Ei4iIiIhUkUK0iIiIiEgVhcRmK0cddZRt1aqV12WIiIiISJhbvnz5Nmttk4quFxIhulWrVixb\ntszrMkREREQkzPl2gq2Q2jlERERERKpIIVpEREREpIoUokVEREREqigkeqJLU1BQwMaNG/ntt9+8\nLkWAOnXq0KxZM6Kjo70uRURERMTv/BaijTHNgRlAU8ACU6y144wxjwC3A1t9V33IWjuvqve/ceNG\nGjRoQKtWrTDG1FTZUg3WWrZv387GjRtp3bq11+WIiIiI+J0/V6L3AQ9aa780xjQAlhtjFvi+N8Za\nO+pQ7vy3335TgA4SxhgaN27M1q1bK76yiIiISBjwW4i21m4CNvku7zLGrATia/IxFKCDh34WIiIi\nEkkCcmKhMaYVkAh85jvU3xjztTHmeWPMkWXcpp8xZpkxZlmwrnBGRUXRuXNnOnbsyNVXX82ePXuq\nfV/vv/8+f/7znwF44403GD58eJnXzcvLY9KkSfu/zs3N5aqrrqr2Y4uIiIhI1fg9RBtj6gOvAQOs\ntTuBycBxQGfcSvWTpd3OWjvFWptkrU1q0qTCTWM8ERMTw4oVK/jmm284/PDDefrppw/4vrWWoqKi\nKt9vz549GTp0aJnfPzhEx8XFMWfOnCo/joiIiIhUj19DtDEmGhegZ1pr5wJYazdbawuttUXAVOBU\nf9YQKGeeeSZr165l3bp1JCQkcMMNN9CxY0d+/PFH3n33Xbp3706XLl24+uqr2b17NwDvvPMO7dq1\no0uXLsydO3f/fU2bNo17770XgM2bN3PFFVdw8sknc/LJJ/Pxxx8zdOhQvvvuOzp37kxqairr1q2j\nY8eOgOsVv/nmm+nUqROJiYksXrx4/3326tWLiy++mLZt2zJ48OAAv0IiIiIi4cOf0zkM8Byw0lo7\nusTxY3390gBXAN8c8oMNGAArVhzy3Rygc2cYO7ZSV923bx9vv/02F198MQBr1qxh+vTpdOvWjW3b\ntvH444/z3nvvUa9ePUaMGMHo0aMZPHgwt99+O4sWLeL444/nmmuuKfW+77vvPs4++2xef/11CgsL\n2b17N8OHD+ebb75hhe85r1u3bv/1J06ciDGGzMxMVq1axUUXXcTq1asBWLFiBRkZGdSuXZuEhAT6\n9+9P8+bND+FFEhEREYlM/pzO0QPoC2QaY4oT7kNAH2NMZ9zYu3XAHX6swa/y8/Pp3Lkz4Faib731\nVnJzc2nZsiXdunUD4NNPPyUrK4sePXoAsHfvXrp3786qVato3bo1bdu2BeD6669nypQp//MYixYt\nYsaMGYDrwW7YsCE7duwos6alS5fSv39/ANq1a0fLli33h+jzzz+fhg0bAtChQwfWr1+vEC0iIiJS\nDf6czrEUKG1kQ5VnQleokivGNa24J/pg9erV23/ZWsuFF17IrFmzDrhOabfzt9q1a++/HBUVxb59\n+wJeg4iIiEg40LbfftatWzc++ugj1q5dC8Cvv/7K6tWradeuHevWreO7774D+J+QXez8889n8uTJ\nABQWFvLLL7/QoEEDdu3aVer1zzzzTGbOnAnA6tWr2bBhAwkJCTX9tEREREQimkK0nzVp0oRp06bR\np08fTjrppP2tHHXq1GHKlClceumldOnShaOPPrrU248bN47FixfTqVMnunbtSlZWFo0bN6ZHjx50\n7NiR1NTUA65/9913U1RURKdOnbjmmmuYNm3aASvQIiIiInLojLXW6xoqlJSUZJctW3bAsZUrV9K+\nfXuPKpLS6GciIiIioc4Ys9xam1TR9bQSLSIiIiJSRf6cziEiIiIiUq70jBzS5meTm5dPXGwMqckJ\npCTGe11WhRSiRURERMQT6Rk5DJubSX5BIQA5efkMm5sJEPRBWu0cIiIiIuKJtPnZ+wN0sfyCQtLm\nZ3tUUeUpRIuIiIiIJ3Lz8qt0PJgoRIuIiIiIJ+JiY6p0PJgoRFfT9u3b6dy5M507d+aYY44hPj5+\n/9d79+49pPt+/fXXSUtLq5E6r7/+elq3bs3JJ5/MCSecwI033khubm6Ftxs9ejS//fZbjdQgIiIi\nUprU5ARioqMOOBYTHUVqcvBvFKcTC6upcePG+7fufuSRR6hfvz6DBg064DrWWqy11KpVtfcqV1xx\nRY3VCTBmzBhSUlIoKipi9OjRnHfeeWRmZhIdHV3mbUaPHs0tt9xCnTp1arQWERERkWLFJw+G4nSO\niFmJTs/IocfwRbQe+hY9hi8iPSPHL4+zdu1aOnTowHXXXceJJ57Ipk2b6NevH0lJSZx44ok89thj\n+6/brFkzHnnkERITEznppJNYvXo1AM8++ywDBgwA3Ery/fffz+mnn85xxx3H66+/DrgtwO+8807a\ntWvHRRddxMUXX0x6enq5tdWqVYtBgwbRqFEj3n33XYBSaxszZgxbtmzhzDPP5IILLijzeiIiIiKH\nKiUxno+GnscPwy/lo6HnhUSAhggJ0cXjU3Ly8rH8MT7FX0F61apVDBw4kKysLOLj4xk+fDjLli3j\nq6++YsGCBWRlZe2/btOmTcnIyOC2225j9OjRpd7fli1b+Oijj0hPT2fYsGEAvPrqq+Tk5JCVlcW0\nadP45JNPKl1fly5dWLVqFUCptQ0cOJCjjz6aJUuW8N5775V5PREREZFIFREhOtDjU9q0aUNS0h+7\nRc6aNYsuXbrQpUsXVq5ceUAA7dWrFwBdu3Zl3bp1pd5fSkoKxhhOOukkcnJc8F+6dCm9e/emVq1a\nxMXFcfbZZ1e6vpJbvZdXW0mVvZ6IiIhIJIiInuhAj0+pV6/e/str1qxh3LhxfP7558TGxnL99dcf\ncMJe7dq1AYiKimLfvn2l3l/xdeDAAFxdK1as4NJLL62wtso+BxEREZFIExEr0V6OT9m5cycNGjTg\niCOOYNOmTcyfP79G7rdHjx7MmTMHay2bNm3iww8/rPA21lrGjBnD9u3bufDCC8utrUGDBuzatcuv\nz0FEREQkVEXESnRqcsIBW0pC4MandOnShQ4dOtCuXTtatmxJjx49auR+e/fuzaJFi2jfvj0tW7Yk\nMTGRhg0blnrdgQMH8vDDD5Ofn0/37t1ZtGgR0dHR5dbWr18/LrjgApo3b86CBQv88hxEREREQpWp\nifYAf0tKSrLLli074NjKlStp3759pe8jPSMnJMenlGf37t3Ur1+frVu3ctppp/HZZ5/RpEkTz+qp\n6s9EREREJNgYY5Zba5Mqul5ErESDG58S6qH5YH/605/YuXMnBQUFPProo54GaBEREZFIEjEhOhwt\nWbLE6xJEREREIlJEnFgoIiIiIlKTQjpEh0I/d6TQz0JEREQiSciG6Dp16rB9+3aFtyBgrWX79u3U\nqVPH61JEREREAiJke6KbNWvGxo0b2bp1q9elCO5NTbNmzbwuQ0RERCQgQjZER0dH07p1a6/LEBER\nEZEIFLLtHCIiIiIiXgnZlWgRERGJbOG4kZqEDoVoERERCTnpGTkMm5tJfkEhADl5+QybmwmgIC0B\noXYOERERCTlp87P3B+hi+QWFpM3P9qgiiTQK0SIiIhJycvPyq3RcpKYpRIuIiEjIiYuNqdJxkZqm\nEC0iIiIhJzU5gZjoqAOOxURHkZqc4FFFEml0YqGIiIiEnOKTBzWdQ7yiEC0iIiIhKSUxXqFZPKN2\nDhERERGRKlKIFhERERGpIoVoEREREZEqUogWEREREakihWgRERERkSrSdA4RERGRAErPyNFovjCg\nlWgRERGRAEnPyGHY3Exy8vKxQE5ePsPmZpKekeN1ad4pKoL0dPjXv7yupEoUokVEREQCJG1+NvkF\nhQccyy8oJG1+tkcVeWjvXnjhBTjxRLjiCpg+HX7/3euqKk0hWkRERCRAcvPyq3Q8LO3eDWPGQJs2\ncMstULs2zJoF337rLocI9USLiIiIBEhcbAw5pQTmuNgYD6oJsG3bYPx4mDABfv4ZzjkHpk6F5GQw\nxuvqqkwr0SIiIiIBkpqcQEx01AHHYqKjSE1O8KiiAFi/Hu6/H1q0gMcegzPPhE8+gcWL4eKLQzJA\ng1aiRURERAKmeApHREzn+OYbGDnStWoAXH89DB4M7dt7W1cNUYgWERERCaCUxPjwDM3FPv4Yhg+H\nN9+EunXh3nvhgQegeXOvK6tRCtEiIiIicmishXnzYMQIWLIEGjWChx+G/v2hcWOvq/MLhWgRERER\nqZ59+2D2bBeeMzPdavPYsXDbbVCvntfV+ZVCtIiIiIhUzZ49bsbzqFGwbh106ODmPPfpA9HRXlcX\nEArRIiIiIh4JuS3Ad+yASZNg3DjYuhW6d3crz5ddBrUia+ibQrSIiIiIB4q3AC/ewbB4C3Ag+IJ0\nbq7bIOXpp91mKZdcAkOHwhlnhOyIukMVWW8ZRERERIJESGwBnp3t+ptbtYLRo6FnT1ixAt56y817\njtAADVqJFhEREfFEUG8BvmyZG1M3d67bivv22+HBB+G447yuLGgoRIuIiIh4IOi2ALcWFi504Xnh\nQmjYEIYNg/vug6ZNvakpiKmdQ0RERMQDQbMFeGEhzJkDp5wCF14IWVlup8ENG+Cf/1SALoNWokVE\nREQ84PkW4L//Di++6ALzmjXQti1MnQp9+7oWDimXQrSIiIiIRzzZAnznTpgyxZ0ouGkTdO0Kr74K\nV1wBUVEV314AhWgRERGRyLB5Mzz1FEycCL/8Ahdc4FaizzsvoqdsVJdCtIiIiEg4++EHt7Pg88+7\nFo4rr4QhQyApyevKQppCtIiIiEg4+vprGDECZs92bRo33ACpqXDCCV5XFhYUokVERETChbWwZIkb\nU/f221C/PjzwAAwYAHFxXlcXVhSiRUREREJdURG8+aYLz59+Ck2auPF0d90FRx7pdXVhSSFaRERE\nJFTt3QuzZrkxdVlZbnvuiRPh5pshxqNNWyKE3zZbMcY0N8YsNsZkGWO+Ncbc7zveyBizwBizxvdf\nvT0SERERqYpff4Vx4+D44+Gmm1zP88yZbt7z3XcrQAeAP3cs3Ac8aK3tAHQD7jHGdACGAguttW2B\nhb6vRURERKQi27fDo49Cixauz7l1a5g3D776Cq69Fg5Tk0Gg+O2VttZuAjb5Lu8yxqwE4oHLgXN8\nV5sOvA8M8VcdIiIiIiHvxx/d5ihTpsCePdCzpxtTd/rpXlcWsQLydsUY0wpIBD4DmvoCNsBPQKkb\nshtj+gH9AFq0aOH/IkVERESCTVaW63eeOdN93aePC88nnuhtXeLXdg4AjDH1gdeAAdbanSW/Z621\ngC3tdtbaKdbaJGttUpMmTfxdpoiIiEjw+PRTSElxYfnVV12f89q1MGOGAnSQ8OtKtDEmGhegZ1pr\n5/oObzbGHGut3WSMORbY4s8aREREREKCtfDOO26DlA8+cKPpHn4Y7r0XjjrK6+rkIP6czmGA54CV\n1trRJb71BnCj7/KNwH/8VYOIiIhI0Nu3z42pS0yESy6B775z/c8bNsAjjyhAByl/rkT3APoCmcaY\nFb5jDwHDgVeMMbcC64HefqxBREREJDjl58O0aZCWBj/8AO3awQsvuCkbhx/udXVSAX9O51gKmDK+\nfb6/HldEREQkqOXlweTJMHYsbNkCp53mVp579oRafj9dTWqIhgmKiIiIBMKmTS44T54Mu3ZBcjIM\nHQpnnw2mrHVHCVYK0SIiIiL+tHata9mYNs31P/fuDYMHux5oCVkK0SIiIiL+sHy5m7Tx2msQHQ23\n3AKDBkGbNl5XJjVAIVpERESkplgLixfD8OGwYAEccYRbdb7/fjjmGK+rkxqkEC0iIiJyqIqKID3d\nhecvvnCBecQIuOMOaNjQ6+rEDxSiRURERKrr99/dltwjR0J2tmvVeOYZuOEGqFPH6+rEjxSiRURE\nRKpq1y6YMsWNpsvNhS5d4JVXoFcviIryujoJAIVoERERkcrauhWeegomTHDzns87z03duOACjamL\nMArRIiIiIhVZtw5GjYLnn4fffnMrzkOGwCmneF2ZeEQhWkRERKQsmZnuBMF//9vtJnjDDZCaCgkJ\nXlcmHlOIFhERETnY0qVu0sZbb0G9ejBgAAwcCPHxXlcmQUIhWkRERATcmLp581x4/ugjaNwYHnsM\n7rkHGjXyujoJMgrRIiIiEtkKCly7xogR8O230LIljB/vdhisW9fr6iRIKUSLiIhIZNqzB557zp0w\nuGEDdOwIL74I11zjtukWKYdCtIiIiESWn392I+rGj4dt26BHD5g4ES69VGPqpNIUokVERCQybNzo\nNkeZMgV+/RX+/Gc3pu6MM7yuTEKQQrSIiIiEt1Wr3LbcL73kTh689loYPNi1b4hUk0K0iIiIhKfP\nP3eTNtLToU4duPNOeOABaNXK68okDChEi4iISPiwFhYscOF58WI48kj429+gf39o0sTr6iSMKESL\n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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(data.Population.min(), data.Population.max(), 100)\n", "f = g[0, 0] + (g[0, 1] * x)\n", "\n", "fig, ax = plt.subplots(figsize=(12,8))\n", "ax.plot(x, f, 'r', label='Prediction')\n", "ax.scatter(data.Population, data.Profit, label='Traning Data')\n", "ax.legend(loc=2)\n", "ax.set_xlabel('Population')\n", "ax.set_ylabel('Profit')\n", "ax.set_title('Predicted Profit vs. Population Size')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looks pretty good! Since the gradient decent function also outputs a vector with the cost at each training iteration, we can plot that as well. Notice that the cost always decreases - this is an example of a convex optimization problem." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtQAAAHwCAYAAACG+PhNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xe4XFW9//H39yQkkAQIgYQaCELonYD0FqQGEAtdlCqK\nvV1BL3r1Kv4uXAVBKRcsCNJCk470IhJSKEJAOiS0EJBAICFl/f5Yc8zJyZxkn8yZs+ec8349z35m\nZu89M9/JpnxYfPdakVJCkiRJ0uJpKrsASZIkqSszUEuSJEk1MFBLkiRJNTBQS5IkSTUwUEuSJEk1\nMFBLkiRJNTBQS1IPExG7RMQTHX1uVxARkyJil7LrkNS9GKgldRsR8WJEfBgR77fYzi67rlpExI4t\nfsv0iEitft/q7f3MlNLdKaUNO/rc9oqI+yNiRqvfc009vkuS6ql32QVIUgfbL6V0+6JOiojeKaXZ\ni9rX3s/oaCml+4ABle8bBrwADGzreyOiqfK+ufWsqwOdkFL6Q9lFSFItHKGW1CNExBci4oGI+FVE\nTAV+3Ma+poj4YUS8FBFvRsRFEbFs5TOGVUaIj4mIl4E7q3zPxIgY1eJ174iYEhFbRMSSEXFxREyN\niH9FxMMRsWIH/Lb7I+KnEfEgMB1YPSKOrdTyXkQ8FxHHtjh/94h4scXrSRHxrYh4PCLejYhLI6Jv\ne8+tHD8pIl6PiMkRcVzlz2vYYvym3Sv/x+GUyp/XCxFxSIvjAyt/llMq550UEdHi+Bcj4qnK7/9H\nRGza4uO3aKt+SVocBmpJPcnHgeeBFYGftbHvC5VtV+Bj5NHh1m0jOwPrA3tW+Y5LgUNbvN4TeCul\nNB74PLAsMBRYHjgB+LC2n/RvnwOOBpYBJgFvAPtWXh8HnBURmyzk/QcBnyD/5i0rn9eucyv/IfFV\n8p/dOsBui/9zAFgNWBpYBTgG+F1ErF059lugX6WG3SrHj6zUcSjwQ+Bw8u//FPD2ouqXpMVloJbU\n3VxbGf1t3o5rcezVlNJZKaXZKaUP29h3OPDLlNLzKaX3gZOAQyKiZYvcj1NK01t8Rkt/BvaPiH6V\n14eRQzbALHKQXjulNCelNC6lNK2DfvfvUkoTU0qzKr/l+spvSCmlO4E7gB0X8v4zUkqvp5SmAjcA\nmy3GuQcBF1bqmA78V4G6f9vqev2oxbG5wI9SSjMrv+EW4LMRsUTlu76fUnovpfQ88CvmBeNjgV9U\n/nxTSumfKaVXFvO3StIi2UMtqbv55EJ6qF8psG8V4KUWr18i/7OyZWtGtc8BIKX0bERMBPaLiOuB\n/YHNK4f/RB6dviwiBgIXAz9IKc1q6/PaYb6aKqPF/wkMJw+e9AMeXsj7X2/x/ANg0GKcuwpwf1s1\nteHLC+mhnppS+qDF65cq3zEE6MWC12nVyvOhwHML+c72/FZJWiRHqCX1JKnAvleBNVq8Xh2YTW6h\nWNjntNTc9nEA8GRK6VmAyujxf6WUNgC2A0ZRaVPoAP+uKSKWAkYDpwIrppQGArcB0cZ7O8pr5DaN\nZkNr/LzlK7+l2erk6/MmMIcFr9PkyvNXgLVq/G5JKsxALUnzuxT4ZkSsGREDgJ8Dl7dzNo/LgD2A\nL5FbQACIiF0jYuOI6AVMI7eA1GM2jr5AH2AKMKcyWj2yDt/T2hXAMRGxbqXl5T9r/Lwm8o2ifSLP\nHb03MLoyoj8a+HlEDIiINYFvkkf8AS4AvhcRm0c2PCJqDfeS1CYDtaTu5vqobV7j35FbM+4lT1E3\ng3yjXWEppdeAB8mj0Je3OLQSOQhOAyYC91S+i4g4NyLObWetbX3/v8gB8xryzXifIfcK11VK6Xrg\nHPKf3TPAA5VDMxfytnNbXa8xLY5NIs9a8hrwR+DYlNIzlWNfBj4CXiT/Of4RuKhSx6XA/yP/2U8D\nrgaWq/kHSlIbIqVF/Z9LSZLaLyI2BsYDfds7L3ZE7A5ckFIaVo/aJKkjOUItSeowEXFgpUVjEPAL\n4LoutMiMJC0WA7UkqSOdCLwFPEtulzmx3HIkqf5s+ZAkSZJq4Ai1JEmSVAMDtSRJklSDLrdS4gor\nrJCGDRtWdhmSJEnq5saNG/dWSmnwos7rcoF62LBhjB07tuwyJEmS1M1FxEtFzrPlQ5IkSaqBgVqS\nJEmqgYFakiRJqoGBWpIkSaqBgVqSJEmqgYFakiRJqoGBWpIkSaqBgVqSJEmqgYFakiRJqoGBWpIk\nSaqBgVqSJEmqgYFakiRJqoGBWpIkSaqBgVqSJEmqgYFakiRJqoGBWpIkSaqBgbqIuXPhnXdg5syy\nK5EkSVKDMVAXMWkSDBoEF19cdiWSJElqMAbqIiLyY0rl1iFJkqSGY6AuwkAtSZKkNhioizBQS5Ik\nqQ0G6iIM1JIkSWqDgboIA7UkSZLaYKAuwkAtSZKkNhioizBQS5IkqQ0G6iIM1JIkSWqDgboIA7Uk\nSZLaYKAuoqnyx2SgliRJUisG6iKaR6jnzi23DkmSJDUcA3URtnxIkiSpDQbqIgzUkiRJaoOBuggD\ntSRJktpgoC7CQC1JkqQ2GKiLMFBLkiSpDQbqIgzUkiRJaoOBuggDtSRJktpgoC7CQC1JkqQ2GKiL\nMFBLkiSpDQbqIlx6XJIkSW0wUBfh0uOSJElqg4G6CFs+JEmS1AYDdREGakmSJLXBQF2EgVqSJElt\nMFAXYaCWJElSGwzURRioJUmS1AYDdREGakmSJLXBQN0eBmpJkiS1YqAuKsJALUmSpAUYqIsyUEuS\nJKkKA3VRTU0GakmSJC3AQF1UhEuPS5IkaQEG6qJs+ZAkSVIVBuqiDNSSJEmqwkBdlIFakiRJVRio\nizJQS5IkqQoDdVEGakmSJFVR10AdEQMjYnREPBUREyNi21bHd4mIdyPikcp2Sj3rqYmBWpIkSVX0\nrvPnnwncklL6TET0AfpVOee+lNKoOtdROwO1JEmSqqhboI6IZYGdgC8ApJQ+Aj6q1/fVnYFakiRJ\nVdSz5WNNYArw+4iYEBEXRET/KudtFxGPRcTNEbFhHeupjYFakiRJVdQzUPcGtgDOSSltDkwHvt/q\nnPHA6imlTYCzgGurfVBEHB8RYyNi7JQpU+pY8kIYqCVJklRFPQP1JGBSSumhyuvR5ID9bymlaSml\n9yvPbwKWiIgVWn9QSun8lNKIlNKIwYMH17HkhWhqculxSZIkLaBugTql9DrwSkSsW9k1Eniy5TkR\nsVJEROX51pV6ptarppo4Qi1JkqQq6j3Lx1eBSyozfDwPHBURJwCklM4FPgN8KSJmAx8Ch6TUoKnV\nQC1JkqQq6hqoU0qPACNa7T63xfGzgbPrWUOHMVBLkiSpCldKLMpALUmSpCoM1EUZqCVJklSFgboo\nA7UkSZKqMFAXZaCWJElSFQbqogzUkiRJqsJAXZSBWpIkSVUYqIsyUEuSJKkKA3VRTU0GakmSJC3A\nQF1UBMydW3YVkiRJajAG6qJs+ZAkSVIVBuqiDNSSJEmqwkBdlIFakiRJVRioizJQS5IkqQoDdVEG\nakmSJFVhoC7KQC1JkqQqDNRFGaglSZJUhYG6KAO1JEmSqjBQF2WgliRJUhUG6qJcelySJElVGKiL\nculxSZIkVWGgLsqWD0mSJFVhoC7KQC1JkqQqDNRFGaglSZJUhYG6KAO1JEmSqjBQF2WgliRJUhUG\n6qIM1JIkSarCQF2UgVqSJElVGKiLMlBLkiSpCgN1UQZqSZIkVWGgLsqlxyVJklSFgboolx6XJElS\nFQbqomz5kCRJUhUG6qIM1JIkSarCQF2UgVqSJElVGKiLMlBLkiSpCgN1UQZqSZIkVWGgLspALUmS\npCoM1EUZqCVJklSFgbooA7UkSZKqMFAXZaCWJElSFQbqolx6XJIkSVUYqIty6XFJkiRVYaAuypYP\nSZIkVWGgLspALUmSpCoM1EUZqCVJklSFgbooA7UkSZKqMFAXZaCWJElSFQbqogzUkiRJqsJAXZSB\nWpIkSVUYqIsyUEuSJKkKA3VRBmpJkiRVYaAuykAtSZKkKgzURTU1ufS4JEmSFmCgLsoRakmSJFVh\noC7KQC1JkqQqDNRFGaglSZJUhYG6KAO1JEmSqjBQF2WgliRJUhUG6qIM1JIkSarCQF2UgVqSJElV\nGKiLMlBLkiSpCgN1UQZqSZIkVWGgLspALUmSpCoM1EW59LgkSZKqMFAX5Qi1JEmSqjBQF2WgliRJ\nUhUG6qIM1JIkSarCQF2UgVqSJElVGKiLMlBLkiSpCgN1UQZqSZIkVWGgLspALUmSpCoM1EUZqCVJ\nklSFgbooA7UkSZKqMFAXZaCWJElSFQbqopqaDNSSJElagIG6qAiYO7fsKiRJktRgDNRF2fIhSZKk\nKgzURRmoJUmSVIWBuigDtSRJkqowUBdloJYkSVIVdQ3UETEwIkZHxFMRMTEitm11PCLi1xHxbEQ8\nFhFb1LOemhioJUmSVEXvOn/+mcAtKaXPREQfoF+r43sDwyvbx4FzKo+Nx0AtSZKkKuo2Qh0RywI7\nARcCpJQ+Sin9q9VpBwAXpezvwMCIWLleNdXEQC1JkqQq6tnysSYwBfh9REyIiAsion+rc1YFXmnx\nelJlX+MxUEuSJKmKegbq3sAWwDkppc2B6cD3F+eDIuL4iBgbEWOnTJnSkTW2pwgDtSRJkhZQz0A9\nCZiUUnqo8no0OWC3NBkY2uL1apV980kpnZ9SGpFSGjF48OC6FLtILj0uSZKkKuoWqFNKrwOvRMS6\nlV0jgSdbnfYX4MjKbB/bAO+mlF6rV001celxSZIkVVHvWT6+ClxSmeHjeeCoiDgBIKV0LnATsA/w\nLPABcFSd61l8tnxIkiSpiroG6pTSI8CIVrvPbXE8ASfWs4YOY6CWJElSFa6UWJSBWpIkSVUYqIsy\nUEuSJKkKA3VRBmpJkiRVYaAuykAtSZKkKgzURRmoJUmSVIWBuigDtSRJkqowUBdloJYkSVIVBuqi\nBgzIgfq998quRJIkSQ3EQF3U0KH5cdKkcuuQJElSQzFQF9UcqF95pdw6JEmS1FAM1EWttlp+NFBL\nkiSpBQN1Uauumm9MNFBLkiSpBQN1UX365LaPO+90tg9JkiT9m4G6PU4+Ge67Dy6+uOxKJEmS1CAM\n1O1x3HGwzTbwzW/C66+XXY0kSZIagIG6PZqa4He/g/ffz+Ha1g9JkqQez0DdXuuvD6eeCjfcAL//\nfdnVSJIkqWQG6sXx9a/DzjvDN74BL75YdjWSJEkqkYF6cTQ1wR/+kJ8fdRTMnVtqOZIkSSqPgXpx\nDRsGv/oV3H03nHVW2dVIkiSpJAbqWhx9NOy7L3z/+/DUU2VXI0mSpBIYqGsRARdcAP37w5FHwuzZ\nZVckSZKkTmagrtVKK8E558DDD+fZPyRJktSjGKg7wmc/C4ceCj/5CYwfX3Y1kiRJ6kQG6o5y9tkw\nZAgcfjh88EHZ1UiSJKmTGKg7yqBBcNFF+ebEb3+77GokSZLUSQzUHWnkSPjOd+Dcc+Evfym7GkmS\nJHUCA3VH++//hs02g2OOgddeK7saSZIk1ZmBuqP17Qt//jNMnw5f+IKrKEqSJHVzBup6WH99+OUv\n4bbb4Mwzy65GkiRJdWSgrpcvfhH23z+vovjoo2VXI0mSpDoxUNdL8yqKgwbBYYfBhx+WXZEkSZLq\nwEBdT4MHwx//CE8+Cd/9btnVSJIkqQ4M1PW2xx7wzW/Cb37jVHqSJEndkIG6M5x6KmyxRZ714+WX\ny65GkiRJHchA3Rn69oXLLoNZs+DQQ/OjJEmSugUDdWcZPhzOPx/+9jf40Y/KrkaSJEkdxEDdmQ49\nFI49NreA3HZb2dVIkiSpAxioO9uZZ8KGG8LnPufS5JIkSd2Agbqz9esHV1wB770HRxwBc+aUXZEk\nSZJqYKAuwwYbwNlnw513ws9/XnY1kiRJqoGBuixHHQWHHw4//jHcc0/Z1UiSJGkxGajLEgHnnANr\nrZWXJn/jjbIrkiRJ0mIwUJdp6aXhyivh7bfzDCCzZ5ddkSRJktrJQF22TTfNI9V33QWnnFJ2NZIk\nSWonA3Uj+MIX4Ljj8vzU119fdjWSJElqBwN1o/j1r2GLLeDII+H558uuRpIkSQUZqBvFkkvC6NH5\n+Wc+AzNmlFuPJEmSCjFQN5I114SLL4YJE+CrXy27GkmSJBVgoG40++4LP/gBXHAB/P73ZVcjSZKk\nRTBQN6L/+i8YORK+/GV45JGyq5EkSdJCGKgbUa9ecOmlsMIK8KlPwdSpZVckSZKkNhioG9XgwXDV\nVfDqq3DIIS76IkmS1KAKBeqI+FORfepgW2+dF325/XY46aSyq5EkSVIVvQuet2HLFxHRC9iy48vR\nAo46CsaPh9NPh803h8MOK7siSZIktbDQEeqIOCki3gM2iYhple094E3guk6pUPDLX8JOO8Gxx+Yp\n9SRJktQwFhqoU0qnppSWBk5LKS1T2ZZOKS2fUrIHobMssQRceSUsvzwceCC89VbZFUmSJKmi6E2J\nN0REf4CIOCIifhkRa9SxLrU2ZAhccw28/jocdJA3KUqSJDWIooH6HOCDiNgU+DbwHHBR3apSdSNG\nwPnnw113wXe/W3Y1kiRJonignp1SSsABwNkppd8AS9evLLXpyCPh61+HM86AP/yh7GokSZJ6vKKB\n+r2IOAn4HHBjRDQBS9SvLC3UaafllRSPPx7uv7/saiRJknq0ooH6YGAmcHRK6XVgNeC0ulWlhWu+\nSXHNNfNNii+8UHZFkiRJPVahQF0J0ZcAy0bEKGBGSske6jIttxxcf32+OXG//WDatLIrkiRJ6pGK\nrpR4EDAG+CxwEPBQRHymnoWpgHXWgdGj4amn4NBDYc6csiuSJEnqcYq2fPwA2Cql9PmU0pHA1sB/\n1q8sFTZyJJx9Ntx0E3zve2VXI0mS1OMUXXq8KaX0ZovXUykexlVvJ5wAEyfmFRXXXz+vqChJkqRO\nUTRQ3xIRtwKXVl4fDNxUn5K0WP73f+Hpp+FLX4K114Zddim7IkmSpB5hoaPMEbF2RGyfUvoucB6w\nSWV7EDi/E+pTUb17w+WXw/Dh8OlPw7PPll2RJElSj7Coto0zgGkAKaWrU0rfSil9C7imckyNZNll\n88wfEbDvvjB1atkVSZIkdXuLCtQrppQeb72zsm9YXSpSbdZaC669Fl56CQ44AGbMKLsiSZKkbm1R\ngXrgQo4t1ZGFqAPtsANcdBE88AB8/vMwd27ZFUmSJHVbiwrUYyPiuNY7I+JYYFx9SlKHOOigvET5\nFVfA979fdjWSJEnd1qJm+fgGcE1EHM68AD0C6AMcWM/C1AG+/e28LPlpp8GwYfDlL5ddkSRJUrez\n0ECdUnoD2C4idgU2quy+MaV0Z90rU+0i4Mwz4ZVX4KtfhaFD8zLlkiRJ6jCF5qFOKd0F3FXnWlQP\nvXvDpZfmeakPOQTuuQdGjCi7KkmSpG7D1Q57gv794YYbYMiQPJ3eCy+UXZEkSVK3YaDuKVZcEW6+\nGWbNgr33hrfeKrsiSZKkbsFA3ZOstx5cd12eo3rUKJg+veyKJEmSujwDdU+z4455ifKHH85LlH/0\nUdkVSZIkdWkG6p5o//3h//4Pbr0VjjrKhV8kSZJqUGiWj8UVES8C7wFzgNkppRGtju8CXAc03yV3\ndUrpJ/WsSRVHHw1vvgknnQSDB8OvfpWn2ZMkSVK71DVQV+yaUlrYHXD3pZRGdUIdau0//iOH6l/9\nKt+0eNJJZVckSZLU5XRGoFajioDTT4cpU+Dkk/NI9bHHll2VJElSl1LvHuoE3B4R4yLi+DbO2S4i\nHouImyNiwzrXo9aamuB3v8tT6X3xi3DNNWVXJEmS1KXUO1DvkFLaDNgbODEidmp1fDywekppE+As\n4NpqHxIRx0fE2IgYO2XKlPpW3BMtsQRceSVsvTUceijc6crykiRJRdU1UKeUJlce3wSuAbZudXxa\nSun9yvObgCUiYoUqn3N+SmlESmnE4MGD61lyz9W8muLw4XkWkAcfLLsiSZKkLqFugToi+kfE0s3P\ngT2Af7Q6Z6WIPLVERGxdqWdqvWrSIiy/PPz1r7DyyrkFZMKEsiuSJElqePUcoV4RuD8iHgXGADem\nlG6JiBMi4oTKOZ8B/lE559fAISmlVMeatCgrrQR33AHLLgt77AETJ5ZdkSRJUkOLrpZfR4wYkcaO\nHVt2Gd3fM8/ATjvlmUDuuw/WWqvsiiRJkjpVRIxrvY5KNa6UqOqGD8/tHx99BCNHwiuvlF2RJElS\nQzJQq20bbZSXJ3/nHdh9d3jjjbIrkiRJajgGai3cllvCTTfBpEnwiU/A22+XXZEkSVJDMVBr0bbf\nHq67Dp5+Ot+o+M47ZVckSZLUMAzUKmb33fMqio8/nkP1v/5VdkWSJEkNwUCt4vbZB666Ch591FAt\nSZJUYaBW+4waBVdfDY88AnvuCe++W3ZFkiRJpTJQq/1Gjcoj1RMm5JFqQ7UkSerBDNRaPPvtB1de\nmUP1nnvCtGllVyRJklQKA7UW3wEHwBVXwLhxhmpJktRjGahVm09+MofqsWPtqZYkST2SgVq1O/DA\neSPVI0fC1KllVyRJktRpDNTqGAcemOep/sc/YNddXaZckiT1GAZqdZx994Ubb4TnnoOdd4bJk8uu\nSJIkqe4M1OpYI0fCrbfCq6/CTjvBiy+WXZEkSVJdGajV8XbYAe64A955J4fqZ54puyJJkqS6MVCr\nPrbaCu66Cz78MIfqJ58suyJJkqS6MFCrfjbdFO65ByJyT/X48WVXJEmS1OEM1KqvDTaAe++F/v1h\nl13g7rvLrkiSJKlDGahVf2uvDQ88AEOHwl57wbXXll2RJElShzFQq3Osuircdx9sthl8+tPw+9+X\nXZEkSVKHMFCr8wwaBLffDrvvDkcfDaedVnZFkiRJNTNQq3MNGADXXw8HHwzf+x78x39ASmVXJUmS\ntNh6l12AeqA+feCSS2C55eB//gemToVzz4Xe/uUoSZK6HhOMytGrF/z2tzB4MPz0pzBlClx6KfTr\nV3ZlkiRJ7WLLh8oTAT/5CZx1Vm4D2W23HKwlSZK6EAO1yveVr8BVV8Gjj8J228Fzz5VdkSRJUmEG\najWGAw+EO+6At9+GbbeFMWPKrkiSJKkQA7Uax3bbwd/+lmcC2WWX3AYiSZLU4AzUaizrrgsPPpiX\nLP/kJ+G888quSJIkaaEM1Go8K64Id9+dlyk/4QQ4+WSYO7fsqiRJkqoyUKsxDRgA110Hxx0Hp56a\nF4L54IOyq5IkSVqAgVqNq3fv3PJx+ul5FpCdd4bXXiu7KkmSpPkYqNXYIuDb34Zrr4WJE2HrreGR\nR8quSpIk6d8M1Ooa9t8f7r8/P99hB/jLX8qtR5IkqcJAra5js83y/NTNM4CcfjqkVHZVkiSphzNQ\nq2tZeeU8A8inPw3f/W6+afGjj8quSpIk9WAGanU9/frB5ZfDD38IF14Ie+wBU6aUXZUkSeqhDNTq\nmpqa4Kc/hYsvhoceghEjYPz4squSJEk9kIFaXdvhh+ebFVOC7beHSy4puyJJktTDGKjV9W25JYwd\nm6fUO+II+M53YPbssquSJEk9hIFa3cOQIXD77XDiifC//wt77w1Tp5ZdlSRJ6gEM1Oo+llgCzj4b\nLrgA7r0XttoKHnus7KokSVI3Z6BW93PMMXDPPTBjBmy7LVxxRdkVSZKkbsxAre5pm21g3DjYdFM4\n+GD4xjecr1qSJNWFgVrdV/MiMF//Opx5JuyyC0yaVHZVkiSpmzFQq3vr0wfOOCMvBPP447D55vnm\nRUmSpA5ioFbPcNBB8PDDsOKKeWXFn/4U5s4tuypJktQNGKjVc6y3Xl5V8bDD4JRTYNQop9aTJEk1\nM1CrZ+nfH/70JzjnHLjjDthiCxgzpuyqJElSF2agVs8TASecAA88kJ9vvz2cdpotIJIkabEYqNVz\njRgBEybAAQfA974H++wDb7xRdlWSJKmLMVCrZ1tuObjyytwCcs89ed5qZwGRJEntYKCWmltAxoyB\nQYPyLCAnnwyzZpVdmSRJ6gIM1FKzjTeGsWPh2GPh1FNh553hxRfLrkqSJDU4A7XUUr9+cP75cNll\n8MQTsNlmcMUVZVclSZIamIFaqubgg/MNi+utl59/7nPw7rtlVyVJkhqQgVpqy8c+BvffDz/+MVx6\nKWyySb5xUZIkqQUDtbQwvXvDj36U56zu0wd23TVPsTdzZtmVSZKkBmGglor4+MdzC8hxx+VFYD7+\ncfjHP8quSpIkNQADtVTUgAFw3nnwl7/Aq6/CllvCL3/pCouSJPVwBmqpvfbbL49O77knfPvbsNtu\n8PzzZVclSZJKYqCWFseQIXDddXDBBbkVZOON4eyzHa2WJKkHMlBLiysCjjkmj1bvuCN89auOVkuS\n1AMZqKVaDR0KN9/saLUkST2UgVrqCC1Hq3faydFqSZJ6EAO11JGGDoWbboILL5w3Wn3WWTBnTtmV\nSZKkOjFQSx0tAo4+Gp54Io9Wf+1rsMMO8PjjZVcmSZLqwEAt1ctqq+XR6osvhmefhS22gB/+EGbM\nKLsySZLUgQzUUj1FwOGHw1NPwRFHwM9+BptsAnfdVXZlkiSpgxiopc6w/PLw+9/D7bfn2T922y23\nhUydWnZlkiSpRgZqqTONHJl7qU86Cf70J1h/ffjznyGlsiuTJEmLyUAtdballoKf/xzGjYOPfSy3\nhOyxBzz9dNmVSZKkxWCglsqyySbwwAN5EZiHH85T7J18MkyfXnZlkiSpHQzUUpl69YITT4R//jOP\nVJ96am4Dufpq20AkSeoiDNRSIxgyJN+0eP/9sNxy8OlPw957wzPPlF2ZJElaBAO11Ei23z73Vp95\nJjz4IGy0UZ67+oMPyq5MkiS1wUAtNZrevfPqik8/DQcdlOeuXn99uOIK20AkSWpABmqpUa20Up5a\n7557chvIwQfnpczHjSu7MkmS1IKBWmp0zSH6/PPzqPVWW+VFYV57rezKJEkSdQ7UEfFiRDweEY9E\nxNgqxyMifh0Rz0bEYxGxRT3rkbqsXr3guOPyTYrf+Q5cfDGss06eFWTGjLKrkySpR+uMEepdU0qb\npZRGVDl3poepAAAXrklEQVS2NzC8sh0PnNMJ9Uhd17LLwv/8Dzz5JOy+e563ev31YfRo+6slSSpJ\n2S0fBwAXpezvwMCIWLnkmqTGt/bacM01cMcdsPTS8NnPwo475plBJElSp6p3oE7A7RExLiKOr3J8\nVeCVFq8nVfZJKmK33WDCBDjvPHjuOdhuO/jUp1zGXJKkTlTvQL1DSmkzcmvHiRGx0+J8SEQcHxFj\nI2LslClTOrZCqavr1QuOPx6efRZ++lP4619hww3hhBO8cVGSpE5Q10CdUppceXwTuAbYutUpk4Gh\nLV6vVtnX+nPOTymNSCmNGDx4cL3Klbq2/v3zIjDPPQdf+hJceGFuDTnlFHjvvbKrkySp26pboI6I\n/hGxdPNzYA/gH61O+wtwZGW2j22Ad1NKDqlJtRgyBM46CyZOhFGj8qj1WmvBb34Ds2aVXZ0kSd1O\nPUeoVwTuj4hHgTHAjSmlWyLihIg4oXLOTcDzwLPA/wFfrmM9Us+y9tpw+eUwZkxuAfnKV2C99eCi\ni2DOnLKrkySp24jUxabaGjFiRBo7doEprSUtTEpw8825JWTChBysf/zjPDtIU9mT/UiS1JgiYlwb\nUz/Px3+TSj1BBOyzT15x8aqr8o2MhxwCm28O113nHNaSJNXAQC31JBF5Wr1HH4VLLoEPPoBPfhK2\n3hpuucVgLUnSYjBQSz1Rr15w2GH5xsXf/Q6mTIG9986Lw9x1l8FakqR2MFBLPVnv3nDUUfDPf8Jv\nfwsvvJAXi9lxR7j1VoO1JEkFGKglQZ8+ee7qZ5/NU+699BLstRd8/ONw/fUGa0mSFsJALWmepZbK\n0+s9+yycfz689Rbsv3++eXH0aJg7t+wKJUlqOAZqSQvq2xeOOw6efhr+8Af48MM8xd7GG8Of/+w8\n1pIktWCgltS2JZaAz38ennwSLr00zxJy+OF5HuvzzoMZM8quUJKk0hmoJS1a87zVjz2W57EeOBBO\nOAHWWAN+/nN4552yK5QkqTQGaknFNTXleazHjIE774QttoAf/ACGDoVvfQtefrnsCiVJ6nQGaknt\nFwG77pqXM3/0UTjwQPj1r2GtteDII+Hxx8uuUJKkTmOgllSbTTaBP/0JnnsuzxBy9dV53z77uEiM\nJKlHMFBL6hhrrAG/+lVu+/jv/4axY/MiMZttlldj9AZGSVI3ZaCW1LEGDcp91S+/DBdemPcdc0zu\ns/7hD+HVV8utT5KkDmagllQfSy4JRx8NjzySb2Dcfvs8I8gaa+Sp98aMKbtCSZI6hIFaUn0138B4\n7bXwzDO5z/r66/Oy5tttB5dfDrNmlV2lJEmLzUAtqfOstVbus540Cc48E958M89vvcYacMopeb8k\nSV2MgVpS51tmGfja1+Cf/8yj1Ztvnm9kHDYsT8F3220wd27ZVUqSVIiBWlJ5mppg1Ci48cY87d53\nvgP33w977gnrrgunnw5Tp5ZdpSRJC2WgltQY1lwTfvGL3PZxySWw0krw3e/CqqvC5z8Pf/+7c1pL\nkhqSgVpSY+nbFw47DO67Dx57LM8UcvXVsO22ecGYM86At94qu0pJkv7NQC2pcW28Mfz2t3nu6vPO\ng3794JvfzKPWBx0Et94Kc+aUXaUkqYczUEtqfEsvDccfDw89lEetv/zlPLf1XnvlVpEf/QhefLHs\nKiVJPZSBWlLXsvHGeeq9yZPhiitggw3gpz+Fj30MPvEJuOwylzmXJHUqA7WkrqlvX/jsZ+GWW/Lo\n9I9/nBeOOfTQfEPj8cfnPmxvZJQk1ZmBWlLXt/rqeWGY55+Hv/4V9t8f/vxn2GmnvJjMKafksC1J\nUh0YqCV1H01NsPvucNFF8Prr8Kc/wdprw89+BuusA9tsk29ydG5rSVIHMlBL6p4GDIAjjsirLr7y\nCpx2GnzwAZx4Iqy8MnzykzB6NHz4YdmVSpK6OAO1pO5vlVXyKoyPPQaPPJKXPX/oodyDPWRIDt7X\nXw8zZ5ZdqSSpCzJQS+pZNt00L2n+yitw++35Jsabb8591yutlBeSue02mD277EolSV2EgVpSz9S7\nN4wcCeefD6+9BjfemEP16NGw5565LeRLX4K773bxGEnSQhmoJalPH9hnH/jjH+HNN+Gaa3LYvugi\n2HVXGDo0t4ncc4/hWpK0AAO1JLW05JL5hsXLLsvh+rLL4OMfh//7P9hllzxyfdxxuU3EnmtJEgZq\nSWpb//5w8MF5xHrKFLjyyjwt3+WX5xHtwYPhsMPgqqtg+vSyq5UklSRSF1tFbMSIEWns2LFllyGp\nJ5s5E+64A66+Gq67Dt56K49s77knfOpTsN9+sNxyZVcpSapRRIxLKY1Y5HkGakmqwezZcP/9OVxf\nfTVMngy9esEOO+RgPWoUrLtu2VVKkhaDgVqSOtvcuTB2bB61vv56ePzxvH/48Byu99sPtt8ellii\n3DolSYUYqCWpbC+9BDfckMP1XXfBRx/BwIGw1145XO+1FwwaVHaVkqQ2GKglqZG8/z789a85XN94\nY55BpFevPGK9zz45XG+yCUSUXakkqcJALUmNau5cePjhHK5vuAEefTTvX2mlfGPjnnvCJz4BK6xQ\nbp2S1MMZqCWpq3j11bzc+a235se3384j1SNG5JHrvfaCrbfOqztKkjqNgVqSuqI5c/KNjbfeCrfc\nAg89lEe0Bw7Mc2DvuWdexXHNNcuuVJK6PQO1JHUH77wDt9+ew/Wtt+Zp+SAH6pEjYbfd8rbiiuXW\nKUndkIFakrqblGDixLyozB13wN13w7vv5mMbbTQvYO+8Myy7bKmlSlJ3YKCWpO5uzhwYP35ewL7/\nfpgxI88eMmLEvIC97bbQr1/Z1UpSl2OglqSeZuZMePDBHK7vvDP3X8+ZkxeS2Wor2GmnvG23nSPY\nklSAgVqSerr33oP77svbvffmqfpmzYKmJthsM9hxxxywd9wRBg8uu1pJajgGaknS/D74II9a33tv\n3h58ED78MB9bf/15I9g77ghDh5ZbqyQ1AAO1JGnhPvoIxo2bF7Dvvx+mTcvHVlstt4Zsu21+3Gwz\n6NOn3HolqZMZqCVJ7TNnDjz2WG4RefBB+Nvf4OWX87Ell8w3OjYH7G23dao+Sd2egVqSVLvJk3O4\nbg7Y48fnkW2Aj30sB+vmbeON8w2QktRNGKglSR1vxgyYMCGH6+aQ/dpr+Vjfvrk1ZKut5m3rrptv\ngpSkLshALUmqv5TgpZdgzJi8Pfxw7suePj0fX2YZ2HLL+UP26qtDRLl1S1IBBmpJUjnmzIGnnpoX\nsB9+GB59NE/ZB3mKvuZwvcUWsPnm+SZIQ7akBmOgliQ1jpkz8w2PLUP2xIl5hBtghRVyu8jmm+dt\niy1g+HDbRSSVqmig7t0ZxUiSeri+feeNSjd7//0cssePz33ZEybAGWfMG8nu3x823XReyN58c9hw\nw/xZktRAHKGWJDWOjz6CJ5+cF7AnTIBHHsnhG/IsIhtskGcU2WST/LjxxrDKKraMSOpwtnxIkrqH\nuXPhuefmD9mPPw6vvjrvnOWWmxeum7eNNso3RUrSYrLlQ5LUPTQ15X7q4cPhoIPm7X/77RysW24X\nXQTvvTfvnDXWWDBkr7OObSOSOpSBWpLUNQ0aBDvvnLdmzdP4tQ7at9wCs2fnc5qaYK21YP31520b\nbADrrQdLL13Ob5HUpRmoJUndRwQMG5a3/fabt3/mTHj6aXjiiTy7yMSJuVf75pvn3QQJefq+5oDd\nMnAPHtzZv0RSF2KgliR1f3375psYN9lk/v2zZsHzz88fsidOhAsumLc4DeRp/dZfP7edrLNO3oYP\nzyPdSy3Vub9FUsPxpkRJklqbOxcmTZo/ZE+cCM88A2+8Me+8CBg6dF7Abhm2hw3Ls5JI6rK8KVGS\npMXV1JSXSF99ddhzz/mPTZuWg/Uzz8A//5m3Z56BP/8Z3n133nm9e8Oaa84L2M0j2h/7WL5Zsk+f\nzv1NkurGQC1JUnssswxsuWXeWkoJ3nprwaD9z3/CnXfChx/OO7epKfdrNwfs5q359aBBzqstdSEG\nakmSOkJEvnlx8GDYbrv5j82dC6+9lvu1W2833DB/Gwnk0N4yYDdvw4blUfMll+y0nyVp0QzUkiTV\nW1MTrLpq3nbcccHj06fDCy8sGLafeCIH7pkz5z9/yJDcNlJtW311GDjQEW6pExmoJUkqW//+edGZ\njTZa8FjL0e2XXpp/e/zxHLhnzJj/PUsv3XbYXmMNWHFF6NWrc36b1AMYqCVJamSLGt1OCaZMWTBs\nN28PPAD/+tf87+nVC1ZZJfdxr7Za/uzm583byit746RUkIFakqSuLCK3gAwZAlttVf2cadNyuH75\n5fw4eXKeFnDSJHjsMbjxRvjggwXft+KK84fslsF71VVzKB8woL6/T+oCDNSSJHV3yywDG2+ct2pS\nylP+TZo0f9hu3p5/Hu69F955Z8H3DhgAK62UR7Rbby33L7+8fd3qtgzUkiT1dBH5RsaBA6v3cTeb\nPj0H7smT4ZVX4PXXc3938zZhQl7O/b33FnzvEkvMC9jVAvhKK80baXf1SXUxBmpJklRM//7zVoNc\nmPffnz9stw7eL7wADz6Ye7+rGTBgXrgeMiS3nrR83XJbfnlvsFTpDNSSJKljDRgAa6+dt4WZNSvP\nwd0cuqdMgTffzNsbb+THF1+EMWPysTlzFvyMCFhhhephe/DgHLiXXz6f0/y8b9+6/Gz1XAZqSZJU\njiWWmHeT46LMnZt7uJsDd+vg3byNH58fWy4D39qAAfMH7ObnC9vXr1/H/W51OwZqSZLU+Jqa5oXd\n9ddf9PkzZ8LUqXk5+GqPLZ8/+2x+XFgIX2qped8/aBAst1yxbeBA6G3c6u68wpIkqfvp2zdP67fK\nKsXfM2sWvP1228G7+fHtt+Gpp/KI+TvvLLiwTmtLL52DddEQvuyyeVtmmdy37uwoDc9ALUmSBLkF\nZcUV89YeM2bMC9dFtmeemff8ww8X/tm9euVg3RywW4btas+rHVtmGUfJ68w/XUmSpFosueS86f/a\na+bMBQP3tGm5/aT5sfXzyZPhySfnvZ49e9Hf07//gkF7wIA8et76sdq+lo/9+jlq3oqBWpIkqSx9\n++Y5uFdaafHen1IeIW8ZutsK4q2fv/ZanuLwvffy48yZxb6zqSkH64WF7taP/fvnreXz1lsXHkWv\ne+UR0QsYC0xOKY1qdWwX4Drghcquq1NKP6l3TZIkSd1CRL5hcqmlFj+UN/vooxysW4bshT223jd5\n8vyv33+/fd/fp0/bYfsPf2h/K04n6oz/FPg6MBFYpo3j97UO2pIkSepkffrkGUwGDeqYz5s7Fz74\nIAfs6dPbv73/fn6cOjWPijewugbqiFgN2Bf4GfCten6XJEmSGkjL1pBurt5x/wzge8DchZyzXUQ8\nFhE3R8SGda5HkiRJ6lB1C9QRMQp4M6U0biGnjQdWTyltApwFXNvGZx0fEWMjYuyUKVPqUK0kSZK0\neOo5Qr09sH9EvAhcBuwWERe3PCGlNC2l9H7l+U3AEhGxQusPSimdn1IakVIaMXjw4DqWLEmSJLVP\n3QJ1SumklNJqKaVhwCHAnSmlI1qeExErReSJDCNi60o9U+tVkyRJktTROn3Cv4g4ASCldC7wGeBL\nETEb+BA4JKWUOrsmSZIkaXFFV8uvI0aMSGPHji27DEmSJHVzETEupTRiUec19qR+kiRJUoMzUEuS\nJEk1MFBLkiRJNTBQS5IkSTUwUEuSJEk1MFBLkiRJNTBQS5IkSTUwUEuSJEk1MFBLkiRJNTBQS5Ik\nSTUwUEuSJEk1MFBLkiRJNYiUUtk1tEtETAFeKunrVwDeKum71Xm8zt2f17hn8Dr3DF7nnqGs67xG\nSmnwok7qcoG6TBExNqU0ouw6VF9e5+7Pa9wzeJ17Bq9zz9Do19mWD0mSJKkGBmpJkiSpBgbq9jm/\n7ALUKbzO3Z/XuGfwOvcMXueeoaGvsz3UkiRJUg0coZYkSZJqYKAuICL2ioinI+LZiPh+2fVo8UXE\n0Ii4KyKejIgnIuLrlf2DIuKvEfFM5XG5Fu85qXLtn46IPcurXu0REb0iYkJE3FB57TXuZiJiYESM\njoinImJiRGzrde5+IuKblX9e/yMiLo2IJb3OXV9E/C4i3oyIf7TY1+7rGhFbRsTjlWO/jojo7N8C\nBupFiohewG+AvYENgEMjYoNyq1INZgPfTiltAGwDnFi5nt8H7kgpDQfuqLymcuwQYENgL+C3lb8m\n1Pi+Dkxs8dpr3P2cCdySUloP2JR8vb3O3UhErAp8DRiRUtoI6EW+jl7nru8P5GvU0uJc13OA44Dh\nla31Z3YKA/WibQ08m1J6PqX0EXAZcEDJNWkxpZReSymNrzx/j/wv4FXJ1/SPldP+CHyy8vwA4LKU\n0syU0gvAs+S/JtTAImI1YF/ggha7vcbdSEQsC+wEXAiQUvoopfQvvM7dUW9gqYjoDfQDXsXr3OWl\nlO4F3m61u13XNSJWBpZJKf095ZsCL2rxnk5loF60VYFXWryeVNmnLi4ihgGbAw8BK6aUXqsceh1Y\nsfLc6981nQF8D5jbYp/XuHtZE5gC/L7S2nNBRPTH69ytpJQmA6cDLwOvAe+mlG7D69xdtfe6rlp5\n3np/pzNQq0eKiAHAVcA3UkrTWh6r/Feu0990URExCngzpTSurXO8xt1Cb2AL4JyU0ubAdCr/e7iZ\n17nrq/TQHkD+D6hVgP4RcUTLc7zO3VNXu64G6kWbDAxt8Xq1yj51URGxBDlMX5JSurqy+43K/zqi\n8vhmZb/Xv+vZHtg/Il4kt2jtFhEX4zXubiYBk1JKD1VejyYHbK9z97I78EJKaUpKaRZwNbAdXufu\nqr3XdXLleev9nc5AvWgPA8MjYs2I6ENuiv9LyTVpMVXu/r0QmJhS+mWLQ38BPl95/nnguhb7D4mI\nvhGxJvmGhzGdVa/aL6V0UkpptZTSMPLfr3emlI7Aa9ytpJReB16JiHUru0YCT+J17m5eBraJiH6V\nf36PJN/74nXuntp1XSvtIdMiYpvKXx9HtnhPp+pdxpd2JSml2RHxFeBW8t3Fv0spPVFyWVp82wOf\nAx6PiEcq+04GfgFcERHHAC8BBwGklJ6IiCvI/6KeDZyYUprT+WWrA3iNu5+vApdUBjueB44iDxR5\nnbuJlNJDETEaGE++bhPIK+YNwOvcpUXEpcAuwAoRMQn4EYv3z+kvk2cMWQq4ubJ1OldKlCRJkmpg\ny4ckSZJUAwO1JEmSVAMDtSRJklQDA7UkSZJUAwO1JEmSVAMDtSQ1iIh4v/I4LCIO6+DPPrnV6791\n5OdLUk9moJakxjMMaFegjohFrSswX6BOKW3XzpokSW0wUEtS4/kFsGNEPBIR34yIXhFxWkQ8HBGP\nRcQXASJil4i4LyL+Ql7wgIi4NiLGRcQTEXF8Zd8vgKUqn3dJZV/zaHhUPvsfEfF4RBzc4rPvjojR\nEfFURFxSWYmMiPhFRDxZqeX0Tv/TkaQG40qJktR4vg98J6U0CqASjN9NKW0VEX2BByLitsq5WwAb\npZReqLw+OqX0dkQsBTwcEVellL4fEV9JKW1W5bs+BWwGbAqsUHnPvZVjmwMbAq8CDwDbR8RE4EBg\nvZRSioiBHf7rJamLcYRakhrfHsCREfEI8BCwPDC8cmxMizAN8LWIeBT4OzC0xXlt2QG4NKU0J6X0\nBnAPsFWLz56UUpoLPEJuRXkXmAFcGBGfAj6o+ddJUhdnoJakxhfAV1NKm1W2NVNKzSPU0/99UsQu\nwO7AtimlTYEJwJI1fO/MFs/nAL1TSrOBrYHRwCjglho+X5K6BQO1JDWe94ClW7y+FfhSRCwBEBHr\nRET/Ku9bFngnpfRBRKwHbNPi2Kzm97dyH3BwpU97MLATMKatwiJiALBsSukm4JvkVhFJ6tHsoZak\nxvMYMKfSuvEH4Exyu8X4yo2BU4BPVnnfLcAJlT7np8ltH83OBx6LiPEppcNb7L8G2BZ4FEjA91JK\nr1cCeTVLA9dFxJLkkfNvLd5PlKTuI1JKZdcgSZIkdVm2fEiSJEk1MFBLkiRJNTBQS5IkSTUwUEuS\nJEk1MFBLkiRJNTBQS5IkSTUwUEuSJEk1MFBLkiRJNfj/NPGqg4HPEBEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(12,8))\n", "ax.plot(np.arange(iters), cost, 'r')\n", "ax.set_xlabel('Iterations')\n", "ax.set_ylabel('Cost')\n", "ax.set_title('Error vs. Training Epoch')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Linear regression with multiple variables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Exercise 1 also included a housing price data set with 2 variables (size of the house in square feet and number of bedrooms) and a target (price of the house). Let's use the techniques we already applied to analyze that data set as well." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SizeBedroomsPrice
021043399900
116003329900
224003369000
314162232000
430004539900
\n", "
" ], "text/plain": [ " Size Bedrooms Price\n", "0 2104 3 399900\n", "1 1600 3 329900\n", "2 2400 3 369000\n", "3 1416 2 232000\n", "4 3000 4 539900" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path = os.getcwd() + '\\data\\ex1data2.txt'\n", "data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])\n", "data2.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For this task we add another pre-processing step - normalizing the features. This is very easy with pandas." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SizeBedroomsPrice
00.130010-0.2236750.475747
1-0.504190-0.223675-0.084074
20.502476-0.2236750.228626
3-0.735723-1.537767-0.867025
41.2574761.0904171.595389
\n", "
" ], "text/plain": [ " Size Bedrooms Price\n", "0 0.130010 -0.223675 0.475747\n", "1 -0.504190 -0.223675 -0.084074\n", "2 0.502476 -0.223675 0.228626\n", "3 -0.735723 -1.537767 -0.867025\n", "4 1.257476 1.090417 1.595389" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data2 = (data2 - data2.mean()) / data2.std()\n", "data2.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's repeat our pre-processing steps from part 1 and run the linear regression procedure on the new data set." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.13070336960771892" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# add ones column\n", "data2.insert(0, 'Ones', 1)\n", "\n", "# set X (training data) and y (target variable)\n", "cols = data2.shape[1]\n", "X2 = data2.iloc[:,0:cols-1]\n", "y2 = data2.iloc[:,cols-1:cols]\n", "\n", "# convert to matrices and initialize theta\n", "X2 = np.matrix(X2.values)\n", "y2 = np.matrix(y2.values)\n", "theta2 = np.matrix(np.array([0,0,0]))\n", "\n", "# perform linear regression on the data set\n", "g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)\n", "\n", "# get the cost (error) of the model\n", "computeCost(X2, y2, g2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can take a quick look at the training progess for this one as well." ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(12,8))\n", "ax.plot(np.arange(iters), cost2, 'r')\n", "ax.set_xlabel('Iterations')\n", "ax.set_ylabel('Cost')\n", "ax.set_title('Error vs. Training Epoch')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead of implementing these algorithms from scratch, we could also use scikit-learn's linear regression function. Let's apply scikit-learn's linear regressio algorithm to the data from part 1 and see what it comes up with." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn import linear_model\n", "model = linear_model.LinearRegression()\n", "model.fit(X, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's what the scikit-learn model's predictions look like." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\ndNttt6XdJ9Pj/LbDDjts/bqmpkabN28uew0AAACVgG2/fTZr1iw9+uijeu655yRJb7/9tp555hlN\nnTpVa9as0fPPPy9Jw0J2yrHHHqvrrrtOkjQwMKA333xT48eP14YNGzLe/6ijjtItt9wiSXrmmWf0\n4osvqrGxsdQvCwAAoKoRon02ceJE3XjjjTr77LN18MEHb23lGDt2rK6//nqdeOKJmjlzpnbfffeM\nj7/22mv14IMPavr06Tr00EO1atUq7brrrpo9e7amTZumtra2tPv/y7/8i7Zs2aLp06frrLPO0o03\n3pg2Aw0AAIDRM+dc0DXk1dzc7Do7O9PGnn76aR1wwAEBVYRM+J4AAICoM7PlzrnmfPdjJhoAAAAo\nkp+rcwAAAAA5tXfFtaijR719CdXXxdTW0qjWpoagy8qLEA0AAIBAtHfFNW9JtxL9A5KkeF9C85Z0\nS1LogzTtHAAAAAjEoo6erQE6JdE/oEUdPQFVVDhCNAAAAALR25coajxMCNEAAAAIRH1drKjxMCFE\nj9D69es1Y8YMzZgxQ3vuuacaGhq2/nnTpk2jOvadd96pRYsWlaTOc889V1OmTNEhhxyi/fffX+ed\nd556e3vzPm7x4sV69913S1IDAABAJm0tjYrV1qSNxWpr1NYS/o3iuLBwhHbdddetW3fPnz9f48aN\n0yWXXJJ2H+ecnHMaM6a49yqnnXZayeqUpGuuuUatra3asmWLFi9erGOOOUbd3d2qra3N+pjFixfr\nn/7pnzR27NiS1gIAAJCSungwiqtzVM1MdHtXXLMXLtOUufdo9sJlau+K+/I8zz33nA488ECdc845\nOuigg7R27VpdcMEFam5u1kEHHaRvf/vbW++79957a/78+WpqatLBBx+sZ555RpL04x//WBdddJEk\nbyb5a1/7mj74wQ/qfe97n+68805J3hbgX/ziFzV16lQdf/zxOuGEE9Te3p6ztjFjxuiSSy7RLrvs\novvvv1+SMtZ2zTXX6NVXX9VRRx2lj370o1nvBwAAMFqtTQ16dO4x+tvCE/Xo3GMiEaClKgnRqeVT\n4n0JOW1bPsWvIL169WpdfPHFWrVqlRoaGrRw4UJ1dnbqiSee0NKlS7Vq1aqt991jjz3U1dWlz3/+\n81q8eHHG47366qt69NFH1d7ernnz5kmSbr/9dsXjca1atUo33nij/vjHPxZc38yZM7V69WpJyljb\n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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.array(X[:, 1].A1)\n", "f = model.predict(X).flatten()\n", "\n", "fig, ax = plt.subplots(figsize=(12,8))\n", "ax.plot(x, f, 'r', label='Prediction')\n", "ax.scatter(data.Population, data.Profit, label='Traning Data')\n", "ax.legend(loc=2)\n", "ax.set_xlabel('Population')\n", "ax.set_ylabel('Profit')\n", "ax.set_title('Predicted Profit vs. Population Size')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's it! Thanks for reading. In Exercise 2 we'll take a look at logistic regression for classification problems." ] } ], "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.1" } }, "nbformat": 4, "nbformat_minor": 1 }