diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-01-22 17:20:09 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-01-22 17:20:09 +0100 |
| commit | 79f3505b2611b0f6a210224d38d59002597379e6 (patch) | |
| tree | b404cbe0c6fe5a711d1a517d6246c8f41a007cd1 /ft_linear_regression_notebook.ipynb | |
| parent | 21fe049421d7a03f1d91febb3069421857f0e3bd (diff) | |
| download | ft_linear_regression-79f3505b2611b0f6a210224d38d59002597379e6.tar.gz ft_linear_regression-79f3505b2611b0f6a210224d38d59002597379e6.tar.bz2 ft_linear_regression-79f3505b2611b0f6a210224d38d59002597379e6.zip | |
Added explaination notebook
Diffstat (limited to 'ft_linear_regression_notebook.ipynb')
| -rw-r--r-- | ft_linear_regression_notebook.ipynb | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/ft_linear_regression_notebook.ipynb b/ft_linear_regression_notebook.ipynb new file mode 100644 index 0000000..6b61b71 --- /dev/null +++ b/ft_linear_regression_notebook.ipynb @@ -0,0 +1,410 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ft_linear_regression\n", + "\n", + "Project in which I need to build a linear regression model for a simple dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "data = np.genfromtxt('../data.csv', delimiter=',')[1:]\n", + "km = data[:, 0]\n", + "price = data[:, 1]" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def plot_data():\n", + " plt.scatter(km, price)\n", + " plt.xlabel(\"km\")\n", + " plt.ylabel(\"price\")\n", + "plot_data()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This dataset contains information about cars, their cost and the the number of kilometers they've made.\n", + "\n", + "We can see just by looking at the data that their is a **linear relationship**, when the distance made diminish, the price rize.\n", + "\n", + "We can try to trace an approximate line which goes *through* the data." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_data()\n", + "plt.plot([200_000, 20_000], [3_500, 8_500], color='r')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use this hypothetical line to predict new data, for example predict the price of a car knowing only it's distance traveled.\n", + "\n", + "The equation of a line is in the form:\n", + "\n", + "$$\n", + "\\boxed {\n", + " y = \\theta_1 x + \\theta_0\n", + "}\n", + "$$\n", + "\n", + "Where $\\theta_1$ is the slope of the line and $\\theta_0$ the y-intercept. If we managed to tweak those values correctly we can find the best fitting line for our data (or at least very close to it).\n", + "\n", + "If we switch to a function, we get $h(x) = \\theta_1 x + \\theta_0$, $h$ is our **hypothesis function**." + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def h(x, theta1, theta0):\n", + " return x * theta1 + theta0\n", + "\n", + "theta1 = -0.03\n", + "theta0 = 9000\n", + "\n", + "line_xs = [km.min(), km.max()]\n", + "line_ys = [h(x, theta1, theta0) for x in line_xs]\n", + "plt.plot(line_xs, line_ys, color='r')\n", + "\n", + "plot_data()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can adjust our prediction by changing $\\theta_1$ and $\\theta_0$.\n", + "\n", + "Now, we need a way to know if our line correctly predicts the data or not, so that if not, we can slightly change it to better fit the data.\n", + "\n", + "Introducing the **error function** $J$ (also called cost function):\n", + "\n", + "$$\n", + "\\begin{align}\n", + "J(\\theta_1, \\theta_0) &= \\frac{1}{2n} \\sum_{i=1}^{n}(h(x_i) - y_i)^2 \\\\\n", + " &= \\frac{1}{2n} \\sum_{i=1}^{n}((\\theta_1 x_i + \\theta_0) - y_i)^2\n", + "\\end{align}\n", + "$$\n", + "\n", + "It's the sum of the square of the distance between what we predicted and the actual data.\n", + "$n$ is the number of entry we got, we divide by it to normalize the result." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [], + "source": [ + "def error_function(xs, ys, theta1, theta0):\n", + " return (1 / (2 * len(xs))) * sum(\n", + " [(h(x, theta1, theta0) - y) ** 2\n", + " for x, y in zip(xs, ys)])" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "386217.6189791666\n" + ] + } + ], + "source": [ + "xs = km\n", + "ys = price\n", + "\n", + "print(error_function(xs, ys, theta1, theta0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The error value is pretty high, this means that the approximated line is garbage.\n", + "\n", + "The process of learning will be done by reducing this error function. To make that happen, we need to know *how* we are going to change $\\theta_1$ and $\\theta_0$.\n", + "\n", + "Here comes partial derivatives:\n", + "\n", + "$$\n", + "\\begin{align}\n", + " \\theta_1 &:= \\theta_1 - \\alpha \\frac{\\partial}{\\partial \\theta_1} J(\\theta_1, \\theta_0) \\\\\n", + " \\theta_0 &:= \\theta_0 - \\alpha \\frac{\\partial}{\\partial \\theta_0} J(\\theta_1, \\theta_0)\n", + "\\end{align}\n", + "$$\n", + "\n", + "First of all $\\alpha$ is the **learning rate** we multiply the change we want to make by it, it describes how *fast* we are changing the hypothesis component.\n", + "\n", + "The partial derivative of $J$ by regard to $\\theta_1$ for example is how the error function changes if we consider $\\theta_0$ has a constant.\n", + "\n", + "We compute the *next* $\\theta_0$ by subtracting learning rate * partial derivative from it.\n", + "\n", + "Lets expand theses partial derivatives:\n", + "\n", + "$$\n", + "\\newcommand{\\partialthetazero}{\\frac{\\partial}{\\partial \\theta_0}}\n", + "\\begin{align}\n", + " & \\partialthetazero \\left[ J(\\theta_1, \\theta_0) \\right] \\\\\n", + " =& \\partialthetazero \\left[ \\frac{1}{2n} \\sum_{i=1}^{n}((\\theta_1 x_i + \\theta_0) - y_i)^2 \\right] \\\\\n", + " =& \\frac{1}{2n} \\sum_{i=1}^{n} \\partialthetazero \\left[ ((\\theta_1 x_i + \\theta_0) - y_i)^2 \\right] \\\\\n", + " =& \\frac{1}{2n} \\sum_{i=1}^{n} 2((\\theta_1 x_i + \\theta_0) - y_i) \\partialthetazero \\left[ ((\\theta_1 x_i + \\theta_0) - y_i) \\right] \\\\\n", + " =& \\boxed{ \\frac{1}{n} \\sum_{i=1}^{n} ((\\theta_1 x_i + \\theta_0) - y_i) }\n", + "\\end{align}\n", + "$$\n", + "\n", + "And for $\\theta_1$:\n", + "\n", + "$$\n", + "\\newcommand{\\partialthetaone}{\\frac{\\partial}{\\partial \\theta_1}}\n", + "\\begin{align}\n", + " & \\partialthetaone \\left[ J(\\theta_1, \\theta_0) \\right] \\\\\n", + " =& \\partialthetaone \\left[ \\frac{1}{2n} \\sum_{i=1}^{n}((\\theta_1 x_i + \\theta_0) - y_i)^2 \\right] \\\\\n", + " =& \\frac{1}{2n} \\sum_{i=1}^{n} \\partialthetaone \\left[ ((\\theta_1 x_i + \\theta_0) - y_i)^2 \\right] \\\\\n", + " =& \\frac{1}{2n} \\sum_{i=1}^{n} 2((\\theta_1 x_i + \\theta_0) - y_i) \\partialthetaone \\left[ ((\\theta_1 x_i + \\theta_0) - y_i) \\right] \\\\\n", + " =& \\boxed { \\frac{1}{n} \\sum_{i=1}^{n} ((\\theta_1 x_i + \\theta_0) - y_i) x_i }\n", + "\\end{align}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 217, + "metadata": {}, + "outputs": [], + "source": [ + "def theta0_partial(xs, ys, theta1, theta0):\n", + " return sum([h(x, theta1, theta0) - y\n", + " for x, y in zip(xs, ys)]) / len(xs)\n", + "\n", + "def theta1_partial(xs, ys, theta1, theta0):\n", + " return sum([(h(x, theta1, theta0) - y) * x\n", + " for x, y in zip(xs, ys)]) / len(xs)\n", + "\n", + "\n", + "def gradient_descent(xs, ys, theta1, theta0, alpha, iterations):\n", + " for _ in range(iterations):\n", + " next_theta1 = theta1 - alpha * theta1_partial(xs, ys, theta1, theta0)\n", + " next_theta0 = theta0 - alpha * theta0_partial(xs, ys, theta1, theta0)\n", + " theta1 = next_theta1\n", + " theta0 = next_theta0\n", + " return theta1, theta0\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The gradient descent work by repeating the formula above a certain amount of times.\n", + "\n", + "But before actually running the algorithm, the data need to be normalized. This means that they will be in a range like 0 < x < 1 but they will keep their relative distance to each other.\n", + "\n", + "If we don't do this, our values will go to infinity or some do some sneaky floating point arithmetic stuff." + ] + }, + { + "cell_type": "code", + "execution_count": 267, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import normalize\n", + "\n", + "X = normalize([xs])[0]\n", + "Y = normalize([ys])[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 274, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "theta1, theta0 = np.random.randn(2)\n", + "\n", + "line_xs = [X.min(), X.max()]\n", + "line_ys = [h(x, theta1, theta0) for x in line_xs]\n", + "plt.plot(line_xs, line_ys, color='r')\n", + "\n", + "plt.scatter(X, Y)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 275, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "error before: 0.20767778959463673\n" + ] + } + ], + "source": [ + "print(\"error before: \", error_function(X, Y, theta1, theta0))" + ] + }, + { + "cell_type": "code", + "execution_count": 276, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.3766258389374899 0.2684839986208806\n", + "error after: 0.00022231909239872055\n" + ] + } + ], + "source": [ + "alpha = 1\n", + "iterations = 1000\n", + "\n", + "theta1, theta0 = gradient_descent(X, Y, theta1, theta0, alpha, iterations)\n", + "\n", + "print(theta1, theta0)\n", + "print(\"error after: \", error_function(X, Y, theta1, theta0))" + ] + }, + { + "cell_type": "code", + "execution_count": 277, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "line_xs = [X.min(), X.max()]\n", + "line_ys = [h(x, theta1, theta0) for x in line_xs]\n", + "plt.plot(line_xs, line_ys, color='r')\n", + "\n", + "plt.scatter(X, Y)\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} |
