427 lines
61 KiB
Plaintext
427 lines
61 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# On importe les librairies\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We want to estimate parameters of a simple linear regression (y i = wx i + b) by closed-form and GD. \n",
|
||
"\n",
|
||
"The loss function is defined on a data point by l(ŷ i , y i ) = (ŷ i − y i )² where the prediction is given by ŷ i = ŵx + b̂. The\n",
|
||
"P N\n",
|
||
"optimization problem we want to solve is min i=1 l(ŷ i , y i ). \n",
|
||
"\n",
|
||
"We assume the following data generation process:\n",
|
||
"w,b\n",
|
||
"Y ∼ wX + b + \\eta where X ∼ U[20; 40] and \\eta ∼ N (0, 1).\n",
|
||
"\n",
|
||
"# 1\n",
|
||
"\n",
|
||
"Generate N data points (x i , y i ) using the data generation process given above and store them into x vs\n",
|
||
"N\n",
|
||
"y. Note: N = 100 and start by first generating {x i } N\n",
|
||
"1 and then {y i } 1 . Do not forget to add noise!\n",
|
||
"\n",
|
||
"D'abord on va générer les x"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# On génère les x\n",
|
||
"list_x = np.random.uniform(20, 40, 100).tolist()\n",
|
||
"\n",
|
||
"# Pis les y\n",
|
||
"\n",
|
||
"def y(x):\n",
|
||
" w = 1.5\n",
|
||
" b = 5\n",
|
||
" return w * x + b + np.random.normal(0,1)\n",
|
||
"\n",
|
||
"list_y = [y(x) for x in list_x ]\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# 2\n",
|
||
"Plot the data points x vs y."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<matplotlib.collections.PathCollection at 0x7ff1544421d0>"
|
||
]
|
||
},
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"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(list_x, list_y, s=6)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# 3\n",
|
||
"Estimate parameters of the simple linear regression by closed-form. Note: store these values into w_cf\n",
|
||
"and b_cf."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# D'abord, on doit transposer nos donner pour pouvoir les utiliser dans le calcul matriciel\n",
|
||
"# Donc on génère une liste de 1 qu'on va nsuit coller à notre liste de x\n",
|
||
"\n",
|
||
"list_1 = np.ones(len(list_x))\n",
|
||
"\n",
|
||
"\n",
|
||
"# Pis on colle les deux\n",
|
||
"\n",
|
||
"X = np.stack((list_1, list_x), axis=1)\n",
|
||
"\n",
|
||
"# Enfin, on fait notre calcul de ouf\n",
|
||
"\n",
|
||
"def B(y): \n",
|
||
" X_T = np.transpose(X)\n",
|
||
" prod = np.dot(X_T, X)\n",
|
||
" inv = np.linalg.inv(prod)\n",
|
||
" return np.dot(inv, np.dot(X_T,y))\n",
|
||
"\n",
|
||
"Y = np.asarray(list_y)\n",
|
||
"b_cf, w_cf = B(Y)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# 8\n",
|
||
"Create a function loss(x_i, y_i, w, b) which is computing the regression loss on the full dataset.\n",
|
||
"What is the value of loss([1], [3], 1, 2) ?"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0"
|
||
]
|
||
},
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# On détermine la fonction de coût\n",
|
||
"\n",
|
||
"def loss(x_i, y_i, w, b):\n",
|
||
" return ((w * x_i) + b - y_i)**2\n",
|
||
"\n",
|
||
"loss(1, 3, 1, 2)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"8"
|
||
]
|
||
},
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"def dl_dw(xi, yi, w, b):\n",
|
||
" return -2 * xi * ( yi - (w * xi + b))\n",
|
||
"\n",
|
||
"dl_dw(4, -1, 0, 0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"2"
|
||
]
|
||
},
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"def dl_db(xi, yi, w, b):\n",
|
||
" return -2 * ( yi - (w * xi + b))\n",
|
||
"\n",
|
||
"dl_db(4, -1, 0, 0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# 11\n",
|
||
"Implement a function update_w_and_b(x_i, y_i, w, b, lr) which is updating w and b according to the gradient compute on the full data points. What is the output of the following command of update_w_and_b([0], [3], 5, 3, 0.1) and why?"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(5.0, 3.0)"
|
||
]
|
||
},
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"def update_w_and_b(x, y, w, b, lr):\n",
|
||
" grad_w = 0\n",
|
||
" grad_b = 0\n",
|
||
" \n",
|
||
" N = len(y)\n",
|
||
" \n",
|
||
" for t in range(N):\n",
|
||
" grad_w += dl_dw(x[t], y[t], w, b)\n",
|
||
" grad_b += dl_db(x[t], y[t], w, b)\n",
|
||
" \n",
|
||
" # update\n",
|
||
" w -= (1 / float(N)) * grad_w * lr\n",
|
||
" b -= (1 / float(N)) * grad_b * lr\n",
|
||
" \n",
|
||
" return w, b\n",
|
||
" \n",
|
||
"update_w_and_b([0], [3], 5, 3, 0.1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# 12 \n",
|
||
"Estimate parameters of the simple linear regression by gradient descent from a random initialization of\n",
|
||
"w and b and with a leanring rate equals to 0.001. Note: store these values into w_gd and b_gd."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"w_gd, b_gd = 2., 4.\n",
|
||
"\n",
|
||
"for i in range(5000):\n",
|
||
" # update w and b\n",
|
||
" w_gd, b_gd = update_w_and_b(list_x, list_y, w_gd, b_gd, 0.001)\n",
|
||
" "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 61,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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QaG3ouWe09LS6NWrF+3bt6dNmzasWrWqYL033niDFi1acPfdd3Pw4MGC15944omCekbbt2+nW7dudOjQgb59+3L27FkAunfvzoQJE+jUqRPNmzdn48aNZGVl8corr7B06VJiY2NZunRpid8lNjaWV155hQ8++ACA5ORkHnzwQTp27EjHjh0LSl9/9913xMbGEhsbS7t27UhNTQXg7bffpk2bNrRt25aJEycCcOTIEfr160eHDh3o0qULBw4cKPhO48eP54477qBJkyYF32/ixIls3LiR2NhY3n///Qr+VIRwHe500xrTWgRKqRZA4SNQE+AV4N/W18OB48BDWuvLldrY9hfhsp3rUNeIhQ7FV7Pbu3dvqeUeCpd7zsnJYcWKFYSGhnLhwgU6d+7MwIED2bFjB0uWLOGnn34iJyeH9u3b31TeOjs7m+eff55Vq1ZRp04dli5dyssvv8zcuXMBo8WxdetWVq9ezd/+9jfWrl3LpEmTSExMLDi4l6Z9+/a88847ALzwwgv8/ve/56677uLkyZP07duX/fv3M3nyZOLj47nzzjtJS0sjMDCQr776ipUrV7JlyxaqVKnCpUuXABg9ejTTp08nMjKSLVu2MHbsWL799lsAzp49y6ZNmzhw4AADBw5kyJAhvPnmm0yePNnpXVRCFJaelcuR5DSa1gku99m8O920xrREoLU+CMQCKKUswGlgBTARWKe1flMpNdH6fIJZcTjKuHHj2LRpE/7+/mzbtg24sdyz1pq//OUvfP/99/j4+HD69GnOnz/Pxo0beeCBB6hSpQpgVBIt6uDBg+zZs4fevXsDRuXR/LLRAIMHDwagQ4cOHD9+vELxFy41snbtWvbt21fw/OrVq6SmpnLnnXfyhz/8gUceeYTBgwfToEED1q5dy8iRIwvir1mzJmlpafz4448MHTq04DMyMzMLHt9///34+PjQunVrp97RTYiSVLZrJ/+mNRVNJI7kqDGCXsARrfUJpdQgoLv19QXABiqbCEo4czdLVFQUn3zyScHz+Ph4Lly4QFzc9bIehcs9L1q0iOTkZLZv346fnx/h4eFkZGQA2CwzXZjWmqioKDZv3mzz/fxichaLpcJlo3/66aeCWj55eXls3ryZoKCgG5aZOHEiAwYMYPXq1XTu3Jm1a9eitb4p/ry8PKpXr87OYu4WVLj4nTvUuhLeyVbX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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 0 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Affichage des résultats des deux techniques\n",
|
||
"\n",
|
||
"min_x, max_x = 20, 40\n",
|
||
"list_x = np.random.uniform(min_x, max_x, 100).tolist()\n",
|
||
"list_x.sort()\n",
|
||
"f = lambda x_i: 1.5 * x_i + 5\n",
|
||
"SCALE = 5\n",
|
||
"list_y = [f(x) + np.random.normal(0, SCALE, 1)[0] for x in list_x]\n",
|
||
"\n",
|
||
"plt.scatter(list_x, list_y, s=6, label='original data')\n",
|
||
"plt.plot([min_x, max_x], [b_cf + w_cf * min_x, b_cf + w_cf * max_x],\n",
|
||
" '-', markersize=3, color='blue', label='Closed-form')\n",
|
||
"plt.plot([min_x, max_x], [b_gd + w_gd * min_x, b_gd + w_gd * max_x],\n",
|
||
"'-', markersize=3, color='orange', label='Gradient Descent')\n",
|
||
"plt.xlabel('x')\n",
|
||
"plt.ylabel('y')\n",
|
||
"plt.legend(loc=0)\n",
|
||
"plt.show()\n",
|
||
"plt.clf()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 62,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Maintenant on voit comment régler ça en 3 lignes\n",
|
||
"\n",
|
||
"from sklearn.linear_model import LinearRegression\n",
|
||
"\n",
|
||
"\n",
|
||
"model = LinearRegression().fit(np.asarray(list_x).reshape(-1, 1), list_y)\n",
|
||
"w_sklearn, b_sklearn = model.coef_[0], model.intercept_\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 63,
|
||
"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"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 0 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Affichage des résultats des trois techniques\n",
|
||
"\n",
|
||
"min_x, max_x = 20, 40\n",
|
||
"list_x = np.random.uniform(min_x, max_x, 100).tolist()\n",
|
||
"list_x.sort()\n",
|
||
"f = lambda x_i: 1.5 * x_i + 5\n",
|
||
"SCALE = 5\n",
|
||
"list_y = [f(x) + np.random.normal(0, SCALE, 1)[0] for x in list_x]\n",
|
||
"\n",
|
||
"plt.scatter(list_x, list_y, s=6, label='original data')\n",
|
||
"plt.plot([min_x, max_x], [b_cf + w_cf * min_x, b_cf + w_cf * max_x],\n",
|
||
" '-', markersize=3, color='blue', label='Closed-form')\n",
|
||
"plt.plot([min_x, max_x], [b_gd + w_gd * min_x, b_gd + w_gd * max_x],\n",
|
||
"'-', markersize=3, color='orange', label='Gradient Descent')\n",
|
||
"plt.plot([min_x, max_x], [b_sklearn + w_sklearn * min_x, b_sklearn + w_sklearn * max_x],\n",
|
||
"'-', markersize=3, color='yellow', label='Sklearn')\n",
|
||
"plt.xlabel('x')\n",
|
||
"plt.ylabel('y')\n",
|
||
"plt.legend(loc=0)\n",
|
||
"plt.show()\n",
|
||
"plt.clf()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.7.0"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|