Skip to content

Instantly share code, notes, and snippets.

@drorata
Created August 11, 2022 06:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save drorata/1fd71d528333607f4cfeff8a2108f875 to your computer and use it in GitHub Desktop.
Save drorata/1fd71d528333607f4cfeff8a2108f875 to your computer and use it in GitHub Desktop.
Notebook behind the post linear-regression-minimal-example.md
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy as np\n",
"from sklearn import linear_model\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"plt.rcParams['figure.figsize'] = (16.0, 5.0)\n",
"plt.style.use('ggplot')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is a rather straightforward example of how to train a linear regression model in a 2D case.\n",
"$X$ is a vector with the independent variables and $Y$ with the dependent ones.\n",
"In this particular example we synthetically generate points on a linear function while adding noise."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0. , 0.20408163, 0.40816327])"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X = np.linspace(0,10,50)\n",
"X[:3] # sample of X"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([-0.37637964, 1.55622455, 1.10414509])"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.random.seed(42)\n",
"noise = 1.5*(2*np.random.random(len(X)) - 1)\n",
"Y = (X + noise)\n",
"Y[:3] # sample of Y"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We start an instance of a [linear regression](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html) model."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"regr = linear_model.LinearRegression()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We train it on the synthetic data."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"regr.fit(X.reshape(-1,1),Y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `reshape` above is there due to a warning/error you might be seeing if omitted.\n",
"\n",
"Once trained, the model can be used to predict the values of the points we started with in $X$.\n",
"Note, as we are dealing with a linear model, there is no way of ending up with [over-fitting model](https://en.wikipedia.org/wiki/Overfitting)."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"Y_pred = regr.predict(X.reshape(-1,1))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6IAAAFACAYAAACm68EnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt8lOWd///XnHKYmRyZAJmoHEXOB4OK2gVdUbBVq1Ba\nV1DUth7QLj+3rvXnblvtwdraaqsVXeyiu1pXZbWuJzxQ3eBWRQigKCiikdJMEhIgh5lJ5nTf3z8C\nwTAJhBzmlPfz8fBBZnLPdV8zuZzkM9d1vW+LaZomIiIiIiIiIgliTXYHREREREREZHBRISoiIiIi\nIiIJpUJUREREREREEkqFqIiIiIiIiCSUClERERERERFJKBWiIiIiIiIiklAqREVERKTHRo4cyc9+\n9rNkd0NERNKcClEREem1K6+8krlz5ybl3I8//jgWiyUp5+7KWWedhcViwWKx4HA4GDlyJN/73vdo\nbGxMdtf61YYNG7jpppuS3Q0REUlzKkRFRET6yWWXXUZNTQ1VVVU89NBDPPvssyxbtiwh5w6Hwwk5\nT0lJCS6XKyHnEhGRzKVCVERE+s3BGdKVK1cyYsQI8vPzueiii6irq+s45vbbb2fs2LE88cQTjB49\nmpycHM4991y++OKLuGO+7P/+7/+wWCx88cUX/O///i+XX345QMcs5JVXXtlln84880yuueaauPsn\nTJjAv/7rvwLw0UcfMW/ePAoLC3G5XEyYMIHHHnvsmJ9/bm4uw4cP57jjjmP+/PlceumlvPrqq52O\n8fv9LF++nLKyMpxOJzNmzODZZ5/tdMzmzZuZNWsWOTk5nHTSSTz77LNxS2ItFgv33Xcfl112GQUF\nBR2vR11dHVdeeSUlJSXk5eVx5plnsm7duo7HRSIR/umf/onjjjuO7OxsSktLufTSSzu+f7TX4vB+\ntLS0cO2111JSUkJ2djYzZ87ktdde6/j+F198gcVi4emnn+aCCy7A6XQyevRoHn300WN+fUVEJHOo\nEBURkX61YcMG3nzzTV566SVeffVVtm7dys0339zpmJqaGlasWMHTTz/NW2+9RXNzMwsWLMA0zR6d\n44wzzuD3v/99R1s1NTX87ne/6/LYpUuXsnr1akKhUMd97733Hh9//DFXXHEFAP/wD//AkCFDePvt\nt9m6dSv33HMPRUVFvXn6HXbu3MnLL79MVlZWx32maXLhhRfy/vvv89RTT/Hhhx9y/fXXc+mll/Ln\nP/8ZgGAwyFe/+lVKSkp47733+I//+A9+/etfs2fPnrhz3HHHHZxxxhls2rSJn/3sZ7S2tnL22WfT\n0tLCmjVr2Lx5M1/96lc599xz2b59OwD3338/Tz/9NI8//jiffvopzz//PLNmzepo81hfi6uvvppX\nX32Vxx9/nC1btnDmmWdywQUX8PHHH3c67tZbb+WKK67ggw8+4NJLL+U73/kOO3bs6NNrLCIiacwU\nERHppaVLl5rnnHNOp9slJSVmW1tbx3133XWXOXz48I7bP/7xj03A/PTTTzvu++STT0zAXLt2bccx\nY8aM6XSut956ywTMqqoq0zRN87HHHjN78mts//79Zk5Ojvn000933HfDDTeYs2bN6ridn59vPvLI\nIz170t2YM2eOabfbTZfLZWZnZ5uACZj33XdfxzFvvvmmmZ2dbTY2NnZ67FVXXWV+/etfN03TNFeu\nXGm6XK5Ox2zfvt0EzJ/+9Kcd9wHm1Vdf3amdRx55xCwrKzMjkUin+88++2xz+fLlpmma5j/+4z+a\nZ599tmkYRpfP42ivxYgRIzr68emnn5qA+dJLL3U6ZsaMGeZVV11lmqZpVlVVmYD5m9/8puP70WjU\ndLvd5kMPPdTteUREJLNpRlRERPrV+PHjyc7O7rjt9Xo7Lc2F9n2GX156O27cODweDx999FG/96ew\nsJCLLrqoY3lpJBLhySef7JgNBbj55pv5zne+w1lnncXtt9/Opk2benWuSy65hC1btrB+/Xq++93v\nsmDBAm644YaO72/YsIFwOExZWRlut7vjv4OzkwDbtm1jwoQJFBQUdDxu/PjxFBYWxp3v1FNP7XR7\nw4YN1NbWUlhY2Kn9t956q6P9q666iq1btzJ27Fiuu+46nnnmmU77S4/ltdi2bRsAs2fP7nT/7Nmz\n436W06dP7/jaZrMxdOjQuHEhIiKDhwpRERHpV19eigrtexnNHi65PchqtcY9JhKJ9LpPV1xxBa+8\n8gr19fW89NJL+P3+Tvsif/jDH7Jjxw6++c1v8uGHHzJr1qyO/aPHIj8/n7FjxzJt2jRWrlxJXV0d\nv/jFLzq+bxgGBQUFbNmypdN/27ZtY82aNR3H9TQN+PDQIMMwmDBhQlz727dv5+GHHwbaC8Kqqip+\n/etfk5WVxfLly5k+fTrNzc39+locrqtxYRhGn9sVEZH0pEJUREQSrr6+ns8++6zj9o4dO2hoaGDi\nxIkADB06lD179hCLxTqOOXxm7mBh8+VjujNv3jyKi4t58skn+c///E8uuOCCuH2Po0ePZtmyZfz3\nf/83P/nJT3jwwQd7/fwOuuOOO/j5z39OdXU1ADNnzqSxsZG2tjbGjh3b6b8TTjgBgIkTJ7J9+3aa\nmpo62vnkk096dBmYmTNn8vnnn3cUxF/+z+v1dhzndru55JJLuO+++9i4cSPbt2+noqLimF+LSZMm\nAXQKQzp4e/LkyT18lUREZDBSISoiIgnndDq56qqr2LhxIxs3bmTp0qVMnz6dc845B4Czzz6bYDDI\nj370Iz777DNWr17NAw880KmNUaNGAfD8889TX1+P3+/v9nx2u53LLruMBx98kJdeeomlS5d2fM/v\n93PDDTfwxhtvUFVVxebNm3nllVc6imJon1H98lLenjrnnHMYP348P/nJTwD4+7//e+bOncuCBQt4\n7rnn+Pzzz6msrOT+++/vmLFcvHgxbre7I9hn/fr1fPvb3yY3N/eoM6WLFy9m1KhRfO1rX+O1117j\niy++YP369fziF7/gueeeA+Duu+/mj3/8Ix999BFVVVWsWrUKm83GuHHjevRafNmYMWNYtGgRy5Yt\n49VXX+Xjjz9m+fLlfPjhh/zzP//zMb9eIiIyeKgQFRGRhCstLeWaa67hG9/4Bl/5yldwOp08++yz\nHYXWSSedxMMPP8x//dd/MXnyZFatWsWdd97ZqY1TTjmF5cuXc+211zJ06FBuvPHGI55z6dKlbN++\nnYKCAs4///yO++12O/v37+fb3/42EyZMYN68eQwbNownnnii45i//vWv/PWvf+3Vc7355ptZtWoV\nO3fuxGKx8Pzzz7NgwQJuuukmxo8fz9e+9jVeeuklxowZA7QX6S+//DJ1dXWccsopLFmyhOXLl+N2\nu8nJyTniuXJycqioqGDmzJlcddVVjBs3jgULFvDee+8xYsQIoH358D333MPpp5/OlClT+NOf/sQz\nzzzDSSed1KPX4nB/+MMfmDdvHkuWLGHatGn85S9/4cUXX2T8+PG9er1ERGRwsJjHunFHRESkD26/\n/XYef/xxdu7cmeyupI1du3YxcuRInn/+eS688MJkd0dERKTP7MnugIiIiHT2+OOPU1ZWxqhRo9i1\naxe33HILI0aM4Lzzzkt210RERPqFClEREZEUs3fvXn784x9TXV1NcXExZ555JqtXr+50WRwREZF0\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10c917780>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(\n",
" X,Y,'*', # Data\n",
" X, Y_pred,'-o' # Regression\n",
")\n",
"plt.legend(['Data','Regression'])\n",
"plt.title('Input vs. Regression');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's look into the result.\n",
"The linear function to which we added noise was $y=ax + b$ where the coefficient $a = 1$ and the intercept $b=0$.\n",
"We can compute $a$ and $b$ of the trained model.\n",
"$a$, a.k.a. the slope, is directly computed by:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.98216273101406792"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(Y_pred[10] - Y_pred[9])/(X[10] - X[9])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is actually an attribute of the model:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.98216273])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"regr.coef_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Similarly, the intercept is merely the value of the model for $X=0$:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"-0.073041941893555951"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Y_pred[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And again, this is an attribute of the model:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"-0.073041941893555951"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"regr.intercept_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the example so far, the noise was uniformly distributed in the $[-1.5,1.5)$ interval.\n",
"Next, we'd like to check the relation between the radius ($1.5$ in this case) of the noise and the coefficient/intercept of the model."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def gen_data(size=30, noise_radius=1.5, seed=42):\n",
" X = np.linspace(0,10,size)\n",
" np.random.seed(seed)\n",
" noise = noise_radius*(2*np.random.random(len(X)) - 1)\n",
" Y = (X + noise)\n",
" return X, Y\n",
"\n",
"def train_predict(X, Y):\n",
" regr = linear_model.LinearRegression()\n",
" regr.fit(X.reshape(-1,1),Y)\n",
" Y_pred = regr.predict(X.reshape(-1,1))\n",
" return regr, Y_pred"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we are going to generate synthetic data sets with growing noise radius.\n",
"In each iterations, we will register the coefficient and the intercept of the trained model."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"coeff = []\n",
"inter = []\n",
"rads = np.linspace(0,50,1000)\n",
"for rad in rads:\n",
" X, Y = gen_data(noise_radius=rad)\n",
" regr, Y_pred = train_predict(X,Y)\n",
" coeff.append(regr.coef_)\n",
" inter.append(regr.intercept_)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's have a look at the behavior of the error between the coefficients and intercepts that we witness and the real ones we used for the generation of the data."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nCgAAAADwzP8HDPtleTJM9T4AAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10c9a35f8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(\n",
" rads,np.abs(np.add(-1,coeff)), # we know that the slope we use equals 1\n",
" rads,np.abs(inter)\n",
")\n",
"plt.title('Error in Coeffieicents and intercepts vs. Noise radius')\n",
"plt.legend(['Coefficient error', 'Intercept error']);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The above image suggest that the error of both the coefficient and the intercept linearly depend on the noise radius."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Formally, the we have samples from a linear function $$y = x + \\epsilon$$ where $\\epsilon$ is uniform noise.\n",
"For each $x_i \\in X$ we have a corresponding value $y_i \\in Y$.\n",
"Our objective is to find $a$ and $b$ such that $y \\sim ax +b$.\n",
"We do so by minimizing the $L_2$ error $$E(a,b) = \\sum_{i=1}^n (y_i - (ax_i+b))^2$$ as a function of $a$ and $b$.\n",
"We take partial derivatives and find the minimum:\n",
"$$\n",
"\\left\\{ \n",
"\\begin{array}{c}\n",
"\\frac{\\partial E}{\\partial a} = 0 \\\\ \n",
"\\frac{\\partial E}{\\partial b} = 0 \n",
"\\end{array}\n",
"\\right. \n",
"$$\n",
"This turns to be:\n",
"$$\n",
"\\left\\{ \n",
"\\begin{array}{c}\n",
"\\sum (y_i - (ax_i +b))x_i = 0 \\\\ \n",
"\\sum (y_i - (ax_i +b)) = 0 \n",
"\\end{array}\n",
"\\right. \n",
"$$\n",
"\n",
"From this, we can have a closed formula for $a$ and $b$:\n",
"$$\n",
"\\left\\{ \n",
"\\begin{array}{c}\n",
"a = \\frac{X \\cdot Y - n \\bar{X}\\bar{Y}}{X \\cdot X - n \\bar{X}^2} \\\\ \n",
"b = \\bar{Y} - a \\bar{X} \n",
"\\end{array}\n",
"\\right. \n",
"$$\n",
"Here, $\\bar{X}$ and $\\bar{Y}$ denote the mean of $X$ and $Y$, respectively.\n",
"Furthermore, $n$ is the number of sample points.\n",
"We can now check the closed formulas, and compare them to the coefficient and intercept of the model we tarined:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"-0.8010271422548586"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(np.dot(X,Y)/(len(Y)) - X.mean()*Y.mean())/\\\n",
"(np.dot(X,X)/len(X) - np.power(X.mean(),2))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"vs."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([-0.80102714])"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"regr.coef_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2.8648629210179717"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Y.mean() - X.mean()* \\\n",
"(np.dot(X,Y)/(len(Y)) - X.mean()*Y.mean())/\\\n",
"(np.dot(X,X)/len(X) - np.power(X.mean(),2))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"vs."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2.864862921017969"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"regr.intercept_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lastly, the closed formulas above provide good intuition why the error of the model grows linearly.\n",
"In the future I will explain this in details."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda root]",
"language": "python",
"name": "conda-root-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment