{
"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",
" Population | \n",
" Profit | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 6.1101 | \n",
" 17.5920 | \n",
"
\n",
" \n",
" 1 | \n",
" 5.5277 | \n",
" 9.1302 | \n",
"
\n",
" \n",
" 2 | \n",
" 8.5186 | \n",
" 13.6620 | \n",
"
\n",
" \n",
" 3 | \n",
" 7.0032 | \n",
" 11.8540 | \n",
"
\n",
" \n",
" 4 | \n",
" 5.8598 | \n",
" 6.8233 | \n",
"
\n",
" \n",
"
\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",
" Population | \n",
" Profit | \n",
"
\n",
" \n",
" \n",
" \n",
" count | \n",
" 97.000000 | \n",
" 97.000000 | \n",
"
\n",
" \n",
" mean | \n",
" 8.159800 | \n",
" 5.839135 | \n",
"
\n",
" \n",
" std | \n",
" 3.869884 | \n",
" 5.510262 | \n",
"
\n",
" \n",
" min | \n",
" 5.026900 | \n",
" -2.680700 | \n",
"
\n",
" \n",
" 25% | \n",
" 5.707700 | \n",
" 1.986900 | \n",
"
\n",
" \n",
" 50% | \n",
" 6.589400 | \n",
" 4.562300 | \n",
"
\n",
" \n",
" 75% | \n",
" 8.578100 | \n",
" 7.046700 | \n",
"
\n",
" \n",
" max | \n",
" 22.203000 | \n",
" 24.147000 | \n",
"
\n",
" \n",
"
\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": [
"iVBORw0KGgoAAAANSUhEUgAAAtEAAAHuCAYAAABZDVDiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n",
"AAALEgAACxIB0t1+/AAAIABJREFUeJzt3X+Q5GldJ/j3Mwwzlj/YZoAdkGVtdvEO92TtmfFwL/xB\n",
"7UpVobvX0nYELupGNYe2RrjISuI1LCHOYbQ4aAEhxkq0gpZ6gUvsWG7rrpNdS1AcFZ6iOAMoIGJM\n",
"c+g6I+PAClpBq/PcH5k1Xd3z7e7K6vz1zXy9Iiqmvt/Kynwy+XTyyafe3+cptdYAAAD7d8OkBwAA\n",
"AG2jiQYAgAFpogEAYECaaAAAGJAmGgAABqSJBgCAAY28iS6lfEEp5bdLKfeVUj5cSnl9//wtpZTN\n",
"UsrHSinnSimHRj0WAAAYhjKOdaJLKV9Ya/3rUsqNSbaTvDLJ0SQP1VrfUEo5leSJtdZXjXwwAABw\n",
"ncYS56i1/nX/25uSPC7Jp9Nrotf759eTvHAcYwEAgOs1lia6lHJDKeW+JA8meXet9Q+S3FprfbB/\n",
"kweT3DqOsQAAwPW6cRwPUmt9JMmRUsrfS9Itpfzzy35eSymPyZU0nQMAgFGotZb93nYsTfSuWuv/\n",
"KKX8lyR3JHmwlPLUWusDpZSnJfnzK/zOOIdIC9x555258847Jz0Mpoy6oIm6oIm6oEkp++6fk4xn\n",
"dY4n7668UUpZSLKU5N4kZ5Os9m+2muRXRz0WZsP58+cnPQSmkLqgibqgibpgGMYxE/20JOullBvS\n",
"a9p/sdb6rlLKvUneWUp5aZLzSV40hrEAAMB1G3kTXWv9UJLbG84/nOT5o358Zs+JEycmPQSmkLqg\n",
"ibqgibpgGMayTvRBlVLqNI8PAIDZUEoZ6MJC237TOltbW5MeAlNIXdBEXdBEXTAMmmgAABiQOAcA\n",
"AHNPnAMAAEZME03ryLLRRF3QRF3QRF0wDJpoAAAYkEw0AABzTyYaAABGTBNN68iy0URd0ERd0ERd\n",
"MAyaaAAAGJBMNAAAc08mGgAARkwTTevIstFEXdBEXdBEXTAMmmgAABiQTDQAAHNPJhoAAEZME03r\n",
"yLLRRF3QRF3QRF0wDJpoAAAYkEw0AABzTyYaAABGTBNN68iy0URd0ERd0ERdMAyaaAAAGJBMNAAA\n",
"c08mGgAARkwTTevIstFEXdBEXdBEXTAMmmgAABiQTDQAAHNPJhoAAEZME03ryLLRRF3QRF3QRF0w\n",
"DJpoAAAYkEw0AABzTyYaAABGTBNN68iy0URd0ERd0ERdMAyaaAAAGJBMNAAAc08mGgAARkwTTevI\n",
"stFEXdBEXdBEXTAMmmgAABiQTDQAAHNPJhoAAEZME03ryLLRRF3QRF3QRF0wDJpoAAAYkEw0AABz\n",
"TyYaAABGTBNN68iy0URd0ERd0ERdMAyaaAAAGJBMNAAAc08mGgAARkwTTevIstFEXdBEXdBEXTAM\n",
"mmgAABiQTDQAAHNPJhoAAEZME03ryLLRRF3QRF3QRF0wDJpoAAAY0Mgz0aWUZyT5hSR/P0lNcqbW\n",
"+pOllDuTfFeST/Vv+upa6z2X/a5MNAAAIzdoJnocTfRTkzy11npfKeWLk7w/yQuTvCjJZ2utb7zK\n",
"72qiAQAYuam7sLDW+kCt9b7+959L8pEkT+//eN8DhV2ybDRRFzRRFzRRFwzDWDPRpZTDSW5L8lv9\n",
"Uy8rpXyglPK2UsqhcY4FAAAO6sZxPVA/yvGfkry81vq5UspPJ3ld/8c/kmQtyUsv/70TJ07k8OHD\n",
"SZJDhw7lyJEjWVxcTHLxk6Rjx44d756blvE4dux4eo93z03LeBxP5nj3+/Pnz+cgxrLZSinl8Ul+\n",
"Pclv1Frf3PDzw0l+rdb6nMvOy0QDADByU5eJLqWUJG9L8uG9DXQp5Wl7bnYsyYdGPRZmw95PkLBL\n",
"XdBEXdBEXTAM44hzfG2S70zywVLKvf1z/z7Ji0spR9Jb9u7+JN8zhrEAAMB1G0uc46DEOQAAGIep\n",
"i3MAAMCs0UTTOrJsNFEXNFEXNFEXDIMmGgAABiQTDQAwY7rdbtbWziRJOp2TWVlZmfCIpt+gmWhN\n",
"NADADOl2uzl2bDU7O3clSRYWTmVjY10jfQ0uLGTmybLRRF3QRF3QZNbrYm3tTL+BXk3Sa6Z3Z6UZ\n",
"Hk00AAAMSJwDAGCGiHMcjEw0AMCcc2Hh4DTRzLytra0sLi5OehhMGXVBE3VBE3VBExcWAgDAiJmJ\n",
"BgBg7pmJBgCAEdNE0zqzvr4nB6MuaKIuaKIuGAZNNAAADEgmGgCAuScTDQAAI6aJpnVk2WiiLmii\n",
"LmiiLhgGTTQAAAxIJhoAgLknEw0AACOmiaZ1ZNlooi5ooi5ooi4YBk00ADB23W43y8vHs7x8PN1u\n",
"d9LDgYHJRAMAY9XtdnPs2Gp2du5KkiwsnMrGxnpWVlYmPDLm2aCZaE00ADBWy8vHs7l5NMlq/8x6\n",
"lpbO5ty5uyc5LOacCwuZebJsNFEXNFEXNFEXDMONkx4AADBfOp2T2d5ezc5O73hh4VQ6nfXJDgoG\n",
"JM4BAIxdt9vN2tqZJL2mWh6aSZOJBgCAAclEM/Nk2WiiLmiiLmiiLhgGTTQAAAxInAMAgLknzgEA\n",
"ACOmiaZ1ZNlooi5ooi5o0lQXtiFnUNaJBgDm2uXbkG9vr9qGnGuSiQYA5pptyElkogEAYOQ00bSO\n",
"jCNN1AVN1AVNLq+LTudkFhZOJVlPst7fhvzkJIZGi8hEAwBzbWVlJRsb63u2IZeH5tpkogEAmHsy\n",
"0QAAMGKaaFpHxpEm6oIm6oIm6oJh0EQDAMCAZKIBAPq63e6eCwxPusBwjgyaidZEAwDksTsXLiyc\n",
"snPhHHFhITNPlo0m6oIm6oImV6qLtbUz/QZ6NUmvmd6dlYbLaaIBAGBA4hwAABHnmHcy0QAAB+TC\n",
"wvmliWbmbW1tZXFxcdLDYMqoC5qoC5qoC5q4sBAAAEbMTDQAAHPPTDQAAIyYJprWse4rTdQFTdQF\n",
"TdQFw6CJBgCAAY08E11KeUaSX0jy95PUJGdqrT9ZSrklyX9M8mVJzid5Ua31M5f9rkw0AAAjN3VL\n",
"3JVSnprkqbXW+0opX5zk/UlemOQlSR6qtb6hlHIqyRNrra+67Hc10QAAjNzUXVhYa32g1npf//vP\n",
"JflIkqcnOZpkvX+z9fQaa7gmWTaaqAuaqAuaqAuGYayZ6FLK4SS3JfntJLfWWh/s/+jBJLeOcywA\n",
"AHBQN47rgfpRjruTvLzW+tlSLs6W11prKaUxt3HixIkcPnw4SXLo0KEcOXLk0V2Gdj9JOnbs2PHu\n",
"uWkZj2PHjqf3ePfctIzH8WSOd78/f/58DmIsm62UUh6f5NeT/Eat9c39cx9NslhrfaCU8rQk7661\n",
"Pvuy35OJBgBg5KYuE116U85vS/Lh3Qa672yS1f73q0l+ddRjYTbs/QQJu9QFTdQFTdQFwzCOOMfX\n",
"JvnOJB8spdzbP/fqJD+W5J2llJemv8TdGMYCAADXbSxxjoMS5wAAYBymLs4BAACzRhNN68iy0URd\n",
"0ERd0ERdMAyaaAAAGJBMNAAAc08mGgAARkwTTevIstFEXdBEXdBEXTAMmmgAABiQTDQAAHNPJhoA\n",
"AEZME03ryLLRRF3QRF3QRF0wDJpoAAAYkEw0AABzTyYaAABGTBNN68iy0URd0ERd0ERdMAyaaAAA\n",
"GJBMNAAAc08mGgAARkwTTevIstFEXdBEXdBEXTAMmmgAgDHqdrtZXj6e5eXj6Xa7kx4OByQTDQAw\n",
"Jt1uN8eOrWZn564kycLCqWxsrGdlZWXCI2PQTLQmGgBgTJaXj2dz82iS1f6Z9Swtnc25c3dPcljE\n",
"hYXMAVk2mqgLmqgLmqgLhuHGSQ8AAGBedDons729mp2d3vHCwql0OuuTHRQHIs4B19DtdrO2diZJ\n",
"781Pbg2A6+H/V6aTTDQMkQtAAGA+yEQz88aZZVtbO9NvoFeT9Jrp3dkDpouMI03UBU3UBcOgiQYA\n",
"gAGJc8BViHMAwHyQiYYhcwEIAMw+TTQzb2trK4uLi5MeBlNGXdBEXdBEXdDEhYUAQCt0u90sLx/P\n",
"8vLxdLvdSQ8HBmImGgAYO9ecMG3EOQCAqbe8fDybm0fTW0I0SdaztHQ2587dPclhMcfEOZh51vek\n",
"ibqgibqgibpgGG6c9AAAgPnT6ZzM9vZqdnZ6xwsLp9LprE92UDAAcQ4AYCIsIco0kYkGAIAByUQz\n",
"82TZaKIuaKIuaKIuGAZNNAAADEicAwCAuSfOAQAAI6aJpnVk2WiiLmiiLmiiLhgGTTQAAAxIJhoA\n",
"gLknEw0AACOmiaZ1ZNlooi5ooi5ooi4YBk00AAAMSCYaAIC5JxMNAAAjpommdWTZaKIu2qfb7WZ5\n",
"+XiWl4+n2+2O5DHUBU3UBcNw46QHAMD86Xa7OXZsNTs7dyVJtrdXs7GxnpWVlQmPDGB/ZKIBGLvl\n",
"5ePZ3DyaZLV/Zj1LS2dz7tzdkxwWMMdkogEAYMQ00bSOLBtN1EW7dDons7BwKsl6kvUsLJxKp3Ny\n",
"6I+jLmiiLhgGmWgAxm5lZSUbG+tZWzuTJOl05KGBdhl5JrqU8vYk/zLJn9dan9M/d2eS70ryqf7N\n",
"Xl1rvafhd2WiAQAYuWnMRP9ckhdcdq4meWOt9bb+12MaaAAAmFYjb6Jrre9N8umGH+2704e9ZNlo\n",
"oi5ooi5ooi4YhkleWPiyUsoHSilvK6UcmuA4AABgIJO6sPCnk7yu//2PJFlL8tKmG544cSKHDx9O\n",
"khw6dChHjhzJ4uJikoufJB07dux499y0jMexY8fTe7x7blrG43gyx7vfnz9/Pgcxls1WSimHk/za\n",
"7oWFA/zMhYUAY9btdvesmnHSqhnAXJjGCwsfo5TytD2Hx5J8aBLjoJ32foKEXepiOHa3497cPJrN\n",
"zaM5dmw13W530sM6MHVBE3XBMIw8zlFKeUeS5yV5cinlk0l+OMliKeVIeqt03J/ke0Y9DgCubW3t\n",
"THZ27srudtw7O71zZqMBLjXyJrrW+uKG028f9eMyu/Zm2mCXuqCJuqCJumAY7FgIwKM6nZPZ3l7N\n",
"zk7vuLcd9/pkBwUwhSaSiYbrIctGE3UxHLvbcS8tnc3S0tlsbLR7O251QRN1wTCYiQbgEisrK61u\n",
"nAHGYSxL3B2UJe4AABiHVixxBwAAbaaJpnVk2WiiLmiiLmiiLhgGTTQAAAxIJhoAgLknEw0AACOm\n",
"iaZ1ZNnGq9vtZnn5eJaXj6fb7U56OFekLmiiLmiiLhgG60QDV9TtdnPs2Gp2du5Kkmxvr7Z+8w0A\n",
"GAaZaOCKlpePZ3PzaJLV/pneTnbnzt09yWFxHbrdbtbWziTpbfHtAxFAz6CZaDPRAHPCXxYAhkcm\n",
"mtaRZRufTudkFhZOJVlPsp6FhVPpdE5OeliN1MW1ra2d6TfQq0l6zfTurPSsUhc0URcMg5lo4IpW\n",
"VlaysbG+58//Zi0BIJGJBpgbl8c5FhZOiXMA9A2aib5mE11KeVet9RuvdW4UNNEAw+XCQoBmQ9ts\n",
"pZSyUEp5UpKnlFJu2fN1OMnTr3+ocDCybDRRF/uzsrKSc+fuzrlzd89FA60uaKIuGIarZaK/J8nL\n",
"k3xpkvfvOf/ZJD81ykEBAMA020+c42W11reMaTyXP7Y4BwAAIze0THQp5Rtrre8qpRxP8pgb1Vp/\n",
"5eDD3OfgNNEAAIzB0DLRSb6h/9///QpfMBGybDRRFzRRFzRRFwzD1TLRn+7/92drrdvjGAwAALTB\n",
"1eIcH6i1flUp5d5a621jHtfuGMQ5AAAYuUHjHFebif5wKeWPkjy9lPKhy35Wa63/9EAjBACAlrti\n",
"JrrW+uIkX5/k40n+VS7NQx8dy+iggSwbTdQFTdQFTdQFw3C1mejUWh9I8k9LKTcl+Z/6p/+w1vo3\n",
"Ix8ZAABMqf2sE72YZD3JJ/qn/mGS1Vrre0Y7NJloAADGY5hL3O16Y5LlWus31Fq/IclykjcddIDA\n",
"fOt2u1lePp7l5ePpdruTHg4AHMh+mugba61/uHtQa/1YrhEDgVGSZWuvbrebY8dWs7l5NJubR3Ps\n",
"2OrQGml1QdMHNHVBE3XBMOynGX5/KeVnk/xSkpLkO5L87khHBUydbrebtbUzSZJO52RWVlYGvo+1\n",
"tTPZ2bkryWqSZGend+4g9wV77X5A69VXsr29mo2N9dx8880THhkwq/bTRH9vkn+b5Pv7x+9N8h9G\n",
"NiK4hsXFxUkPYaY1NctXalCmqflVF/PtSh/Qzp27e7IDYyp5v2AYrtpEl1JuTPKBWuuzk6yNZ0gw\n",
"X4YxwzvMsTQ1y8OaQe50TmZ7ezU7O73jhYVT6XTWh/kUAGAsrpqJrrX+bZI/LKV82ZjGA9c0S1m2\n",
"UWaED+LSZrnXTO82+MOwsrKSjY31LC2dzdLS2aHOZs9SXTC4TudkFhZOpbeY1Hr/A9pJdUEjdcEw\n",
"7CfOcUuSPyilvC/JX/XP1VqrDVfgOrUlIzzMGeSVlZWpe3603+4HtIt/1el9QNMsAaOyn3Win7f7\n",
"7Z7T1TrRcP2Wl49nc/NodpvopDdLO6kc5+VxjoWFU4/OFk9T7AQAhm3QdaKv2ESXUhbSu6jwWUk+\n",
"mOTt496pUBPNrLta0zrJMWmWAZg3w2yi35nkQnqrcXxzkvO11pcPZZT7pImmydbW1kxdWa1pHY5Z\n",
"qwuGQ13QRF3QZNAm+mqZ6K+otT6nf6dvS/I71zs44LFkhAGgfa42E31vrfW2Kx2Pg5loAADGYZhx\n",
"jr9L8td7Ti0k6V+bn1prfcKBR7lPmmgAAMZh0Cb6iutE11ofV2v9kj1fN+75fuQNNFyJJatooi5o\n",
"oi5ooi4YhqtutgIAADzWNdeJniRxDgAAxmFocQ4AAKCZJprWkWWjibqgibqgibpgGDTRAAAwIJlo\n",
"AADmnkw0AACMmCaa1pFlo4m6oIm6oIm6YBg00QAAMCCZaAAA5p5MNAAAjJgmmtaRZaOJuqCJuqCJ\n",
"umAYRt5El1LeXkp5sJTyoT3nbimlbJZSPlZKOVdKOTTqcQCQdLvdLC8fz/Ly8XS73UkPB6C1Rp6J\n",
"LqV8fZLPJfmFWutz+ufekOShWusbSimnkjyx1vqqht+ViQYYkm63m2PHVrOzc1eSZGHhVDY21rOy\n",
"sjLhkQFM3qCZ6LFcWFhKOZzk1/Y00R9N8rxa64OllKcm2aq1Prvh9zTRAEOyvHw8m5tHk6z2z6xn\n",
"aelszp27e5LDApgKbbmw8NZa64P97x9McuuExkELybLRRF3QRF3QRF0wDDdOegC11lpKueJ084kT\n",
"J3L48OEkyaFDh3LkyJEsLi4mufiPwPF8He+alvE4no7j++67b6rGM43Hz3/+12R7+1R2dpLkI7np\n",
"pjPpdN4xNeMbxfGuaRmP4+k49n7heNfW1lbOnz+fg5hknGOx1vpAKeVpSd4tzgEwet1uN2trZ5Ik\n",
"nc5JeWiAvrZkot+Q5C9qrXeVUl6V5JALCwEAmJSpy0SXUt6R5DeT/M+llE+WUl6S5MeSLJVSPpbk\n",
"X/SPYV/2/hkGdqkLmqgLmqgLhmHkmeha64uv8KPnj/qxAQBgFMYS5zgocQ4AAMZh6uIcAAAwazTR\n",
"tI4sG03UBU3UBU3UBcOgiQYAgAHJRDPzrIsLAFyLTDTs0e12c+zYajY3j2Zz82iOHVtNt9ud9LCg\n",
"lbrdbpaXj2d5+bh/R8Dc00TTOoNk2dbWzmRn564kq0lWs7Nz16Oz0swWGcfRausHUnVBE3XBMIx8\n",
"nWgA2u/SD6TJzk7vnHgUMK800bTO4uLivm/b6ZzM9vZqdnZ6xwsLp9LprI9mYEzUIHXB/FAXNFEX\n",
"DIMLC5l5LiyE67cb5+jNRvc+kG5srPv3BMyMQS8s1ETTOltbW2YReAx1MXpt/ECqLmiiLmgyaBMt\n",
"zgHAvqysrLSicQYYBzPRAADMPetEAwDAiGmiaR3re9JEXdBEXdBEXTAMmmgAABiQTDQAAHNPJhoA\n",
"AEZME03ryLLRpE110e12s7x8PMvLx9Ptdic9nJnWprpgfNQFw2CdaIAxunznv+3tVTv/AbSQTDTA\n",
"GC0vH8/m5tEkq/0z61laOptz5+6e5LAA5p5MNEBEJgAYLU00rSPLRpO9dbEbmdjcPJrNzaM5dmx1\n",
"ahrpTudkFhZOJVlPsp6FhVPpdE5Oelgzy/sFTdQFwyATDcyctbUz/cxxLzKxs9M7Nw2545WVlWxs\n",
"rGdt7UySpNORhwZoI5looBW63e6exvPkVRtPuWMABjVoJtpMNDD1Bl3RotM5me3t1ezs9I57kYn1\n",
"cQ0XgDkgE03ryLLNn0vjGb1mendWetfeutiNTCwtnc3S0llLyM0x7xc0URcMg5loYCatrKxonAEY\n",
"GZloyGB523kwba/H5XGOhYVTZpcBGKpBM9GaaOaeBu1S0/p6TFtjD8BssdkKM2/YWbb95G3nybS+\n",
"HisrKzl37u6cO3d3YwM9yoyjjVvaS/aVJuqCYZCJBriKQVcGAWA+iHMw96Y1vjApXo9LWXMaYD6I\n",
"c8CAVlZW8prXvCy33PIjueWWH8lrXvOyuW0Yk9EtDycSAcAs0UTTOsPOsnW73Zw+/ZY8/PAP5eGH\n",
"fyinT7+lFU3etZrS62lar5U/PshYjx1bzebm0WxuHs2xY6tDf42b6mIYjXunczILC6eSrCdZ72/c\n",
"cvK6xsr4yL7SRF0wDDLRzL1LL6RLdnZ656Z5NvpaOd1py/GO6zXeu4LH8553e06ffst1vwa7M/MX\n",
"VwaZ32gLABdpommdxcXFSQ+h0TiXYLtWU9rGDwbX6/Of//wlHxze9a5OHnlkLcN4DWzc0l7T+n7B\n",
"ZKkLhkETzdzrdE5me3s1Ozu9496f69cHuo9pm/kdxDia/2G8xtdy+QeHRx5561DvHwAuUWud2q/e\n",
"8OBS7373u4d+n/fcc09dWvrWurT0rfWee+4Z+PeXlr61Jj9fk9r/+vm6tPStQx/nrnvuuacuLNza\n",
"f8yfrwsLt14y7mv9fNDbDWvM1/MaX8sdd3z9Zf8bdOoNNzxxLM+N6TWK9wvaT13QpN937rtPNRMN\n",
"ad+f66+V091vjnecsY9Rv8YvetG/yoc/fGrPbPcv5TWv6eQ97zmbRJYZgOGyTjQMQVvXVp61NZBt\n",
"DQ7AQQ26TrQmGoakjQ1cW5t/ABg2TTQzb2try5XVQ9TG5r+JuqCJuqCJuqDJoE20TDTMubblwQFg\n",
"GpiJhiGblZldAJgn4hwwQTLGANBOgzbRN4xyMDAKW1tbkx7CFV26ZFyvmd6dlWa0prkumBx1QRN1\n",
"wTBoommVbrebV77ytVlePp5utzvp4cyUbreb5eXjXlsA2AdxDlqjDVGJNoyxSVvHDQDDIhPNzGrL\n",
"xiBtvLCwLa8tAIyKTDRzYGvSA0hy5fjDyspKzp27O+fO3d2KBnpWyDjSRF3QRF0wDJpoWqPTOZmF\n",
"hVNJ7kmynoWFU+l0Tk5kLLvxh83No9ncPJpjx1avK0c86Tzyxdd2PZN4bSf9/CdhHp8zwCwR56BV\n",
"piUq0RR/uO22n8mTn3zrwGObljzypF7baXn+4zSPzxlg2slEwxjcfvti7r33JbnYRL8ypbwttb45\n",
"yWBN0bznkefx+c/jcwaYdjLRzLxpyLL95V9+Ksm/y278Ifm5fgM9f+tDT0ssYRrqgumjLmiiLhiG\n",
"Gyf54KWU80n+MsnfJfmbWutzJzke2uF973tffvRH35JkMpGObreb++//syQvTfLWJH+U5IkHvr9O\n",
"52S2t1ezs9M77uWR14cw0tG7PJawvb06cCyhzc//oObxOQPMmonGOUop9ye5o9b68BV+Ls7BJaYh\n",
"S9r0p/hSXpbHP/4LcuHCjx9oXNeTR55kTnxYsYRpybqP0zw+Z4BpNmicY6Iz0X37Hixcuq12srPT\n",
"OzfpBuTIkdvz+te/ek9TNFhjv7KycqDnMIyZ4Glw0OffZvP4nAFmyaQz0TXJfyul/G4p5bsnPBZa\n",
"4yMTffSm5eBe//pXD3V96P3mjC/9UDH+LPakl8bbS8aRJuqCJuqCYZj0TPTX1lr/rJTylCSbpZSP\n",
"1lrfu/cGJ06cyOHDh5Mkhw4dypEjR7K4uJjk4j8Cx/Nz/Pznf03e854fy4ULX5HkI7nppjPpdN4x\n",
"1vGsrKxkY2M9r3nN6STJ6dO9md9h3f/nP//5/uzyiSQXZ5dvvvnmx9z+4Yc/lYu2svcDxjhej5tv\n",
"vjkbG+tZWzuThx/+VF70olc8+gFi3PVx3333jfXxHLfjeNe0jMfxdBx7v3C8a2trK+fPn89BTM0S\n",
"d6WUH07yuVrr2p5zMtE8xqxnSQfJGU9DRhwAZkFrMtGllC9M8rha62dLKV+UZDnJ/zWp8dAe15Ml\n",
"nbUGfHdW/KBZbADgYG6Y4GPfmuS9pZT7kvx2kl+vtZ6b4Hhoib1/hhnEsLfqHpVBc8bXymJPyzrO\n",
"o3bQumC2qQuaqAuGYWIz0bXW+5McmdTjM3+mdWWPyw1zdnlWVu8AgGkzNZnoJjLRDNM8brU8j88Z\n",
"AA7Ctt9wBdO0HNtBdbvd3H77Yp70pGfl9tu/7tF4xrxENgBgWmiiaZ1Bsmx7m8sk2djozcQuLZ1t\n",
"Xayh2+3m6NF/k3vvfUkefviHcu+9f5ijR/91Tp8+fcWs9zA+OLSlQZdxpIm6oIm6YBgmvU40jMyV\n",
"8sBtjTKsrZ3pbyu++ui5Cxfemje+8eeumPW+3ny1TDUANNNE0zq7i6VfS1suJBy1piUB97vUX5te\n",
"w/3WBfNFXdBEXTAM4hww5XbjFA899Be58caXZzeakbwyN9300bziFS8ZKLIxDUv9tSUiAgBXYnUO\n",
"Wmdra2tfswjTupvfIBu+XP4cbrrpB/OMZzw1n/70X+eJT7w5T3jCU/LkJz8pz3ve7XnPe35vX/c5\n",
"6R0RR/W/y37rgvmiLmiiLmjSmh0L4SC63W5e85rTueWWp1yzWZzG3fwGzRhfHqe4cCH5R//obDqd\n",
"kzl2bDV//Mf/Z/9+RvMBYRSvYZsiIgBwJZpoWuMgF7ldzxbhozCsBvJ67qfTOZnt7dXs7PSOe/GP\n",
"9Sveftpewysxq0QTdUETdcEwyETTGpc2jr1meneGdJJGme8dxdrWu7PLk1rqbxbW6wYAM9G00FaS\n",
"xQmPoWdSxnFkAAASHElEQVTQ2fGDzAJfKU4xyP003e+kZpdHFbORcaSJuqCJumAYXFhIa1xsWE8k\n",
"+YorXpA2yIV71+sg22oPa3zjfJ5t4P8UaaIuaKIuaDLohYWaaFrlWo3juFfkOEgTDQBMH000c+1q\n",
"Te0oZm5H2bSbaQaA8Rm0iXZhIa2ztbU18O+MaoORUV2kNw0borTNQeqC2acuaKIuGAYXFjJTrnTh\n",
"XtOScN/+7d+XO+74quue5R3FRXrWUgaA6WYmmta52sUgg8wMP/zwQjY3/3u++Zu/I6dPn77m49qq\n",
"erq5SIgm6oIm6oJhkIlmLpw+fTqvfe1aHnnkTf0zr0jySJI3J0luuOEH8l//6zuu2HCP+4LFad2y\n",
"HABmlUw0M2/QLFu3283p02/JI4/8H0nemuQHknxheg10b+OWRx5501U3bhn3Ri+T3hCljWQcaaIu\n",
"aKIuGAaZaGbe5fni3k55r5jgiPanLdttA8A8MhNNq3S73fzoj77lunPJ//gf/8PccMMPZL9bT9uq\n",
"evrJONJEXdBEXTAMMtG0xkFzwlf6vSQDrcNs3WYAmF02W2FmXdxI5cuSLGaQ3QE1wLPPNr40URc0\n",
"URc0GbSJlolmLsgXAwDDZCaa1piWZd/MagPA7BHnYKYNu4Ed9P6mpZEHAIZLE83MG1aW7SAN8cVc\n",
"9sXl8vaby2a0ZBxpoi5ooi5oIhMN+3T5+tE7O71zZpUBgGvRRNM6k5w96HROZnt7NTs7vePeetHr\n",
"ExsPF5lVoom6oIm6YBjEOZhb17PutAsLAWC2yEQz87a2tvL5z39+KI2shnh2yDjSRF3QRF3QRCaa\n",
"mfe+970vd975xkdnkLe3Vw+0A2Fi/WgA4GDMRNM6TStk3Hbbz+SjH/34vqMZTTPQZqUBYH6ZiWYu\n",
"feITD+x7pY3Ls9DveteL88xn/oN88pOfzIULb05ycXZbIw0ANLlh0gOAQT3/+V+ThYVTSdaTrGdh\n",
"4VSe+MQvecztHnroLxp//9Kl7VbzyCNvyh//8RflwoUbkzw1Sa/B3p2Vph22trYmPQSmkLqgibpg\n",
"GDTRtM5zn/vcbGz0NjlZWjqbjY31POEJX5TkldltrHvf/+0A9/qlSX4iicYZALg2mWhmQi8n/cwk\n",
"9/fPPDNLS/c37iR4eZwj2Z3VfiDJW5N8r+28AWDODJqJNhPNTOh0TmZh4ZeSHE1yNAsLv5RO52Tj\n",
"bVdWVrKxsZ7bbvu53HBDJ8l3JnkgN930g7nttsc9OrutgQYArsRMNK1zpfU9D7K6xvWsyGE1j+li\n",
"3VeaqAuaqAuaWJ2DuXWQNZ8Puk705ZEQq3kAwHwxEw0NrjXL3LRW9dLS2cYMNgAw/cxEw3UyywwA\n",
"XIsLC2mdUa/vefk60k1rRvcuZLx0reorXcjIeFj3lSbqgibqgmHQRDPTut1ubr99MU960rNy++1f\n",
"l263O5T73V3hY+9a1dc7U93tdrO8fDzLy8eHNk4AYDRkoplZ3W43R4/+m1y48OP9M6/MTTf9bc6e\n",
"/eWrNry93/vXuXDh2UmSm2766DV/Zxhj3RshsU41AIyXdaKhb23tTL+BXu1//UQuXHj2PrfzfnyS\n",
"7+1/PX6Eo+zZT4QEAJgemmhaZxyZ6L3N94ULP66hbQEZR5qoC5qoC4ZBE83M6nRO5qabfjC7F/8l\n",
"r8yNN34kDz304FByx8PMMLtQEQDaRSaamdXtdvPqV78+H//4/an1b3LrrU/OJz/5yVy48OYkV84d\n",
"7yefPIoMsx0QAWByBs1Ea6JppWs1nKdPn85rX7uWRx55U5Jek/vsZz8r99773dnPBik2WwGA+eLC\n",
"QmbeG97whhw7tprNzaPZ3DyaY8dWL4lTdLvdvPa1b+o30Bcv1PvEJx7Ycy/dJG/N+9//gcYoxsrK\n",
"Ss6duzvnzt1tRrglZBxpoi5ooi4YBjsW0jrvfOev71nJItnZ6V0MuNvsrq2dySOPfPljfu/Lvuwf\n",
"ZGfnVHZ2PpRe9vgn8vDDybFjg+9I2OmczPb2anZ2ese9DPP6dT4zAKAtNNG0zi23PGUft/raJKce\n",
"Pbrhhh/I61//jiTJt3/79+Xhh38iV2rC92N3s5WLkY9eEy7XPDmLi4uTHgJTSF3QRF0wDJpoWufS\n",
"WeAP5YYbfj4PPfSV6Xa7WVlZ2fPz70zy1txwwx/lda/rPNrQ3nHHV2Vz8/rHsbKyctWLDbe3B5/h\n",
"BgDaQSaa1rn55puzsbGe2277mdxww9vzyCNruffelzyajb64Jff9WVr60rzudT+Q97zn9x5dim5U\n",
"y8m1fcOUtm87LuNIE3VBE3XBMEx0JrqU8oIkb07yuCQ/W2u9a5LjoT1WVlb62eeLq23sjWXsfl1p\n",
"drgpijHPzKIDwGAm1kSXUh6X5KeSPD/Jnyb5nVLK2VrrRyY1JtphkCzbpbPDFxvtUay60eaLDa/0\n",
"OrWpiZZxpIm6oIm6YBgmORP93CQfr7WeT5JSyi8n+ZYkmmj2Zdqa1itdbAgAzJ5JZqKfnuSTe47/\n",
"pH8Ormo3y3Yx+3w2S0tnG+MH495Ou63rS8/CtuMyjjRRFzRRFwzDJGei97UV4YkTJ3L48OEkyaFD\n",
"h3LkyJFH/wyz+4/A8Xwd79ra2srNN9/86C6BW1tb2drauuT2uxchrq2dycMPfyovetErHm1up+X5\n",
"TMPxyspK7rzzFXnnO9+WW255Sjqd9dx8882PeT2nZbxNx/fdd99UjcfxdBzvmpbxOJ6OY+8Xjndt\n",
"bW3l/PnzOYiJbftdSvlnSe6stb6gf/zqJI/svbjQtt8AAIxDm7b9/t0kX15KOVxKuSnJtyU5O8Hx\n",
"AADAvkysia61/m2Sf5ukm+TDSf6jlTnYj71/hoFd6oIm6oIm6oJhmOg60bXW30jyG5McAwAADGpi\n",
"mej9kIkGAGAc2pSJBgCAVtJE0zp7s2zdbjfLy8ezvHw83W53coNi4mQcaaIuaKIuGIaJZqLhenS7\n",
"3Rw7ttrfrjrZ3l5t3HAFAGDYZKJpreXl49ncPJpktX+mt3vh7uYrAAD7JRMNAAAjpommdXazbJ3O\n",
"ySwsnEqynmQ9Cwun0umcnOTQmCAZR5qoC5qoC4ZBJprWWllZycbGetbWziRJOh15aABgPGSimQnd\n",
"bndPM31SMw0ADGTQTLQmmta7fJWOhYVTVukAAAbiwkJm3uVZtrW1M/0GejVJr5nenZUeJWtUTxcZ\n",
"R5qoC5qoC4ZBJhoOwBrVADDfxDlovUnEOaxRDQCzZdA4h5loWs8qHQDAuJmJpnW2trayuLg40TG4\n",
"mHH6TENdMH3UBU3UBU3MRMMYmP0GgPlmJhoAgLlniTsAABgxTTStY31PmqgLmqgLmqgLhkETDQAA\n",
"A5KJBgBg7slEAwDAiGmiaR1ZNpqoC5qoC5qoC4ZBEw0AAAOSiQYAYO7JRAMAwIhpommVbrebr/7q\n",
"b8jy8vF0u91JD4cpIuNIE3VBE3XBMNw46QHAfnW73Rw7tpqdnRNJviLb26vZ2FjPysrKpIcGAMwZ\n",
"mWhaY3n5eDY3jyZZ7Z9Zz9LS2Zw7d/ckhwUAzACZaAAAGDFNNK3R6ZzMwsKpJK9Ksp6FhVPpdE5O\n",
"elhMCRlHmqgLmqgLhkETTWusrKxkY2M9d9zxm1laOisPDQBMjEw0AABzTyYaAABGTBNN68iy0URd\n",
"0ERd0ERdMAyaaAAAGJBMNAAAc08mGgAARkwTTevIstFEXdBEXdBEXTAMmmgAABiQTDQAAHNPJhoA\n",
"AEZME03ryLLRRF3QRF3QRF0wDJpoAAAYkEw0AABzTyYaAABGTBNN68iy0URd0ERd0ERdMAyaaAAA\n",
"GJBMNAAAc08mGgAARkwTTevIstFEXdBEXdBEXTAMmmgAABiQTDQAAHNPJhoAAEZME03ryLLRRF3Q\n",
"RF3QRF0wDBNpokspd5ZS/qSUcm//6wWTGAftdN999016CEwhdUETdUETdcEw3Dihx61J3lhrfeOE\n",
"Hp8W+8xnPjPpITCF1AVN1AVN1AXDMMk4x76D2wAAME0m2US/rJTygVLK20ophyY4Dlrm/Pnzkx4C\n",
"U0hd0ERd0ERdMAwjW+KulLKZ5KkNP3pNkt9K8qn+8Y8keVqt9aUN92F9OwAAxmKQJe4mvk50KeVw\n",
"kl+rtT5nogMBAIB9mtTqHE/bc3gsyYcmMQ4AADiISa3OcVcp5Uh6q3Tcn+R7JjQOAAAY2MTjHAAA\n",
"0DZTuWNhKeUFpZSPllL+qJRyatLjYXqUUs6XUj7Y36TnfZMeD+NXSnl7KeXBUsqH9py7pZSyWUr5\n",
"WCnlnBV/5s8V6sLGXnOulPKMUsq7Syl/UEr5/VLK9/fPe8+YY1epi4HeM6ZuJrqU8rgkf5jk+Un+\n",
"NMnvJHlxrfUjEx0YU6GUcn+SO2qtD096LExGKeXrk3wuyS/sXpBcSnlDkodqrW/of/B+Yq31VZMc\n",
"J+N1hbr44SSftbHX/CqlPDXJU2ut95VSvjjJ+5O8MMlL4j1jbl2lLl6UAd4zpnEm+rlJPl5rPV9r\n",
"/Zskv5zkWyY8JqaLjXrmWK31vUk+fdnpo0nW+9+vp/dmyBy5Ql0k3i/mWq31gVrrff3vP5fkI0me\n",
"Hu8Zc+0qdZEM8J4xjU3005N8cs/xn+TiE4Oa5L+VUn63lPLdkx4MU+PWWuuD/e8fTHLrJAfDVLGx\n",
"F0keXVL3tiS/He8Z9O2pi9/qn9r3e8Y0NtHTlS9h2nxtrfW2JN+U5Pv6f8KFR9VeRs37CEny00me\n",
"meRIkj9LsjbZ4TAp/T/Z353k5bXWz+79mfeM+dWvi/+UXl18LgO+Z0xjE/2nSZ6x5/gZ6c1GQ2qt\n",
"f9b/76eSbKQX/4EH+xm33XXo/3zC42EK1Fr/vPYl+dl4v5hLpZTHp9dA/2Kt9Vf7p71nzLk9dfFL\n",
"u3Ux6HvGNDbRv5vky0sph0spNyX5tiRnJzwmpkAp5QtLKV/S//6LkizHRj30nE2y2v9+NcmvXuW2\n",
"zAkbe1FKKUneluTDtdY37/mR94w5dqW6GPQ9Y+pW50iSUso3JXlzkscleVut9fUTHhJToJTyzPRm\n",
"n5PeRkH/t9qYP6WUdyR5XpInp5dlfG2S/5zknUn+YZLzSV5Ua/3MpMbI+DXUxQ8nWUzvz7KPbuy1\n",
"JwfLHCilfF2S/yfJB3MxsvHqJO+L94y5dYW6+PdJXpwB3jOmsokGAIBpNo1xDgAAmGqaaAAAGJAm\n",
"GgAABqSJBgCAAWmiAQBgQJpoAAAYkCYaYIxKKX9XSrm3lPKhUso7SykLQ77/rVLKHde4zb/b+7il\n",
"lP9SSnnCMMcBMOs00QDj9de11ttqrc9JciHJ9w75/msubh5wJS9P8oWP/kKt/7LW+pdDHgfATNNE\n",
"A0zOdpJnlVKeWEr51VLKB0op/28p5TlJUkq5s5Tyi6WU3yylfKyU8l3984ullF/bvZNSyk+VUlYv\n",
"v/NSyn8opfxOKeX3Syl39s99f5IvTfLuUsq7+ufOl1Ju6X//iv4s+YdKKS/vnztcSvlIKeVM/766\n",
"pZQvGO1LAzDdNNEAE1BKuTHJC9LbdvZ1Sd5fa/2q9Lae/YU9N/3KJP88yf+W5LWllKc13N2VZp9f\n",
"U2v9X5N8VZLnlVK+stb6k0n+e5LFWus37vn99GMgJ5I8N8k/S/LdpZQj/ds8K8lP1Vq/Mslnkhw/\n",
"0BMHmBGaaIDxWiil3Jvkd5J8Isnbk3xtkl9Mklrru5M8qZTyJek1t/+51vr5WutfJHl3eg3uteIa\n",
"u76tlPL+JL+X5H9J8k+uctuS5OuS/EqtdafW+ldJfiXJ1/cf7/5a6wf7t31/ksP7HAPATLpx0gMA\n",
"mDM7tdbb9p4opSS9JnY/Hknyt7l0EuQxFyeWUp6ZpJPkq2ut/6OU8nNJrhXBqJeNo+Riw/75Pef/\n",
"rukxAeaJmWiAyXtvku9IennnJJ+qtX42vSb2W0opN5dSnpRkMb0Z7P8vyT8ppdxUSjmU5F803OcT\n",
"kvxVkr8spdya5Jv2/Oyz/Z/vVfvjeGEpZaGU8kVJXtg/t98GH2BumIkGGK+mKMadSd5eSvlAeo3v\n",
"6p7bfjC9GMeTk7yu1vpAkpRS3pnk95Pcn15c49IHqfUD/djIR5N8Mr2LGHedSXJPKeVP9+SiU2u9\n",
"t5Ty80ne1z/1M/37Odww7v1GSgBmUqnV+yDANCql/HCSz9Va1yY9FgAuJc4BMN3MdABMITPRAAAw\n",
"IDPRAAAwIE00AAAMSBMNAAAD0kQDAMCANNEAADCg/x+IwfVsWyR8dAAAAABJRU5ErkJggg==\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",
" Ones | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 6.1101 | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" 5.5277 | \n",
"
\n",
" \n",
" 2 | \n",
" 1 | \n",
" 8.5186 | \n",
"
\n",
" \n",
" 3 | \n",
" 1 | \n",
" 7.0032 | \n",
"
\n",
" \n",
" 4 | \n",
" 1 | \n",
" 5.8598 | \n",
"
\n",
" \n",
"
\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",
" Profit | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 17.5920 | \n",
"
\n",
" \n",
" 1 | \n",
" 9.1302 | \n",
"
\n",
" \n",
" 2 | \n",
" 13.6620 | \n",
"
\n",
" \n",
" 3 | \n",
" 11.8540 | \n",
"
\n",
" \n",
" 4 | \n",
" 6.8233 | \n",
"
\n",
" \n",
"
\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",
" Size | \n",
" Bedrooms | \n",
" Price | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2104 | \n",
" 3 | \n",
" 399900 | \n",
"
\n",
" \n",
" 1 | \n",
" 1600 | \n",
" 3 | \n",
" 329900 | \n",
"
\n",
" \n",
" 2 | \n",
" 2400 | \n",
" 3 | \n",
" 369000 | \n",
"
\n",
" \n",
" 3 | \n",
" 1416 | \n",
" 2 | \n",
" 232000 | \n",
"
\n",
" \n",
" 4 | \n",
" 3000 | \n",
" 4 | \n",
" 539900 | \n",
"
\n",
" \n",
"
\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",
" Size | \n",
" Bedrooms | \n",
" Price | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.130010 | \n",
" -0.223675 | \n",
" 0.475747 | \n",
"
\n",
" \n",
" 1 | \n",
" -0.504190 | \n",
" -0.223675 | \n",
" -0.084074 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.502476 | \n",
" -0.223675 | \n",
" 0.228626 | \n",
"
\n",
" \n",
" 3 | \n",
" -0.735723 | \n",
" -1.537767 | \n",
" -0.867025 | \n",
"
\n",
" \n",
" 4 | \n",
" 1.257476 | \n",
" 1.090417 | \n",
" 1.595389 | \n",
"
\n",
" \n",
"
\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": [
"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\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
}