{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Linear Regression in plain Python\n",
"\n",
"In linear regression we want to model the relationship between a **scalar dependent variable** $y$ and one or more **independent (predictor) variables** $\\boldsymbol{x}$.\n",
"\n",
"**Given:** \n",
"- Dataset $D = \\{(\\pmb{x}^{(1)}, y^{(1)}), ..., (\\pmb{x}^{(m)}, y^{(m)})\\}$\n",
"- With $\\pmb{x}^{(i)}$ being a $d-$dimensional vector $\\pmb{x}^{(i)} = (x^{(i)}_1, ..., x^{(i)}_d)$ and\n",
"- $y^{(i)}$ being a scalar target variable\n",
"\n",
"**Assumptions:**\n",
"- We assume that dataset was produced by some unknown function $f$ which maps features $\\pmb{x}$ to labels $y$\n",
"- We further assume that the labels $y^{(i)}$ are *noisy*\n",
"- In other words: the labels have been produced by adding some noise $\\epsilon$ to the true function value: $y^{(i)} = f(\\pmb{x}^{(i)}) + \\epsilon$\n",
"\n",
"**Model:** \n",
"The linear regression model can be interpreted as a very **simple neural network:**\n",
"- It has a real-valued weight vector $\\pmb{w}= (w_{1}, ..., w_{d})$\n",
"- It has a real-valued bias $b$\n",
"- It uses the identity function as its activation function\n",
"- Note: in most books the parameter vector $\\pmb{w}$ is denoted in a more general form, namely as $\\pmb{\\theta}$\n",
"\n",
"\n",
"\n",
"**Approach:** \n",
"Our goal is to learn the underlying function $f$ such that we can predict function values at new input locations. In linear regression, we model $f$ using a *linear combination* of the input features:\n",
"\n",
"$$\n",
"\\begin{split}\n",
"y^{(i)} &= b + w_1 x_1^{(i)} + w_2 x_2^{(i)} + ... + w_d x_d^{(i)} \\\\\n",
"&= \\sum_{j=1}^{d} b + w_j x_j^{(i)} \\\\\n",
"&= \\pmb{w}^T \\pmb{x}^{(i)} + b\n",
"\\end{split}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Training\n",
"A linear regression is typically trained using the (mean) squared error (MSE) as a loss function. This computes a [least squares](https://en.wikipedia.org/wiki/Least_squares) solution. The mean squared error minimizes the sum of squared residuals (= difference between true label $y$ and the model prediction $\\hat{y}$):\n",
"\n",
"$J(\\boldsymbol{w},b) = \\frac{1}{m} \\sum_{i=1}^m \\Big(\\hat{y}^{(i)} - y^{(i)} \\Big)^2$\n",
"\n",
"\n",
"Why do we use the squared error as a loss function? In short, using the MSE corresponds to computing a maximum likelihood solution to our problem. For a more detailed explanation [look here](https://datascience.stackexchange.com/questions/10188/why-do-cost-functions-use-the-square-error).\n",
"\n",
"With the MSE at hand a linear regression model can be trained using either \n",
"a) gradient descent or \n",
"b) the normal equation (closed-form solution): $\\boldsymbol{w} = (\\boldsymbol{X}^T \\boldsymbol{X})^{-1} \\boldsymbol{X}^T \\boldsymbol{y}$ \n",
"\n",
"where $\\boldsymbol{X}$ is a matrix of shape $(m, n_{features})$ that holds all training examples. \n",
"The normal equation requires computing the inverse of $\\boldsymbol{X}^T \\boldsymbol{X}$. The computational complexity of this operation lies between $O(n_{features}^{2.4}$) and $O(n_{features}^3$) (depending on the implementation).\n",
"Therefore, if the number of features in the training set is large, the normal equation will get very slow. \n",
"\n",
"\n",
"* * *\n",
"The training procedure of a linear regression model has different steps. In the beginning (step 0) the model parameters are initialized. The other steps (see below) are repeated for a specified number of training iterations or until the parameters have converged.\n",
"\n",
"**Step 0: ** \n",
"\n",
"Initialize the weight vector and bias with zeros (or small random values)\n",
"\n",
"**OR**\n",
"\n",
"Compute the parameters directly using the normal equation\n",
"* * *\n",
"\n",
"**Step 1: ** (Only needed when training with gradient descent)\n",
"\n",
"Compute a linear combination of the input features and weights. This can be done in one step for all training examples, using vectorization and broadcasting:\n",
"$\\boldsymbol{\\hat{y}} = \\boldsymbol{X} \\cdot \\boldsymbol{w} + b $\n",
"\n",
"where $\\boldsymbol{X}$ is a matrix of shape $(m, n_{features})$ that holds all training examples, and $\\cdot$ denotes the dot product.\n",
"* * *\n",
"\n",
"**Step 2: ** (Only needed when training with gradient descent)\n",
"\n",
"Compute the cost (mean squared error) over the training set:\n",
"\n",
"$J(\\boldsymbol{w},b) = \\frac{1}{m} \\sum_{i=1}^m \\Big(\\hat{y}^{(i)} - y^{(i)} \\Big)^2$\n",
"* * *\n",
"\n",
"**Step 3: ** (Only needed when training with gradient descent)\n",
"\n",
"Compute the partial derivatives of the cost function with respect to each parameter:\n",
"\n",
"$ \\frac{\\partial J}{\\partial w_j} = \\frac{2}{m}\\sum_{i=1}^m \\Big( \\hat{y}^{(i)} - y^{(i)} \\Big) x^{(i)}_j$\n",
"\n",
"$ \\frac{\\partial J}{\\partial b} = \\frac{2}{m}\\sum_{i=1}^m \\Big( \\hat{y}^{(i)} - y^{(i)} \\Big)$\n",
"\n",
"\n",
"The gradient containing all partial derivatives can then be computed as follows: \n",
"\n",
"$\\nabla_{\\boldsymbol{w}} J = \\frac{2}{m} \\boldsymbol{X}^T \\cdot \\big(\\boldsymbol{\\hat{y}} - \\boldsymbol{y} \\big)$\n",
"\n",
"$\\nabla_{\\boldsymbol{b}} J = \\frac{2}{m} \\big(\\boldsymbol{\\hat{y}} - \\boldsymbol{y} \\big)$\n",
"* * *\n",
"\n",
"**Step 4: ** (Only needed when training with gradient descent)\n",
"\n",
"Update the weight vector and bias:\n",
"\n",
"$\\boldsymbol{w} = \\boldsymbol{w} - \\eta \\, \\nabla_w J$ \n",
"\n",
"$b = b - \\eta \\, \\nabla_b J$ \n",
"\n",
"\n",
"where $\\eta$ is the learning rate."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2018-03-26T14:37:04.956748Z",
"start_time": "2018-03-26T14:37:04.391421Z"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"np.random.seed(123)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dataset"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2018-03-26T14:37:06.048159Z",
"start_time": "2018-03-26T14:37:05.749381Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"