Skip to content

Instantly share code, notes, and snippets.

@ssaamm
Created November 3, 2016 02:44
Show Gist options
  • Save ssaamm/edde6f68ab233360ad9bbcd1373803e8 to your computer and use it in GitHub Desktop.
Save ssaamm/edde6f68ab233360ad9bbcd1373803e8 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{"nbformat_minor": 1, "cells": [{"source": "# Linear regression\n\nHi there. Today we're going to learn about linear regression and implement it using Python. This tutorial is targeted at someone who doesn't know any Python, but has had some math.\n\nYou may be familiar with this from an introductory stats or linear algebra course.", "cell_type": "markdown", "metadata": {}}, {"source": "First, we'll import the libraries we need.\n\n* `numpy` -- makes matrix math more natural\n* `matplotlib` -- lets us make graphs (coincidentally, it's designed to be similar to Matlab's graphing library)", "cell_type": "markdown", "metadata": {}}, {"execution_count": 1, "cell_type": "code", "source": "import numpy as np\n\n%matplotlib inline\nimport matplotlib.pyplot as plt", "outputs": [], "metadata": {"collapsed": false}}, {"source": "Suppose I am curious about how long it takes me to get to work at various times in the day. Each day, I write down when I leave for work and how long it takes me to get there.\n\nI record my observations of when I leave in the vector $X$ and the duration of my commute in the vector $y$:", "cell_type": "markdown", "metadata": {}}, {"source": "$$\nX = \\left(\n\\begin{array}{c}\n\\text{7:15 am}\\\\\n\\text{7:46 am}\\\\\n\\text{8:50 am}\\\\\n\\end{array}\n\\right)\n$$\n\n$$\ny = \\left(\n\\begin{array}{c}\n13\\text{ minutes}\\\\\n16\\text{ minutes}\\\\\n23\\text{ minutes}\\\\\n\\end{array}\n\\right)\n$$", "cell_type": "markdown", "metadata": {}}, {"source": "In order to use linear regression, we need real-valued data. Our commute durations ($y$) are real values, but our departure times ($X$) are not. Fortunately, we can represent a time of day as the number of minutes between midnight and the time.\n\nWe can express these values in Python by using Numpy matrices:", "cell_type": "markdown", "metadata": {}}, {"execution_count": 2, "cell_type": "code", "source": "X = np.matrix([[7 * 60 + 15],\n [7 * 60 + 46],\n [8 * 60 + 50]])\ny = np.matrix([[13],\n [16],\n [23]])", "outputs": [], "metadata": {"collapsed": false}}, {"source": "Next, let's visualize the data. We set up the title, label the axes, and then put the data on a scatter plot:", "cell_type": "markdown", "metadata": {}}, {"execution_count": 3, "cell_type": "code", "source": "plt.title('Departure time and commute duration')\nplt.ylabel('Commute duration (min)')\nplt.xlabel('Depart time (min after midnight)')\n\nplt.scatter(X, y)\nplt.show()", "outputs": [{"output_type": "display_data", "data": {"image/png": "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\n", "text/plain": "<matplotlib.figure.Figure at 0x7faabfd52668>"}, "metadata": {}}], "metadata": {"collapsed": false}}, {"source": "Our goal is to use the data we have to draw a line that is representative of the relationship between departure time and commute duration. The line we draw is a specific **model** of the relationship. How should we go about doing this?\n\nWe want our line to be close to the data points, and we need a way of quantifying this idea. To add some rigor, let our inputs $\nX = \\left(\n\\begin{array}{c}\nx_1\\\\\nx_2\\\\\nx_3\\\\\n\\end{array}\n\\right)\n$ and our outputs $\ny = \\left(\n\\begin{array}{c}\ny_1\\\\\ny_2\\\\\ny_3\\\\\n\\end{array}\n\\right)$. Finally, let our model predict $y_{pred} = \\left(\n\\begin{array}{c}\ny_1'\\\\\ny_2'\\\\\ny_3'\\\\\n\\end{array}\n\\right)$.\n\nWhile we want our line to be close to the data points, we can equivalently (and more conveniently) talk about minimizing how far our line is from the data points. A common way to quantify how far our line is from the data is the sum of squared errors, or $e(y_{pred}, y) = \\left(y_{pred} - y\\right)^2 = \\left(\n\\begin{array}{c}\ny_1' - y_1\\\\\ny_2' - y_2\\\\\ny_3' - y_3\\\\\n\\end{array}\n\\right)^2$. For more about why this makes sense, refer to Appendix A.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 4, "cell_type": "code", "source": "def error(y_pred, y_true):\n return np.sum(np.power(y_pred - y_true, 2))", "outputs": [], "metadata": {"collapsed": true}}, {"source": "```\n<insert fancy derivation here>\n```\n\nThus, we attain our hypothesis:\n\n$$h(D) = D (X^T X)^{-1}X^T y$$", "cell_type": "markdown", "metadata": {}}, {"source": "We can implement our hypothesis in Python code. We want our code to take in our example data $X$ and $y$ and return a function that will predict a commute duration given a departure time.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 5, "cell_type": "code", "source": "def fit_model(X, y):\n weights = (X.T * X).I * X.T * y\n \n def hypothesis(D):\n return D * weights\n \n return hypothesis\n\npredict = fit_model(X, y)\ny_pred = predict(X)", "outputs": [], "metadata": {"collapsed": false}}, {"execution_count": 6, "cell_type": "code", "source": "plt.title('Departure time and commute duration')\nplt.ylabel('Commute duration (min)')\nplt.xlabel('Depart time (min after midnight)')\n\nplt.scatter(X, y)\nplt.plot(X, y_pred, c='g')\nplt.xlim((0, 540))\nplt.ylim((0, 24))\nplt.show()", "outputs": [{"output_type": "display_data", "data": {"image/png": "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\n", "text/plain": "<matplotlib.figure.Figure at 0x7faabd83f860>"}, "metadata": {}}], "metadata": {"collapsed": false}}, {"source": "What happened? Our data looks pretty much linear, but the line seems pretty far from our data.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 7, "cell_type": "code", "source": "error(y_pred, y)", "outputs": [{"execution_count": 7, "output_type": "execute_result", "data": {"text/plain": "22.589702028718975"}, "metadata": {}}], "metadata": {"collapsed": false}}, {"execution_count": 8, "cell_type": "code", "source": "def fit_model_with_bias(X_in, y):\n def add_bias_terms(X_in):\n return np.concatenate([np.ones((X_in.shape[0], 1)), X_in], axis=1)\n \n X = add_bias_terms(X_in)\n weights = (X.T * X).I * X.T * y\n \n def hypothesis(D):\n return add_bias_terms(D) * weights\n return hypothesis\n\npredict = fit_model_with_bias(X, y)\ny_pred = predict(X)", "outputs": [], "metadata": {"collapsed": false}}, {"execution_count": 9, "cell_type": "code", "source": "plt.title('Departure time and commute duration')\nplt.ylabel('Commute duration (min)')\nplt.xlabel('Depart time (min after midnight)')\n\nplt.scatter(X, y)\nplt.plot(X, y_pred, c='g')\nplt.show()", "outputs": [{"output_type": "display_data", "data": {"image/png": "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\n", "text/plain": "<matplotlib.figure.Figure at 0x7faabd34d2b0>"}, "metadata": {}}], "metadata": {"collapsed": false}}, {"execution_count": 10, "cell_type": "code", "source": "error(y_pred, y)", "outputs": [{"execution_count": 10, "output_type": "execute_result", "data": {"text/plain": "0.044382900156225917"}, "metadata": {}}], "metadata": {"collapsed": false}}, {"source": "# Appendix A: Sum of squared errors", "cell_type": "markdown", "metadata": {}}], "nbformat": 4, "metadata": {"kernelspec": {"display_name": "Python 3", "name": "python3", "language": "python"}, "language_info": {"mimetype": "text/x-python", "nbconvert_exporter": "python", "version": "3.5.1", "name": "python", "file_extension": ".py", "pygments_lexer": "ipython3", "codemirror_mode": {"version": 3, "name": "ipython"}}}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment