{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"hide_input": true,
"internals": {},
"slideshow": {
"slide_type": "skip"
},
"tags": [
"hide-cell"
]
},
"outputs": [],
"source": [
"import numpy as np\n",
"import scipy as sp\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"import matplotlib as mp\n",
"import sklearn\n",
"from IPython.display import Image, HTML\n",
"\n",
"import laUtilities as ut\n",
"\n",
"%matplotlib inline\n",
"\n",
"import statsmodels.api as sm\n",
"\n",
"def centerAxes(ax):\n",
" ax.spines['left'].set_position('zero')\n",
" ax.spines['right'].set_color('none')\n",
" ax.spines['bottom'].set_position('zero')\n",
" ax.spines['top'].set_color('none')\n",
" ax.xaxis.set_ticks_position('bottom')\n",
" ax.yaxis.set_ticks_position('left')\n",
" bounds = np.array([ax.axes.get_xlim(), ax.axes.get_ylim()])\n",
" ax.plot(bounds[0][0],bounds[1][0],'')\n",
" ax.plot(bounds[0][1],bounds[1][1],'')"
]
},
{
"cell_type": "markdown",
"metadata": {
"hide_input": true,
"internals": {
"slide_type": "subslide"
},
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Linear Regression"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
},
"tags": [
"hide-input"
]
},
"source": [
""
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"hide_input": true,
"tags": [
"hide-input"
]
},
"outputs": [
{
"data": {
"text/html": [
"Sir Francis Galton by Charles Wellington Furse by Charles Wellington Furse (died 1904) - National Portrait Gallery: NPG 3916"
],
"text/plain": [
""
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"HTML(u'Sir Francis Galton by Charles Wellington Furse by Charles Wellington Furse (died 1904) - National Portrait Gallery: NPG 3916')"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In 1886 Francis Galton published his observations about how random factors affect outliers.\n",
"\n",
"This notion has come to be called \"regression to the mean\" because unusually large or small phenomena, after the influence of random events, become closer to their mean values (less extreme)."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Galton fit a straight line to this effect, and the fitting of lines or curves to data has come to be called regression as well."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"The most common form of machine learning is __regression__, which means constructing an equation that describes the relationships among variables.\n",
"\n",
"It is a form of supervised learning: whereas __classification__ deals with predicting categorical features (labels or classes), __regression__ deals with predicting continuous features (real values)."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"For example, we may look at these points and decide to model them using a line."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"hide_input": false,
"tags": [
"hide-input"
]
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ax = plt.figure(figsize = (7, 7)).add_subplot()\n",
"centerAxes(ax)\n",
"log = np.array([1, 4])\n",
"xlog = 10.0 * np.random.random(100)\n",
"ylog = log[0] + log[1] * np.log(xlog) + np.random.randn(100)\n",
"ax.plot(xlog, ylog, 'ro', markersize=4);"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Clearly, none of these datasets agrees perfectly with the proposed model. So the question arises:\n",
"\n",
"How do we find the __best__ linear function (or quadratic function, or logarithmic function) given the data?"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"__Framework.__\n",
"\n",
"This problem has been studied extensively in the field of statistics. Certain terminology is used:\n",
"\n",
"* Some values are referred to as \"independent,\" and\n",
"* Some values are referred to as \"dependent.\""
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"The basic regression task is: \n",
"* given a set of independent variables \n",
"* and the associated dependent variables, \n",
"* estimate the parameters of a model (such as a line, parabola, etc) that describes how the dependent variables are related to the independent variables."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"The independent variables are collected into a matrix $X,$ which is called the __design matrix.__\n",
"\n",
"The dependent variables are collected into an __observation__ vector $\\mathbf{y}.$\n",
"\n",
"The parameters of the model (for any kind of model) are collected into a __parameter__ vector $\\mathbf{\\beta}.$"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"hide_input": true,
"slideshow": {
"slide_type": "skip"
},
"tags": [
"hide-input"
]
},
"outputs": [
{
"data": {
"image/png": "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6Xe/+53GjRunDRs26NRTT437fLfeemtEl966deu0aNEiTZ48WX369Am5rqyszNbaDxw4oEGDBum6667Tddddl/D9aXvO+ccff1wdO3ZMeB/YqKoqcn2Iw2Juj19rQ23MIvM034XLOeecI8uyWgb1b775ZjU1NenRRx8NmUobi51jLsExi/Ly8qjXn3jiiZKkY489tuXYgw8+qClTpuiGG26QJD388MNaunSp5s2bp9mzZ8et5dZbb4049uSTT2rRokWaMmWKLrjgggSvpn21jx8/XuPHj5ckTZkyJe7jP/PMM7r99tt18skna9euXZo7d67mzZuXdH1oh/BFh5995viiw2j/K4as17ZjHCXGuA48Il6zxniwW8wYYwYOHGg6duzYstDvxhtvTPq+dnYt/dM//ZORZJYtWxZx3Z49e8wRRxwR0rV06NAhk5+fbxYuXBhy25tuusmMHDky6dfQVrpjLqnWHu7oo4+O2S22ZMkSc8QRR5hBgwaZ3bt3mwEDBpiCggLz6aefplSj1/imW8zl7qLwLrCbbsrQEzHm4gXZtYjyvPPO0zfffKMZM2aoc+fOuueee5K+75YtW1IJVD355JMxHyv41/9zzz0XGMA6rKGhQTNmzNB3332n2267reV4fX29mpqa1K1bt5DH6datm3bt2pX0a7BDqrUn6+2339bll1+uXr16admyZerSpYt+9atfqbGxkbUtTnGpuyjq2hUjPfpohp4w1rb+8ATfdYtJgXGXyspKHThwQA899JA6derkSh3BL+jHH39c69at00UXXaSvv/5ay5YtU21traZMmRJ1HCi8+84Yk1SXnp3SrT2eDz/8UN///vd1/PHHa/ny5erevbsk6fLLL1d5ebkWLVqkVatW6fzzz7f99aANF7qLEnaDIef4suVy2mmnSZLOPPNMTZs2zZUavvrqK9XX16uiokJXXHGFtmzZogcffFALFy5UUVGRFi5cqPnz54fcp3PnzsrPz49opezevTuiNeO12hP5/PPPdckll8iyLL366qvq27dvyPXB8aQ77rjDtteBGBxedBgeLPX1BAt82nIJrgBPdhA/E4J/+VdUVCT9hVlYWKjhw4dr+fLluuKKK1qOL1++XJMmTUqrjilTpiQcXA+XTu2J9OvXL27X3ujRo0O635BBDi06PP986e23Q4/xK0aQ78Ll6aefVlVV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vIdlZWU67rjjNGfOnJDbeOG9njp1qrp27apBgwa1HEv2+9a2741485RNgnUuGzZsMBs3bjSjRo0y7733Xsvx9evXmyFDhphvv/3W1NbWmqKiItPY2Bhx/zvuuMPMnj3bGGPM7NmzzZ133tneOdftMnPmTPPLX/4y6nW9e/c2dXV1mXvygQONycsLLPDIywtcjuFf//VfzW9+85u4D9fY2GiKiorM5s2bzaFDh8yQIUPM+vXr7a46ofC1K+vWGXPnnXfG/F1n/H1OIN77FlwTsGTJEjN27FjT3NxsVq9ebc466yzX6jXGmB07dpi1a9caY4zZv3+/Of300yN+1ytXrjTf+9733CgvrkS/b6+91201Njaabt26mS1btoQc98J7/eabb5q1a9ea0tLSlmPJfN+m8b2RmXUuJSUlKo7ST75o0SJdffXV6tChg0477TT169dPa9asiXq7yZMnS5ImT56s//7v/25POe1ijNHChQv1D//wD+4UYPO0Ybe3Nikvj752ZehQ6eyzz9a2bdscqyUVybxvixYt0nXXXSfLsnT22Wdr37592rlzp0sVS927d9ewYcMkSccee6xKSkq0fft21+qxk9fe67Zee+019e3bt2WHBy8ZOXKkOnXqFHIsme9bO783MjLmsn37dp1yyiktl3v16hX1w/7Xv/5V3bt3lxT4H2T37t2ZKCcpq1atUrdu3XT66adHvd6yLI0ZM0bDhw9XZWWl/QWkuGvuI488oiFDhmjq1KlRm7fJ/g4ywbIit3FpOynxiSee0Lhx42LcN8PvcwLJvG9uvreJbNmyRR988IFGjBgRcd3q1as1dOhQjRs3Tus9MkU90e/by+/1s88+G/OPUS++18l839r5fidc52JZ1gpJJ4fP/581a5Z+8IMfRL2PiTK92Yo2/9Qho0eP1q5duyKOt30NzzzzTNxWyzvvvKMePXpo9+7dqqio0IABAzRy5EhXar7xxhv1i1/8QpZl6Re/+IVuu+02PfHEEyG3c+N3MHr0aL322oqQY6WlgzRr1ixJgfd51qxZKigo0DXXXBP1MZx+n8Ml87557fMddODAAU2aNElz5szRcccdF3LdsGHD9OWXX+qYY47Ryy+/rIkTJ2rTpk0uVdoq0e/bq+91Q0ODFi9erNmzZ0dc59X3Ohl2vt8Jw8UYMzr4z2QfNNltNbp166adO3eq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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ax = plt.figure(figsize = (7, 7)).add_subplot()\n",
"centerAxes(ax)\n",
"line = np.array([1, 0.5])\n",
"xlin = -10.0 + 20.0 * np.random.random(100)\n",
"ylin = line[0] + (line[1] * xlin) + np.random.randn(100)\n",
"ax.plot(xlin, ylin, 'ro', markersize = 4)\n",
"ax.plot(xlin, line[0] + line[1] * xlin, 'b-')\n",
"plt.text(-9, 3, r'$y = \\beta_0 + \\beta_1x$', size=20);"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Least-Squares Lines"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"The first kind of model we'll study is a linear equation, $y = \\beta_0 + \\beta_1 x.$\n",
"\n",
"Experimental data often produce points $(x_1, y_1), \\dots, (x_n,y_n)$ that seem to lie close to a line. \n",
"\n",
"We want to determine the parameters $\\beta_0, \\beta_1$ that define a line that is as \"close\" to the points as possible."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Suppose we have a line $y = \\beta_0 + \\beta_1 x$. For each data point $(x_j, y_j),$ there is a point $(x_j, \\beta_0 + \\beta_1 x_j)$ that is the point on the line with the same $x$-coordinate."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Image from Lay, _Linear Algebra and its Applications,_ 4th edition"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"We call \n",
"* $y_j$ the __observed__ value of $y$ and \n",
"* $\\beta_0 + \\beta_1 x_j$ the __predicted__ $y$-value. \n",
"\n",
"The difference between an observed $y$-value and a predicted $y$-value is called a __residual__."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"There are several ways of measure how \"close\" the line is to the data. \n",
"\n",
"The usual choice is to sum the squares of the residuals. "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"The __least-squares line__ is the line $y = \\beta_0 + \\beta_1x$ that minimizes the sum of squares of the residuals. \n",
"\n",
"The coefficients $\\beta_0, \\beta_1$ of the line are called __regression coefficients.__"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"__A least-squares problem.__\n",
"\n",
"If the data points were on the line, the parameters $\\beta_0$ and $\\beta_1$ would satisfy the equations\n",
"\n",
"$$\\beta_0 + \\beta_1 x_1 = y_1 $$\n",
"$$\\beta_0 + \\beta_1 x_2 = y_2 $$\n",
"$$\\beta_0 + \\beta_1 x_3 = y_3 $$\n",
"$$ \\vdots$$\n",
"$$\\beta_0 + \\beta_1 x_n = y_n $$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"We can write this system as \n",
"\n",
"$$X\\mathbf{\\beta} = \\mathbf{y}$$\n",
"\n",
"where \n",
"\n",
"$$X=\\begin{bmatrix}1&x_1\\\\1&x_2\\\\\\vdots&\\vdots\\\\1&x_n\\end{bmatrix},\\;\\;\\mathbf{\\beta} = \\begin{bmatrix}\\beta_0\\\\\\beta_1\\end{bmatrix},\\;\\;\\mathbf{y}=\\begin{bmatrix}y_1\\\\y_2\\\\\\vdots\\\\y_n\\end{bmatrix}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Of course, if the data points don't actually lie exactly on a line, \n",
"\n",
"... then there are no parameters $\\beta_0, \\beta_1$ for which the predicted $y$-values in $X\\mathbf{\\beta}$ equal the observed $y$-values in $\\mathbf{y}$, \n",
"\n",
"... and $X\\mathbf{\\beta}=\\mathbf{y}$ has no solution."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Now, since the data doesn't fall exactly on a line, we have decided to seek the $\\beta$ that minimizes the sum of squared residuals, ie,\n",
"\n",
"$$\\sum_i (\\beta_0 + \\beta_1 x_i - y_i)^2$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"$$=\\Vert X\\beta -\\mathbf{y}\\Vert^2$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"This is key: __the sum of squares of the residuals__ is __exactly__ the __square of the distance between the vectors $X\\mathbf{\\beta}$ and $\\mathbf{y}.$__"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Computing the least-squares solution of $X\\beta = \\mathbf{y}$ is equivalent to finding the $\\mathbf{\\beta}$ that determines the least-squares line."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"hide_input": true,
"tags": [
"hide-input"
]
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ax = plt.figure(figsize = (7, 7)).add_subplot()\n",
"centerAxes(ax)\n",
"line = np.array([1, 0.5])\n",
"xlin = -10.0 + 20.0 * np.random.random(100)\n",
"ylin = line[0] + (line[1] * xlin) + np.random.randn(100)\n",
"ax.plot(xlin, ylin, 'ro', markersize = 4)\n",
"ax.plot(xlin, line[0] + line[1] * xlin, 'b-')\n",
"plt.text(-9, 3, r'$y = \\beta_0 + \\beta_1x$', size=20);"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Now, to obtain the least-squares line, find the least-squares solution to $X\\mathbf{\\beta} = \\mathbf{y}.$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"From linear algebra we know that the least squares solution of $X\\mathbf{\\beta} = \\mathbf{y}$ is given by the solution of the __normal equations__:\n",
"\n",
"$$X^TX\\mathbf{\\beta} = X^T\\mathbf{y}$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We also know that the normal equations __always__ have at least one solution.\n",
"\n",
"And if $X^TX$ is invertible, there is a unique solution that is given by:\n",
" \n",
"$$\\hat{\\mathbf{\\beta}} = (X^TX)^{-1} X^T\\mathbf{y}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## The General Linear Model"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Another way that the inconsistent linear system is often written is to collect all the residuals into a __residual vector.__ \n",
"\n",
"Then an exact equation is\n",
"\n",
"$$y = X\\mathbf{\\beta} + {\\mathbf\\epsilon}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Any equation of this form is referred to as a __linear model.__ \n",
"\n",
"In this formulation, the goal is to find the $\\beta$ so as to minimize the length of $\\epsilon$, ie, $\\Vert\\epsilon\\Vert.$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"In some cases, one would like to fit data points with something other than a straight line. \n",
"\n",
"In cases like this, the matrix equation is still $X\\mathbf{\\beta} = \\mathbf{y}$, but the specific form of $X$ changes from one problem to the next."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Least-Squares Fitting of Other Models"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"In model fitting, the parameters of the model are what is unknown. \n",
"\n",
"A central question for us is whether the model is _linear_ in its parameters."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"For example, the model \n",
"\n",
"$$y = \\beta_0 e^{-\\beta_1 x}$$\n",
"\n",
"is __not__ linear in its parameters. \n",
"\n",
"The model \n",
"\n",
"$$y = \\beta_0 e^{-2 x}$$\n",
"\n",
"__is__ linear in its parameters."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"For a model that is linear in its parameters, an observation is a linear combination of (arbitrary) known functions."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"In other words, a model that is linear in its parameters is\n",
"\n",
"$$y = \\beta_0f_0(x) + \\beta_1f_1(x) + \\dots + \\beta_nf_n(x)$$\n",
"\n",
"where $f_0, \\dots, f_n$ are known functions and $\\beta_0,\\dots,\\beta_k$ are parameters."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"__Example.__ \n",
"\n",
"Suppose data points $(x_1, y_1), \\dots, (x_n, y_n)$ appear to lie along some sort of parabola instead of a straight line. "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"hide_input": false,
"tags": [
"hide-input"
]
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ax = plt.figure(figsize = (7, 7)).add_subplot()\n",
"centerAxes(ax)\n",
"quad = np.array([1, 3, 0.5])\n",
"xquad = -10.0 + 20.0 * np.random.random(100)\n",
"yquad = quad[0] + (quad[1] * xquad) + (quad[2] * xquad * xquad) + np.random.randn(100)\n",
"ax.plot(xquad, yquad, 'ro', markersize = 4);"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"As a result, we wish to approximate the data by an equation of the form\n",
"\n",
"$$y = \\beta_0 + \\beta_1x + \\beta_2x^2.$$\n",
"\n",
"Let's describe the linear model that produces a \"least squares fit\" of the data by the equation."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"__Solution.__ The ideal relationship is $y = \\beta_0 + \\beta_1x + \\beta_2x^2.$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Suppose the actual values of the parameters are $\\beta_0, \\beta_1, \\beta_2.$ Then the coordinates of the first data point satisfy the equation\n",
"\n",
"$$y_1 = \\beta_0 + \\beta_1x_1 + \\beta_2x_1^2 + \\epsilon_1$$\n",
"\n",
"where $\\epsilon_1$ is the residual error between the observed value $y_1$ and the predicted $y$-value."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Each data point determines a similar equation:\n",
"\n",
"$$y_1 = \\beta_0 + \\beta_1x_1 + \\beta_2x_1^2 + \\epsilon_1$$\n",
"$$y_2 = \\beta_0 + \\beta_1x_2 + \\beta_2x_2^2 + \\epsilon_2$$\n",
"$$\\vdots$$\n",
"$$y_n = \\beta_0 + \\beta_1x_n + \\beta_2x_n^2 + \\epsilon_n$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Clearly, this system can be written as $\\mathbf{y} = X\\mathbf{\\beta} + \\mathbf{\\epsilon}.$\n",
"\n",
"$$\\begin{bmatrix}y_1\\\\y_2\\\\\\vdots\\\\y_n\\end{bmatrix} = \\begin{bmatrix}1&x_1&x_1^2\\\\1&x_2&x_2^2\\\\\\vdots&\\vdots&\\vdots\\\\1&x_n&x_n^2\\end{bmatrix} \\begin{bmatrix}\\beta_0\\\\\\beta_1\\\\\\beta_2\\end{bmatrix} + \\begin{bmatrix}\\epsilon_1\\\\\\epsilon_2\\\\\\vdots\\\\\\epsilon_n\\end{bmatrix}$$"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"source": [
"#\n",
"# Input data are in the vectors xquad and yquad\n",
"#\n",
"# estimate the parameters of the linear model\n",
"#\n",
"m = np.shape(xquad)[0]\n",
"X = np.array([np.ones(m), xquad, xquad**2]).T\n",
"beta = np.linalg.inv(X.T @ X) @ X.T @ yquad"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"hide_input": true,
"slideshow": {
"slide_type": "fragment"
},
"tags": [
"hide-input"
]
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"