{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Machine Learning Exercise 1 - 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": 1, "metadata": { "collapsed": false }, "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": 2, "metadata": { "collapsed": 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", "
PopulationProfit
0 6.1101 17.5920
1 5.5277 9.1302
2 8.5186 13.6620
3 7.0032 11.8540
4 5.8598 6.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": 2, "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": 3, "metadata": { "collapsed": 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PopulationProfit
count 97.000000 97.000000
mean 8.159800 5.839135
std 3.869884 5.510262
min 5.026900 -2.680700
25% 5.707700 1.986900
50% 6.589400 4.562300
75% 8.578100 7.046700
max 22.203000 24.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": 3, "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": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": [ "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\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": 5, "metadata": { "collapsed": false }, "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": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data.insert(0, 'Ones', 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's do some variable initialization." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "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": 8, "metadata": { "collapsed": 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", "
OnesPopulation
0 1 6.1101
1 1 5.5277
2 1 8.5186
3 1 7.0032
4 1 5.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": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.head()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": 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", "
Profit
0 17.5920
1 9.1302
2 13.6620
3 11.8540
4 6.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": 9, "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": 10, "metadata": { "collapsed": false }, "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": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[0, 0]])" ] }, "execution_count": 11, "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": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "((97L, 2L), (1L, 2L), (97L, 1L))" ] }, "execution_count": 12, "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": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "32.072733877455676" ] }, "execution_count": 13, "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": 14, "metadata": { "collapsed": false }, "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": 15, "metadata": { "collapsed": false }, "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": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[-3.24140214, 1.1272942 ]])" ] }, "execution_count": 16, "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": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "4.5159555030789118" ] }, "execution_count": 17, "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": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": [ "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\n", "HMI3vvEN3n//fWbMmMExxxzDtttuyw033MDee+/N3LlzmTVrFrBiW8iTTz7J0KFDuffee5k5cya9\n", "e/fm6KOPXmH/f//733nxxRd57bXXuOeee8hkMo350kmSJDUbxRmiQ8jPV45ijBx22GF06dKFvn37\n", "UlpaytChQwEYMmQInTt3pl27dtx4442ccsop7LHHHoQQOP7442nXrh3PPvsszz33HEuWLOHss8+m\n", "devWVFRUsMcee9R7vOeff56ZM2dyxRVXUFJSQrt27dhnn31qa1mdO++8k5NOOomdd96Ztm3bMnLk\n", "SJ599lmmTZtW+5zBgwfTsWNHNt98c/bff39eeeWVnF8TSZKkYtRsl/1erZT6h0MIPPTQQxxwwAFf\n", "e6xuC8b777/P7bffzjXXXFN73+LFi5k5cyYxRjbddNMVtu3du3e9x5s+fTq9e/emVavc3wvNnDmT\n", "3Xffvfb2BhtsQLdu3ZgxYwZbbLEFAD169Kh9fP3112fevHk5H0eSJKkYFedIdAGq246xxRZbMGzY\n", "MGbPnl37NW/ePH7yk5/Qs2dPZsyYscK277//fr373HzzzZk2bRpLly5d7fHq06tXL957773a2/Pn\n", "z+fzzz//WoCXJEnS1xmiU3DyySfz5z//meeff54YI/Pnz+fvf/878+bNY5999mG99dbj6quvZvHi\n", "xTzwwAO88MIL9e5nzz33pGfPngwePJgFCxbw1Vdf8cwzzwCwySab8MEHH7B48eLa58cYa9s8jjnm\n", "GG699VZeffVVFi5cyNChQ9lrr71qR6FX5uwgkiRJ/8cQ3QRWHhXebbfduOmmmzjjjDPo2rUrW2+9\n", "NbfffjsAbdq04YEHHuC2226jW7du3HPPPVRUVNS7v9atW/Pwww/z9ttvs8UWW7D55ptzzz33AHDg\n", "gQey/fbb06NHDzbeeOPa7ZZve+CBB3LhhRdSUVFBr169ePfdd7n77rtXWXPdbSVJklq6UMgjjCGE\n", "WF99IQRHRouUP1tJkpSGbAZp8IihI9GSJElSjgzRkiRJUo4M0ZIkSVKODNGSJElSjgzRkiRJUo4M\n", "0ZIkSVKODNGSJElSjgzRkiRJUo4M0c3QtGnT6NChg4uSSJIkpcQQnUcbbrghHTp0oEOHDrRq1Yr1\n", "11+/9vZdd92Vt+NsscUWzJ07t1GW4T7hhBNo164dHTt2pGPHjuy4444MHTqUL7/8ssH72HLLLXny\n", "ySfzXpskSVKhaFEhOsbI1Vf/ie9//1COOOJ4pkyZktf9z5s3j7lz5zJ37lx69+7NI488Unv7mGOO\n", "qX3ekiVL8nrcfAohMGjQIL788ks+++wzbr31Vp577jm+973vsWDBggbvw1FySZJUzIoqRH/++eec\n", "ddZvOfjgo6muvoqlS5eu8PiwYeczZMgtPP30z3ngge3ZY4/vM3369Hr3M23aNJYtW5aXusaNG8dm\n", "m23G5ZdfTs+ePTnppJP44osvOOSQQ9h4443p2rUrhx56KDNmzKjdprS0lPPOO499992Xjh07Ul5e\n", "zueffw7Ae++9R6tWrWrrW91zAW6//XZ69+5N9+7dueiii9hyyy154oknVlnv8gDctm1bdt99d8aM\n", "GcPnn3/OrbfeCsA777zDAQccQPfu3dloo4342c9+xpw5cwA47rjjmDZtGoceeigdOnTgyiuvBODI\n", "I4+kZ8+edO7cmf32249Jkybl5bWVJElKQ9GE6AULFrDHHqXccMM8/vGPQznvvNGcdNLpKzzn2muv\n", "Z8GCe4ABxDiIhQsP5b777qt9PMbIaaf9ml69vsF22+3F9tvvyUcffZSX+j7++GNmz57NtGnTuOGG\n", "G1i2bBknnXQS06ZNY9q0aZSUlHDGGWessM1dd93FbbfdxieffMKiRYtqA2l9VvXcSZMmcfrpp3PX\n", "XXcxc+ZM5syZw4cffphTK8iGG25Iv379ePrpp2vvGzZsGDNnzuTNN99k+vTpjBgxAoA77riDLbbY\n", "onYU/je/+Q0ABx98MG+//Taffvopu+66Kz/96U8bfHxJkqRCUzQh+vHHH+ezz7qxaNF1wE9ZsOAR\n", "7rxzVINbECAJonfc8RSLFk1jwYIZvP32gRx//C/zUl+rVq04//zzadOmDe3bt6dr164MGDCA9u3b\n", "s+GGGzJ06FCeeuqp2ueHEDjxxBPZaqutaN++PUcddRSvvPJKvfte3XPvu+8++vfvzz777EObNm24\n", "4IIL1qqXumfPnsyaNQuAb33rWxx44IG0adOG7t278+tf/3qF2utzwgknsMEGG9CmTRuGDx/Oq6++\n", "yty5c3OuQ5IkqRAUTYhOWjfaA8sDYlsgrNDSccYZp7H++kcBo2nV6jLatXuYI488svbxF16YwPz5\n", "RwGdgcCSJSczYcLLealvo402om3btrW3FyxYwCmnnMKWW25Jp06d2G+//ZgzZ84KvcQ9evSo/b6k\n", "pIR58+atcv+reu6HH37IZptttsJj3bp1y7n+GTNm1G738ccfc/TRR7PZZpvRqVMnjjvuuBXaR1a2\n", "bNkyBg8ezFZbbUWnTp34xje+QQiBzz77LOc6JEmSCkHRhOj999+fkpK3aN36AuBJ2rc/hrKyg+nQ\n", "oUPtcy6+eDgjR/6c73//Fg4/fBIvvPDvFQJmnz7fpKTkCSC58C+Ex9hyy2/mpb6VR3+rq6uZMmUK\n", "zz//PHPmzOGpp54ixpj3C/J69erFBx98UHu7pqZmtYG3vlrnzZvH448/Tt++fQEYOnQorVu35vXX\n", "X2fOnDnccccdK/SPr7z9nXfeyZgxY3jiiSeYM2cO7777bqOcqyRJUlMpmhDduXNnXnjhKQ455C2+\n", "853zOfnkrbj//jtWeE4IgbPOOp2nnnqYe+8dRZ8+fVZ4/Be/+AV77dWODTfcgY4d96Nr15Hcfvuf\n", "GqXeefPmUVJSQqdOnZg1axbnn3/+156TS8hc1XMrKip4+OGHefbZZ1m0aBEjRoxY7X7rhtuFCxfy\n", "0ksvcdhhh9GtWzdOPPHE2to32GADOnbsyIwZM7jiiitW2Mcmm2zCO++8s8K5tmvXjq5duzJ//nyG\n", "Dh3a4POSJEkqREUToiGZP/nBB+/klVee4uqrL6d9+/Y5bd+mTRsef3wMY8fexv33n8vbb09ku+22\n", "y0ttK4/O/upXv6Kmpobu3buzzz77cNBBB33tOXVvhxC+drshz91+++255pprOProo+nVqxcdOnRg\n", "4403pl27dqus8/LLL6djx450796dyspK9thjD5555hlKSkoAGD58OC+//DKdOnXi0EMPpaKiYoXj\n", "DxkyhIsuuoguXbrw+9//nuOPP57evXuz6aabssMOO7D33ns3yhzXkiRJTSUU8kfqIYRYX33OQ7z2\n", "5s2bR5cuXXj77bfp3bt32uV8jT9bSZKUhmwGafAoX1GNRKt+Dz/8MAsWLGD+/Pn85je/YaeddirI\n", "AC1JktRcGKJbgDFjxrDpppuy6aab8s4773D33XenXZIkSVKzZjuHCoo/W0mSlAbbOSRJkqRGZoiW\n", "JEmScmSIliRJknK0XtoFrC3nGZYkSVJammWI9sIzSZIkpcl2DkmSJClHhmhJkiQpR4ZoSZIkKUeG\n", "aEmSJClHhmhJkiQpR4ZoSZIkKUeGaEmSJClHhmhJkiQpR4ZoSZIkKUeGaEmSJClHjR6iQwibhxD+\n", "FUJ4I4TwegjhrOz9I0IIH4QQJmS/ftjYtUiSJEn5EGKMjXuAEHoAPWKMr4QQNgReAg4DjgLmxhh/\n", "v5ptY2PXJ0mSJIUQiDGGhj5/vcYsBiDG+BHwUfb7eSGEN4FNsw83uFBJkiSpUDRpT3QIYUtgF+C5\n", "7F1nhhBeDSHcHELo3JS1SJIkSWur0Ueil8u2ctwHnJ0dkb4euCD78IVANXDSytuNGDGi9vvS0lJK\n", "S0sbvVZJkiQVt3HjxjFu3Li13r7Re6IBQghtgEeAf8YYr6rn8S2Bh2OMO650vz3RkiRJanS59kQ3\n", "xewcAbgZmFQ3QIcQetZ52gBgYmPXIkmSJOVDU8zOsS/wb+A1YPnBhgLHADtn73sXOCXG+PFK2zoS\n", "LUmSpEaX60h0k7RzrC1DtCRJkppCwbVzSJIkScXGEC1JkiTlyBAtSZIk5cgQLUmSVGQymQxlZRWU\n", "lVWQyWTSLqcoeWGhJElSEclkMgwYUElNzWUAlJQMYvToUZSXl6dcWWFzdg5JkqQWrKysgrFj+wOV\n", "2XtG0a/fGB577P40yyp4zs4hSZIkNbL10i5AkiRJ+VNVNZDx4yupqUlul5QMoqpqVLpFFSHbOSRJ\n", "kopMJpOhuvpGIAnV9kOvmT3RkiRJUo7siZYkSZIamSFakiRJypEhWpIkScqRIVqSJEnKkSFakiRJ\n", "ypEhWpIkScqRIVqSJEnKkSFakiRJypEhWpIkScqRIVqSJEnKkSFakiRJypEhWpIkScqRIVqSJDW5\n", "TCZDWVkFZWUVZDKZtMuRchZijGnXsEohhFjI9UmSpNxlMhkGDKikpuYyAEpKBjF69CjKy8tTrkwt\n", "WQiBGGNo8PMLOaQaoiVJKj5lZRWMHdsfqMzeM4p+/cbw2GP3p1mWWrhcQ7TtHJIkSVKO1ku7AEmS\n", "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\n", "YII=\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": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": [ "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\n", "9RjJ3hn4e0ppchfvvcTs86q2z4n6MbW6QVONa/To0YwePbrsMtTDeF2oK14X6orXhTqbfTr+hVOP\n", "nuwDgYvn8N41wKEAlRXQpqaUbBWRJElSQ6vpSHZELEa+6fGLVfuOBkgpnZVSuiEidomIp4H3gMNr\n", "WY8kSZJUDzUN2Sml94BlOu07q9PrY2pZg5pXW1tb2SWoB/K6UFe8LtQVrwvVUs0WoylSRKRGqFOS\n", "JEmNKyIKu/HRZdUlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKk\n", "ghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSC\n", "GbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZ\n", "siVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmy\n", "JUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIl\n", "SZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJ\n", "kqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmS\n", "pIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKk\n", "ghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSC\n", "GbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkghmyJUmSpIIZsiVJkqSCGbIlSZKkgtU8ZEfE4Ii4\n", "LCKeiIgJETGy0/ttEfF2RIyrbD+odU2SJElSLfWpw2f8ErghpbRPRPQBFuvimDtSSnvUoRZJkiSp\n", "5moasiNiCWCrlNIXAFJKM4C3uzq0lnVIkiRJ9VTrdpFVgMkRcU5EPBQRv4uIAZ2OScAWETE+Im6I\n", "iLVqXJMkSZJUU7UO2X2ADYEzUkobAu8B3+t0zEPA8JTS+sCvgatqXJMkSZJUU7XuyZ4ETEopPVB5\n", "fRmdQnZK6d2q5zdGxBkRsVRK6c3q40aPHv3v521tbbS1tdWqZkmSJLWAMWPGMGbMmJqcO1JKNTnx\n", "vz8g4k7gqJTSPyNiNNA/pfTdqveHAK+nlFJEbAr8KaW0cqdzpFrXKUmSpNYWEaSUCrlXsB6zixwL\n", "XBgRfYFngCMi4miAlNJZwD7AVyJiBvA+cEAdapIkSZJqpuYj2UVwJFuSJEm1VuRItis+SpIkSQUz\n", "ZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNk\n", "S5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RL\n", "kiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuS\n", "JEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5Ik\n", "SQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJ\n", "BTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkF\n", "M2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUz\n", "ZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNk\n", "S5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RL\n", "kiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBTNkS5IkSQUzZEuSJEkFM2RLkiRJBatpyI6IwRFxWUQ8\n", "ERETImJkF8f8KiKeiojxEbFBLeuRJEmS6qFPjc//S+CGlNI+EdEHWKz6zYjYBVgtpTQiIjYDzgQ+\n", "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\n", "TkSuQmCC\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": 20, "metadata": { "collapsed": 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", " \n", " \n", " \n", " \n", " \n", "
SizeBedroomsPrice
0 2104 3 399900
1 1600 3 329900
2 2400 3 369000
3 1416 2 232000
4 3000 4 539900
\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": 20, "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": 21, "metadata": { "collapsed": 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", " \n", " \n", " \n", " \n", " \n", "
SizeBedroomsPrice
0 0.130010-0.223675 0.475747
1-0.504190-0.223675-0.084074
2 0.502476-0.223675 0.228626
3-0.735723-1.537767-0.867025
4 1.257476 1.090417 1.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": 21, "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": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.13070336960771897" ] }, "execution_count": 22, "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": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAAt8AAAH4CAYAAACSS4HXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", "AAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmUXXWZ7//3kwoJZGAIo4RoCARkigIaQRTLATsoCEoj\n", "ouBt24u0NoraehG7V5P+dV+HbsffD/VCN6LigC0iggoCaqlXmUUIkEgAw6wQJglhyPD8/tinyElR\n", "c52z9xner7XOqn32dJ5K7ZV86ptnf3dkJpIkSZKab1LVBUiSJEndwvAtSZIklcTwLUmSJJXE8C1J\n", "kiSVxPAtSZIklcTwLUmSJJXE8C1JXSoiTo2I/2z0vq0uIuZGxPqI8N9ASaUL5/mW1KkiYgWwHbCu\n", "bvXZmfmBaiqauIi4GHhF7e1UIIFnau/Pycz3VVLYBETEemA1xffS718y8zNN+ry5wB3A5Mxc34zP\n", "kKShTK66AElqogQOy8yfj7RjRPRk5roB6yaNJZyNdf/xyMxD6z7vbODuzPznQWqZnJlrm1lLgy3I\n", "zDuqLkKSms3/cpPUlSLibyLiNxHxuYhYCSyOiLMj4isR8ZOIWAX0RsQeEdEXEY9ExE0RcXjdOb42\n", "cP8Bn3FMRFwzYN2HIuKHteU3RMTNEfGXiLgnIv5hPN9K3bnXR8T7ImI58Ifaui9GxF0R8VhEXBsR\n", "r6jbf3FEnFNb7m/FeGdE3BkRD0bEx8e572YR8fWIeDgibomI/xURd4/je+v/3PMi4tzan9N1EbGg\n", "bvtwP5/NIuKzEbEiIh6NiF9HxNS60x83WP2S1EyGb0mdLobZthC4naI15X/X9j0W+NfMnAFcA1wE\n", "XAJsC7wf+FZE7FZ3jvr9fzPg/BcCu0fErnXr3g58q7Z8FvCezNwc2AsYcYR+FI4AXgrsWXt/NfAi\n", "YCvg28D3ImJKbdtgfYcHAbsBrwX+OSJ2H8e+pwHPB3YGDgGOG+L4esP9nN4E/Hfd93BBRPRExCYM\n", "//P5DLAvcCAwC/jogDoG1v/CEWqUpAkzfEvqZEER1B6pe727bvt9mfmlzFyfmU9RBLMLMvOK2vYX\n", "A9Mz81OZuTYzfwH8iCJw93t2/8x8uv7DM/NJ4If9+0fEfGB3ilAORa/2XhGxeWY+lpnXN+B7/mRm\n", "PtpfS2Z+KzMfqX2Pn6PoE+8PyYMF3n/JzKcz80bgBorgPtZ9jwY+Ufue7gW+OMTx9X434Od0SN22\n", "azPz/Fpb0OeATSkC9QEM8fOp3Uz5LuDkzLy/9v1fmZnP1J13qPolqWkM35I6WQJHZOZWda+z6rYP\n", "1gpxT93yjoPsc2dtff/5R2qn+DYbwvrbgR/Ugj7AUcAbgBW11okDRjjXaGxUT0R8pNb68WhEPAJs\n", "AWwzzPF/qlteDcwYx74D/9zq/0yHsu+An9Nlgx2fxSwB99Q+43kM/fPZmiKk3z6G+qePok5JmhDD\n", "t6RuNlgrRP26+4A5EVE/avsC4N4xfMblwLYR8SLgbRRhvPigzGsz80iKlokLKForJurZ+iPilRSt\n", "Fkdn5paZuRXwGCOPQk/U/cCcuvdzhtpxlJ49vjaivRPFz2C4n89K4CmgvuVHkipn+JbU6cYSNAfu\n", "eyXFiOj/iohNIqIXOAw4d7Tnzsw1wPco+o+3Ai4DqJ3vHRGxRa2d4nE2nhJxPPUONBNYC6yMiCkR\n", "8c/A5mP8jPH4b+DUiNgyImYDJzGxnu/9I+LNETEZ+CBFqL6Sop990J9PbYT8q8DnIuJ5tR7xA+v6\n", "3cdagyQ1hOFbUqe7KCIer3t9v7Y+eW4g3GhdLTgfDhwKPAicDhyfmbcOc47BfJvipr7vDZiK8Djg\n", "jxHxGPAe4B0AEfH8Wq07jXDegZ8/sJZLaq9bgRXAk8BdYzh+LJ9V7/+haA35I3ApxS8fzwyzP8AN\n", "A35On6v7nB8CxwAPU/wZvSUz19X6t4f7+XwEWEJx4+xDwCfZELBH+l8PSWqKpj5kJyIWAV8AeoD/\n", "ysxPD9jeS/GXav/crt/PzH8bzbGSpPYQEe8F3pqZrx7HsacBu2bm8Y2vTJLK17SH7ERED8UoxOso\n", "+u+uiYgLM3PpgF1/mZlvGuexkqQWExE7ALsAVwDzgQ8D/994T9eouiSpFTSz7WQhcFtmrqj91+25\n", "FPPPDjTYX6yjPVaS1HqmAP8H+AvwM4qbSb88znONtrVHktpCMx8vP5vnTjX1sgH7JPDyiLiBYoT7\n", "I5l5yyiPlSS1oMy8C9inQef6l0acR5JaRTPD92hGKn4HzMnM1RFxKMXoyG4jHPOsiHA0RJIkSaXI\n", "zAm3wjUzfN/Lc+d53ehBC5n5eN3yxRHx5YiYVdtv2GPrjmtYweoMixcvZvHixVWXoRbjdaHBeF1o\n", "MF4XGszGjxQYv2b2fF8LzI+IubV5VY9hwyOVAYiI7fsfjhARCylmX3l4NMdKkiRJ7aZpI9+ZuTYi\n", "TgJ+SjFd4FmZuTQiTqxtPwP4a+C9EbGW4kEJbxvu2GbVKkmSJJWhmW0nZObFwMUD1p1Rt/wl4Euj\n", "PVYajd7e3qpLUAvyutBgvC40GK8LNVNTH7LTbBGR7Vy/JEmS2kNENOSGSx8vL0mSJJXE8C1JkiSV\n", "xPAtSZIklcTwLUmSJJXE8C1JkiSVxPAtSZIklcTwLUmSJJXE8C1JkiSVxPAtSZIklcTwLUmSJJXE\n", "8C1JkiSVxPAtSZIklcTwLUmSJJXE8C1JkiSVxPAtSZIklcTwLUmSJJXE8C1JkiSVxPAtSZIklcTw\n", "LUmSJJXE8C1JkiSVpP3D9zPPVF2BJEmSNCrtH74feqjqCiRJkqRRaf/w/fDDVVcgSZIkjUr7h29H\n", "viVJktQmDN+SJElSSdo/fNt2IkmSpDbR/uHbkW9JkiS1CcO3JEmSVJL2D9+2nUiSJKlNtH/4duRb\n", "kiRJbcLwLUmSJJXE8C1JkiSVpP3Dtz3fkiRJahPtH74feggyq65CkiRJGlH7h++eHnjiiaqrkCRJ\n", "kkbU/uF7661tPZEkSVJb6Izw7U2XkiRJagPtH75nzTJ8S5IkqS20f/i27USSJEltojPCtyPfkiRJ\n", "agPtH75tO5EkSVKbaP/wbduJJEmS2kRnhG9HviVJktQG2j9823YiSZKkNtH+4du2E0mSJLWJzgjf\n", "jnxLkiSpDTQ1fEfEoohYFhHLI+KUYfZ7aUSsjYij6tatiIgbI+L6iLh6yA8xfEuSJKlNTG7WiSOi\n", "BzgdeB1wL3BNRFyYmUsH2e/TwCUDTpFAb2YO31Oy1Vbw6KOwfj1Mav+BfEmSJHWuZqbVhcBtmbki\n", "M9cA5wJHDLLf+4HzgAcH2RYjfsrkyTBjBjz22ERqlSRJkpqumeF7NnB33ft7auueFRGzKQL5V2qr\n", "sm5zApdHxLURccKwn2TriSRJktpA09pO2DhID+ULwMcyMyMi2Hik+6DMvD8itgUui4hlmfnrgSdY\n", "vHgxPPkkfOpT9B53HL29vQ0pXpIkSd2rr6+Pvr6+hp83MkeTkcdx4ogDgMWZuaj2/lRgfWZ+um6f\n", "O9gQuLcBVgMnZOaFA851GrAqMz87YH1mJixaBCefDIce2pTvRZIkSd0tIsjMkVuiR9DMtpNrgfkR\n", "MTcipgDHABuF6sycl5k7Z+bOFH3f783MCyNiWkTMBIiI6cDrgSVDfpJtJ5IkSWoDTWs7ycy1EXES\n", "8FOgBzgrM5dGxIm17WcMc/gOwPlFJwqTgW9l5qVD7r3NNvDgYPdrSpIkSa2jmT3fZObFwMUD1g0a\n", "ujPzXXXLdwAvHvUHbbut4VuSJEktrzMmxjZ8S5IkqQ0YviVJkqSSGL4lSZKkkhi+JUmSpJIYviVJ\n", "kqSSNO0hO2V49iE769fD1KmwejVssknVZUmSJKnDtMNDdsozaRLMmgUrV1ZdiSRJkjSkzgjfYOuJ\n", "JEmSWp7hW5IkSSqJ4VuSJEkqieFbkiRJKonhW5IkSSqJ4VuSJEkqieFbkiRJKonhW5IkSSpJZ4Vv\n", "H7IjSZKkFtZZ4duRb0mSJLWwyMyqaxi3iMhn61+7FjbbDJ5+unjcvCRJktQgEUFmxkTP0zkpdfJk\n", "2HxzePjhqiuRJEmSBtU54RtsPZEkSVJLM3xLkiRJJTF8S5IkSSUxfEuSJEklMXxLkiRJJTF8S5Ik\n", "SSUxfEuSJEklMXxLkiRJJTF8S5IkSSUxfEuSJEklicysuoZxi4jcqP6nn4aZM4uvEdUVJkmSpI4S\n", "EWTmhANmZ418T50Km20Gjz5adSWSJEnSc3RW+AbYfnv485+rrkKSJEl6js4L3zvsYPiWJElSS+q8\n", "8L399vCnP1VdhSRJkvQcnRe+HfmWJElSi+q88O3ItyRJklpU54VvR74lSZLUojovfDvyLUmSpBbV\n", "eeHbkW9JkiS1qM4L3458S5IkqUV11uPlYcMj5p96CiZ13u8WkiRJKp+Plx/K1KkwfTo88kjVlUiS\n", "JEkb6bzwDUXft60nkiRJajGdGb63396bLiVJktRyOjN8O/ItSZKkFtSZ4duRb0mSJLWgzgzfjnxL\n", "kiSpBTU1fEfEoohYFhHLI+KUYfZ7aUSsjYijxnrsoBz5liRJUgtqWviOiB7gdGARsCdwbETsMcR+\n", "nwYuGeuxQ3LkW5IkSS2omSPfC4HbMnNFZq4BzgWOGGS/9wPnAQ+O49jBOfItSZKkFtTM8D0buLvu\n", "/T21dc+KiNkUofortVX9j6sc8dhhOfItSZKkFjS5iecezXPrvwB8LDMzIgLof2TnqJ95v3jx4meX\n", "e3t76e3the22g5UrYd066OkZQ8mSJEkS9PX10dfX1/DzRuaoc+7YThxxALA4MxfV3p8KrM/MT9ft\n", "cwcbAvc2wGrgBOCBkY6trc8h699mG7jlliKIS5IkSRMQEWRmjLzn8Jo58n0tMD8i5gL3AccAx9bv\n", "kJnz+pcj4mzgosy8MCImj3TsiPr7vg3fkiRJahFN6/nOzLXAScBPgVuA72bm0og4MSJOHM+xYyrA\n", "vm9JkiS1mKa1nZRh2LaTt78d3vAGOO64couSJElSx2lU20lnPuESHPmWJElSy+nc8O1c35IkSWox\n", "nRu+HfmWJElSizF8S5IkSSXp3PD9vOfB/fdXXYUkSZL0rM4N37Nnw333VV2FJEmS9KzODd+zZsHq\n", "1fDkk1VXIkmSJAGdHL4jitYTR78lSZLUIjo3fIOtJ5IkSWopnR2+d9wR7r236iokSZIkoBvCtyPf\n", "kiRJahGdHb5tO5EkSVIL6ezw7ci3JEmSWkjnh297viVJktQiOj98O/ItSZKkFtEd4Tuz6kokSZKk\n", "Dg/fM2dCTw889ljVlUiSJEkdHr7B1hNJkiS1jM4P3043KEmSpBbR+eHbkW9JkiS1iO4I3043KEmS\n", "pBbQ+eHbthNJkiS1iM4P37adSJIkqUUYviVJkqSSdEf4tudbkiRJLSCyjZ/+GBE5Yv1PP108bOep\n", "p2BS5/+uIUmSpMaLCDIzJnqezk+jU6fCFlvAypVVVyJJkqQu1/nhG2w9kSRJUkvojvDtdIOSJElq\n", "Ad0Rvh35liRJUgvojvC9005wzz1VVyFJkqQu1x3h+/nPh7vuqroKSZIkdbnuCN9z5sDdd1ddhSRJ\n", "krpcd4RvR74lSZLUAjr/ITsAq1fD1lsXX2PCc6NLkiSpy/iQnbGYNq14+aAdSZIkVag7wjfYeiJJ\n", "kqTKdU/49qZLSZIkVay7wrcj35IkSapQ94Tv5z/fkW9JkiRVqnvCtyPfkiRJqlj3hG9HviVJklSx\n", "7gnf3nApSZKkinXHQ3YA1qyB6dOLB+1MntzcwiRJktRRfMjOWG2yCWy3Hdx3X9WVSJIkqUt1T/gG\n", "b7qUJElSpbovfNv3LUmSpIo0NXxHxKKIWBYRyyPilEG2HxERN0TE9RFxXUS8pm7bioi4sbbt6oYU\n", "5CPmJUmSVKGm3XkYET3A6cDrgHuBayLiwsxcWrfb5Zn5w9r++wA/AHatbUugNzMfblhRc+bA8uUN\n", "O50kSZI0Fs0c+V4I3JaZKzJzDXAucET9Dpn5RN3bGcDKAeeY8B2lG3Gub0mSJFWomeF7NlCfdO+p\n", "rdtIRBwZEUuBi4EP1G1K4PKIuDYiTmhIRd5wKUmSpAo1c8LrUU3AnZkXABdExCuBc4Dda5sOysz7\n", "I2Jb4LKIWJaZvx54/OLFi59d7u3tpbe3d+gP84ZLSZIkjUJfXx99fX0NP2/THrITEQcAizNzUe39\n", "qcD6zPz0MMfcDizMzIcGrD8NWJWZnx2wfvQP2QFYvx6mTYOHHioeuCNJkiSNQjs8ZOdaYH5EzI2I\n", "KcAxwIX1O0TELhERteX9ADLzoYiYFhEza+unA68Hlky4okmTnPFEkiRJlWla20lmro2Ik4CfAj3A\n", "WZm5NCJOrG0/AzgKeGdErAFWAW+rHb4DcH4tl08GvpWZlzaksLlz4Y9/hD32aMjpJEmSpNFqWttJ\n", "GcbcdgJw4omwYAH8/d83pyhJkiR1nHZoO2lNO+9cjHxLkiRJJevO8L1iRdVVSJIkqQt1Z/h25FuS\n", "JEkVMHxLkiRJJem+8L3NNvD00/DYY1VXIkmSpC7TfeE7wtFvSZIkVaL7wjcYviVJklSJ7g3fzngi\n", "SZKkknVv+HbkW5IkSSUzfEuSJEklMXxLkiRJJYnMrLqGcYuIHFf9jz0GO+4Iq1YVs59IkiRJw4gI\n", "MnPCwbE7R7632AKmToUHH6y6EkmSJHWR7gzf4IwnkiRJKl13h2/7viVJklQiw7ckSZJUEsO3JEmS\n", "VBLDtyRJklSS7g3fu+wCt99edRWSJEnqIt05zzfAM8/AzJnw+OMwZUpjC5MkSVJHcZ7viZoyBXba\n", "yekGJUmSVJruDd8A8+fD8uVVVyFJkqQu0d3he9ddDd+SJEkqTXeH7/nz4bbbqq5CkiRJXcLw7ci3\n", "JEmSStLd4du2E0mSJJWoe6caBFizBmbMcLpBSZIkDcupBhthk01gzhyfdClJkqRSdHf4BltPJEmS\n", "VBrDtzOeSJIkqSSGb2c8kSRJUkkM37adSJIkqSSGb9tOJEmSVJLunmoQnG5QkiRJI3KqwUbpn27w\n", "jjuqrkSSJEkdzvANtp5IkiSpFIZvKML3rbdWXYUkSZI6nOEb4IUvhGXLqq5CkiRJHc7wDbDHHrB0\n", "adVVSJIkqcMZvsHwLUmSpFIYvgG23x7WrYMHH6y6EkmSJHUwwzdARNH37ei3JEmSmmjE8B0R54xm\n", "Xduz9USSJElNNpqR773r30TEZGD/5pRTIcO3JEmSmmzI8B0RH4+Ix4F9IuLx/hfwAHBhaRWWxfAt\n", "SZKkJovMHH6HiE9l5sdKqmdMIiJHqn/Ubr8dXvMauPPOxpxPkiRJHSMiyMyY6HlG03byo4iYUfvQ\n", "4yPicxHxgtGcPCIWRcSyiFgeEacMsv2IiLghIq6PiOsi4jWjPbbh5s4tZjtZtarpHyVJkqTuNJrw\n", "/RVgdUS8CPgwcAfwjZEOioge4HRgEbAncGxE7DFgt8sz80WZuS/wN8CZYzi2sXp6isfM/+EPTf0Y\n", "SZIkda/RhO+1mbkeOBL4UmaeDswcxXELgdsyc0VmrgHOBY6o3yEzn6h7OwNYOdpjm8K+b0mSJDXR\n", "aML34xHxceA4ihaUHmCTURw3G7i77v09tXUbiYgjI2IpcDHwgbEc23CGb0mSJDXRaML3McDTwN9m\n", "5p8oQvB/jOK4Ud0JmZkXZOYewOHAOREx4Ub2cfNBO5IkSWqiySPtkJn3R8S3gJdGxGHA1Zk5Ys83\n", "cC8wp+79HIoR7KE+59e1OcRn1fYb1bGLFy9+drm3t5fe3t5RlDYER74lSZIE9PX10dfX1/Dzjmaq\n", "wbdSjHT/srbqYOCjmfm9EY6bDPwBeC1wH3A1cGxmLq3bZxfgjszMiNgP+F5m7jKaY2vHN26qQYCn\n", "noItt4THH4dNRtNZI0mSpG7QqKkGRxz5Bv4JeGlmPlD74G2BnwHDhu/MXBsRJwE/BXqAszJzaUSc\n", "WNt+BnAU8M6IWAOsAt423LHj+QbHZNNNYc4cWL4c9tyz6R8nSZKk7jKake8lwIL+IeaImATckJn7\n", "lFDfsBo+8g3wlrfAMccUL0mSJIlyH7JzCfDTiPibiHgX8BOKmUk604IFcOONVVchSZKkDjRk20lE\n", "zAe2z8yPRsRRwEG1Tb8Fvl1GcZXYZx/4+terrkKSJEkdaMi2k4j4MXBqZt44YP0C4H9n5uEl1Des\n", "prSdLF8OhxwCK1Y09rySJElqW2W0nWw/MHgD1NbtPNEPblnz5sGDD8Jjj1VdiSRJkjrMcOF7y2G2\n", "bdroQlpGTw/stRfcdFPVlUiSJKnDDBe+r42I9wxcGREnANc1r6QWsM8+sGRJ1VVIkiSpwww3z/cH\n", "gR9ExDvYELb3B6YCb252YZVyxhNJkiQ1wZDhOzP/FBEvB14N7A0k8KPM/HlZxVVmn33gvPOqrkKS\n", "JEkdZsSH7LSypsx2AsUNl7vuCo8+CjHhm1olSZLU5sp8yE732XZbmDYN7rqr6kokSZLUQQzfQ1mw\n", "wJsuJUmS1FCG76F406UkSZIazPA9FKcblCRJUoMZvoeyYAH8/vdVVyFJkqQO4mwnQ3nmGdhyy2Lm\n", "k+nTm/MZkiRJagvOdtJsU6YUj5l39FuSJEkNYvgezv77w3XXjbyfJEmSNAqG7+Hstx/87ndVVyFJ\n", "kqQOYfgejiPfkiRJaiBvuBzO00/DVlvBypXFEy8lSZLUlbzhsgxTp8Iee/iwHUmSJDWE4Xsk++1n\n", "64kkSZIawvA9Evu+JUmS1CCG75Hsv78znkiSJKkhvOFyJE89BbNmwcMPw6abNvezJEmS1JK84bIs\n", "m24Ku+3mTZeSJEmaMMP3aNj3LUmSpAYwfI/GwoVwzTVVVyFJkqQ2Z/gejQMOgCuuqLoKSZIktTlv\n", "uByNtWuLJ13edVfxVZIkSV3FGy7LNHkyvOQlcPXVVVciSZKkNmb4Hq0DD7T1RJIkSRNi+B6tAw6A\n", "K6+sugpJkiS1MXu+R+uBB2D33eGhh2CSv7NIkiR1E3u+y7bddsWTLm+9tepKJEmS1KYM32PhlIOS\n", "JEmaAMP3WNj3LUmSpAkwfI+F4VuSJEkT4A2XY/HMM0Xf9/33w8yZ5X2uJEmSKuUNl1WYMgX228/R\n", "b0mSJI2L4XusDj4YfvWrqquQJElSGzJ8j9XBB8Mvf1l1FZIkSWpD9nyP1apVsMMOsHIlbLppuZ8t\n", "SZKkStjzXZUZM2CvveCqq6quRJIkSW3G8D0er3qVfd+SJEkaM8P3eNj3LUmSpHGw53s8Hn0U5syB\n", "hx4qph+UJElSR2uLnu+IWBQRyyJieUScMsj2d0TEDRFxY0T8JiIW1G1bUVt/fURc3cw6x2zLLWHX\n", "XeG666quRJIkSW2kaeE7InqA04FFwJ7AsRGxx4Dd7gAOzswFwL8CZ9ZtS6A3M/fNzIXNqnPcnO9b\n", "kiRJY9TMke+FwG2ZuSIz1wDnAkfU75CZV2TmY7W3VwE7DTjHhIf2m+ZVr7LvW5IkSWPSzPA9G7i7\n", "7v09tXVDeTfwk7r3CVweEddGxAlNqG9iDj4YfvMbWLOm6kokSZLUJiY38dyjvhMyIl4N/C1wUN3q\n", "gzLz/ojYFrgsIpZl5q8HHrt48eJnl3t7e+nt7R13wWOyzTZF3/eVV8IrX1nOZ0qSJKkUfX199PX1\n", "Nfy8TZvtJCIOABZn5qLa+1OB9Zn56QH7LQDOBxZl5m1DnOs0YFVmfnbA+mpmO+l36qkweTL8679W\n", "V4MkSZKarh1mO7kWmB8RcyNiCnAMcGH9DhHxfIrgfVx98I6IaRExs7Y8HXg9sKSJtY7PIYfAZZdV\n", "XYUkSZLaRFPn+Y6IQ4EvAD3AWZn5yYg4ESAzz4iI/wLeDNxVO2RNZi6MiHkUoRyK1phvZeYnBzl/\n", "tSPfTz9dtJ/cdRdstVV1dUiSJKmpGjXy7UN2JurQQ+GEE+Atb6m2DkmSJDVNO7SddIdDDoFLL626\n", "CkmSJLUBw/dE2fctSZKkUTJ8T9Tee8Pq1XD77VVXIkmSpBZn+J6oCEe/JUmSNCqG70ZYtAh+8pOR\n", "95MkSVJXc7aTRnj4YZg7F/78Z9hss6qrkSRJUoM520krmTUL9t0Xfv7zqiuRJElSCzN8N8phh8GP\n", "flR1FZIkSWphtp00yrJlxY2Xd91V3IQpSZKkjmHbSavZfXfYdFP4/e+rrkSSJEktyvDdKBG2nkiS\n", "JGlYhu9GOvxwuOiiqquQJElSi7Lnu5GeeQa23x5uuQWe97yqq5EkSVKD2PPdiqZMgUMPhQsuqLoS\n", "SZIktSDDd6MdfTR873tVVyFJkqQWZNtJoz35JOywAyxfDtttV3U1kiRJagDbTlrVZpsVrSc/+EHV\n", "lUiSJKnFGL6bwdYTSZIkDcK2k2ZYvbqY7eS222DbbauuRpIkSRNk20krmzYN/uqvnPVEkiRJGzF8\n", "N4utJ5IkSRrAtpNmeeIJmD0bli0rZj+RJElS27LtpNVNnw5HHgnf+U7VlUiSJKlFGL6b6fjj4Zxz\n", "qq5CkiRJLcLw3Uy9vfDAA3DTTVVXIkmSpBZg+G6mnh447jhHvyVJkgR4w2Xz3XxzMe3gnXcWYVyS\n", "JEltxxsu28Vee8H228MvflF1JZIkSaqY4bsM73wnfO1rVVchSZKkitl2UoaHH4Z58+D222Hrrauu\n", "RpIkSWNk20k7mTULDj8cvv71qiuRJElShQzfZTnxRDjzTGiHkXpJkiQ1heG7LAcdVMx28stfVl2J\n", "JEmSKmL4LktEMfp9xhlVVyJJkqSKeMNlmR55BHbeGW69FbbbrupqJEmSNErecNmOttoKjjqq6P2W\n", "JElS13Hku2xLlhRPvPzjH2Hq1KqrkSRJ0ig48t2u9tmneOrld79bdSWSJEkqmeG7Ch/6EHz+8047\n", "KEmS1GUM31VYtAiefNJpByVJkrqM4bsKkyZtGP2WJElS1/CGy6qsXg3z5sHPflb0gEuSJKllecNl\n", "u5s2DT74QfjEJ6quRJIkSSVx5LtKf/kL7LIL/Pa3MH9+1dVIkiRpCI58d4LNN4eTToJPfrLqSiRJ\n", "klQCR76r9sgjsOuucN11MHdu1dVIkiRpEI58d4qttoITT3T0W5IkqQs0NXxHxKKIWBYRyyPilEG2\n", "vyMiboh7xZQsAAAUXklEQVSIGyPiNxGxYLTHdpSPfATOPx+WL6+6EkmSJDVR09pOIqIH+APwOuBe\n", "4Brg2MxcWrfPgcAtmflYRCwCFmfmAaM5tnZ8+7ed9PvEJ2DJEvjOd6quRJIkSQO0Q9vJQuC2zFyR\n", "mWuAc4Ej6nfIzCsy87Ha26uAnUZ7bMc5+eTiiZfXX191JZIkSWqSZobv2cDdde/vqa0byruBn4zz\n", "2PY3fTr80z/Bxz9edSWSJElqkslNPPeo+0Ei4tXA3wIHjfXYxYsXP7vc29tLb2/vaA9tPf/zf8Jn\n", "Pws//zm85jVVVyNJktS1+vr66Ovra/h5m9nzfQBFD/ei2vtTgfWZ+ekB+y0AzgcWZeZtYzy2c3q+\n", "+51/Ppx2WtF+MrmZvxtJkiRptNqh5/taYH5EzI2IKcAxwIX1O0TE8ymC93H9wXu0x3asN78ZttsO\n", "zjij6kokSZLUYE19yE5EHAp8AegBzsrMT0bEiQCZeUZE/BfwZuCu2iFrMnPhUMcOcv7OG/mGYtaT\n", "174Wli6FrbeuuhpJkqSu16iRb59w2apOOgky4UtfqroSSZKkrmf4psPD98MPw557wkUXwUtfWnU1\n", "kiRJXa0der41EbNmwWc+AyecAGvWVF2NJEmSGsDw3cre8Y7i5svPf77qSiRJktQAtp20ujvugIUL\n", "4aqrYJddqq5GkiSpK9l20i3mzYNTTikewLN+fdXVSJIkaQIM3+3gwx+GZ56BL36x6kokSZI0Abad\n", "tIvbb4cDDoC+Pthrr6qrkSRJ6iq2nXSbXXaBT3wCjj++GAWXJElS23Hku51kwhFHwG67FdMQSpIk\n", "qRSOfHejCDj7bDjvPLjggqqrkSRJ0hg58t2OrroKDj8crryymA1FkiRJTeXIdzd72cvgn/4Jjj4a\n", "nnqq6mokSZI0So58t6tMeOtbYcst4cwzi5YUSZIkNYUj390uAr761aIFxfm/JUmS2sLkqgvQBMyc\n", "CRddBAceCPPnwxvfWHVFkiRJGoYj3+3uBS+A738f3vUuWLKk6mokSZI0DMN3JzjwwKL15PDD4d57\n", "q65GkiRJQ7DtpFMceyzcdRe8/vXwq1/B1ltXXZEkSZIGcLaTTnPKKdDXB5dfXvSES5IkacIaNduJ\n", "4bvTZMJ73gN33AE//jFsumnVFUmSJLU9wzeG7yGtWwdvfzs8/jicf74BXJIkaYKc51tD6+mBb34T\n", "ttgC3vQmWL266ookSZKE4btzbbIJnHMO7LBDMf/3qlVVVyRJktT1DN+dbPJkOPtsmDcP/uqv4KGH\n", "qq5IkiSpqxm+O11PD/znf8JBB8ErXgF33ll1RZIkSV3Leb67waRJ8O//DrNnFyH8Rz+CF7+46qok\n", "SZK6jiPf3eTkk+Hzny8exHPRRVVXI0mS1HUc+e42Rx8Nc+bAX/813HAD/OM/Qkx41hxJkiSNgvN8\n", "d6v77oOjjipaUb72NZgxo+qKJEmSWpbzfGtidtyxeAz9llvCgQfCsmVVVyRJktTxDN/dbOrUYiaU\n", "D3wAXvlKOOus4vH0kiRJagrbTlS45RZ429tgjz3gjDOKEXFJkiQBtp2o0fbcE666CrbdFvbdF37x\n", "i6orkiRJ6jiOfOu5fvxj+Lu/g8MOK+YHnzmz6ookSZIq5ci3mueNb4QlS2DNGth7b/jpT6uuSJIk\n", "qSM48q3hXXYZnHBCMSPKZz5TTE0oSZLUZRz5VjkOOaS4GXOXXeBFLyoC+Jo1VVclSZLUlgzfGtm0\n", "afBv/wZXXAE//3kRwn/8Y6cllCRJGiPbTjQ2mfCjH8HHPlbMjPLv/w4LF1ZdlSRJUlPZdqJqRMDh\n", "h8MNN8Dxx8Nb3gJHHw3Ll1ddmSRJUsszfGt8Jk+Gd78bbr0V9tuvuCHzne/0MfWSJEnDMHxrYqZN\n", "g1NPhdtvh913h4MPLp6UedNNVVcmSZLUcgzfaowttoB//McihO+3H7zudXDEEdDX542ZkiRJNd5w\n", "qeZYvRq+8Q34whdgs83gQx8qRsSnTKm6MkmSpDFr1A2Xhm811/r1cMkl8PnPw803w3vfW/SK77hj\n", "1ZVJkiSNmrOdqD1MmgRveEPxpMxLL4V77ikeWX/kkcVc4evWVV2hJElSaRz5VvlWrYLvfhfOPBPu\n", "v78YCX/nO2HnnauuTJIkaVBtMfIdEYsiYllELI+IUwbZ/sKIuCIinoqIfxiwbUVE3BgR10fE1c2s\n", "UyWbMaMI3FddBRddBA8+WDyo56CD4MtfhpUrq65QkiSpKZo28h0RPcAfgNcB9wLXAMdm5tK6fbYF\n", "XgAcCTySmZ+t2/ZHYP/MfHiYz3Dku1OsWVO0pXzzm3DxxfDKV8I73gGHHVaEdUmSpAq1w8j3QuC2\n", "zFyRmWuAc4Ej6nfIzAcz81pgzRDnmPA3qDaxySbwxjfCd74Dd99dPDXza18rbsw84ohi+aGHqq5S\n", "kiRpQpoZvmcDd9e9v6e2brQSuDwiro2IExpamVrbzJlFD/gll8CddxZB/MILYd48eO1r4fTTixs3\n", "JUmS2szkJp57ov0gB2Xm/bXWlMsiYllm/nrgTosXL352ube3l97e3gl+rFrKVlvBcccVr9Wri9aU\n", "H/wATjsNdtoJDj0UFi0q+sU32aTqaiVJUofo6+ujr6+v4edtZs/3AcDizFxUe38qsD4zPz3IvqcB\n", "q+p7vkez3Z7vLrZ2LVx9dTE6fvHFsHw5vPrVRRh//eth7tyqK5QkSR2k5R+yExGTKW64fC1wH3A1\n", "A264rNt3MfB4f7iOiGlAT2Y+HhHTgUuBf8nMSwccZ/hW4YEHilHxiy+Gyy+HadOKMN7/2mmnqiuU\n", "JEltrOXDN0BEHAp8AegBzsrMT0bEiQCZeUZE7EAxC8rmwHrgcWBPYDvg/NppJgPfysxPDnJ+w7ee\n", "KxNuuQX6+uAXvyi+brVVEcJ7e4sWlec/H8L7eSVJ0ui0RfhuNsO3RmX9erjppiKE9/XBb39bPHnz\n", "wAPh5S8vvu63H2y6adWVSpKkFmX4xvCtccqEFSuKEH7FFcVr2TJYsKAI4i95SRHGd9utCOmSJKnr\n", "Gb4xfKuBnngCrrmmCOLXXQe/+13x5M0Xvxj237947bcfvPCF0NNTdbWSJKlkhm8M32qyhx+G668v\n", "wnh/IL//fthnn+K1994bvm67bdXVSpKkJjJ8Y/hWBR59FG64AW6+GZYsKXrJlywp+sXrw/jeexej\n", "5FtsUXXFkiSpAQzfGL7VIjLh3ns3hPH+QH7rrTBjRtE7vvvuxat/ed48HwokSVIbMXxj+FaLy4T7\n", "7oM//GHD69Zbi6/33ltMd9gfxOfNg5133vB1+vSqq5ckSXUM3xi+1caefhpuv70I4nfcAX/8Y/G6\n", "445iJpbNNy9CeH0gnzcPXvCC4oFBU6dW/R1IktRVDN8YvtWh1q+HP/95Qyiv/3rXXcVo+hZbwJw5\n", "RRCv/9q/PHu2AV2SpAYyfGP4Vpdavx4eeADuvhvuuaf4OnD5/vuLp3rOng077FC8nve8Dcv1rxkz\n", "fNqnJEkjMHxj+JaGtG5dMXp+773F1z/9afDX/fcX+9eH8e23L6ZO3GabwV+bbVbt9yZJUgUM3xi+\n", "pYZYteq5oXzlysFfDz5YzNIyVDCfNasYcd9yyw1f+5dtg5EktTHDN4ZvqXSZxdNAhwrnK1cWc6H3\n", "vx55ZMPXnp7nBvLBlmfOHPq16aa2yEiSKmH4xvAttY1MePLJDWF8YDCvD+yPP168/vKXDcv9r/Xr\n", "hw/nM2cWM8XMmFFM1zhtWvGqXx74fvp0mDLFUC9JGpbhG8O31HWeeWbjMD5YQO9/rV698euJJ4Z+\n", "v3bt8EF9s82KUfeBr6lTx/Z+4LqpUw39ktQmDN8YviU1yNq1w4f1J54o5mZ/6qniVb88nvf9655+\n", "uhh1nzq16KWfMmXD1/rlRm+bPLl49fRsWB5u3Vj27enxFwpJHcnwjeFbUptbv74Yze9/rVnz3OWB\n", "Xxuxbd264heO/tfA9xNZt24dTJo0fFDv6SlekyYVr7EsN2vfwY6LKF5DLY9lWyuep/+XpIHLY/3q\n", "sRt/Hcx4trX6+Uba1oEaFb4nN6IYSdI4TJq0oQWlU2QWAXykoL5+ffFat2745ZG2N+K4wdatWVN8\n", "L/2v9esHXx7LtlY7T//Pq355rF89duOvgxnPtlY/30S0+i8VQ60/7rihzzVGjnxLkiSpMZoR9Fvh\n", "l5RJk4ipUx35liRJUguxTWVEk6ouQJIkSeoWhm9JkiSpJIZvSZIkqSSGb0mSJKkkhm9JkiSpJIZv\n", "SZIkqSSGb0mSJKkkhm9JkiSpJIZvSZIkqSSGb0mSJKkkhm9JkiSpJIZvSZIkqSSGb0mSJKkkhm9J\n", "kiSpJIZvSZIkqSSGb0mSJKkkhm9JkiSpJIZvSZIkqSSGb0mSJKkkhm9JkiSpJIZvSZIkqSSGb0mS\n", "JKkkhm9JkiSpJIZvSZIkqSSGb0mSJKkkhm9JkiSpJIZvSZIkqSSGb0mSJKkkTQ3fEbEoIpZFxPKI\n", "OGWQ7S+MiCsi4qmI+IexHCsNpa+vr+oS1IK8LjQYrwsNxutCzdS08B0RPcDpwCJgT+DYiNhjwG4P\n", "Ae8HPjOOY6VB+ZemBuN1ocF4XWgwXhdqpmaOfC8EbsvMFZm5BjgXOKJ+h8x8MDOvBdaM9VhJkiSp\n", "3TQzfM8G7q57f09tXbOPlSRJklpSZGZzThxxFLAoM0+ovT8OeFlmvn+QfU8DVmXmZ8dybEQ0p3hJ\n", "kiRpgMyMiZ5jciMKGcK9wJy693MoRrAbdmwj/gAkSZKksjSz7eRaYH5EzI2IKcAxwIVD7DswRI/l\n", "WEmSJKktNG3kOzPXRsRJwE+BHuCszFwaESfWtp8RETsA1wCbA+sj4mRgz8xcNdixzapVkiRJKkPT\n", "er4lSZIkbaxtn3DpQ3i6U0TMiYhfRMTNEXFTRHygtn5WRFwWEbdGxKURsWXdMafWrpNlEfH66qpX\n", "s0VET0RcHxEX1d57XXS5iNgyIs6LiKURcUtEvMzrQrWf880RsSQivh0RU70uuk9EfDUi/hwRS+rW\n", "jfk6iIj9a9fS8oj44kif25bh24fwdLU1wIcycy/gAODvaz/7jwGXZeZuwM9q74mIPSnuGdiT4nr5\n", "ckS05XWvUTkZuAXo/y89rwt9EfhJZu4BLACW4XXR1SJiLnACsF9m7kPR3vo2vC660dkUP9N6Y7kO\n", "+u9Z/Arw7sycT3HP4sBzbqRdLx4fwtOlMvNPmfn72vIqYCnFHPBvAr5e2+3rwJG15SOA72Tmmsxc\n", "AdxGcf2ow0TETsAbgP9iw03cXhddLCK2AF6ZmV+F4l6kzHwMr4tu9xeKgZxpETEZmAbch9dF18nM\n", "XwOPDFg9luvgZRHxPGBmZl5d2+8bdccMql3Dtw/hUf/oxb7AVcD2mfnn2qY/A9vXlndk42kqvVY6\n", "1+eBjwLr69Z5XXS3nYEHI+LsiPhdRPxnREzH66KrZebDwGeBuyhC96OZeRleFyqM9ToYuP5eRrg+\n", "2jV8e5dol4uIGcD3gZMz8/H6bVncRTzcNeL102Ei4jDggcy8nudOXQp4XXSpycB+wJczcz/gCWr/\n", "hdzP66L7RMQuwAeBuRTBaUbtYX7P8roQjOo6GJd2Dd8TeYCP2lxEbEIRvM/JzAtqq/9cm7qS2n8B\n", "PVBbP/Ba2am2Tp3l5cCbIuKPwHeA10TEOXhddLt7gHsy85ra+/MowvifvC662kuA32bmQ5m5Fjgf\n", "OBCvCxXG8u/GPbX1Ow1YP+z10a7h24fwdKnazQ1nAbdk5hfqNl0I/I/a8v8ALqhb/7aImBIROwPz\n", "gatRR8nMj2fmnMzcmeLGqZ9n5vF4XXS1zPwTcHdE7FZb9TrgZuAivC662TLggIjYrPZvyusobtT2\n", "uhCM8d+N2t8zf6nNpBTA8XXHDKqZj5dvmqEe4FNxWSrHQcBxwI0RcX1t3anAp4D/joh3AyuAtwJk\n", "5i0R8d8Uf7GuBd6XTm7fDfp/xl4Xej/wrdpAze3Auyj+3fC66FKZeUNEfINiIG898DvgTGAmXhdd\n", "JSK+A7wK2CYi7gb+mfH9u/E+4GvAZhSzK10y7Od6/UiSJEnlaNe2E0mSJKntGL4lSZKkkhi+JUmS\n", "pJIYviVJkqSSGL4lSZKkkhi+JUmSpJIYviWpBUXEqtrXF0TEsQ0+98cHvP9NI88vSRqa4VuSWlP/\n", "Qxh2Bt4+lgMjYqQHqJ260QdlHjSW80uSxs/wLUmt7VPAKyPi+og4OSImRcR/RMTVEXFDRLwHICJ6\n", "I+LXEfFD4Kbaugsi4tqIuCkiTqit+xSwWe1859TW9Y+yR+3cSyLixoh4a925+yLiexGxNCK+2V9c\n", "RHwqIm6u1fIfpf7JSFIbasvHy0tSFzkF+EhmHg5QC9uPZubCiJgK/N+IuLS2777AXpl5Z+39uzLz\n", "kYjYDLg6Is7LzI9FxN9n5r51n9E/yv4W4EXAAmBb4JqI+FVt24uBPYH7gd9ExEHAMuDIzHxhrbbN\n", "m/D9S1JHceRbklpbDHj/euCdEXE9cCUwC9i1tu3quuANcHJE/B64ApgDzB/hs14BfDsLDwC/BF5K\n", "Ec6vzsz7MjOB3wMvAB4FnoqIsyLizcCT4/4uJalLGL4lqf2clJn71l67ZObltfVP9O8QEb3Aa4ED\n", "MvPFwPXApiOcN3lu2O8fFX+6bt06YJPMXAcsBM4DDgMuGc83I0ndxPAtSa3tcWBm3fufAu/rv6ky\n", "InaLiGmDHLc58EhmPhURLwQOqNu2ZoibMn8NHFPrK98WOBi4mucGcmqfPR3YMjMvBj5M0bIiSRqG\n", "Pd+S1Jr6R5xvANbV2kfOBv5fYC7wu4gI4AHgzbX9s+74S4C/i4hbgD9QtJ70OxO4MSKuy8zj+4/L\n", "zB9ExIG1z0zgo5n5QETsMeDc/fXNBH4YEZtSBPQPNeQ7l6QOFkX7niRJkqRms+1EkiRJKonhW5Ik\n", "SSqJ4VuSJEkqieFbkiRJKonhW5IkSSqJ4VuSJEkqieFbkiRJKsn/D78fehQXipj4AAAAAElFTkSu\n", "QmCC\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": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "LinearRegression(copy_X=True, fit_intercept=True, normalize=False)" ] }, "execution_count": 24, "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": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": [ "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\n", "aadp7ty5CS9CsnPnTp100knad9999f7772vFihU688wzNXHiRN1555066qijtHHjRq1bt05SbFvI\n", "U089pZkzZ+r3v/+9Vq1apfHjx+uMM86IOf/jjz+uF198Ua+99poeeugheZ6XzpcOAAAgZ+RniDZL\n", "zVeSnHM65ZRTNGzYMB1zzDEqLS3VzJkzJUlXXXWVhg4dqn79+mnOnDm68MILNWXKFJmZzjnnHPXr\n", "10/PPvusnnvuOe3YsUOXXXaZevXqpaqqKk2ZMiXh4z3//PNatWqVbrnlFhUXF6tfv36aOnVqWy0d\n", "uf/++3X++efr0EMPVd++fTV79mw9++yzWrZsWdsxV155pQYPHqyxY8fqq1/9ql555ZWkXxMAAIB8\n", "lLOX/e5QSP3DZqZHHnlExx133G63RbdgvP/++7r33nt12223te3bvn27Vq1aJeecxowZE3Pf8ePH\n", "J3y85cuXa/z48SoqSv690KpVq3T44Ye3bQ8cOFDDhw/XihUrNG7cOEnSyJEj224fMGCANm3alPTj\n", "AAAA5KP8HInOQtHtGOPGjdPVV1+t9evXt31t2rRJ//Zv/6ZRo0ZpxYoVMfd9//33E55z7NixWrZs\n", "mXbu3Nnh4yUyevRoLV26tG178+bNWrt27W4BHgAAALsjRIfgggsu0B133KHnn39ezjlt3rxZjz/+\n", "uDZt2qSpU6eqd+/e+tWvfqXt27fr4Ycf1gsvvJDwPEcccYRGjRqlK6+8Ulu2bNHWrVv1zDPPSJL2\n", "3ntvffDBB9q+fXvb8c65tjaPM888U3fffbdeffVVffrpp5o5c6aOPPLItlHoeKwOAgAAsAshOgPi\n", "R4UPO+ww3XXXXbr44otVUlKi/fffX/fee68kqU+fPnr44Yd1zz33aPjw4XrooYdUVVWV8Hy9evXS\n", "o48+qiVLlmjcuHEaO3asHnroIUnS8ccfr4MOOkgjR47UXnvt1Xa/1vsef/zxuv7661VVVaXRo0fr\n", "vffe04MPPthuzdH3BQAAKHSWzSOMZuYS1WdmjIzmKX62AAAgDEEG6fKIISPRAAAAQJII0QAAAECS\n", "CNEAAABAkgjRAAAAQJII0QAAAECSCNEAAABAkgjRAAAAQJII0QAAAECSCNE5aNmyZRo0aBAXJQEA\n", "AAgJITqF9thjDw0aNEiDBg1SUVGRBgwY0Lb9wAMPpOxxxo0bp40bN6blMtznnnuu+vXrp8GDB2vw\n", "4ME6+OCDNXPmTH3yySddPseECRP01FNPpbw2AACAbFFQIdo5p1/96j/1la9M07/+6zl65513Unr+\n", "TZs2aePGjdq4caPGjx+vxx57rG37zDPPbDtux44dKX3cVDIzzZgxQ5988onWrFmju+++W88995y+\n", "/OUva8uWLV0+B6PkAAAgn+VViF67dq0uvfQHOvHEM1Rbe6t27twZc/vVV1+nq676rZ5++lt6+OGD\n", "NGXKV7R8+fKE51m2bJlaWlpSUldjY6P22Wcf3XzzzRo1apTOP/98ffzxxzrppJO01157qaSkRNOm\n", "TdOKFSva7lNaWqprrrlGRx99tAYPHqzy8nKtXbtWkrR06VIVFRW11dfRsZJ07733avz48RoxYoRu\n", "uOEGTZgwQQsWLGi33tYA3LdvXx1++OGqr6/X2rVrdffdd0uS3n33XR133HEaMWKE9txzT5111lna\n", "sGGDJOnss8/WsmXLNG3aNA0aNEg/+9nPJEmnnXaaRo0apaFDh+rYY4/V4sWLU/LaAgAAhCFvQvSW\n", "LVs0ZUqp7rxzk/70p2m65pp5Ov/878Yc8+tf364tWx6SVCnnZujTT6fpD3/4Q9vtzjlddNHlGj16\n", "Xx144JE66KAj9OGHH6akvtWrV2v9+vVatmyZ7rzzTrW0tOj888/XsmXLtGzZMhUXF+viiy+Ouc8D\n", "Dzyge+65R//85z+1bdu2tkCaSHvHLl68WN/97nf1wAMPaNWqVdqwYYNWrlyZVCvIHnvsobKyMj39\n", "9NNt+66++mqtWrVKb775ppYvX65Zs2ZJku677z6NGzeubRT+iiuukCSdeOKJWrJkiT766CNNnjxZ\n", "3/zmN7v8+AAAANkmb0L0k08+qTVrhmvbtv+S9E1t2fKY7r+/rsstCJIfRO+7b6G2bVumLVtWaMmS\n", "43XOOd9JSX1FRUW67rrr1KdPH/Xv318lJSWqrKxU//79tccee2jmzJlauHBh2/FmpvPOO0/77bef\n", "+vfvr9NPP12vvPJKwnN3dOwf/vAHVVRUaOrUqerTp49+8pOfdKuXetSoUVq3bp0k6bOf/ayOP/54\n", "9enTRyNGjNDll18eU3si5557rgYOHKg+ffro2muv1auvvqqNGzcmXQcAAEA2yJsQ7bdu9JfUGhD7\n", "SrKYlo6LL75IAwacLmmeiopuUr9+j+q0005ru/2FFxZp8+bTJQ2VZNqx4wItWvRySurbc8891bdv\n", "37btLVu26MILL9SECRM0ZMgQHXvssdqwYUNML/HIkSPbvi8uLtamTZvaPX97x65cuVL77LNPzG3D\n", "hw9Puv4VK1a03W/16tU644wztM8++2jIkCE6++yzY9pH4rW0tOjKK6/UfvvtpyFDhmjfffeVmWnN\n", "mjVJ1wEAAJAN8iZEf/WrX1Vx8dvq1esnkp5S//5nKhI5UYMGDWo75sYbr9Xs2d/SV77yW5166mK9\n", "8ML/xQTMAw74jIqLF0jyJ/6ZzdeECZ9JSX3xo7+1tbV655139Pzzz2vDhg1auHChnHMpn5A3evRo\n", "ffDBB23bzc3NHQbeRLVu2rRJTz75pI455hhJ0syZM9WrVy+98cYb2rBhg+67776Y/vH4+99///2q\n", "r6/XggULtGHDBr333ntpea4AAACZkjcheujQoXrhhYU66aS39cUvXqcLLthPc+feF3OMmenSS7+r\n", "hQsf1e9/X6cDDjgg5vZ///d/15FH9tMee3xBgwcfq5KS2br33v9MS72bNm1ScXGxhgwZonXr1um6\n", "667b7ZhkQmZ7x1ZVVenRRx/Vs88+q23btmnWrFkdnjc63H766ad66aWXdMopp2j48OE677zz2mof\n", "OHCgBg8erBUrVuiWW26JOcfee++td999N+a59uvXTyUlJdq8ebNmzpzZ5ecFAACQjfImREv++sl/\n", "/OP9euWVhfrVr25W//79k7p/nz599OST9WpouEdz5/5YS5a8rgMPPDAltcWPzn7ve99Tc3OzRowY\n", "oalTp+rrX//6bsdEb5vZbttdOfaggw7SbbfdpjPOOEOjR4/WoEGDtNdee6lfv37t1nnzzTdr8ODB\n", "GjFihKqrqzVlyhQ988wzKi4uliRde+21evnllzVkyBBNmzZNVVVVMY9/1VVX6YYbbtCwYcP085//\n", "XOecc47Gjx+vMWPG6Atf+IKOOuqotKxxDQAAkCmWzR+pm5lLVB/rEHffpk2bNGzYMC1ZskTjx48P\n", "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\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 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.9" } }, "nbformat": 4, "nbformat_minor": 0 }