├── 01 Linear Regression using Least Squares ├── .ipynb_checkpoints │ └── Linear Regression using Least Squares-checkpoint.ipynb ├── Linear Regression using Least Squares.ipynb ├── README.md ├── animation-gif2.gif ├── data.csv ├── dataset │ ├── example_data.csv │ └── headbrain.csv └── error.jpg ├── 02 Linear Regression using Gradient Descent ├── .ipynb_checkpoints │ └── Linear Regression using Gradient Descent-checkpoint.ipynb ├── Linear Regression using Gradient Descent.ipynb ├── README.md ├── animation1.gif ├── data.csv ├── output1.png ├── output2.png └── valley-illustration.jpg ├── 03 Linear Regression in 2 minutes ├── .ipynb_checkpoints │ └── Linear Regression In 6 lines-checkpoint.ipynb ├── Linear Regression In 6 lines.ipynb ├── README.md └── data.csv └── README.md /01 Linear Regression using Least Squares/.ipynb_checkpoints/Linear Regression using Least Squares-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Linear Regression using Least Squares\n", 8 | " \n", 9 | "![animation](animation-gif2.gif) \n", 10 | "## Linear Regression \n", 11 | "In statistics, linear regression is a linear approach to modelling the relationship between a dependent variable and one or more independent variables. In the case of one independent variable it is called simple linear regression. For more than one independent variable, the process is called mulitple linear regression. We will be dealing with simple linear regression in this tutorial. \n", 12 | "Let **X** be the independent variable and **Y** be the dependent variable. We will define a linear relationship between these two variables as follows: \n", 13 | "\n", 14 | "\\\\[ Y = mX + c \\\\] \n", 15 | "![mxplusc](http://www.nabla.hr/SlopeInterceptLineEqu.gif)\n", 16 | "\n", 17 | "This is the equation for a line that you studied in high school. **m** is the slope of the line and **c** is the y intercept. Today we will use this equation to train our model with a given dataset and predict the value of **Y** for any given value of **X**. \n", 18 | " \n", 19 | "Our challenege today is to determine the value of **m** and **c**, that gives the minimum error for the given dataset. We will be doing this by using the **Least Squares** method. \n", 20 | "\n", 21 | "## Finding the Error \n", 22 | "So to minimize the error we need a way to calculate the error in the first place. A **loss function** in machine learning is simply a measure of how different the predicted value is from the actual value. \n", 23 | "Today we will be using the **Quadratic Loss Function** to calculate the loss or error in our model. It can be defined as: \n", 24 | " \n", 25 | "\\\\[ L(x) = \\sum_{i=1}^n (y_i - p_i)^2\\\\] \n", 26 | "![error](error.jpg) \n", 27 | " \n", 28 | "We are squaring it because, for the points below the regression line **y - p** will be negative and we don't want negative values in our total error. \n", 29 | "\n", 30 | "## Least Squares method \n", 31 | "Now that we have determined the loss function, the only thing left to do is minimize it. This is done by finding the partial derivative of **L**, equating it to 0 and then finding an expression for **m** and **c**. After we do the math, we are left with these equations: \n", 32 | " \n", 33 | "\\\\[m = \\frac{\\sum_{i=1}^n (x_i - \\bar x)(y_i - \\bar y)}{\\sum_{i=1}^n (x_i - \\bar x)^2}\\\\] \n", 34 | " \n", 35 | "\\\\[c = \\bar y - m\\bar x\\\\] \n", 36 | " \n", 37 | "Here $\\bar x$ is the mean of all the values in the input **X** and $\\bar y$ is the mean of all the values in the desired output **Y**. This is the Least Squares method. \n", 38 | "Now we will implement this in python and make predictions. \n" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | "## Implementing the Model" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 84, 51 | "metadata": { 52 | "collapsed": true 53 | }, 54 | "outputs": [], 55 | "source": [ 56 | "# Making imports\n", 57 | "import pandas as pd\n", 58 | "import numpy as np\n", 59 | "import matplotlib.pyplot as plt\n", 60 | "plt.rcParams['figure.figsize'] = (12.0, 9.0)" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 20, 66 | "metadata": {}, 67 | "outputs": [ 68 | { 69 | "data": { 70 | "image/png": "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\nx3XBTlwb7GTurg01yQAA0GAmGQAAGoTkniml/EellN8ppfx+KeWzpZR/MDj+UCnlt0spny+l/Eop\n5btnPVamr5RyqJSyWkr5F4PXrgtSSvlSKeVGKeX3Sikrg2OvK6U8O7g2ni2lvHbW42S6SimLpZSP\nl1L+sJTyuVLKf+66oJRybPBvxdZ//28p5e/M47UhJPfPt5I8Umt9a5K3JXl3KeWHkvxMkp+ttT6c\n5MUkH5zhGJmdn0zyubteuy7Y8hdrrW+7q4XTuSTPDa6N5wav6Zd/lOTXaq0/kOSt2fy3w3XRc7XW\nm4N/K96W5C8k+WaST2QOrw0huWfqpv9v8PLw4L+a5JEkHx8cfyrJ6RkMjxkqpdyf5K8l+YXB6xLX\nBTt7LJvXROLa6J1Syp9J8s4kv5gktdZv11rX47rgXo8m+aNa65czh9eGkNxDg0fqv5fkhSTPJvmj\nJOu11pcGpzyfZGlW42Nmfi7J30vyp4PXr4/rgk01ya+XUq6XUp4YHHtTrfVrSTL4+MaZjY5Z+P4k\nt5P8k0GJ1i+UUr43rgvu9YEkHxl8PnfXhpDcQ7XWlwePQe5P8o4kf3a706Y7KmaplPLeJC/UWq/f\nfXibU10X/XSy1vr2JO9J8qFSyjtnPSBm7r4kb0/y87XWE0n+Q+bg8TnTM1jD8r4kvzrrsQxLSO6x\nwaOxTyX5oSSLpZT7Bl+6P8mtWY2LmTiZ5H2llC8l+Wg2yyx+Lq4LktRabw0+vpDN2sJ3JPl6KeXN\nSTL4+MLsRsgMPJ/k+Vrrbw9efzybodl1wZb3JPndWuvXB6/n7toQknumlHKklLI4+HwhyV/K5mKL\n30jyw4PTHk/yydmMkFmotZ6vtd5fa30wm4/HrtVafyyui94rpXxvKeU/3vo8yV9J8pkkT2fzmkhc\nG71Ta/03Sb5aSjk2OPRokj+I64JX/WheLbVI5vDasJlIz5RS/nw2C+YPZfMm6WO11n9YSvn+bM4g\nvi7JapL/qtb6rdmNlFkppbwryf9Ya32v64LBNfCJwcv7kvzzWutPl1Jen+RjSR5I8pUk76+1fmNG\nw2QGSilvy+ZC3+9O8sUkP5HB/1fiuui1Usprknw1yffXWv/d4Njc/ZshJAMAQINyCwAAaBCSAQCg\nQUgGAIAGIRkAABqEZAAAaBCSAQCgQUgGAIAGIRkAABr+f7vauJU1NKqHAAAAAElFTkSuQmCC\n", 71 | "text/plain": [ 72 | "" 73 | ] 74 | }, 75 | "metadata": {}, 76 | "output_type": "display_data" 77 | } 78 | ], 79 | "source": [ 80 | "# Preprocessing Input data\n", 81 | "data = pd.read_csv(\"data.csv\")\n", 82 | "X = data.iloc[:, 0]\n", 83 | "Y = data.iloc[:, 1]\n", 84 | "plt.scatter(X, Y)\n", 85 | "plt.show()" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 85, 91 | "metadata": {}, 92 | "outputs": [ 93 | { 94 | "name": "stdout", 95 | "output_type": "stream", 96 | "text": [ 97 | "1.287357370010931 9.908606190326509\n" 98 | ] 99 | } 100 | ], 101 | "source": [ 102 | "# Building the model\n", 103 | "X_mean = np.mean(X)\n", 104 | "Y_mean = np.mean(Y)\n", 105 | "\n", 106 | "num = 0\n", 107 | "den = 0\n", 108 | "for i in range(len(X)):\n", 109 | " num += (X[i] - X_mean)*(Y[i] - Y_mean)\n", 110 | " den += (X[i] - X_mean)**2\n", 111 | "m = num/den\n", 112 | "c = Y_mean - (m * X_mean)\n", 113 | "\n", 114 | "print(m, c)" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 87, 120 | "metadata": {}, 121 | "outputs": [ 122 | { 123 | "data": { 124 | "image/png": "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\n", 125 | "text/plain": [ 126 | "" 127 | ] 128 | }, 129 | "metadata": {}, 130 | "output_type": "display_data" 131 | } 132 | ], 133 | "source": [ 134 | "# Making predictions\n", 135 | "\n", 136 | "Y_pred = m*X + c\n", 137 | "\n", 138 | "plt.scatter(X, Y)\n", 139 | "plt.scatter(X, Y_pred, color='red')\n", 140 | "# plt.plot([min(X), max(X)], [min(Y_pred), max(Y_pred)], color='red')\n", 141 | "plt.show()" 142 | ] 143 | } 144 | ], 145 | "metadata": { 146 | "kernelspec": { 147 | "display_name": "Python 3", 148 | "language": "python", 149 | "name": "python3" 150 | }, 151 | "language_info": { 152 | "codemirror_mode": { 153 | "name": "ipython", 154 | "version": 3 155 | }, 156 | "file_extension": ".py", 157 | "mimetype": "text/x-python", 158 | "name": "python", 159 | "nbconvert_exporter": "python", 160 | "pygments_lexer": "ipython3", 161 | "version": "3.5.4" 162 | } 163 | }, 164 | "nbformat": 4, 165 | "nbformat_minor": 2 166 | } 167 | -------------------------------------------------------------------------------- /01 Linear Regression using Least Squares/Linear Regression using Least Squares.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Linear Regression using Least Squares\n", 8 | " \n", 9 | "![animation](animation-gif2.gif) \n", 10 | "## Linear Regression \n", 11 | "In statistics, linear regression is a linear approach to modelling the relationship between a dependent variable and one or more independent variables. In the case of one independent variable it is called simple linear regression. For more than one independent variable, the process is called mulitple linear regression. We will be dealing with simple linear regression in this tutorial. \n", 12 | "Let **X** be the independent variable and **Y** be the dependent variable. We will define a linear relationship between these two variables as follows: \n", 13 | "\n", 14 | "\\\\[ Y = mX + c \\\\] \n", 15 | "![mxplusc](http://www.nabla.hr/SlopeInterceptLineEqu.gif)\n", 16 | "\n", 17 | "This is the equation for a line that you studied in high school. **m** is the slope of the line and **c** is the y intercept. Today we will use this equation to train our model with a given dataset and predict the value of **Y** for any given value of **X**. \n", 18 | " \n", 19 | "Our challenege today is to determine the value of **m** and **c**, that gives the minimum error for the given dataset. We will be doing this by using the **Least Squares** method. \n", 20 | "\n", 21 | "## Finding the Error \n", 22 | "So to minimize the error we need a way to calculate the error in the first place. A **loss function** in machine learning is simply a measure of how different the predicted value is from the actual value. \n", 23 | "Today we will be using the **Quadratic Loss Function** to calculate the loss or error in our model. It can be defined as: \n", 24 | " \n", 25 | "\\\\[ L(x) = \\sum_{i=1}^n (y_i - p_i)^2\\\\] \n", 26 | "![error](error.jpg) \n", 27 | " \n", 28 | "We are squaring it because, for the points below the regression line **y - p** will be negative and we don't want negative values in our total error. \n", 29 | "\n", 30 | "## Least Squares method \n", 31 | "Now that we have determined the loss function, the only thing left to do is minimize it. This is done by finding the partial derivative of **L**, equating it to 0 and then finding an expression for **m** and **c**. After we do the math, we are left with these equations: \n", 32 | " \n", 33 | "\\\\[m = \\frac{\\sum_{i=1}^n (x_i - \\bar x)(y_i - \\bar y)}{\\sum_{i=1}^n (x_i - \\bar x)^2}\\\\] \n", 34 | " \n", 35 | "\\\\[c = \\bar y - m\\bar x\\\\] \n", 36 | " \n", 37 | "Here $\\bar x$ is the mean of all the values in the input **X** and $\\bar y$ is the mean of all the values in the desired output **Y**. This is the Least Squares method. \n", 38 | "Now we will implement this in python and make predictions. \n" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | "## Implementing the Model" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": null, 51 | "metadata": { 52 | "collapsed": true 53 | }, 54 | "outputs": [], 55 | "source": [ 56 | "# Making imports\n", 57 | "import pandas as pd\n", 58 | "import numpy as np\n", 59 | "import matplotlib.pyplot as plt\n", 60 | "plt.rcParams['figure.figsize'] = (12.0, 9.0)" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": null, 66 | "metadata": {}, 67 | "outputs": [], 68 | "source": [ 69 | "# Preprocessing Input data\n", 70 | "data = pd.read_csv('data.csv')\n", 71 | "X = data.iloc[:, 0]\n", 72 | "Y = data.iloc[:, 1]\n", 73 | "plt.scatter(X, Y)\n", 74 | "plt.show()" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 98, 80 | "metadata": {}, 81 | "outputs": [ 82 | { 83 | "name": "stdout", 84 | "output_type": "stream", 85 | "text": [ 86 | "1.287357370010931 9.908606190326509\n" 87 | ] 88 | } 89 | ], 90 | "source": [ 91 | "# Building the model\n", 92 | "X_mean = np.mean(X)\n", 93 | "Y_mean = np.mean(Y)\n", 94 | "\n", 95 | "num = 0\n", 96 | "den = 0\n", 97 | "for i in range(len(X)):\n", 98 | " num += (X[i] - X_mean)*(Y[i] - Y_mean)\n", 99 | " den += (X[i] - X_mean)**2\n", 100 | "m = num / den\n", 101 | "c = Y_mean - m*X_mean\n", 102 | "\n", 103 | "print (m, c)" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": 101, 109 | "metadata": {}, 110 | "outputs": [ 111 | { 112 | "data": { 113 | "image/png": "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\n", 114 | "text/plain": [ 115 | "" 116 | ] 117 | }, 118 | "metadata": {}, 119 | "output_type": "display_data" 120 | } 121 | ], 122 | "source": [ 123 | "# Making predictions\n", 124 | "Y_pred = m*X + c\n", 125 | "\n", 126 | "plt.scatter(X, Y) # actual\n", 127 | "plt.plot([min(X), max(X)], [min(Y_pred), max(Y_pred)], color='red') # predicted\n", 128 | "plt.show()" 129 | ] 130 | } 131 | ], 132 | "metadata": { 133 | "kernelspec": { 134 | "display_name": "Python 3", 135 | "language": "python", 136 | "name": "python3" 137 | }, 138 | "language_info": { 139 | "codemirror_mode": { 140 | "name": "ipython", 141 | "version": 3 142 | }, 143 | "file_extension": ".py", 144 | "mimetype": "text/x-python", 145 | "name": "python", 146 | "nbconvert_exporter": "python", 147 | "pygments_lexer": "ipython3", 148 | "version": "3.5.4" 149 | } 150 | }, 151 | "nbformat": 4, 152 | "nbformat_minor": 2 153 | } 154 | -------------------------------------------------------------------------------- /01 Linear Regression using Least Squares/README.md: -------------------------------------------------------------------------------- 1 | # 01 Linear Regression using Least Squares -------------------------------------------------------------------------------- /01 Linear Regression using Least Squares/animation-gif2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chasinginfinity/ml-from-scratch/24c0c0472d87f31c65cb9ad82ff0836afce924f1/01 Linear Regression using Least Squares/animation-gif2.gif -------------------------------------------------------------------------------- /01 Linear Regression using Least Squares/data.csv: -------------------------------------------------------------------------------- 1 | 32.502345269453031,31.70700584656992 2 | 53.426804033275019,68.77759598163891 3 | 61.530358025636438,62.562382297945803 4 | 47.475639634786098,71.546632233567777 5 | 59.813207869512318,87.230925133687393 6 | 55.142188413943821,78.211518270799232 7 | 52.211796692214001,79.64197304980874 8 | 39.299566694317065,59.171489321869508 9 | 48.10504169176825,75.331242297063056 10 | 52.550014442733818,71.300879886850353 11 | 45.419730144973755,55.165677145959123 12 | 54.351634881228918,82.478846757497919 13 | 44.164049496773352,62.008923245725825 14 | 58.16847071685779,75.392870425994957 15 | 56.727208057096611,81.43619215887864 16 | 48.955888566093719,60.723602440673965 17 | 44.687196231480904,82.892503731453715 18 | 60.297326851333466,97.379896862166078 19 | 45.618643772955828,48.847153317355072 20 | 38.816817537445637,56.877213186268506 21 | 66.189816606752601,83.878564664602763 22 | 65.41605174513407,118.59121730252249 23 | 47.48120860786787,57.251819462268969 24 | 41.57564261748702,51.391744079832307 25 | 51.84518690563943,75.380651665312357 26 | 59.370822011089523,74.765564032151374 27 | 57.31000343834809,95.455052922574737 28 | 63.615561251453308,95.229366017555307 29 | 46.737619407976972,79.052406169565586 30 | 50.556760148547767,83.432071421323712 31 | 52.223996085553047,63.358790317497878 32 | 35.567830047746632,41.412885303700563 33 | 42.436476944055642,76.617341280074044 34 | 58.16454011019286,96.769566426108199 35 | 57.504447615341789,74.084130116602523 36 | 45.440530725319981,66.588144414228594 37 | 61.89622268029126,77.768482417793024 38 | 33.093831736163963,50.719588912312084 39 | 36.436009511386871,62.124570818071781 40 | 37.675654860850742,60.810246649902211 41 | 44.555608383275356,52.682983366387781 42 | 43.318282631865721,58.569824717692867 43 | 50.073145632289034,82.905981485070512 44 | 43.870612645218372,61.424709804339123 45 | 62.997480747553091,115.24415280079529 46 | 32.669043763467187,45.570588823376085 47 | 40.166899008703702,54.084054796223612 48 | 53.575077531673656,87.994452758110413 49 | 33.864214971778239,52.725494375900425 50 | 64.707138666121296,93.576118692658241 51 | 38.119824026822805,80.166275447370964 52 | 44.502538064645101,65.101711570560326 53 | 40.599538384552318,65.562301260400375 54 | 41.720676356341293,65.280886920822823 55 | 51.088634678336796,73.434641546324301 56 | 55.078095904923202,71.13972785861894 57 | 41.377726534895203,79.102829683549857 58 | 62.494697427269791,86.520538440347153 59 | 49.203887540826003,84.742697807826218 60 | 41.102685187349664,59.358850248624933 61 | 41.182016105169822,61.684037524833627 62 | 50.186389494880601,69.847604158249183 63 | 52.378446219236217,86.098291205774103 64 | 50.135485486286122,59.108839267699643 65 | 33.644706006191782,69.89968164362763 66 | 39.557901222906828,44.862490711164398 67 | 56.130388816875467,85.498067778840223 68 | 57.362052133238237,95.536686846467219 69 | 60.269214393997906,70.251934419771587 70 | 35.678093889410732,52.721734964774988 71 | 31.588116998132829,50.392670135079896 72 | 53.66093226167304,63.642398775657753 73 | 46.682228649471917,72.247251068662365 74 | 43.107820219102464,57.812512976181402 75 | 70.34607561504933,104.25710158543822 76 | 44.492855880854073,86.642020318822006 77 | 57.50453330326841,91.486778000110135 78 | 36.930076609191808,55.231660886212836 79 | 55.805733357942742,79.550436678507609 80 | 38.954769073377065,44.847124242467601 81 | 56.901214702247074,80.207523139682763 82 | 56.868900661384046,83.14274979204346 83 | 34.33312470421609,55.723489260543914 84 | 59.04974121466681,77.634182511677864 85 | 57.788223993230673,99.051414841748269 86 | 54.282328705967409,79.120646274680027 87 | 51.088719898979143,69.588897851118475 88 | 50.282836348230731,69.510503311494389 89 | 44.211741752090113,73.687564318317285 90 | 38.005488008060688,61.366904537240131 91 | 32.940479942618296,67.170655768995118 92 | 53.691639571070056,85.668203145001542 93 | 68.76573426962166,114.85387123391394 94 | 46.230966498310252,90.123572069967423 95 | 68.319360818255362,97.919821035242848 96 | 50.030174340312143,81.536990783015028 97 | 49.239765342753763,72.111832469615663 98 | 50.039575939875988,85.232007342325673 99 | 48.149858891028863,66.224957888054632 100 | 25.128484647772304,53.454394214850524 101 | -------------------------------------------------------------------------------- /01 Linear Regression using Least Squares/dataset/example_data.csv: -------------------------------------------------------------------------------- 1 | 5.1101,17.592 2 | 5.5277,9.1302 3 | 8.5186,13.662 4 | 7.0032,11.854 5 | 5.8598,6.8233 6 | 8.3829,11.886 7 | 7.4764,4.3483 8 | 8.5781,12 9 | 6.4862,6.5987 10 | 5.0546,3.8166 11 | 5.7107,3.2522 12 | 13.964,15.505 13 | 5.734,3.1551 14 | 8.4084,7.2258 15 | 5.6407,0.71618 16 | 5.3794,3.5129 17 | 6.3654,5.3048 18 | 5.1301,0.56077 19 | 6.4296,3.6518 20 | 7.0708,5.3893 21 | 6.1891,3.1386 22 | 20.27,21.767 23 | 5.4901,4.263 24 | 6.3261,5.1875 25 | 5.5649,3.0825 26 | 18.945,22.638 27 | 12.828,13.501 28 | 10.957,7.0467 29 | 13.176,14.692 30 | 22.203,24.147 31 | 5.2524,-1.22 32 | 6.5894,5.9966 33 | 9.2482,12.134 34 | 5.8918,1.8495 35 | 6.2111,6.5426 36 | 7.9334,4.5623 37 | 8.0959,4.1164 38 | 5.6063,3.3928 39 | 12.836,10.117 40 | 6.3534,5.4974 41 | 5.4069,0.55657 42 | 6.8825,3.9115 43 | 11.708,5.3854 44 | 5.7737,2.4406 45 | 7.8247,6.7318 46 | 7.0931,1.0463 47 | 5.0702,5.1337 48 | 5.8014,1.844 49 | 11.7,8.0043 50 | 5.5416,1.0179 51 | 7.5402,6.7504 52 | 5.3077,1.8396 53 | 7.4239,4.2885 54 | 7.6031,4.9981 55 | 6.3328,1.4233 56 | 6.3589,-1.4211 57 | 6.2742,2.4756 58 | 5.6397,4.6042 59 | 9.3102,3.9624 60 | 9.4536,5.4141 61 | 8.8254,5.1694 62 | 5.1793,-0.74279 63 | 21.279,17.929 64 | 14.908,12.054 65 | 18.959,17.054 66 | 7.2182,4.8852 67 | 8.2951,5.7442 68 | 10.236,7.7754 69 | 5.4994,1.0173 70 | 20.341,20.992 71 | 10.136,6.6799 72 | 7.3345,4.0259 73 | 6.0062,1.2784 74 | 7.2259,3.3411 75 | 5.0269,-2.6807 76 | 6.1479,0.29678 77 | 7.5386,3.8845 78 | 5.0365,5.7014 79 | 10.274,6.7526 80 | 5.1077,2.0576 81 | 5.7292,0.47953 82 | 5.1884,0.20421 83 | 6.3557,0.67861 84 | 9.7687,7.5435 85 | 6.5159,5.3436 86 | 8.5172,4.2415 87 | 9.1802,6.7981 88 | 6.002,0.92695 89 | 5.5204,0.152 90 | 5.0594,2.8214 91 | 5.7077,1.8451 92 | 7.6366,4.2959 93 | 5.8707,7.2029 94 | 5.3054,1.9869 95 | 8.2934,0.14454 96 | 13.394,9.0551 97 | 5.4369,0.61705 98 | -------------------------------------------------------------------------------- /01 Linear Regression using Least Squares/dataset/headbrain.csv: -------------------------------------------------------------------------------- 1 | Gender,Age Range,Head Size(cm^3),Brain Weight(grams) 2 | 1,1,4512,1530 3 | 1,1,3738,1297 4 | 1,1,4261,1335 5 | 1,1,3777,1282 6 | 1,1,4177,1590 7 | 1,1,3585,1300 8 | 1,1,3785,1400 9 | 1,1,3559,1255 10 | 1,1,3613,1355 11 | 1,1,3982,1375 12 | 1,1,3443,1340 13 | 1,1,3993,1380 14 | 1,1,3640,1355 15 | 1,1,4208,1522 16 | 1,1,3832,1208 17 | 1,1,3876,1405 18 | 1,1,3497,1358 19 | 1,1,3466,1292 20 | 1,1,3095,1340 21 | 1,1,4424,1400 22 | 1,1,3878,1357 23 | 1,1,4046,1287 24 | 1,1,3804,1275 25 | 1,1,3710,1270 26 | 1,1,4747,1635 27 | 1,1,4423,1505 28 | 1,1,4036,1490 29 | 1,1,4022,1485 30 | 1,1,3454,1310 31 | 1,1,4175,1420 32 | 1,1,3787,1318 33 | 1,1,3796,1432 34 | 1,1,4103,1364 35 | 1,1,4161,1405 36 | 1,1,4158,1432 37 | 1,1,3814,1207 38 | 1,1,3527,1375 39 | 1,1,3748,1350 40 | 1,1,3334,1236 41 | 1,1,3492,1250 42 | 1,1,3962,1350 43 | 1,1,3505,1320 44 | 1,1,4315,1525 45 | 1,1,3804,1570 46 | 1,1,3863,1340 47 | 1,1,4034,1422 48 | 1,1,4308,1506 49 | 1,1,3165,1215 50 | 1,1,3641,1311 51 | 1,1,3644,1300 52 | 1,1,3891,1224 53 | 1,1,3793,1350 54 | 1,1,4270,1335 55 | 1,1,4063,1390 56 | 1,1,4012,1400 57 | 1,1,3458,1225 58 | 1,1,3890,1310 59 | 1,2,4166,1560 60 | 1,2,3935,1330 61 | 1,2,3669,1222 62 | 1,2,3866,1415 63 | 1,2,3393,1175 64 | 1,2,4442,1330 65 | 1,2,4253,1485 66 | 1,2,3727,1470 67 | 1,2,3329,1135 68 | 1,2,3415,1310 69 | 1,2,3372,1154 70 | 1,2,4430,1510 71 | 1,2,4381,1415 72 | 1,2,4008,1468 73 | 1,2,3858,1390 74 | 1,2,4121,1380 75 | 1,2,4057,1432 76 | 1,2,3824,1240 77 | 1,2,3394,1195 78 | 1,2,3558,1225 79 | 1,2,3362,1188 80 | 1,2,3930,1252 81 | 1,2,3835,1315 82 | 1,2,3830,1245 83 | 1,2,3856,1430 84 | 1,2,3249,1279 85 | 1,2,3577,1245 86 | 1,2,3933,1309 87 | 1,2,3850,1412 88 | 1,2,3309,1120 89 | 1,2,3406,1220 90 | 1,2,3506,1280 91 | 1,2,3907,1440 92 | 1,2,4160,1370 93 | 1,2,3318,1192 94 | 1,2,3662,1230 95 | 1,2,3899,1346 96 | 1,2,3700,1290 97 | 1,2,3779,1165 98 | 1,2,3473,1240 99 | 1,2,3490,1132 100 | 1,2,3654,1242 101 | 1,2,3478,1270 102 | 1,2,3495,1218 103 | 1,2,3834,1430 104 | 1,2,3876,1588 105 | 1,2,3661,1320 106 | 1,2,3618,1290 107 | 1,2,3648,1260 108 | 1,2,4032,1425 109 | 1,2,3399,1226 110 | 1,2,3916,1360 111 | 1,2,4430,1620 112 | 1,2,3695,1310 113 | 1,2,3524,1250 114 | 1,2,3571,1295 115 | 1,2,3594,1290 116 | 1,2,3383,1290 117 | 1,2,3499,1275 118 | 1,2,3589,1250 119 | 1,2,3900,1270 120 | 1,2,4114,1362 121 | 1,2,3937,1300 122 | 1,2,3399,1173 123 | 1,2,4200,1256 124 | 1,2,4488,1440 125 | 1,2,3614,1180 126 | 1,2,4051,1306 127 | 1,2,3782,1350 128 | 1,2,3391,1125 129 | 1,2,3124,1165 130 | 1,2,4053,1312 131 | 1,2,3582,1300 132 | 1,2,3666,1270 133 | 1,2,3532,1335 134 | 1,2,4046,1450 135 | 1,2,3667,1310 136 | 2,1,2857,1027 137 | 2,1,3436,1235 138 | 2,1,3791,1260 139 | 2,1,3302,1165 140 | 2,1,3104,1080 141 | 2,1,3171,1127 142 | 2,1,3572,1270 143 | 2,1,3530,1252 144 | 2,1,3175,1200 145 | 2,1,3438,1290 146 | 2,1,3903,1334 147 | 2,1,3899,1380 148 | 2,1,3401,1140 149 | 2,1,3267,1243 150 | 2,1,3451,1340 151 | 2,1,3090,1168 152 | 2,1,3413,1322 153 | 2,1,3323,1249 154 | 2,1,3680,1321 155 | 2,1,3439,1192 156 | 2,1,3853,1373 157 | 2,1,3156,1170 158 | 2,1,3279,1265 159 | 2,1,3707,1235 160 | 2,1,4006,1302 161 | 2,1,3269,1241 162 | 2,1,3071,1078 163 | 2,1,3779,1520 164 | 2,1,3548,1460 165 | 2,1,3292,1075 166 | 2,1,3497,1280 167 | 2,1,3082,1180 168 | 2,1,3248,1250 169 | 2,1,3358,1190 170 | 2,1,3803,1374 171 | 2,1,3566,1306 172 | 2,1,3145,1202 173 | 2,1,3503,1240 174 | 2,1,3571,1316 175 | 2,1,3724,1280 176 | 2,1,3615,1350 177 | 2,1,3203,1180 178 | 2,1,3609,1210 179 | 2,1,3561,1127 180 | 2,1,3979,1324 181 | 2,1,3533,1210 182 | 2,1,3689,1290 183 | 2,1,3158,1100 184 | 2,1,4005,1280 185 | 2,1,3181,1175 186 | 2,1,3479,1160 187 | 2,1,3642,1205 188 | 2,1,3632,1163 189 | 2,2,3069,1022 190 | 2,2,3394,1243 191 | 2,2,3703,1350 192 | 2,2,3165,1237 193 | 2,2,3354,1204 194 | 2,2,3000,1090 195 | 2,2,3687,1355 196 | 2,2,3556,1250 197 | 2,2,2773,1076 198 | 2,2,3058,1120 199 | 2,2,3344,1220 200 | 2,2,3493,1240 201 | 2,2,3297,1220 202 | 2,2,3360,1095 203 | 2,2,3228,1235 204 | 2,2,3277,1105 205 | 2,2,3851,1405 206 | 2,2,3067,1150 207 | 2,2,3692,1305 208 | 2,2,3402,1220 209 | 2,2,3995,1296 210 | 2,2,3318,1175 211 | 2,2,2720,955 212 | 2,2,2937,1070 213 | 2,2,3580,1320 214 | 2,2,2939,1060 215 | 2,2,2989,1130 216 | 2,2,3586,1250 217 | 2,2,3156,1225 218 | 2,2,3246,1180 219 | 2,2,3170,1178 220 | 2,2,3268,1142 221 | 2,2,3389,1130 222 | 2,2,3381,1185 223 | 2,2,2864,1012 224 | 2,2,3740,1280 225 | 2,2,3479,1103 226 | 2,2,3647,1408 227 | 2,2,3716,1300 228 | 2,2,3284,1246 229 | 2,2,4204,1380 230 | 2,2,3735,1350 231 | 2,2,3218,1060 232 | 2,2,3685,1350 233 | 2,2,3704,1220 234 | 2,2,3214,1110 235 | 2,2,3394,1215 236 | 2,2,3233,1104 237 | 2,2,3352,1170 238 | 2,2,3391,1120 239 | -------------------------------------------------------------------------------- /01 Linear Regression using Least Squares/error.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chasinginfinity/ml-from-scratch/24c0c0472d87f31c65cb9ad82ff0836afce924f1/01 Linear Regression using Least Squares/error.jpg -------------------------------------------------------------------------------- /02 Linear Regression using Gradient Descent/.ipynb_checkpoints/Linear Regression using Gradient Descent-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Linear Regression using Gradient Descent \n", 8 | "![Gradeint descent](animation1.gif)\n", 9 | "## Linear Regression \n", 10 | "In statistics, linear regression is a linear approach to modelling the relationship between a dependent variable and one or more independent variables. \n", 11 | "Let **X** be the independent variable and **Y** be the dependent variable. We will define a linear relationship between these two variables as follows: \n", 12 | "\n", 13 | "\\\\[ Y = mX + c \\\\] \n", 14 | "![mxplusc](http://www.nabla.hr/SlopeInterceptLineEqu.gif)\n", 15 | "\n", 16 | "This is the equation for a line that you studied in high school. **m** is the slope of the line and **c** is the y intercept. Today we will use this equation to train our model with a given dataset and predict the value of **Y** for any given value of **X**. \n", 17 | " \n", 18 | "Our challenege today is to determine the value of **m** and **c**, such that the line corresponding to those values is the best fitting line or gives the minimum error. \n", 19 | "## Loss function \n", 20 | "The loss is the error in our predicted of **m** and **c**. Our goal is to minimize this error to obtain the most accurance value of **m** and **c**. \n", 21 | "We will use the Mean Squared Error function to calculate the loss. There are three steps in this function:\n", 22 | "1. Find the difference between the actual y and predicted y value(y = mx + c), for a given x. \n", 23 | "2. Square this difference.\n", 24 | "3. Find the mean of the squares for every value in X. \n", 25 | "\\\\[ E = \\frac{1}{n} \\sum_{i=0}^n (y_i - \\bar y_i)^2\\\\] \n", 26 | "\n", 27 | "Here $y_i$ is the actual value and $\\bar y_i$ is the predicted value. Lets substitue the value of $\\bar y_i$\n", 28 | "\\\\[ E = \\frac{1}{n} \\sum_{i=0}^n (y_i - (mx_i + c))^2\\\\]\n", 29 | "So we square the error and find the mean. hence the name Mean Squared Error. \n", 30 | "Now that we have defined the loss function, lets get into the interesting part - minimizing it and finding **m** and **c**\n", 31 | "\n", 32 | "## The Gradient Descent Algorithm \n", 33 | "Gradient descent is an iterative optimization algorithm to find the minimum of a function. Here that function is our Loss Function. \n", 34 | "**Understanding Gradient Descent** \n", 35 | "![valley](valley-illustration.jpg) \n", 36 | "\n", 37 | "Imagine a valley and a person with no sense of direction who wants to get to the bottom of the valley. He goes down the slope and takes large steps when the slope is steep and small steps when the slope is less steep. He decides his next position based on his current position and stops when he gets to the bottom of the valley which was his goal. \n", 38 | "Let's try applying gradient descent to **m** and **c** and approach it step by step: \n", 39 | "1. Initially let m = 0 and c = 0. Let L be our learning rate. This controls how much the value of **m** changes with each step. L could be a small value like 0.0001 for good accuracy. \n", 40 | "2. Calculate the partial derivative of the loss function with respect to m, and plug in the current values of x, y, m and c in it to obtain the derivative value **D**. \n", 41 | "\\\\[ D_m = \\frac{1}{n} \\sum_{i=0}^n 2(y_i - (mx_i + c))(-x_i) \\\\]\n", 42 | "\\\\[ D_m = \\frac{-2}{n} \\sum_{i=0}^n x_i(y_i - \\bar y_i) \\\\] \n", 43 | "$D_m$ is the value of the partial derivative with respect to **m**. Similarly lets find the partial derivative with respect to **c**, $D_c$ : \n", 44 | "\\\\[ D_c = \\frac{-2}{n} \\sum_{i=0}^n (y_i - \\bar y_i) \\\\]\n", 45 | "3. Now we update the current value of **m** and **c** using the following equation: \n", 46 | "\\\\[ m = m - L \\times D_m\\\\] \n", 47 | "\\\\[ c = c - L \\times D_c\\\\] \n", 48 | "4. We repeat this process untill our loss function is a very small value or ideally 0 (which means 0 error or 100% accuracy). The value of **m** and **c** that we are left with now will be the optimum values. \n", 49 | " \n", 50 | "Now going back to our analogy, **m** can be considered the current position of the person. **D** is equivalent to the steepness of the slope and **L** can be the speed with which he moves. Now the new value of **m** that we calculate using the above equation will be his next positon, and $L \\times D$ will be the size of the steps he will take. When the slope is more steep (**D** is more) he takes longer steps and when it is less steep (**D** is less), he takes smaller steps. Finally he arrives at the bottom of the valley which corresponds to our loss = 0. \n", 51 | "We repeat the same process above to find the value of **c** also. Now with the optimum value of **m** and **c** our model is ready to make predictions ! \n", 52 | "\n", 53 | "## Implementing the Model \n", 54 | "Now let's convert everything above into code and see our model in action !" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 2, 60 | "metadata": {}, 61 | "outputs": [ 62 | { 63 | "data": { 64 | "image/png": "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\nx3XBTlwb7GTurg01yQAA0GAmGQAAGoTkniml/EellN8ppfx+KeWzpZR/MDj+UCnlt0spny+l/Eop\n5btnPVamr5RyqJSyWkr5F4PXrgtSSvlSKeVGKeX3Sikrg2OvK6U8O7g2ni2lvHbW42S6SimLpZSP\nl1L+sJTyuVLKf+66oJRybPBvxdZ//28p5e/M47UhJPfPt5I8Umt9a5K3JXl3KeWHkvxMkp+ttT6c\n5MUkH5zhGJmdn0zyubteuy7Y8hdrrW+7q4XTuSTPDa6N5wav6Zd/lOTXaq0/kOSt2fy3w3XRc7XW\nm4N/K96W5C8k+WaST2QOrw0huWfqpv9v8PLw4L+a5JEkHx8cfyrJ6RkMjxkqpdyf5K8l+YXB6xLX\nBTt7LJvXROLa6J1Syp9J8s4kv5gktdZv11rX47rgXo8m+aNa65czh9eGkNxDg0fqv5fkhSTPJvmj\nJOu11pcGpzyfZGlW42Nmfi7J30vyp4PXr4/rgk01ya+XUq6XUp4YHHtTrfVrSTL4+MaZjY5Z+P4k\nt5P8k0GJ1i+UUr43rgvu9YEkHxl8PnfXhpDcQ7XWlwePQe5P8o4kf3a706Y7KmaplPLeJC/UWq/f\nfXibU10X/XSy1vr2JO9J8qFSyjtnPSBm7r4kb0/y87XWE0n+Q+bg8TnTM1jD8r4kvzrrsQxLSO6x\nwaOxTyX5oSSLpZT7Bl+6P8mtWY2LmTiZ5H2llC8l+Wg2yyx+Lq4LktRabw0+vpDN2sJ3JPl6KeXN\nSTL4+MLsRsgMPJ/k+Vrrbw9efzybodl1wZb3JPndWuvXB6/n7toQknumlHKklLI4+HwhyV/K5mKL\n30jyw4PTHk/yydmMkFmotZ6vtd5fa30wm4/HrtVafyyui94rpXxvKeU/3vo8yV9J8pkkT2fzmkhc\nG71Ta/03Sb5aSjk2OPRokj+I64JX/WheLbVI5vDasJlIz5RS/nw2C+YPZfMm6WO11n9YSvn+bM4g\nvi7JapL/qtb6rdmNlFkppbwryf9Ya32v64LBNfCJwcv7kvzzWutPl1Jen+RjSR5I8pUk76+1fmNG\nw2QGSilvy+ZC3+9O8sUkP5HB/1fiuui1Usprknw1yffXWv/d4Njc/ZshJAMAQINyCwAAaBCSAQCg\nQUgGAIAGIRkAABqEZAAAaBCSAQCgQUgGAIAGIRkAABr+f7vauJU1NKqHAAAAAElFTkSuQmCC\n", 65 | "text/plain": [ 66 | "" 67 | ] 68 | }, 69 | "metadata": {}, 70 | "output_type": "display_data" 71 | } 72 | ], 73 | "source": [ 74 | "# Making the imports\n", 75 | "import numpy as np\n", 76 | "import pandas as pd\n", 77 | "import matplotlib.pyplot as plt\n", 78 | "plt.rcParams['figure.figsize'] = (12.0, 9.0)\n", 79 | "\n", 80 | "# Preprocessing Input data\n", 81 | "data = pd.read_csv('data.csv')\n", 82 | "X = data.iloc[:, 0]\n", 83 | "Y = data.iloc[:, 1]\n", 84 | "plt.scatter(X, Y)\n", 85 | "plt.show()" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 6, 91 | "metadata": {}, 92 | "outputs": [ 93 | { 94 | "name": "stdout", 95 | "output_type": "stream", 96 | "text": [ 97 | "1.4796491688889395 0.10148121494753726\n" 98 | ] 99 | } 100 | ], 101 | "source": [ 102 | "# Building the model\n", 103 | "m = 0\n", 104 | "c = 0\n", 105 | "\n", 106 | "L = 0.0001 # The learning Rate\n", 107 | "epochs = 1000 # The number of iterations to perform gradient descent\n", 108 | "\n", 109 | "n = float(len(X)) # Number of elements in X\n", 110 | "\n", 111 | "# Performing Gradient Descent \n", 112 | "for i in range(epochs): \n", 113 | " Y_pred = m*X + c # The current predicted value of Y\n", 114 | " D_m = (-2/n) * sum(X * (Y - Y_pred)) # Derivative wrt m\n", 115 | " D_c = (-2/n) * sum(Y - Y_pred) # Derivative wrt c\n", 116 | " m = m - L * D_m # Update m\n", 117 | " c = c - L * D_c # Update c\n", 118 | " \n", 119 | "print (m, c)" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 7, 125 | "metadata": {}, 126 | "outputs": [ 127 | { 128 | "data": { 129 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAskAAAIMCAYAAAAHEDHqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8lfXZx/HPr0g1ats40ErUqq3FASo2tQOrPtWKWgfy\nuEd9rJaqOHCguLeguLdW62idVYwIKg7UujUaERHiHgQVHMFBlPV7/rgThZiQcc7Juc85n/fr1Rdw\nOMm5OCH14rq/9/ULMUYkSZIkfecH+S5AkiRJShubZEmSJKkZm2RJkiSpGZtkSZIkqRmbZEmSJKkZ\nm2RJkiSpGZtkSZIkqRmbZEmSJKkZm2RJkiSpGZtkSZIkqZnF8l0AwPLLLx9XW221fJchSZKkIvfC\nCy98HGPs0dbzUtEkr7baalRXV+e7DEmSJBW5EMK77XmecQtJkiSpGZtkSZIkqRmbZEmSJKkZm2RJ\nkiSpGZtkSZIkqRmbZEmSJKkZm2RJkiSpGZtkSZIkqZk2m+QQwj9DCNNDCK8s8NjIEMKUEMLLIYS7\nQgjlC/zesSGEN0IItSGE/rkqXJIkScqV9kySrwe2avbYg0DvGON6wGvAsQAhhHWA3YB1Gz/m8hBC\nt6xVK0mSJHWBNpvkGON/gU+bPfZAjHFu4y+fAVZu/PkOwK0xxm9ijG8DbwAbZbFeSZIkKeeykUn+\nK3Bf488rgPcX+L2pjY9JkiRJBSOjJjmEcDwwF7ip6aEWnhZb+dhBIYTqEEL1jBkzMilDkiRJyqpO\nN8khhH2AbYE9Y4xNjfBUYJUFnrYyMK2lj48xXh1jrIwxVvbo0aOzZUiSJElZ16kmOYSwFXAMsH2M\ncdYCvzUa2C2EsHgIYXVgTeC5zMuUJEmSus5ibT0hhHALsBmwfAhhKnAyyTaLxYEHQwgAz8QYD4gx\nTgoh3A68ShLDGBxjnJer4iVJkqRcCN8lJfKnsrIyVldX57sMSZIkFbkQwgsxxsq2ntfmJFmSJEmZ\nqaqpY+S4WqbVN9CzvIyh/XsxoK8LwNLMJlmSJCmHqmrqOHbURBrmJAnUuvoGjh01EcBGOcWysSdZ\nkiRJrRg5rvbbBrlJw5x5jBxXm6eK1B42yZIkSTk0rb6hQ48rHWySJUmScqhneVmHHlc62CRLkiTl\n0ND+vSjr3m2hx8q6d2No/155qkjt4Y17kiRJOdR0c57bLQqLTbIkSVKODehbYVNcYIxbSJIkSc3Y\nJEuSJEnN2CRLkiRJzdgkS5IkSc3YJEuSJEnN2CRLkiRJzdgkS5IkSc3YJEuSJEnN2CRLkiRJzdgk\nS5IkSc14LLUkSSpqVTV1jBxXy7T6BnqWlzG0fy+PiFabbJIlSVLRqqqp49hRE2mYMw+AuvoGjh01\nEcBGWYtkkyxJkorWyHG13zbITRrmzGPkuFqb5DaU+gTeJlmSJBWtafUNHXpcCSfw3rgnSZKKWM/y\nsg49rsSiJvClwiZZkiQVraH9e1HWvdtCj5V178bQ/r3yVFFhcAJvkyxJkorYgL4VDB/Yh4ryMgJQ\nUV7G8IF9SiYy0FlO4M0kS5KkIjegb4VNcQcN7d9roUwylN4E3iZZkiRJC2n6R4XbLSRJkqQFlPoE\n3kyyJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSM\nTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxN\nsiRJktSMTbIkSZLUTJtNcgjhnyGE6SGEVxZ4bOcQwqQQwvwQQmWz5x8bQngjhFAbQuifi6IlSZKk\nXGrPJPl6YKtmj70CDAT+u+CDIYR1gN2AdRs/5vIQQrfMy5QkSZK6TptNcozxv8CnzR6bHGOsbeHp\nOwC3xhi/iTG+DbwBbJSVSiVJkqQuku1McgXw/gK/ntr4mCRJklQwst0khxYeiy0+MYRBIYTqEEL1\njBkzslyGJEmS1HnZbpKnAqss8OuVgWktPTHGeHWMsTLGWNmjR48slyFJkiR1Xrab5NHAbiGExUMI\nqwNrAs9l+TUkSZKknFqsrSeEEG4BNgOWDyFMBU4muZHvEqAHMDaE8FKMsX+McVII4XbgVWAuMDjG\nOC9n1UuSJEk50GaTHGPcvZXfuquV558JnJlJUZIkSVI+eeKeJEmS1IxNsiRJktSMTbIkSZLUjE2y\nJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIk\nSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJ\nktSMTbIkSZLUjE2yJEmS1IxNsiRJktTMYvkuQJIkSaWhqqaOkeNqmVbfQM/yMob278WAvhX5LqtF\n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\n", 130 | "text/plain": [ 131 | "" 132 | ] 133 | }, 134 | "metadata": {}, 135 | "output_type": "display_data" 136 | } 137 | ], 138 | "source": [ 139 | "# Making predictions\n", 140 | "Y_pred = m*X + c\n", 141 | "\n", 142 | "plt.scatter(X, Y)\n", 143 | "plt.plot([min(X), max(X)], [min(Y_pred), max(Y_pred)], color='red') # predicted\n", 144 | "plt.show()" 145 | ] 146 | } 147 | ], 148 | "metadata": { 149 | "kernelspec": { 150 | "display_name": "Python 3", 151 | "language": "python", 152 | "name": "python3" 153 | }, 154 | "language_info": { 155 | "codemirror_mode": { 156 | "name": "ipython", 157 | "version": 3 158 | }, 159 | "file_extension": ".py", 160 | "mimetype": "text/x-python", 161 | "name": "python", 162 | "nbconvert_exporter": "python", 163 | "pygments_lexer": "ipython3", 164 | "version": "3.5.4" 165 | } 166 | }, 167 | "nbformat": 4, 168 | "nbformat_minor": 2 169 | } 170 | -------------------------------------------------------------------------------- /02 Linear Regression using Gradient Descent/Linear Regression using Gradient Descent.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Linear Regression using Gradient Descent \n", 8 | "![Gradeint descent](animation1.gif)\n", 9 | "## Linear Regression \n", 10 | "In statistics, linear regression is a linear approach to modelling the relationship between a dependent variable and one or more independent variables. \n", 11 | "Let **X** be the independent variable and **Y** be the dependent variable. We will define a linear relationship between these two variables as follows: \n", 12 | "\n", 13 | "\\\\[ Y = mX + c \\\\] \n", 14 | "![mxplusc](http://www.nabla.hr/SlopeInterceptLineEqu.gif)\n", 15 | "\n", 16 | "This is the equation for a line that you studied in high school. **m** is the slope of the line and **c** is the y intercept. Today we will use this equation to train our model with a given dataset and predict the value of **Y** for any given value of **X**. \n", 17 | " \n", 18 | "Our challenege today is to determine the value of **m** and **c**, such that the line corresponding to those values is the best fitting line or gives the minimum error. \n", 19 | "## Loss function \n", 20 | "The loss is the error in our predicted of **m** and **c**. Our goal is to minimize this error to obtain the most accurance value of **m** and **c**. \n", 21 | "We will use the Mean Squared Error function to calculate the loss. There are three steps in this function:\n", 22 | "1. Find the difference between the actual y and predicted y value(y = mx + c), for a given x. \n", 23 | "2. Square this difference.\n", 24 | "3. Find the mean of the squares for every value in X. \n", 25 | "\\\\[ E = \\frac{1}{n} \\sum_{i=0}^n (y_i - \\bar y_i)^2\\\\] \n", 26 | "\n", 27 | "Here $y_i$ is the actual value and $\\bar y_i$ is the predicted value. Lets substitue the value of $\\bar y_i$\n", 28 | "\\\\[ E = \\frac{1}{n} \\sum_{i=0}^n (y_i - (mx_i + c))^2\\\\]\n", 29 | "So we square the error and find the mean. hence the name Mean Squared Error. \n", 30 | "Now that we have defined the loss function, lets get into the interesting part - minimizing it and finding **m** and **c**\n", 31 | "\n", 32 | "## The Gradient Descent Algorithm \n", 33 | "Gradient descent is an iterative optimization algorithm to find the minimum of a function. Here that function is our Loss Function. \n", 34 | "**Understanding Gradient Descent** \n", 35 | "![valley](valley-illustration.jpg) \n", 36 | "\n", 37 | "Imagine a valley and a person with no sense of direction who wants to get to the bottom of the valley. He goes down the slope and takes large steps when the slope is steep and small steps when the slope is less steep. He decides his next position based on his current position and stops when he gets to the bottom of the valley which was his goal. \n", 38 | "Let's try applying gradient descent to **m** and **c** and approach it step by step: \n", 39 | "1. Initially let m = 0 and c = 0. Let L be our learning rate. This controls how much the value of **m** changes with each step. L could be a small value like 0.0001 for good accuracy. \n", 40 | "2. Calculate the partial derivative of the loss function with respect to m, and plug in the current values of x, y, m and c in it to obtain the derivative value **D**. \n", 41 | "\\\\[ D_m = \\frac{1}{n} \\sum_{i=0}^n 2(y_i - (mx_i + c))(-x_i) \\\\]\n", 42 | "\\\\[ D_m = \\frac{-2}{n} \\sum_{i=0}^n x_i(y_i - \\bar y_i) \\\\] \n", 43 | "$D_m$ is the value of the partial derivative with respect to **m**. Similarly lets find the partial derivative with respect to **c**, $D_c$ : \n", 44 | "\\\\[ D_c = \\frac{-2}{n} \\sum_{i=0}^n (y_i - \\bar y_i) \\\\]\n", 45 | "3. Now we update the current value of **m** and **c** using the following equation: \n", 46 | "\\\\[ m = m - L \\times D_m\\\\] \n", 47 | "\\\\[ c = c - L \\times D_c\\\\] \n", 48 | "4. We repeat this process untill our loss function is a very small value or ideally 0 (which means 0 error or 100% accuracy). The value of **m** and **c** that we are left with now will be the optimum values. \n", 49 | " \n", 50 | "Now going back to our analogy, **m** can be considered the current position of the person. **D** is equivalent to the steepness of the slope and **L** can be the speed with which he moves. Now the new value of **m** that we calculate using the above equation will be his next positon, and $L \\times D$ will be the size of the steps he will take. When the slope is more steep (**D** is more) he takes longer steps and when it is less steep (**D** is less), he takes smaller steps. Finally he arrives at the bottom of the valley which corresponds to our loss = 0. \n", 51 | "We repeat the same process above to find the value of **c** also. Now with the optimum value of **m** and **c** our model is ready to make predictions ! \n", 52 | "\n", 53 | "## Implementing the Model \n", 54 | "Now let's convert everything above into code and see our model in action !" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 2, 60 | "metadata": {}, 61 | "outputs": [ 62 | { 63 | "data": { 64 | "image/png": "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\nx3XBTlwb7GTurg01yQAA0GAmGQAAGoTkniml/EellN8ppfx+KeWzpZR/MDj+UCnlt0spny+l/Eop\n5btnPVamr5RyqJSyWkr5F4PXrgtSSvlSKeVGKeX3Sikrg2OvK6U8O7g2ni2lvHbW42S6SimLpZSP\nl1L+sJTyuVLKf+66oJRybPBvxdZ//28p5e/M47UhJPfPt5I8Umt9a5K3JXl3KeWHkvxMkp+ttT6c\n5MUkH5zhGJmdn0zyubteuy7Y8hdrrW+7q4XTuSTPDa6N5wav6Zd/lOTXaq0/kOSt2fy3w3XRc7XW\nm4N/K96W5C8k+WaST2QOrw0huWfqpv9v8PLw4L+a5JEkHx8cfyrJ6RkMjxkqpdyf5K8l+YXB6xLX\nBTt7LJvXROLa6J1Syp9J8s4kv5gktdZv11rX47rgXo8m+aNa65czh9eGkNxDg0fqv5fkhSTPJvmj\nJOu11pcGpzyfZGlW42Nmfi7J30vyp4PXr4/rgk01ya+XUq6XUp4YHHtTrfVrSTL4+MaZjY5Z+P4k\nt5P8k0GJ1i+UUr43rgvu9YEkHxl8PnfXhpDcQ7XWlwePQe5P8o4kf3a706Y7KmaplPLeJC/UWq/f\nfXibU10X/XSy1vr2JO9J8qFSyjtnPSBm7r4kb0/y87XWE0n+Q+bg8TnTM1jD8r4kvzrrsQxLSO6x\nwaOxTyX5oSSLpZT7Bl+6P8mtWY2LmTiZ5H2llC8l+Wg2yyx+Lq4LktRabw0+vpDN2sJ3JPl6KeXN\nSTL4+MLsRsgMPJ/k+Vrrbw9efzybodl1wZb3JPndWuvXB6/n7toQknumlHKklLI4+HwhyV/K5mKL\n30jyw4PTHk/yydmMkFmotZ6vtd5fa30wm4/HrtVafyyui94rpXxvKeU/3vo8yV9J8pkkT2fzmkhc\nG71Ta/03Sb5aSjk2OPRokj+I64JX/WheLbVI5vDasJlIz5RS/nw2C+YPZfMm6WO11n9YSvn+bM4g\nvi7JapL/qtb6rdmNlFkppbwryf9Ya32v64LBNfCJwcv7kvzzWutPl1Jen+RjSR5I8pUk76+1fmNG\nw2QGSilvy+ZC3+9O8sUkP5HB/1fiuui1Usprknw1yffXWv/d4Njc/ZshJAMAQINyCwAAaBCSAQCg\nQUgGAIAGIRkAABqEZAAAaBCSAQCgQUgGAIAGIRkAABr+f7vauJU1NKqHAAAAAElFTkSuQmCC\n", 65 | "text/plain": [ 66 | "" 67 | ] 68 | }, 69 | "metadata": {}, 70 | "output_type": "display_data" 71 | } 72 | ], 73 | "source": [ 74 | "# Making the imports\n", 75 | "import numpy as np\n", 76 | "import pandas as pd\n", 77 | "import matplotlib.pyplot as plt\n", 78 | "plt.rcParams['figure.figsize'] = (12.0, 9.0)\n", 79 | "\n", 80 | "# Preprocessing Input data\n", 81 | "data = pd.read_csv('data.csv')\n", 82 | "X = data.iloc[:, 0]\n", 83 | "Y = data.iloc[:, 1]\n", 84 | "plt.scatter(X, Y)\n", 85 | "plt.show()" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 6, 91 | "metadata": {}, 92 | "outputs": [ 93 | { 94 | "name": "stdout", 95 | "output_type": "stream", 96 | "text": [ 97 | "1.4796491688889395 0.10148121494753726\n" 98 | ] 99 | } 100 | ], 101 | "source": [ 102 | "# Building the model\n", 103 | "m = 0\n", 104 | "c = 0\n", 105 | "\n", 106 | "L = 0.0001 # The learning Rate\n", 107 | "epochs = 1000 # The number of iterations to perform gradient descent\n", 108 | "\n", 109 | "n = float(len(X)) # Number of elements in X\n", 110 | "\n", 111 | "# Performing Gradient Descent \n", 112 | "for i in range(epochs): \n", 113 | " Y_pred = m*X + c # The current predicted value of Y\n", 114 | " D_m = (-2/n) * sum(X * (Y - Y_pred)) # Derivative wrt m\n", 115 | " D_c = (-2/n) * sum(Y - Y_pred) # Derivative wrt c\n", 116 | " m = m - L * D_m # Update m\n", 117 | " c = c - L * D_c # Update c\n", 118 | " \n", 119 | "print (m, c)" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 7, 125 | "metadata": {}, 126 | "outputs": [ 127 | { 128 | "data": { 129 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAskAAAIMCAYAAAAHEDHqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8lfXZx/HPr0g1ats40ErUqq3FASo2tQOrPtWKWgfy\nuEd9rJaqOHCguLeguLdW62idVYwIKg7UujUaERHiHgQVHMFBlPV7/rgThZiQcc7Juc85n/fr1Rdw\nOMm5OCH14rq/9/ULMUYkSZIkfecH+S5AkiRJShubZEmSJKkZm2RJkiSpGZtkSZIkqRmbZEmSJKkZ\nm2RJkiSpGZtkSZIkqRmbZEmSJKkZm2RJkiSpGZtkSZIkqZnF8l0AwPLLLx9XW221fJchSZKkIvfC\nCy98HGPs0dbzUtEkr7baalRXV+e7DEmSJBW5EMK77XmecQtJkiSpGZtkSZIkqRmbZEmSJKkZm2RJ\nkiSpGZtkSZIkqRmbZEmSJKkZm2RJkiSpGZtkSZIkqZk2m+QQwj9DCNNDCK8s8NjIEMKUEMLLIYS7\nQgjlC/zesSGEN0IItSGE/rkqXJIkScqV9kySrwe2avbYg0DvGON6wGvAsQAhhHWA3YB1Gz/m8hBC\nt6xVK0mSJHWBNpvkGON/gU+bPfZAjHFu4y+fAVZu/PkOwK0xxm9ijG8DbwAbZbFeSZIkKeeykUn+\nK3Bf488rgPcX+L2pjY9JkiRJBSOjJjmEcDwwF7ip6aEWnhZb+dhBIYTqEEL1jBkzMilDkiRJyqpO\nN8khhH2AbYE9Y4xNjfBUYJUFnrYyMK2lj48xXh1jrIwxVvbo0aOzZUiSJElZ16kmOYSwFXAMsH2M\ncdYCvzUa2C2EsHgIYXVgTeC5zMuUJEmSus5ibT0hhHALsBmwfAhhKnAyyTaLxYEHQwgAz8QYD4gx\nTgoh3A68ShLDGBxjnJer4iVJkqRcCN8lJfKnsrIyVldX57sMSZIkFbkQwgsxxsq2ntfmJFmSJEmZ\nqaqpY+S4WqbVN9CzvIyh/XsxoK8LwNLMJlmSJCmHqmrqOHbURBrmJAnUuvoGjh01EcBGOcWysSdZ\nkiRJrRg5rvbbBrlJw5x5jBxXm6eK1B42yZIkSTk0rb6hQ48rHWySJUmScqhneVmHHlc62CRLkiTl\n0ND+vSjr3m2hx8q6d2No/155qkjt4Y17kiRJOdR0c57bLQqLTbIkSVKODehbYVNcYIxbSJIkSc3Y\nJEuSJEnN2CRLkiRJzdgkS5IkSc3YJEuSJEnN2CRLkiRJzdgkS5IkSc3YJEuSJEnN2CRLkiRJzdgk\nS5IkSc14LLUkSSpqVTV1jBxXy7T6BnqWlzG0fy+PiFabbJIlSVLRqqqp49hRE2mYMw+AuvoGjh01\nEcBGWYtkkyxJkorWyHG13zbITRrmzGPkuFqb5DaU+gTeJlmSJBWtafUNHXpcCSfw3rgnSZKKWM/y\nsg49rsSiJvClwiZZkiQVraH9e1HWvdtCj5V178bQ/r3yVFFhcAJvkyxJkorYgL4VDB/Yh4ryMgJQ\nUV7G8IF9SiYy0FlO4M0kS5KkIjegb4VNcQcN7d9roUwylN4E3iZZkiRJC2n6R4XbLSRJkqQFlPoE\n3kyyJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSM\nTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxN\nsiRJktSMTbIkSZLUTJtNcgjhnyGE6SGEVxZ4bOcQwqQQwvwQQmWz5x8bQngjhFAbQuifi6IlSZKk\nXGrPJPl6YKtmj70CDAT+u+CDIYR1gN2AdRs/5vIQQrfMy5QkSZK6TptNcozxv8CnzR6bHGOsbeHp\nOwC3xhi/iTG+DbwBbJSVSiVJkqQuku1McgXw/gK/ntr4mCRJklQwst0khxYeiy0+MYRBIYTqEEL1\njBkzslyGJEmS1HnZbpKnAqss8OuVgWktPTHGeHWMsTLGWNmjR48slyFJkiR1Xrab5NHAbiGExUMI\nqwNrAs9l+TUkSZKknFqsrSeEEG4BNgOWDyFMBU4muZHvEqAHMDaE8FKMsX+McVII4XbgVWAuMDjG\nOC9n1UuSJEk50GaTHGPcvZXfuquV558JnJlJUZIkSVI+eeKeJEmS1IxNsiRJktSMTbIkSZLUjE2y\nJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIk\nSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJktSMTbIkSZLUjE2yJEmS1IxNsiRJ\nktSMTbIkSZLUjE2yJEmS1IxNsiRJktTMYvkuQJIkSaWhqqaOkeNqmVbfQM/yMob278WAvhX5LqtF\n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\n", 130 | "text/plain": [ 131 | "" 132 | ] 133 | }, 134 | "metadata": {}, 135 | "output_type": "display_data" 136 | } 137 | ], 138 | "source": [ 139 | "# Making predictions\n", 140 | "Y_pred = m*X + c\n", 141 | "\n", 142 | "plt.scatter(X, Y)\n", 143 | "plt.plot([min(X), max(X)], [min(Y_pred), max(Y_pred)], color='red') # predicted\n", 144 | "plt.show()" 145 | ] 146 | } 147 | ], 148 | "metadata": { 149 | "kernelspec": { 150 | "display_name": "Python 3", 151 | "language": "python", 152 | "name": "python3" 153 | }, 154 | "language_info": { 155 | "codemirror_mode": { 156 | "name": "ipython", 157 | "version": 3 158 | }, 159 | "file_extension": ".py", 160 | "mimetype": "text/x-python", 161 | "name": "python", 162 | "nbconvert_exporter": "python", 163 | "pygments_lexer": "ipython3", 164 | "version": "3.5.4" 165 | } 166 | }, 167 | "nbformat": 4, 168 | "nbformat_minor": 2 169 | } 170 | -------------------------------------------------------------------------------- /02 Linear Regression using Gradient Descent/README.md: -------------------------------------------------------------------------------- 1 | # 02 Linear Regression using Gradient Descent -------------------------------------------------------------------------------- /02 Linear Regression using Gradient Descent/animation1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chasinginfinity/ml-from-scratch/24c0c0472d87f31c65cb9ad82ff0836afce924f1/02 Linear Regression using Gradient Descent/animation1.gif -------------------------------------------------------------------------------- /02 Linear Regression using Gradient Descent/data.csv: -------------------------------------------------------------------------------- 1 | 32.502345269453031,31.70700584656992 2 | 53.426804033275019,68.77759598163891 3 | 61.530358025636438,62.562382297945803 4 | 47.475639634786098,71.546632233567777 5 | 59.813207869512318,87.230925133687393 6 | 55.142188413943821,78.211518270799232 7 | 52.211796692214001,79.64197304980874 8 | 39.299566694317065,59.171489321869508 9 | 48.10504169176825,75.331242297063056 10 | 52.550014442733818,71.300879886850353 11 | 45.419730144973755,55.165677145959123 12 | 54.351634881228918,82.478846757497919 13 | 44.164049496773352,62.008923245725825 14 | 58.16847071685779,75.392870425994957 15 | 56.727208057096611,81.43619215887864 16 | 48.955888566093719,60.723602440673965 17 | 44.687196231480904,82.892503731453715 18 | 60.297326851333466,97.379896862166078 19 | 45.618643772955828,48.847153317355072 20 | 38.816817537445637,56.877213186268506 21 | 66.189816606752601,83.878564664602763 22 | 65.41605174513407,118.59121730252249 23 | 47.48120860786787,57.251819462268969 24 | 41.57564261748702,51.391744079832307 25 | 51.84518690563943,75.380651665312357 26 | 59.370822011089523,74.765564032151374 27 | 57.31000343834809,95.455052922574737 28 | 63.615561251453308,95.229366017555307 29 | 46.737619407976972,79.052406169565586 30 | 50.556760148547767,83.432071421323712 31 | 52.223996085553047,63.358790317497878 32 | 35.567830047746632,41.412885303700563 33 | 42.436476944055642,76.617341280074044 34 | 58.16454011019286,96.769566426108199 35 | 57.504447615341789,74.084130116602523 36 | 45.440530725319981,66.588144414228594 37 | 61.89622268029126,77.768482417793024 38 | 33.093831736163963,50.719588912312084 39 | 36.436009511386871,62.124570818071781 40 | 37.675654860850742,60.810246649902211 41 | 44.555608383275356,52.682983366387781 42 | 43.318282631865721,58.569824717692867 43 | 50.073145632289034,82.905981485070512 44 | 43.870612645218372,61.424709804339123 45 | 62.997480747553091,115.24415280079529 46 | 32.669043763467187,45.570588823376085 47 | 40.166899008703702,54.084054796223612 48 | 53.575077531673656,87.994452758110413 49 | 33.864214971778239,52.725494375900425 50 | 64.707138666121296,93.576118692658241 51 | 38.119824026822805,80.166275447370964 52 | 44.502538064645101,65.101711570560326 53 | 40.599538384552318,65.562301260400375 54 | 41.720676356341293,65.280886920822823 55 | 51.088634678336796,73.434641546324301 56 | 55.078095904923202,71.13972785861894 57 | 41.377726534895203,79.102829683549857 58 | 62.494697427269791,86.520538440347153 59 | 49.203887540826003,84.742697807826218 60 | 41.102685187349664,59.358850248624933 61 | 41.182016105169822,61.684037524833627 62 | 50.186389494880601,69.847604158249183 63 | 52.378446219236217,86.098291205774103 64 | 50.135485486286122,59.108839267699643 65 | 33.644706006191782,69.89968164362763 66 | 39.557901222906828,44.862490711164398 67 | 56.130388816875467,85.498067778840223 68 | 57.362052133238237,95.536686846467219 69 | 60.269214393997906,70.251934419771587 70 | 35.678093889410732,52.721734964774988 71 | 31.588116998132829,50.392670135079896 72 | 53.66093226167304,63.642398775657753 73 | 46.682228649471917,72.247251068662365 74 | 43.107820219102464,57.812512976181402 75 | 70.34607561504933,104.25710158543822 76 | 44.492855880854073,86.642020318822006 77 | 57.50453330326841,91.486778000110135 78 | 36.930076609191808,55.231660886212836 79 | 55.805733357942742,79.550436678507609 80 | 38.954769073377065,44.847124242467601 81 | 56.901214702247074,80.207523139682763 82 | 56.868900661384046,83.14274979204346 83 | 34.33312470421609,55.723489260543914 84 | 59.04974121466681,77.634182511677864 85 | 57.788223993230673,99.051414841748269 86 | 54.282328705967409,79.120646274680027 87 | 51.088719898979143,69.588897851118475 88 | 50.282836348230731,69.510503311494389 89 | 44.211741752090113,73.687564318317285 90 | 38.005488008060688,61.366904537240131 91 | 32.940479942618296,67.170655768995118 92 | 53.691639571070056,85.668203145001542 93 | 68.76573426962166,114.85387123391394 94 | 46.230966498310252,90.123572069967423 95 | 68.319360818255362,97.919821035242848 96 | 50.030174340312143,81.536990783015028 97 | 49.239765342753763,72.111832469615663 98 | 50.039575939875988,85.232007342325673 99 | 48.149858891028863,66.224957888054632 100 | 25.128484647772304,53.454394214850524 101 | -------------------------------------------------------------------------------- /02 Linear Regression using Gradient Descent/output1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chasinginfinity/ml-from-scratch/24c0c0472d87f31c65cb9ad82ff0836afce924f1/02 Linear Regression using Gradient Descent/output1.png -------------------------------------------------------------------------------- /02 Linear Regression using Gradient Descent/output2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chasinginfinity/ml-from-scratch/24c0c0472d87f31c65cb9ad82ff0836afce924f1/02 Linear Regression using Gradient Descent/output2.png -------------------------------------------------------------------------------- /02 Linear Regression using Gradient Descent/valley-illustration.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chasinginfinity/ml-from-scratch/24c0c0472d87f31c65cb9ad82ff0836afce924f1/02 Linear Regression using Gradient Descent/valley-illustration.jpg -------------------------------------------------------------------------------- /03 Linear Regression in 2 minutes/.ipynb_checkpoints/Linear Regression In 6 lines-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 2 6 | } 7 | -------------------------------------------------------------------------------- /03 Linear Regression in 2 minutes/Linear Regression In 6 lines.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Linear Regression in 6 lines of Python" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 6, 13 | "metadata": { 14 | "collapsed": true 15 | }, 16 | "outputs": [], 17 | "source": [ 18 | "import numpy as np\n", 19 | "import matplotlib.pyplot as plt\n", 20 | "import pandas as pd\n", 21 | "from sklearn.linear_model import LinearRegression" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 7, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "data = pd.read_csv('data.csv')\n", 31 | "X = data.iloc[:, 0].values.reshape(-1, 1) # values converts it into a numpy array\n", 32 | "Y = data.iloc[:, 1].values.reshape(-1, 1) # -1 means that calculate the dimension of rows, but have 1 column\n", 33 | "linear_regressor = LinearRegression()\n", 34 | "linear_regressor.fit(X, Y)\n", 35 | "Y_pred = linear_regressor.predict(X)" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 9, 41 | "metadata": {}, 42 | "outputs": [ 43 | { 44 | "data": { 45 | "image/png": "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\nRK5CYII=\n", 46 | "text/plain": [ 47 | "" 48 | ] 49 | }, 50 | "metadata": {}, 51 | "output_type": "display_data" 52 | } 53 | ], 54 | "source": [ 55 | "plt.scatter(X, Y)\n", 56 | "plt.plot(X, Y_pred, color='red')\n", 57 | "plt.show()" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 16, 63 | "metadata": {}, 64 | "outputs": [ 65 | { 66 | "data": { 67 | "image/png": "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\nWDcCAAAAAElFTkSuQmCC\n", 68 | "text/plain": [ 69 | "" 70 | ] 71 | }, 72 | "metadata": {}, 73 | "output_type": "display_data" 74 | } 75 | ], 76 | "source": [ 77 | "from sklearn.preprocessing import PolynomialFeatures\n", 78 | "pr = PolynomialFeatures(degree = 2)\n", 79 | "X_poly = pr.fit_transform(X)\n", 80 | "pr.fit(X_poly, Y)\n", 81 | "lin_reg = LinearRegression()\n", 82 | "lin_reg.fit(X_poly, Y)\n", 83 | "plt.scatter(X, Y)\n", 84 | "plt.scatter(X, lin_reg.predict(pr.fit_transform(X)))\n", 85 | "plt.show()" 86 | ] 87 | } 88 | ], 89 | "metadata": { 90 | "kernelspec": { 91 | "display_name": "Python 3", 92 | "language": "python", 93 | "name": "python3" 94 | }, 95 | "language_info": { 96 | "codemirror_mode": { 97 | "name": "ipython", 98 | "version": 3 99 | }, 100 | "file_extension": ".py", 101 | "mimetype": "text/x-python", 102 | "name": "python", 103 | "nbconvert_exporter": "python", 104 | "pygments_lexer": "ipython3", 105 | "version": "3.5.4" 106 | } 107 | }, 108 | "nbformat": 4, 109 | "nbformat_minor": 2 110 | } 111 | -------------------------------------------------------------------------------- /03 Linear Regression in 2 minutes/README.md: -------------------------------------------------------------------------------- 1 | # 02 Linear Regression in 2 minutes -------------------------------------------------------------------------------- /03 Linear Regression in 2 minutes/data.csv: -------------------------------------------------------------------------------- 1 | 32.502345269453031,31.70700584656992 2 | 53.426804033275019,68.77759598163891 3 | 61.530358025636438,62.562382297945803 4 | 47.475639634786098,71.546632233567777 5 | 59.813207869512318,87.230925133687393 6 | 55.142188413943821,78.211518270799232 7 | 52.211796692214001,79.64197304980874 8 | 39.299566694317065,59.171489321869508 9 | 48.10504169176825,75.331242297063056 10 | 52.550014442733818,71.300879886850353 11 | 45.419730144973755,55.165677145959123 12 | 54.351634881228918,82.478846757497919 13 | 44.164049496773352,62.008923245725825 14 | 58.16847071685779,75.392870425994957 15 | 56.727208057096611,81.43619215887864 16 | 48.955888566093719,60.723602440673965 17 | 44.687196231480904,82.892503731453715 18 | 60.297326851333466,97.379896862166078 19 | 45.618643772955828,48.847153317355072 20 | 38.816817537445637,56.877213186268506 21 | 66.189816606752601,83.878564664602763 22 | 65.41605174513407,118.59121730252249 23 | 47.48120860786787,57.251819462268969 24 | 41.57564261748702,51.391744079832307 25 | 51.84518690563943,75.380651665312357 26 | 59.370822011089523,74.765564032151374 27 | 57.31000343834809,95.455052922574737 28 | 63.615561251453308,95.229366017555307 29 | 46.737619407976972,79.052406169565586 30 | 50.556760148547767,83.432071421323712 31 | 52.223996085553047,63.358790317497878 32 | 35.567830047746632,41.412885303700563 33 | 42.436476944055642,76.617341280074044 34 | 58.16454011019286,96.769566426108199 35 | 57.504447615341789,74.084130116602523 36 | 45.440530725319981,66.588144414228594 37 | 61.89622268029126,77.768482417793024 38 | 33.093831736163963,50.719588912312084 39 | 36.436009511386871,62.124570818071781 40 | 37.675654860850742,60.810246649902211 41 | 44.555608383275356,52.682983366387781 42 | 43.318282631865721,58.569824717692867 43 | 50.073145632289034,82.905981485070512 44 | 43.870612645218372,61.424709804339123 45 | 62.997480747553091,115.24415280079529 46 | 32.669043763467187,45.570588823376085 47 | 40.166899008703702,54.084054796223612 48 | 53.575077531673656,87.994452758110413 49 | 33.864214971778239,52.725494375900425 50 | 64.707138666121296,93.576118692658241 51 | 38.119824026822805,80.166275447370964 52 | 44.502538064645101,65.101711570560326 53 | 40.599538384552318,65.562301260400375 54 | 41.720676356341293,65.280886920822823 55 | 51.088634678336796,73.434641546324301 56 | 55.078095904923202,71.13972785861894 57 | 41.377726534895203,79.102829683549857 58 | 62.494697427269791,86.520538440347153 59 | 49.203887540826003,84.742697807826218 60 | 41.102685187349664,59.358850248624933 61 | 41.182016105169822,61.684037524833627 62 | 50.186389494880601,69.847604158249183 63 | 52.378446219236217,86.098291205774103 64 | 50.135485486286122,59.108839267699643 65 | 33.644706006191782,69.89968164362763 66 | 39.557901222906828,44.862490711164398 67 | 56.130388816875467,85.498067778840223 68 | 57.362052133238237,95.536686846467219 69 | 60.269214393997906,70.251934419771587 70 | 35.678093889410732,52.721734964774988 71 | 31.588116998132829,50.392670135079896 72 | 53.66093226167304,63.642398775657753 73 | 46.682228649471917,72.247251068662365 74 | 43.107820219102464,57.812512976181402 75 | 70.34607561504933,104.25710158543822 76 | 44.492855880854073,86.642020318822006 77 | 57.50453330326841,91.486778000110135 78 | 36.930076609191808,55.231660886212836 79 | 55.805733357942742,79.550436678507609 80 | 38.954769073377065,44.847124242467601 81 | 56.901214702247074,80.207523139682763 82 | 56.868900661384046,83.14274979204346 83 | 34.33312470421609,55.723489260543914 84 | 59.04974121466681,77.634182511677864 85 | 57.788223993230673,99.051414841748269 86 | 54.282328705967409,79.120646274680027 87 | 51.088719898979143,69.588897851118475 88 | 50.282836348230731,69.510503311494389 89 | 44.211741752090113,73.687564318317285 90 | 38.005488008060688,61.366904537240131 91 | 32.940479942618296,67.170655768995118 92 | 53.691639571070056,85.668203145001542 93 | 68.76573426962166,114.85387123391394 94 | 46.230966498310252,90.123572069967423 95 | 68.319360818255362,97.919821035242848 96 | 50.030174340312143,81.536990783015028 97 | 49.239765342753763,72.111832469615663 98 | 50.039575939875988,85.232007342325673 99 | 48.149858891028863,66.224957888054632 100 | 25.128484647772304,53.454394214850524 101 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Machine Learning from Scratch 2 | This is the code repository for my [Machine Learning from Scratch youtube playlist](https://www.youtube.com/watch?v=4PHI11lX11I&list=PLP3ANEJKF1TzOz3hwOoRclgRFVi8A76k2) 3 | ## 01 Linear Regression using Least Squares 4 | [Check out the tutorial video](https://www.youtube.com/watch?v=kR6tBAq16ng&t=2s) 5 | ## 02 Linear Regression using Gradient Descent 6 | [Check out the tutorial video](https://www.youtube.com/watch?v=4PHI11lX11I&t=2s) 7 | [Check out the medium post](https://towardsdatascience.com/linear-regression-using-gradient-descent-97a6c8700931) 8 | ## 03 Linear Regression in 2 minutes 9 | [Check out the medium post](https://towardsdatascience.com/linear-regression-in-6-lines-of-python-5e1d0cd05b8d) 10 | --------------------------------------------------------------------------------