This commit is contained in:
Joachim Bach committed 2025-10-11 10:03:45 +02:00
1 parent c360807ab5
commit 8ec28596c0
2 files changed
+1125

No files matched your search

+202
View File
@@ -0,0 +1,202 @@
living_area,nb_rooms,rent_price
69,3,1810
95,3.5,2945
21,1.5,685
20,1,720
33,1.5,830
13,1,850
17,1,850
27,1,855
32,1,875
26,1.5,890
25,1,890
31,1,900
18,1,900
24,1,900
25,1,920
25,1,930
27,1,950
37,2,955
28,1,960
39,1,970
31,1,980
25,1,980
25,1,980
29,1.5,1000
38,1,1015
16,1,1040
20,1,1060
50,2,1100
37,1.5,1130
33,2,1160
40,1,1200
46,1,1210
45,2,1235
19,1,1250
45,2,1310
56,2,1315
60,2.5,1320
23,1,1350
49,2,1370
51,1.5,1385
48,2,1390
51,1,1400
41,2,1400
47,2,1410
45,2,1410
47,2,1415
37,1.5,1420
52,2,1445
45,2,1450
43,2,1450
26,1.5,1470
49,2,1480
49,2.5,1490
39,1,1530
60,2,1530
65,2.5,1580
60,3,1590
60,3,1590
47,1,1595
57,2,1630
65,2,1640
33,1,1650
56,2.5,1660
69,3,1690
61,2.5,1690
60,3,1690
47,1.5,1700
49,2,1700
60,2.5,1700
72,3,1715
70,2.5,1730
59,2,1750
30,1,1750
39,2,1750
25,1,1780
68,3,1790
63,3,1790
78,2,1790
50,2.5,1800
70,3,1810
75,2.5,1830
60,3,1840
70,3.5,1840
28,1,1850
62,2.5,1860
90,3,1870
78,3.5,1920
80,2,1930
72,3,1940
78,3.5,1950
62,2.5,1980
80,3.5,1990
80,3.5,2000
75,4,2030
68,3,2040
76,3.5,2060
81,3,2080
92,3,2085
75,3,2090
82,3.5,2130
80,3.5,2130
95,4,2145
85,4.5,2160
58,2.5,2160
33,1.5,2170
94,4.5,2190
100,3.5,2250
77,3.5,2270
80,3.5,2270
80,3.5,2290
92,3.5,2320
92,3.5,2335
99,4.5,2335
98,3,2358
90,4.5,2360
96,3,2380
92,4.5,2380
86,4.5,2390
73,3,2400
80,3.5,2400
96,3,2403
72,3.5,2410
91,4,2420
53,2.5,2425
60,2.5,2490
95,3.5,2500
97,4.5,2530
103,4.5,2550
105,5,2550
112,3.5,2550
110,4,2560
107,5,2570
65,1.5,2570
97,4.5,2590
110,4.5,2625
102,4.5,2635
101,4.5,2675
98,3.5,2700
109,4.5,2710
120,5,2710
107,4,2720
125,3.5,2725
120,4.5,2750
108,5,2805
130,5.5,2820
112,4.5,2825
121,4.5,2830
118,4.5,2840
107,4.5,2840
87,3.5,2850
114,4,2850
110,4.5,2870
118,4.5,2875
126,5.5,2900
112,4.5,2915
93,3,2945
80,3.5,2950
116,4.5,3050
145,4,3050
95,4.5,3080
100,3.5,3090
98,3.5,3090
94,4.5,3100
110,4.5,3150
100,4.5,3160
110,2,3180
109,4.5,3220
131,5,3300
133,5,3300
86,2.5,3350
84,3,3400
145,4,3450
113,4.5,3490
130,3.5,3500
108,3,3525
94,4.5,3570
136,4.5,3765
140,4.5,3765
125,3.5,3790
156,5.5,3930
91,3.5,3950
130,4.5,3965
102,4.5,4061
130,4.5,4200
142,5.5,4260
88,3.5,4310
178,6.5,4760
150,4.5,4800
185,5.5,4900
164,6.5,5160
214,5.5,5200
191,6,5229
156,5.5,5250
145,5,5383
175,5,5460
150,4.5,5500
129,5.5,5560
160,4,5775
201,5.5,6200
240,6.5,6700
145,5,7383
1 living_area nb_rooms rent_price
2 69 3 1810
3 95 3.5 2945
4 21 1.5 685
5 20 1 720
6 33 1.5 830
7 13 1 850
8 17 1 850
9 27 1 855
10 32 1 875
11 26 1.5 890
12 25 1 890
13 31 1 900
14 18 1 900
15 24 1 900
16 25 1 920
17 25 1 930
18 27 1 950
19 37 2 955
20 28 1 960
21 39 1 970
22 31 1 980
23 25 1 980
24 25 1 980
25 29 1.5 1000
26 38 1 1015
27 16 1 1040
28 20 1 1060
29 50 2 1100
30 37 1.5 1130
31 33 2 1160
32 40 1 1200
33 46 1 1210
34 45 2 1235
35 19 1 1250
36 45 2 1310
37 56 2 1315
38 60 2.5 1320
39 23 1 1350
40 49 2 1370
41 51 1.5 1385
42 48 2 1390
43 51 1 1400
44 41 2 1400
45 47 2 1410
46 45 2 1410
47 47 2 1415
48 37 1.5 1420
49 52 2 1445
50 45 2 1450
51 43 2 1450
52 26 1.5 1470
53 49 2 1480
54 49 2.5 1490
55 39 1 1530
56 60 2 1530
57 65 2.5 1580
58 60 3 1590
59 60 3 1590
60 47 1 1595
61 57 2 1630
62 65 2 1640
63 33 1 1650
64 56 2.5 1660
65 69 3 1690
66 61 2.5 1690
67 60 3 1690
68 47 1.5 1700
69 49 2 1700
70 60 2.5 1700
71 72 3 1715
72 70 2.5 1730
73 59 2 1750
74 30 1 1750
75 39 2 1750
76 25 1 1780
77 68 3 1790
78 63 3 1790
79 78 2 1790
80 50 2.5 1800
81 70 3 1810
82 75 2.5 1830
83 60 3 1840
84 70 3.5 1840
85 28 1 1850
86 62 2.5 1860
87 90 3 1870
88 78 3.5 1920
89 80 2 1930
90 72 3 1940
91 78 3.5 1950
92 62 2.5 1980
93 80 3.5 1990
94 80 3.5 2000
95 75 4 2030
96 68 3 2040
97 76 3.5 2060
98 81 3 2080
99 92 3 2085
100 75 3 2090
101 82 3.5 2130
102 80 3.5 2130
103 95 4 2145
104 85 4.5 2160
105 58 2.5 2160
106 33 1.5 2170
107 94 4.5 2190
108 100 3.5 2250
109 77 3.5 2270
110 80 3.5 2270
111 80 3.5 2290
112 92 3.5 2320
113 92 3.5 2335
114 99 4.5 2335
115 98 3 2358
116 90 4.5 2360
117 96 3 2380
118 92 4.5 2380
119 86 4.5 2390
120 73 3 2400
121 80 3.5 2400
122 96 3 2403
123 72 3.5 2410
124 91 4 2420
125 53 2.5 2425
126 60 2.5 2490
127 95 3.5 2500
128 97 4.5 2530
129 103 4.5 2550
130 105 5 2550
131 112 3.5 2550
132 110 4 2560
133 107 5 2570
134 65 1.5 2570
135 97 4.5 2590
136 110 4.5 2625
137 102 4.5 2635
138 101 4.5 2675
139 98 3.5 2700
140 109 4.5 2710
141 120 5 2710
142 107 4 2720
143 125 3.5 2725
144 120 4.5 2750
145 108 5 2805
146 130 5.5 2820
147 112 4.5 2825
148 121 4.5 2830
149 118 4.5 2840
150 107 4.5 2840
151 87 3.5 2850
152 114 4 2850
153 110 4.5 2870
154 118 4.5 2875
155 126 5.5 2900
156 112 4.5 2915
157 93 3 2945
158 80 3.5 2950
159 116 4.5 3050
160 145 4 3050
161 95 4.5 3080
162 100 3.5 3090
163 98 3.5 3090
164 94 4.5 3100
165 110 4.5 3150
166 100 4.5 3160
167 110 2 3180
168 109 4.5 3220
169 131 5 3300
170 133 5 3300
171 86 2.5 3350
172 84 3 3400
173 145 4 3450
174 113 4.5 3490
175 130 3.5 3500
176 108 3 3525
177 94 4.5 3570
178 136 4.5 3765
179 140 4.5 3765
180 125 3.5 3790
181 156 5.5 3930
182 91 3.5 3950
183 130 4.5 3965
184 102 4.5 4061
185 130 4.5 4200
186 142 5.5 4260
187 88 3.5 4310
188 178 6.5 4760
189 150 4.5 4800
190 185 5.5 4900
191 164 6.5 5160
192 214 5.5 5200
193 191 6 5229
194 156 5.5 5250
195 145 5 5383
196 175 5 5460
197 150 4.5 5500
198 129 5.5 5560
199 160 4 5775
200 201 5.5 6200
201 240 6.5 6700
202 145 5 7383
+923
View File
@@ -0,0 +1,923 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "18bdba27",
"metadata": {},
"source": [
"# PW4 - Linear Regression"
]
},
{
"cell_type": "markdown",
"id": "3629bfdf",
"metadata": {},
"source": [
"## Imports"
]
},
{
"cell_type": "code",
"execution_count": 141,
"id": "d6eb2aab",
"metadata": {},
"outputs": [],
"source": [
"import random\n",
"import pandas as pd\n",
"import numpy as np\n",
"from numpy.linalg import inv\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"id": "e69e5d68",
"metadata": {},
"source": [
"## Load data"
]
},
{
"cell_type": "markdown",
"id": "ba14bf9f",
"metadata": {},
"source": [
"Define the path to the file containing the data"
]
},
{
"cell_type": "code",
"execution_count": 142,
"id": "5f3f924f",
"metadata": {},
"outputs": [],
"source": [
"datafile = \"lausanne-appart.csv\""
]
},
{
"cell_type": "markdown",
"id": "adfab574",
"metadata": {},
"source": [
"Read the data"
]
},
{
"cell_type": "code",
"execution_count": 143,
"id": "5108e239",
"metadata": {},
"outputs": [],
"source": [
"dataset = pd.read_csv(datafile)"
]
},
{
"cell_type": "markdown",
"id": "5a97d4cc",
"metadata": {},
"source": [
"Display first rows"
]
},
{
"cell_type": "code",
"execution_count": 144,
"id": "34222aff",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>living_area</th>\n",
" <th>nb_rooms</th>\n",
" <th>rent_price</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>69</td>\n",
" <td>3.0</td>\n",
" <td>1810</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>95</td>\n",
" <td>3.5</td>\n",
" <td>2945</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>21</td>\n",
" <td>1.5</td>\n",
" <td>685</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>20</td>\n",
" <td>1.0</td>\n",
" <td>720</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>33</td>\n",
" <td>1.5</td>\n",
" <td>830</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" living_area nb_rooms rent_price\n",
"0 69 3.0 1810\n",
"1 95 3.5 2945\n",
"2 21 1.5 685\n",
"3 20 1.0 720\n",
"4 33 1.5 830"
]
},
"execution_count": 144,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dataset.head()"
]
},
{
"cell_type": "markdown",
"id": "2ec4b8eb",
"metadata": {},
"source": [
"## Exercise 1 - Visualize the data"
]
},
{
"cell_type": "markdown",
"id": "dbf6b9cf",
"metadata": {},
"source": [
"a) Plot a histogram to visualize the distribution of the renting price"
]
},
{
"cell_type": "code",
"execution_count": 145,
"id": "ad07d4cd",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Your code here\n",
"\n",
"plt.hist(dataset[\"rent_price\"])\n",
"plt.xlabel(\"Rent price\")\n",
"plt.ylabel(\"Count\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "602770ae",
"metadata": {},
"source": [
"b) Plot a histogram to visualize the distribution of the living area"
]
},
{
"cell_type": "code",
"execution_count": 146,
"id": "ac0c9f07",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAj0AAAGwCAYAAABCV9SaAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJEpJREFUeJzt3XtwVPX9//HXYkK4hN2QAEnQhARELnJREHFtpQqRgJQBia3StCKD1wZUUIupIuLYgdEWqBbFVi46FbG04A3EgWCCl0AhchGUjDBBqJBEpckmaC6Sz/eP/tifK0Fz2eTs8nk+ZnaGPefsyXtzJstzTs5uXMYYIwAAgHNcG6cHAAAAaA1EDwAAsALRAwAArED0AAAAKxA9AADACkQPAACwAtEDAACsEOH0AC2trq5Ox44dU6dOneRyuZweBwAANIAxRhUVFerevbvatAnOOZpzPnqOHTumpKQkp8cAAABNcPToUV1wwQVB2dc5Hz2dOnWS9L9vmtvtdngaAADQED6fT0lJSf7/x4PhnI+e07/ScrvdRA8AAGEmmJemcCEzAACwAtEDAACsQPQAAAArED0AAMAKRA8AALAC0QMAAKxA9AAAACsQPQAAwApEDwAAsALRAwAArED0AAAAKxA9AADACkQPAACwAtEDAACsQPQAAAArRDg9ANAQKQ+ud3qERju8YJzTIwAAvoMzPQAAwApEDwAAsALRAwAArED0AAAAKxA9AADACkQPAACwAtEDAACsQPQAAAArED0AAMAKRA8AALAC0QMAAKxA9AAAACsQPQAAwApEDwAAsALRAwAArED0AAAAKxA9AADACkQPAACwAtEDAACsQPQAAAArED0AAMAKRA8AALAC0QMAAKxA9AAAACsQPQAAwApEDwAAsALRAwAArBAy0bNgwQK5XC7de++9/mVVVVXKyspSXFycoqOjlZGRoZKSEueGBAAAYSskomfHjh167rnnNGjQoIDlM2fO1BtvvKE1a9YoLy9Px44d06RJkxyaEgAAhDPHo6eyslKZmZn629/+ps6dO/uXl5eXa9myZVq4cKFGjhypoUOHasWKFfrggw+0bds2BycGAADhyPHoycrK0rhx45SWlhawvKCgQLW1tQHL+/btq+TkZOXn5591f9XV1fL5fAE3AACACCe/+OrVq/Xhhx9qx44dZ6wrLi5W27ZtFRMT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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Your code here\n",
"\n",
"plt.hist(dataset[\"living_area\"])\n",
"plt.xlabel(\"Living Area\")\n",
"plt.ylabel(\"Count\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "b9a954dd",
"metadata": {},
"source": [
"c) Plot a scatter plot of renting price as a function of living area"
]
},
{
"cell_type": "code",
"execution_count": 147,
"id": "6d015af9",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Your code here\n",
"\n",
"plt.scatter(dataset[\"living_area\"], dataset[\"rent_price\"])\n",
"plt.xlabel(\"Living Area\")\n",
"plt.ylabel(\"Rent price\")\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "9c787c4b",
"metadata": {},
"source": [
"## Exercise 2 - Normal equations for linear regression"
]
},
{
"cell_type": "markdown",
"id": "859bbd89",
"metadata": {},
"source": [
"a) Implement the closed form solution to this problem using the following normal equation:"
]
},
{
"cell_type": "markdown",
"id": "cf1d5eda",
"metadata": {},
"source": [
"<div><div style=\"display: table-cell; width: 100%;\"><center>$\\theta = (X^{T}X)^{-1}X^{T}\\vec{y}$</center></div><div style=\"display: table-cell; width: 100%;\">$(3)$</div></div>"
]
},
{
"cell_type": "markdown",
"id": "c3c8e4c1",
"metadata": {},
"source": [
"Assuming $x$ is the living area and $y$ is the renting price. Use `numpy` for the vector operations. Plot the computed line on top of the scatter plot of exercise 1."
]
},
{
"cell_type": "code",
"execution_count": 148,
"id": "19ffbbd9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Theta : [240.07710727 26.33242457]\n"
]
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Your code here\n",
"X = dataset[\"living_area\"].to_frame()\n",
"X.insert(0, \"x0\", 1) # add the column full of ones at the start, this represents x0\n",
"X = np.array(X)\n",
"\n",
"y = np.array(dataset[\"rent_price\"])\n",
"\n",
"theta = np.linalg.inv(X.T @ X) @ X.T @ y \n",
"\n",
"print(f\"Theta : {theta}\")\n",
"\n",
"\n",
"plt.scatter(dataset[\"living_area\"], dataset[\"rent_price\"])\n",
"plt.xlabel(\"Living Area\")\n",
"plt.ylabel(\"Rent price\")\n",
"\n",
"y_regr = theta[0] + theta[1] * X[:,1]\n",
"plt.plot(X[:,1], y_regr, color='red', label='Regression line')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "ccc5d7b9",
"metadata": {},
"source": [
"b) Compute the overall cost value according to the following equation:"
]
},
{
"cell_type": "markdown",
"id": "31a38211",
"metadata": {},
"source": [
"<div><div style=\"display: table-cell; width: 100%;\"><center>$J(\\theta) = \\frac{1}{2N} \\sum_{n=1}^{N} (h_{\\theta}(\\mathbf{x}_{n}) - y_{n})^{2}$</center></div><div style=\"display: table-cell; width: 100%;\">$(2)$</div></div>"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "db65a2fa",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Overall cost : 138034.95779787414\n"
]
}
],
"source": [
"# Your code here\n",
"def cost_J(y_pred, y):\n",
" return (1/(2*len(y))) * np.sum((y_pred - y)**2)\n",
"\n",
"y_pred = X @ theta\n",
"# print(y_pred)\n",
"# print(X)\n",
"closed_form_cost = cost_J(y_pred, y)\n",
"print(f\" Overall cost : {closed_form_cost}\")"
]
},
{
"cell_type": "markdown",
"id": "38fed9aa",
"metadata": {},
"source": [
"## Exercise 3 - Gradient descent for linear regression"
]
},
{
"cell_type": "markdown",
"id": "d946ac48",
"metadata": {},
"source": [
"Implement the _full batch_ gradient descent algorithm for the previous problem. As seen in the\n",
"theory, the update rules are:"
]
},
{
"cell_type": "markdown",
"id": "9d1618d6",
"metadata": {},
"source": [
"<div><div style=\"display: table-cell; width: 100%;\"><center>$\\theta_{0} \\leftarrow \\theta_{0} - \\alpha \\frac{1}{N} \\sum_{n=1}^{N} (h_{\\theta}(\\mathbf{x}_{n}) - y_{n})$</center></div><div style=\"display: table-cell; width: 100%;\">$(6)$</div></div>"
]
},
{
"cell_type": "markdown",
"id": "6c0049d3",
"metadata": {},
"source": [
"<div><div style=\"display: table-cell; width: 100%;\"><center>$\\theta_{1} \\leftarrow \\theta_{1} - \\alpha \\frac{1}{N} \\sum_{n=1}^{N} (h_{\\theta}(\\mathbf{x}_{n}) - y_{n}) x_{n,1}$</center></div><div style=\"display: table-cell; width: 100%;\">$(7)$</div></div>"
]
},
{
"cell_type": "markdown",
"id": "3e0f8c42",
"metadata": {},
"source": [
"**Remark** You need to iterate several times over the training set. If you have problems of convergence, you need to use a smaller value of $\\alpha$. Values such as $0.000001$ are common."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9ca79a3d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Theta = [240.07710713 26.33242457]\n",
"Cost = 138034.95779787414\n"
]
}
],
"source": [
"# Your code here\n",
"\n",
"theta = np.zeros((2))\n",
"\n",
"\n",
"alpha = 0.0001 # i got the best results with those parameters\n",
"\n",
"max_iter = 1000000\n",
"costs = []\n",
"\n",
"for i in range(0, max_iter): # we could also use a delta on the cost function with a while to stop when the cost is not improving but we wanted to see the curve after x iterations\n",
" y_pred = X @ theta\n",
" theta[0] = theta[0] - alpha * (1/len(y)) * np.sum(y_pred - y)\n",
" theta[1] = theta[1] - alpha * (1/len(y)) * np.sum((y_pred - y) * X[:,1]) \n",
"\n",
" c = cost_J(y_pred, y) # to plot the costs over iters\n",
" costs.append(c)\n",
"\n",
"y_pred = X @ theta\n",
"print(f\"Theta = {theta}\")\n",
"print(f\"Cost = {cost_J(y_pred, y)}\")\n"
]
},
{
"cell_type": "markdown",
"id": "da5121b6",
"metadata": {},
"source": [
"a) Plot the cost value (Equation 2) as a function of the iterations. What do you observe?"
]
},
{
"cell_type": "code",
"execution_count": 167,
"id": "5a34ad43",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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1izNmjXLVlEAACB8sDYNAAAwijACAACMIowAAACjCCMAAMAowoikK1sqEAAAXAnCCAAAMIowAgAAjCKMAAAAo8I6jLA0DQAA5oV1GAEAAOYRRgAAgFGEEQAAYBRhBAAAGEUYAQAARhFGAACAUYQRAABgFGFEkiUWpwEAwBTCCAAAMIowAgAAjCKMAAAAo8I6jDhYnAYAAOPCOowAAADzCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCiCSLu8EDAGAMYQQAABhFGAEAAEYRRgAAgFGEEQAAYFRYhxGHWJwGAADTwjqMAAAA8wgjAADAKMIIAAAwijACAACMIowAAACjbIWRgoICjRkzRjExMYqLi1N2drYOHz7c6pjCwkI5HI4mW3R09BUVDQAAQoetMPLGG28oLy9Pb731lnbt2qXz58/r61//uurr61sd53K5dOLEicBWWVl5RUV3NJamAQDAnG52Om/fvr3J48LCQsXFxamsrExf/epXWxzncDiUkJDQvgoBAEBIu6JzRmpqaiRJsbGxrfarq6tT//795fF4NHPmTB08eLDV/g0NDfL5fE02AAAQmtodRvx+v+6//35NnDhRo0aNarHfsGHDtHbtWm3ZskUvvvii/H6/JkyYoI8++qjFMQUFBXK73YHN4/G0t0wAAHCVa3cYycvL04EDB1RUVNRqv4yMDOXk5Cg1NVWTJ0/Wq6++qq985St67rnnWhyTn5+vmpqawHb8+PH2lgkAAK5yts4ZuWTBggXaunWrdu/erb59+9oa2717d6WlpenIkSMt9nE6nXI6ne0pzRYHS9MAAGCcrSMjlmVpwYIF2rRpk15//XUNHDjQ9g4bGxu1f/9+JSYm2h4LAABCj60jI3l5edqwYYO2bNmimJgYeb1eSZLb7VaPHj0kSTk5OerTp48KCgokSY8++qjGjx+vIUOG6OzZs3rqqadUWVmpefPmdfBbAQAAwchWGFm1apUkacqUKU3a161bp+9+97uSpKqqKkVEfHHA5dNPP9X8+fPl9XrVq1cvpaena+/evRo5cuSVVQ4AAEKCrTBiWV9+e7CSkpImj5955hk988wztooCAADhg7VpAACAUYQRte2IDwAA6ByEEQAAYBRhBAAAGEUYAQAARhFGAACAUYQRAABgVFiHEdamAQDAvLAOIwAAwDzCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwK6zDiEIvTAABgWliHEQAAYB5hBAAAGEUYAQAARhFGAACAUYQRAABgFGFEkmWZrgAAgPBFGAEAAEYRRgAAgFGEEQAAYBRhBAAAGEUYAQAARoV1GHGwNA0Line truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Your code here\n",
"plt.plot(range(0, len(costs)), costs)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "63917be0",
"metadata": {},
"source": [
"In this scenario, we can clearly observe a plateau of the cost function. This means that we have reached a local minimum while trying to minimise the cost."
]
},
{
"cell_type": "markdown",
"id": "c5903f37",
"metadata": {},
"source": [
"b) Imagine a stopping criterion, i.e. when do we stop iterating on the training set?"
]
},
{
"cell_type": "markdown",
"id": "93905b85",
"metadata": {},
"source": [
"The stopping criterion can be a small delta between each calculations of the cost. Like if the cost did not change of at least delta, this means we are in a plateau and should stop."
]
},
{
"cell_type": "markdown",
"id": "7667bec1",
"metadata": {},
"source": [
"c) Plot the computed line $h_{\\theta}(\\mathbf{x})$ on top of the scatter plot of exercise 1."
]
},
{
"cell_type": "code",
"execution_count": 152,
"id": "e80c04b3",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(dataset[\"living_area\"], dataset[\"rent_price\"])\n",
"plt.xlabel(\"Living Area\")\n",
"plt.ylabel(\"Rent price\")\n",
"\n",
"y_regr = theta[0] + theta[1] * X[:,1]\n",
"plt.plot(X[:,1], y_regr, color='red', label='Regression line')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "d1fdf27b",
"metadata": {},
"source": [
"d) Compute the final cost value according to Equation 2 and compare it to the one of exercise 2. What can you conclude?"
]
},
{
"cell_type": "code",
"execution_count": 153,
"id": "5e594f32",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The best cost value is 138034.95779787409, the exercice 2 cost value is 138034.95779787414\n"
]
}
],
"source": [
"# Your code here\n",
"\n",
"print(f\"The best cost value is {best_cost}, the exercice 2 cost value is {closed_form_cost}\")"
]
},
{
"cell_type": "markdown",
"id": "cd10b91b",
"metadata": {},
"source": [
"We took some time to experiment with the alpha and max_iter values to try to get the best possible result. It seems that the closed form formula is the best one but we can get really close by tweaking those two values. "
]
},
{
"cell_type": "markdown",
"id": "54727ff1",
"metadata": {},
"source": [
"## Exercise 4 - Stochastic gradient descent for linear regression"
]
},
{
"cell_type": "markdown",
"id": "32a00957",
"metadata": {},
"source": [
"Implement the stochastic gradient descent algorithm for the previous problem. As seen in the theory, the update rules are:"
]
},
{
"cell_type": "markdown",
"id": "636920d2",
"metadata": {},
"source": [
"<div><div style=\"display: table-cell; width: 100%;\"><center>$\\theta_{i} \\leftarrow \\theta_{i} - \\alpha (h_{\\theta}(\\mathbf{x}_{n}) - y_{n}) x_{n,i}$</center></div><div style=\"display: table-cell; width: 100%;\">$(8)$</div></div>"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3f693388",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"144176.78676766725\n",
"[ 0.32486065 28.59143527]\n"
]
}
],
"source": [
"# Your code here\n",
"import random\n",
"theta = np.zeros((2))\n",
"\n",
"\n",
"alpha = 0.000001 # i got the best results with those parameters\n",
"\n",
"max_iter = 1000\n",
"costs = []\n",
"\n",
"best_cost = np.inf\n",
"\n",
"for i in range(0, max_iter): # we could also use a delta on the cost function with a while to stop when the cost is not improving but we wanted to see the curve after x iterations\n",
" rand = int(random.random() * X.shape[0])\n",
" y_pred_stoch = X[rand] @ theta\n",
" theta[0] = theta[0] - alpha * (y_pred_stoch - y[rand])\n",
" theta[1] = theta[1] - alpha * (y_pred_stoch - y[rand]) * X[rand,1]\n",
"\n",
" y_pred = X @ theta\n",
" costs.append(cost_J(y_pred, y))\n",
"\n",
"\n",
"y_pred = X @ theta\n",
"print(cost_J(y_pred, y))\n",
"print(theta)"
]
},
{
"cell_type": "code",
"execution_count": 178,
"id": "edbc5a14",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(range(0, len(costs)), costs)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "cb73d7c1",
"metadata": {},
"source": [
"a) Plot the computed line $h_{\\theta}(\\mathbf{x})$ on top of the scatter plot of exercise 1."
]
},
{
"cell_type": "code",
"execution_count": 179,
"id": "f73c6af3",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Your code here\n",
"plt.scatter(dataset[\"living_area\"], dataset[\"rent_price\"])\n",
"plt.xlabel(\"Living Area\")\n",
"plt.ylabel(\"Rent price\")\n",
"\n",
"y_regr = theta[0] + theta[1] * X[:,1]\n",
"plt.plot(X[:,1], y_regr, color='red', label='Regression line')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "16e1eec7",
"metadata": {},
"source": [
"b) How many samples do you need to visit for reaching the convergence?"
]
},
{
"cell_type": "markdown",
"id": "fd7870eb",
"metadata": {},
"source": [
"The biggest improvements are made before the first 300ish iterations but smaller improvements still occur after that. If we were very limited in cpu time, we would tell that the convergence vas reached around 300 samples"
]
},
{
"cell_type": "markdown",
"id": "c185d7bc",
"metadata": {},
"source": [
"c) What kind of stopping criterion could we use here?"
]
},
{
"cell_type": "markdown",
"id": "235f3ac0",
"metadata": {},
"source": [
"We would use the delta of the global cost function. When we compute the cost function, we can stop the iterations when the result is not improving more than a set delta."
]
},
{
"cell_type": "markdown",
"id": "5e7ce003",
"metadata": {},
"source": [
"d) Compute the final cost value according to Equation 2 and compare it to the one of exercise 2 and 3. What can you conclude?"
]
},
{
"cell_type": "code",
"execution_count": 180,
"id": "dbcb6f22",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"144176.78676766725\n",
"[ 0.32486065 28.59143527]\n"
]
}
],
"source": [
"# Your code here\n",
"y_pred = X @ theta\n",
"print(cost_J(y_pred, y))\n",
"print(theta)"
]
},
{
"cell_type": "markdown",
"id": "27a8e7fd",
"metadata": {},
"source": [
"The result is really close to both of the other methods but the stochastic is way faster because we dont loop trough the whole dataset for each update. The stochastic might have a slightly worse final result because it is harder to find the exact perfect values but its speed and efficency compensates this."
]
},
{
"cell_type": "markdown",
"id": "a8a85676",
"metadata": {},
"source": [
"## Exercise 5 - Review questions"
]
},
{
"cell_type": "markdown",
"id": "84f82d3d",
"metadata": {},
"source": [
"a) The linear regression has a mathematical _closed form_ solution. Then, in which conditions would we prefer a gradient descent algorithm to compute the regression model?"
]
},
{
"cell_type": "markdown",
"id": "eecbe019",
"metadata": {},
"source": [
"_Your answer here_"
]
},
{
"cell_type": "markdown",
"id": "3696b258",
"metadata": {},
"source": [
"b) Outliers in a data set can be defined as values that are out of the \"usual\" range in comparison with other values. They typically come from noise or anomalies in the data capturing process. What is the impact of an outlier in the stochastic gradient descent process? What if we have many outliers? _Hint_: look at the equation of the MSE, and to the equation of the update rule."
]
},
{
"cell_type": "markdown",
"id": "4873219d",
"metadata": {},
"source": [
"_Your answer here_"
]
},
{
"cell_type": "markdown",
"id": "22dce221",
"metadata": {},
"source": [
"c) In the case of stochastic gradient descent, what is the danger of having a too large or too small $\\alpha$ value? Could you think of a better (more advanced) strategy as the one stated in Slide 36?"
]
},
{
"cell_type": "markdown",
"id": "d1536554",
"metadata": {},
"source": [
"_Your answer here_"
]
},
{
"cell_type": "markdown",
"id": "07bdad8b",
"metadata": {},
"source": [
"d) Let's assume we expect that the target variable $y$ has a dependency to the square and to the cube of one of the feature $x_d$ in our multi-variable training set $(x_1, \\ldots, x_d, \\ldots, x_D)$. How would you proceed? Do we need to take precautions in terms of numerical stability?"
]
},
{
"cell_type": "markdown",
"id": "d4f242c5",
"metadata": {},
"source": [
"_Your answer here_"
]
},
{
"cell_type": "markdown",
"id": "b7cf619b",
"metadata": {},
"source": [
"e) _Advanced_. Could we use a descent algorithm without computing the gradient? If yes, give a pseudo code of the algorithm to find $(\\theta_{0}, \\theta_{1})$ using a linear regression $h_{\\theta}(x) = \\theta_0 + \\theta_1 x$."
]
},
{
"cell_type": "markdown",
"id": "89317af1",
"metadata": {},
"source": [
"_Your answer here_"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2b0997fa",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"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.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}