aboutsummaryrefslogtreecommitdiff
path: root/notebooks/linear-regression.ipynb
blob: 4d6a6cd4f2c3fb573012708df8bb1f619379aeb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Linear Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "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": 26,
   "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": 27,
   "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": 28,
   "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": 29,
   "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": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "386217.6189791666\n"
     ]
    }
   ],
   "source": [
    "xs = km\n",
    "ys = price\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": 31,
   "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"
   ]
  },
  {
   "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.\n",
    "\n",
    "Here is how we normalize:\n",
    "\n",
    "$$\n",
    "X_{normalized} = \\frac{X - X_{min}}{X_{max} - X_{min}}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "def normalize(x):\n",
    "    return (x - x.min()) / (x.max() - x.min())\n",
    "\n",
    "def denormalize(x, x_ref):\n",
    "    return x * (x_ref.max() - x_ref.min()) + x_ref.min()\n",
    "\n",
    "X = normalize(xs)\n",
    "Y = ys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD8CAYAAAB+UHOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAExpJREFUeJzt3X+spFV9x/H3FxZkrcpF2BK5UHcbV9pVoktuEENiWzAsYsNuqLVral0NKYm11l+hXdo/MFoDhtZfiUW3xRaNFSglsKlUQgFjQgp616UgUMotCOwV5eqytCmrAn77x5wLF7h3Z+7uzDPzzHm/ks3Oc55nZs65d3c+85zzPOdEZiJJqs9Bw66AJGk4DABJqpQBIEmVMgAkqVIGgCRVygCQpEoZAJJUKQNAkiplAEhSpVYMuwL7ctRRR+Xq1auHXQ1JapUdO3b8ODNXdTtupANg9erVTE9PD7saktQqEfFgL8fZBSRJlTIAJKlSBoAkVcoAkKRKGQCSVKmRvgpIi7tm5ywXX38vP9izl2MmVnLehuPZtH5y2NWS1DIGQMtcs3OW86++k71PPg3A7J69nH/1nQCGgKRlsQuoZS6+/t5nPvzn7X3yaS6+/t4h1UhSWxkALfODPXuXVS5JSzEAWuaYiZXLKpekpRgALXPehuNZecjBzylbecjBnLfh+CHVSFJb9RQAEfGhiLgrIr4XEV+LiMMiYk1E3BYRMxFxRUQcWo59UdmeKftXL3id80v5vRGxYTBNGm+b1k9y4dknMDmxkgAmJ1Zy4dknOAAsadm6XgUUEZPAnwDrMnNvRFwJbAbOBD6dmZdHxBeAc4BLyt+PZearImIz8Eng9yJiXXnea4BjgH+LiFdn5tOLvG1ftOlyyeXUddP6ya7taFPbJQ1Hr11AK4CVEbECeDHwCHAqcFXZfxmwqTzeWLYp+0+LiCjll2fmzzLzAWAGOOnAm7C4+cslZ/fsJXn2cslrds4O6i33W7/r2qa2SxqergGQmbPAXwEP0fngfxzYAezJzKfKYbuA+a+Xk8DD5blPleOPXFi+yHP6rk2XS/a7rm1qu6Th6RoAEXEEnW/va+h03fwScMagKhQR50bEdERMz83N7ffrtOlyyX7XtU1tlzQ8vXQBvRl4IDPnMvNJ4GrgFGCidAkBHAvM9y/MAscBlP2HAz9ZWL7Ic56Rmdsycyozp1at6rqgzZLadLlkv+vaprZLGp5eAuAh4OSIeHHpyz8NuBu4GXhbOWYLcG15vL1sU/bflJlZyjeXq4TWAGuBb/enGS/Upssl+13XNrVd0vB0vQooM2+LiKuA7wJPATuBbcDXgcsj4i9L2aXlKZcCX4mIGWA3nSt/yMy7yhVEd5fXed8grwCav+KlDVfC9LuubWq7pOGJzpfz0TQ1NZWuCSxJyxMROzJzqttx3gksSZUyACSpUgaAJFXKBWHGhFM/SFouA6BlFvugB1wlTNKyGQAtstRykIcdctCSUz8YAJKWYgC0yFJz/Dy/bJ5TP0jaFweBW2S5H+hO/SBpXwyAFlnqA31i5SFO/SBp2QyAFllqjp+PnvUaVwmTtGyOAbRItzl+/MCXtBwGQMv0shykJPXCLiBJqpQBIEmVMgAkqVIGgCRVykFgDZST1EmjywDQwCw1dxF4yao0CgyAhozyN+FB1W2puYucpE4aDQZAA0b5m/Ag67bU3EVOUieNBgeBG7Cvb8LDNsi6LTV3kZPUSaPBM4AGNPlNeLndOYOs23kbjn/O2QU8O0ndKHeJSbUwABpwzMRKZhf5QO33N+H96c4ZZN2WmrsIXMFMGgV2ATVgqVk8+z1d8/505wy6bpvWT3LL1lN54KK3csvWU9m0fnKku8SkmngG0IBus3j2y/505zRVt17q4+Cw1CwDoCFNzOK5v905Tc8w2lSXmKR9swtojCynO+eanbOcctFNrNn6dU656Cau2TnbVDUb6xKTtG+eAYyRXrtzhn1fwjC6nSS9UGTmsOuwpKmpqZyenh52NcbOKRfdtGgXzOTESm7ZeuoQaiSpnyJiR2ZOdTvOLqAKOQgrCQyAKnmHriRwDKDV9vdu2n3dodvP95E02gyAljqQgdzlDMIOe8BY0uAYAC11oFMt93rtv1M6S+PLMYCWamog1wFjaXwZAC3V1EDuUq93UESjN49J6j8DoKWaupt2sfcBeDqT86++0xCQWswAaKlN6ye58OwTmJxYSdC5ievCs0/oe7/8/PscHPGCfc7gKbWbg8At1tQkbpvWT/KhK25fdJ9jAVJ79XQGEBETEXFVRPxnRNwTEW+MiJdHxA0RcV/5+4hybETE5yJiJiLuiIgTF7zOlnL8fRGxZVCNUv9585g0fnrtAvos8I3M/DXgdcA9wFbgxsxcC9xYtgHeAqwtf84FLgGIiJcDFwBvAE4CLpgPDY2+bmMOw5xdtK38mWnYugZARBwOvAm4FCAzf56Ze4CNwGXlsMuATeXxRuDL2XErMBERrwA2ADdk5u7MfAy4ATijr63RwOxrzGH+ZrHZPXtJnr1ZzA+0pfkz0yjoZQxgDTAH/H1EvA7YAXwAODozHynH/BA4ujyeBB5e8PxdpWypcrXEUmMO3iy2fP7MNAp66QJaAZwIXJKZ64H/49nuHgCyM6d0X+aVjohzI2I6Iqbn5ub68ZIaMG8WWz5/ZhoFvQTALmBXZt5Wtq+iEwg/Kl07lL8fLftngeMWPP/YUrZU+XNk5rbMnMrMqVWrVi2nLRoSB4iXz5+ZRkHXAMjMHwIPR8T8HUanAXcD24H5K3m2ANeWx9uBd5WrgU4GHi9dRdcDp0fEEWXw9/RSppZzicflG+bPzMFnzev1PoD3A1+NiEOB+4H30AmPKyPiHOBB4O3l2OuAM4EZ4IlyLJm5OyI+DnynHPexzNzdl1ZoqFzicfmG9TNzdlct5JKQUkVcDrQOLgkp6QUcfNZCBoBUEQeftZABIFXEAXst5GRwUkUcsNdCBoBUmaZmkdXoswtIkiplAEhSpewC0li6Zues/dxSFwaAxo53u0q9sQtIY2dfUy1LepZnABo73u3af3apjSfPADR2vNu1v1y9bHwZABo73u3aX3apjS+7gDR2vNu1v+xSG18GgMaSd7v2zzETKxedQtoutfazC0jSPtmlNr48A5C0T3apjS8DQFJXdqmNJ7uAJKlSBoAkVcoAkKRKGQCSVCkDQJIqZQBIUqUMAEmqlAEgSZUyACSpUgaAJFXKAJCkSjkXkKSBcBnJ0WcASCOqzR+g88tIzq8kNr+MJNCaNtTALiBpBLV9HV6XkWwHA0AaQW3/AHUZyXYwAKQR1PYP0KWWi3QZydFiAEgjqO0foC4j2Q4GgDSC2v4Bumn9JBeefQKTEysJYHJiJReefYIDwCPGq4CkETQO6/C6jOToMwCkEeUHqAbNLiBJqlTPARARB0fEzoj4l7K9JiJui4iZiLgiIg4t5S8q2zNl/+oFr3F+Kb83Ijb0uzGSpN4t5wzgA8A9C7Y/CXw6M18FPAacU8rPAR4r5Z8uxxER64DNwGuAM4C/iYjnjnJJkhrTUwBExLHAW4G/K9sBnApcVQ65DNhUHm8s25T9p5XjNwKXZ+bPMvMBYAY4qR+NkCQtX69nAJ8B/hT4Rdk+EtiTmU+V7V3A/GjVJPAwQNn/eDn+mfJFniNJaljXAIiI3wYezcwdDdSHiDg3IqYjYnpubq6Jt5SkKvVyGegpwFkRcSZwGPAy4LPARESsKN/yjwXmZ6maBY4DdkXECuBw4CcLyuctfM4zMnMbsA1gamoq96dR0qho84yeGn9dzwAy8/zMPDYzV9MZxL0pM38fuBl4WzlsC3Bteby9bFP235SZWco3l6uE1gBrgW/3rSXSiGn7jJ4afwdyH8CfAR+OiBk6ffyXlvJLgSNL+YeBrQCZeRdwJXA38A3gfZn59AteVRoTbZ/RU+NvWXcCZ+Y3gW+Wx/ezyFU8mflT4HeXeP4ngE8st5JSG7V9Rk+NP6eCkAbkmImVzC7yYd+WGT3VnGGNFTkVhDQgbZ/RU80Y5liRASANiFMiqxfDHCuyC0gaIGf0VDfDHCvyDECShmiYq78ZAJI0RMMcK7ILSJKGaJirvxkAkjRkwxorsgtIkiplAEhSpQwASaqUASBJlTIAJKlSBoAkVcoAkKRKGQCSVCkDQJIqZQBIUqUMAEmqlAEgSZUyACSpUgaAJFXKAJCkShkAklQpA0CSKmUASFKlDABJqpQBIEmVMgAkqVIGgCRVygCQpEoZAJJUKQNAkiplAEhSpQwASaqUASBJlTIAJKlSBoAkVcoAkKRKdQ2AiDguIm6OiLsj4q6I+EApf3lE3BAR95W/jyjlERGfi4iZiLgjIk5c8FpbyvH3RcSWwTVLktRNL2cATwEfycx1wMnA+yJiHbAVuDEz1wI3lm2AtwBry59zgUugExjABcAbgJOAC+ZDQ5LUvK4BkJmPZOZ3y+P/Be4BJoGNwGXlsMuATeXxRuDL2XErMBERrwA2ADdk5u7MfAy4ATijr62RJPVsWWMAEbEaWA/cBhydmY+UXT8Eji6PJ4GHFzxtVylbqvz573FuRExHxPTc3NxyqidJWoaeAyAiXgL8M/DBzPyfhfsyM4HsR4Uyc1tmTmXm1KpVq/rxkpKkRfQUABFxCJ0P/69m5tWl+Eela4fy96OlfBY4bsHTjy1lS5VLkoagl6uAArgUuCczP7Vg13Zg/kqeLcC1C8rfVa4GOhl4vHQVXQ+cHhFHlMHf00uZJGkIVvRwzCnAHwB3RsTtpezPgYuAKyPiHOBB4O1l33XAmcAM8ATwHoDM3B0RHwe+U477WGbu7ksrJEnLFp3u+9E0NTWV09PTw66GJLVKROzIzKlux3knsCRVygCQpEoZAJJUKQNAkiplAEhSpQwASaqUASBJlTIAJKlSBoAkVcoAkKRKGQCSVCkDQJIqZQBIUqUMAEmqlAEgSZUyACSpUgaAJFXKAJCkShkAklQpA0CSKmUASFKlDABJqpQBIEmVMgAkqVIGgCRVygCQpEoZAJJUKQNAkiplAEhSpQwASaqUASBJlTIAJKlSBoAkVcoAkKRKGQCSVCkDQJIqZQBIUqUMAEmqVOMBEBFnRMS9ETETEVubfn9JUkejARARBwOfB94CrAPeERHrmqyDJKmj6TOAk4CZzLw/M38OXA5sbLgOkiRgRcPvNwk8vGB7F/CGgb7jBz8It98+0LeQpL54/evhM59p7O1GbhA4Is6NiOmImJ6bmxt2dSRpbDV9BjALHLdg+9hS9ozM3AZsA5iamsoDfscG01SS2qTpM4DvAGsjYk1EHApsBrY3XAdJEg2fAWTmUxHxx8D1wMHAlzLzribrIEnqaLoLiMy8Driu6feVJD3XyA0CS5KaYQBIUqUMAEmqlAEgSZUyACSpUpF54PdaDUpEzAEP9uGljgJ+3IfXaQvbO95qam9NbYX+tfeVmbmq20EjHQD9EhHTmTk17Ho0xfaOt5raW1Nbofn22gUkSZUyACSpUrUEwLZhV6Bhtne81dTemtoKDbe3ijEASdIL1XIGIEl6nrEKgG4LzkfEiyLiirL/tohY3Xwt+6eH9n44Iu6OiDsi4saIeOUw6tkv3dq74LjfiYiMiNZePdJLWyPi7eX3e1dE/GPTdeynHv4t/0pE3BwRO8u/5zOHUc9+iIgvRcSjEfG9JfZHRHyu/CzuiIgTB1aZzByLP3Sml/5v4FeBQ4H/ANY975g/Ar5QHm8Grhh2vQfc3t8CXlwev3fc21uOeynwLeBWYGrY9R7g73YtsBM4omz/8rDrPeD2bgPeWx6vA74/7HofQHvfBJwIfG+J/WcC/woEcDJw26DqMk5nAL0sOL8RuKw8vgo4LSKiwTr2U9f2ZubNmflE2byVzgpsbdXL7xfg48AngZ82Wbk+66Wtfwh8PjMfA8jMRxuuYz/10t4EXlYeHw78oMH69VVmfgvYvY9DNgJfzo5bgYmIeMUg6jJOAbDYgvOTSx2TmU8BjwNHNlK7/uulvQudQ+dbRVt1bW85VT4uM7/eZMUGoJff7auBV0fELRFxa0Sc0Vjt+q+X9n4UeGdE7KKznsj7m6naUCz3//Z+a3xBGDUvIt4JTAG/Mey6DEpEHAR8Cnj3kKvSlBV0uoF+k86Z3bci4oTM3DPUWg3OO4B/yMy/jog3Al+JiNdm5i+GXbE2G6czgK4Lzi88JiJW0DmV/Ekjteu/XtpLRLwZ+AvgrMz8WUN1G4Ru7X0p8FrgmxHxfTp9p9tbOhDcy+92F7A9M5/MzAeA/6ITCG3US3vPAa4EyMx/Bw6jM2/OOOrp/3Y/jFMA9LLg/HZgS3n8NuCmLKMuLdS1vRGxHvginQ//NvcRQ5f2ZubjmXlUZq7OzNV0xjzOyszp4VT3gPTyb/kaOt/+iYij6HQJ3d9kJfuol/Y+BJwGEBG/TicA5hqtZXO2A+8qVwOdDDyemY8M4o3Gpgsol1hwPiI+Bkxn5nbgUjqnjjN0BmE2D6/GB6bH9l4MvAT4pzLW/VBmnjW0Sh+AHts7Fnps6/XA6RFxN/A0cF5mtvJstsf2fgT424j4EJ0B4Xe39ctbRHyNTngfVcY0LgAOAcjML9AZ4zgTmAGeAN4zsLq09GcoSTpA49QFJElaBgNAkiplAEhSpQwASaqUASBJlTIAJKlSBoAkVcoAkKRK/T8qNH5e/0FcgQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "theta1, theta0 = 0, 0\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": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "error before:  20880519.291666664\n"
     ]
    }
   ],
   "source": [
    "print(\"error before: \", error_function(X, Y, theta1, theta0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-4656.591444722055 8008.439832646783\n",
      "error after:  222822.6225356367\n"
     ]
    }
   ],
   "source": [
    "alpha = 0.1\n",
    "iterations = 20000\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": 36,
   "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()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that our model is trained, if we want to make a prediction, we have to normalize the prediction the same way that we normalized our trainning data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7427.151470348072"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predict = 50_000\n",
    "predict = (predict - xs.min()) / (xs.max() - xs.min())\n",
    "h(predict, theta1, theta0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we plot this point with the original data. We can see that the prediction seems correct."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "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": [
    "plt.scatter(km, price)\n",
    "plt.scatter([50_000], h(predict, theta1, theta0), color='r')\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.8.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}