diff --git a/Archis Applications/Exercices/Exercice 1.ipynb b/Archis Applications/Exercices/TP1/.ipynb_checkpoints/Exercice 1-checkpoint.ipynb similarity index 100% rename from Archis Applications/Exercices/Exercice 1.ipynb rename to Archis Applications/Exercices/TP1/.ipynb_checkpoints/Exercice 1-checkpoint.ipynb diff --git a/Archis Applications/Exercices/Exercice 2.ipynb b/Archis Applications/Exercices/TP1/.ipynb_checkpoints/Exercice 2-checkpoint.ipynb similarity index 100% rename from Archis Applications/Exercices/Exercice 2.ipynb rename to Archis Applications/Exercices/TP1/.ipynb_checkpoints/Exercice 2-checkpoint.ipynb diff --git a/Archis Applications/Exercices/TP1/Exercice 1.ipynb b/Archis Applications/Exercices/TP1/Exercice 1.ipynb new file mode 100644 index 0000000..2b98d49 --- /dev/null +++ b/Archis Applications/Exercices/TP1/Exercice 1.ipynb @@ -0,0 +1,359 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# On importe les librairies\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1 - Créer une fonction J(theta qui implémente J(theta). Quelle est la valeur de de J(4) ?" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "25" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def J(theta_i):\n", + " return (theta_i + 1)**2\n", + "\n", + "J(4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# On génère les points dans theta\n", + "theta = np.arange(-10.00, 10.00, 0.01)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3\n", + "Plot theta vs J(theta). When do we reach the minimum?" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot de J(theta)\n", + "plt.plot(theta,J(theta), label='Fitted line - closed form')\n", + "plt.xlabel('x')\n", + "plt.ylabel('J(x)')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1.0" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "J_theta = [J(x) for x in theta]\n", + "# Valeur de theta à laquelle on obtien le plus petit J(theta)\n", + "round(theta[J_theta.index(min(J_theta))], 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4\n", + "Create a function dJ_dtheta(x_i) which is computing the gradient\n", + "?" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# On calcule la fonction dérivée. D'après J(theta). Merci dcode.fr\n", + "def dJ_theta(x_i):\n", + " return 2 * (x_i + 1)\n", + "# Affichage de la valeur à 0\n", + "dJ_theta(-1)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(theta, dJ_theta(theta))\n", + "# dJ_t = [dJ_theta(x) for x in theta]\n", + "# plt.plot(theta, dJ_t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 5\n", + "Create a function gradient_descent(theta_0, lr, nb_iters, df_dx, f) which returns the solution\n", + "of argmin f (θ). \n", + "x_0, lr, nb_iters, df_dx, f correspond respectively to the initial value of θ, the\n", + "θ\n", + "learning rate, the number of iterations allowed for solving the problem, the gradient of θ and the\n", + "function J(.).\n", + "\n", + "What is the solution θ̂ found by gradient descent to our problem? Note: assume that\n", + "x_0, lr, nb_iters = -7, 0.1, 100 while debugging" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def gradient_descent(theta_0, lr, nb_iters, dJ_t, J_theta):\n", + " # puis on reprend les étapes vues en cours\n", + " theta = theta_0\n", + " \n", + " for t in range(nb_iters): \n", + " # calcul de theta\n", + " theta = theta - lr * dJ_t(theta)\n", + "\n", + " return theta\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1.0000000100978041" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# On appelle la fonction \n", + "gradient_descent(-7, 0.01, 1000, dJ_theta, J)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 6\n", + "Update your function gradient_descent for printing the optimization path (i.e. print the line between\n", + "θ t and θ t+1 and saving the figure at the end of the optimization process)." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "-1.0000000100978041" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xd8VGW+x/HPL5NKOpCEhNCLNKmhKrIWVuyLupZVZG2Ia2Pd9a6uXq/ede91XdtaVkVQUFTUtevKWhZEUErovfcaamgJKc/9I6MXFUhIZnJmJt/36zWvZE7O5HzHvPLl+OSc5zHnHCIiEv6ivA4gIiKBoUIXEYkQKnQRkQihQhcRiRAqdBGRCKFCFxGJECp0EZEIoUIXEYkQKnQRkQgRXZsHa9iwoWvevHltHlJEJOzNmjVrh3Muo7L9arXQmzdvTn5+fm0eUkQk7JnZuqrspyEXEZEIoUIXEYkQKnQRkQihQhcRiRAqdBGRCKFCFxGJECp0EZEIERaFPnv9bp7/apXXMUREQlpYFPoHczbx8KdL+XTBFq+jiIiErLAo9D+e156uTdL4/dvzWLl9n9dxRERCUqWFbmbxZjbDzOaZ2SIze9C/fYyZrTGzuf5H12CFjIv28dzV3UmI9XHTq7PYX1warEOJiIStqpyhFwNnOOe6AF2BQWbWx/+1u5xzXf2PuUFLCWSnJvD0ld1Zu/Mgd709D+dcMA8nIhJ2Ki10V2G//2mM/+FJm/Zt1YC7B7Xj04VbeWHyai8iiIiErCqNoZuZz8zmAtuBz51z0/1f+rOZzTezJ8wsLmgpj3BD/xac1zmbRyYsZerKHbVxSBGRsFClQnfOlTnnugK5QC8z6wTcA7QDegL1gT8c7bVmNszM8s0sv6CgoMaBzYxHLulM68wkbntjDpv2HKrx9xQRiQQndJWLc24PMAkY5Jzb4h+OKQZeBnod4zUjnXN5zrm8jIxK52evksS4aJ6/ugclpeXcPG4WRSVlAfm+IiLhrCpXuWSYWZr/8wTgLGCpmWX7txnwC2BhMIP+WMuMJB67rAvzN+7lgQ8X1eahRURCUlXO0LOBiWY2H5hJxRj6x8BrZrYAWAA0BB4KXsyj+3nHRtxyeivGz9zA+Bnra/vwIiIhpdIl6Jxz84FuR9l+RlASnaA7B57E/I17uf+DRbTPTqFLkzSvI4mIeCIs7hQ9Hl+U8dQV3chIjuPmcbPYub/Y60giIp4I+0IHSE+M5YUhPdhx4DC3j59DaVm515FERGpdRBQ6QKfGqTz0i05MXbmTRz9b7nUcEZFaFzGFDnBZXhOu6t2U579axYSFmplRROqWiCp0gPsv6EDXJmn87q15LN+mmRlFpO6IuEKPi/bx/NU9SIyL5oax+ew+cNjrSCIitSLiCh2gUWo8zw/pwda9Rdz6xmz9kVRE6oSILHSA7k3T+Z+LT2bqyp089MkSr+OIiARdpTcWhbNLe+SydEsho6asoX12Mpf3bOp1JBGRoInYM/Tv3H1OO/q3ach97y8kf+0ur+OIiARNxBd6tC+KZ67sTm56PYaPm6XpdkUkYkV8oQOk1ovhxWt6UFxSzrBX8jl0WNPtikjkqROFDtA6M5mnruzG4i2F3PUPrUkqIpGnzhQ6wOntMvmPs9vx8fwt/H3SKq/jiIgEVERf5XI0wwe0ZOnWQh79bBlts5IZ2CHL60giIgFRp87QoWJN0r9c0pmTG6cyYvwcTQ8gIhGjzhU6QHyMjxeG9CAhNpobX8lnz0FNDyAi4a9OFjpAdmoCLwzpwZY9RdzyuqYHEJHwV2cLHaBHs3T+PLhiDvU/fbzY6zgiIjVSaaGbWbyZzTCzeWa2yMwe9G9vYWbTzWyFmb1pZrHBjxt4v8xrwo39WzD223WMmbrG6zgiItVWlTP0YuAM51wXoCswyMz6AH8BnnDOtQF2A9cHL2Zw3X1OewZ2yOK/P17MxKXbvY4jIlItlRa6q7Df/zTG/3DAGcA//NvHAr8ISsJa4Isy/nZFV9pnp3Dr67NZsqXQ60giIiesSmPoZuYzs7nAduBzYBWwxzlX6t9lI9D4GK8dZmb5ZpZfUFAQiMxBUS82mtFDe5IcH8P1Y2ayvbDI60giIiekSoXunCtzznUFcoFeQPuj7XaM1450zuU55/IyMjKqn7QWNEqNZ9TQPPYcKuEGzfkiImHmhK5ycc7tASYBfYA0M/vuTtNcYHNgo3mjU+NUnrqiGws27eW3b86lvFxzvohIeKjKVS4ZZpbm/zwBOAtYAkwELvXvNhT4IFgha9tZHbK477wOTFi0lUf+tczrOCIiVVKVuVyygbFm5qPiH4C3nHMfm9liYLyZPQTMAUYHMWetu+6U5qzZsZ/nv1pFi4b1tNqRiIS8SgvdOTcf6HaU7aupGE+PSGbGAxd0ZN3Og9z73kKapNejX+uGXscSETmmOn2naGWifVE8e1V3WmYkMnzcLFZu31/5i0REPKJCr0RKfAyjh/YkNjqK68bMZNcBTeQlIqFJhV4FTerXY+Q1eWwrLGLYK/kUl+pyRhEJPSr0KureNJ3HLutC/rrd3PX2fF3OKCIhp86tWFQT53fOYf2ugzwyYRnZafHcc87R7q8SEfGGCv0E3TygFZv3HOKFr1aTk5rA0H7NvY4kIgKo0E+YmfHghZ3YVljMAx8tIisljkGdsr2OJSKiMfTq8EUZT13Rja5N0rhj/Fzy1+7yOpKIiAq9uhJifYwe2pOctASuH5uva9RFxHMq9BqonxjL2Gt7EeMzhr40Q1PuioinVOg11LRBPV7+dS92HzzMtWNmsr+4tPIXiYgEgQo9AE7OTeXZq7qzdOs+bh43i5Kycq8jiUgdpEIPkNNPyuR/Lz6Zr1fs4A/vzMc53XgkIrVLly0G0GV5Tdiyp4gnvlhOTmoCvz/7JK8jiUgdokIPsNvPbM3WwkM8M3El2WnxXNW7mdeRRKSOUKEHmJnxp4sqbjz6z/cX0jApjrM7NvI6lojUARpDD4JoXxTP/KobnXPTuO2NOXyzaofXkUSkDlChB0m92GjGXNuT5g3qMeyVWSzYuNfrSCIS4aqySHQTM5toZkvMbJGZ3eHf/oCZbTKzuf7HucGPG17S6sXyynW9SU2IYejLM1hVoLtJRSR4qnKGXgr8zjnXHugD3GJmHfxfe8I519X/+GfQUoaxRqnxjLuhNwYMGTWdzXsOeR1JRCJUpYXunNvinJvt/3wfsARoHOxgkaRFw0TGXteLfUWlDBk9XcvYiUhQnNAYupk1B7oB0/2bbjWz+Wb2kpmlBzhbROnUOJVRQ/PYuPsQ1748Q1MEiEjAVbnQzSwJeAcY4ZwrBJ4DWgFdgS3AY8d43TAzyzez/IKCggBEDl+9WzbgmV91Z+HmQm56VWuTikhgVanQzSyGijJ/zTn3LoBzbptzrsw5Vw68CPQ62mudcyOdc3nOubyMjIxA5Q5bAztk8cglnZm6cicjxs+lTGuTikiAVOUqFwNGA0ucc48fsf3IZXoGAwsDHy8yXdIjl/88vwOfLtzKve8t0LwvIhIQVblT9BRgCLDAzOb6t/0RuNLMugIOWAvcFJSEEer6U1uw+8Bhnpm4kvTEWP4wqJ3XkUQkzFVa6M65KYAd5Uu6TLGGfvfztuw6eJjnJq0iNSGG4QNaeR1JRMKY5nLx0HfzvhQeKuHhT5dSL9bHNX2bex1LRMKUCt1jvijjicu7Ulxazv0fLCI+2sdlPZt4HUtEwpDmcgkBMf7JvPq3acgf3p3PB3M3eR1JRMKQCj1ExEX7GDkkj17N63PnW/OYsHCr15FEJMyo0ENIQqyP0b/uSefcVG57YzYTl233OpKIhBEVeohJiotmzLW9aJuVzPBXZ/HNSs2lLiJVo0IPQakJMbx6fW+aNajHDa/kk792l9eRRCQMqNBDVP3EWMbd0JtGKfFc+/JM5m/c43UkEQlxKvQQlpkcz2s39iYtMYYho2ewZEuh15FEJISp0ENcdmoCr9/Qh4QYH1ePms7K7fu8jiQiIUqFHgaa1K/H6zf2xsy4YuR0Vm7XUnYi8lMq9DDRMiOJ8cN6A3DFyGkqdRH5CRV6GGmdmfyjUtfwi4j8PxV6mPlhqWtMXUT+nwo9DKnUReRoVOhh6selvmKbSl2krlOhh7GKUu8DwJUvqtRF6joVephrnZmkUhcRoGqLRDcxs4lmtsTMFpnZHf7t9c3sczNb4f+YHvy4cjQqdRGBqp2hlwK/c861B/oAt5hZB+Bu4EvnXBvgS/9z8cgPS32apgkQqYMqLXTn3Bbn3Gz/5/uAJUBj4CJgrH+3scAvghVSqqZ1ZhJv3tSH6Kgorhg5TRN6idQxJzSGbmbNgW7AdCDLObcFKkofyAx0ODlxrTKSeOumviTHR3PVi9M19a5IHVLlQjezJOAdYIRzrsr/P29mw8ws38zyCwoKqpNRTlDTBvV466a+ZCTHMWT0DC2SIVJHVKnQzSyGijJ/zTn3rn/zNjPL9n89GzjqemnOuZHOuTznXF5GRkYgMksV5KQlMP6mPjStX49fj5nJxKVazk4k0lXlKhcDRgNLnHOPH/GlD4Gh/s+HAh8EPp7URGZyPG8M60PbrCSGvZrPhIVbvI4kIkFUlTP0U4AhwBlmNtf/OBd4GBhoZiuAgf7nEmLqJ8by2g19OLlxKre8PocP5m7yOpKIBEl0ZTs456YAdowvnxnYOBIM361Rev3YmYx4cy6HDpdxRa+mXscSkQDTnaJ1RGJcNGOu7cVpbTK4+90FvDx1jdeRRCTAVOh1SHyMj5HX9ODsjlk8+NFinvxiOc45r2OJSICo0OuYuGgfz/6qO5d0z+XJL1bwwIeLKC9XqYtEgkrH0CXyRPui+OulnamfGMOLX69hz6ESHv1lF2J8+vddJJyp0OuoqCjjj+e2p35iHH+ZsJS9h0p47qoeJMT6vI4mItWkU7I6zMy4+Wet+N+LT2by8gKuHj2dvQdLvI4lItWkQheu7NWUZ3/VnQUb93LZC9+yrbDI60giUg0qdAHgnJOzGXNtTzbuPsilz3/D2h0HvI4kIidIhS7f69e6IW8M68OB4jIuff5bFm3e63UkETkBKnT5gc65abx1U19ifcblL0xjygrN1CgSLlTo8hOtM5N45zf9yE1P4Ncvz+C9ORu9jiQiVaBCl6PKTk3greF96dm8Pr99cx5/n7RSd5WKhDgVuhxTSnwMY67ryYVdcnhkwjL+84OFlOmuUpGQpRuL5Ljion08eXlXctISeP6rVWzdW8zTV3bTDUgiIUhn6FKpqCjj7nPa8d8XdeTLpdv41ahp7Dpw2OtYIvIjKnSpsmv6Nue5q3qweHMhlzz3Det26lp1kVCiQpcTMqhTI16/sTe7Dx7m4r9/w+z1u72OJCJ+KnQ5YT2a1eedm/uRGBfNFSOn8dG8zV5HEhFU6FJNrTKSeP+WU+iSm8ptb8zh6S9X6LJGEY9VWuhm9pKZbTezhUdse8DMNv1o0WipY+onxjLuht4M7taYxz5fzu/emkdxaZnXsUTqrKqcoY8BBh1l+xPOua7+xz8DG0vCRVy0j8cv68KdA9vy7pxNDBk1Q1fAiHik0kJ3zk0GdtVCFglTZsbtZ7bhqSu7MXfjHgb/fSqrCvZ7HUukzqnJGPqtZjbfPySTHrBEErYu7JLDGzf2YX9RKYOfnco3qzSxl0htqm6hPwe0AroCW4DHjrWjmQ0zs3wzyy8oKKjm4SRc9GiWzvu3nEJWSjzXjJ7BuGnrvI4kUmdUq9Cdc9ucc2XOuXLgRaDXcfYd6ZzLc87lZWRkVDenhJEm9evxzm/6cWqbhtz3/kLue38BJWXlXscSiXjVKnQzyz7i6WBg4bH2lbopJT6G0UN7ctOAloybtp6rRk1n5/5ir2OJRLSqXLb4BvAtcJKZbTSz64FHzGyBmc0HTgd+G+ScEoZ8UcY957Tnycu7Mm/DHi58ZiqLNxd6HUskYllt3gySl5fn8vPza+14Ejrmb9zDsFdmsfdQCY9d1oVzT86u/EUiAoCZzXLO5VW2n+4UlVrROTeND289hXbZyfzmtdk8/tkyyjW3ukhAqdCl1mSmxDN+WB9+2SOXp/69kpvGzWJfUYnXsUQihgpdalVctI9HLu3M/ed34N9Lt3PRM1NZvm2f17FEIoIKXWqdmXHdqS14/YbeFBaV8otnp/LxfM3YKFJTKnTxTO+WDfjk9lNp1yiZW1+fw0MfL6ZU16uLVJsKXTyVlRLP+GF9Gdq3GaOmrOGqUdMp2Kfr1UWqQ4UunouNjuLBizrxxOVdmLdxD+c//bVWQhKpBhW6hIzB3XJ59+ZTiIv2cfkL3/Ly1DVaNEPkBKjQJaR0yEnho1tPZUDbDB78aDE3j5vN3kO6tFGkKlToEnJS68Xw4jV53Htue75Yso0Lnp7Cgo17vY4lEvJU6BKSzIwbT2vJmzf1pbSsnEue+4ZXvl2rIRiR41ChS0jr0SydT27vzymtG3D/B4u49fU5FOruUpGjUqFLyEtPjGX00J7cfU47JizaqiEYkWNQoUtYiIoyhg9oxZvD+nC4tJyLn5vKi5NXa4IvkSOo0CWs5DWvz6d39OeMdpn8+Z9LGPryDLbvK/I6lkhIUKFL2EmrF8vzV/fgz4M7MWPNLs7929dMXLbd61ginlOhS1gyM67q3YyPbjuVhklxXPvyTP77o8UUl5Z5HU3EMyp0CWtts5J5/5ZTGNq3GS9NXcPgZ79hhabjlTqqKmuKvmRm281s4RHb6pvZ52a2wv8xPbgxRY4tPsbHgxd1YtQ1eWwtLOK8p6cw6mv9wVTqnqqcoY8BBv1o293Al865NsCX/ucinjqrQxb/GnEap7VpyEOfLOHKF6exYddBr2OJ1JpKC905NxnY9aPNFwFj/Z+PBX4R4Fwi1ZKRHMeL1+TxyKWdWbS5kHP+9jVv5W/QHaZSJ1R3DD3LObcFwP8xM3CRRGrGzLgsrwmf3tGfjjkp/Mc/5nPjK7M0z7pEvKD/UdTMhplZvpnlFxQUBPtwIt9rUr8eb9zYh/vOa8/kFQWc/eRkJizc6nUskaCpbqFvM7NsAP/HY14E7Jwb6ZzLc87lZWRkVPNwItUTFWXc0L8ln9x2Kjlp8QwfN4s735qrKXklIlW30D8Ehvo/Hwp8EJg4IsHRJiuZ935zCref2YYP5m5m0JOTmbhUNyNJZKnKZYtvAN8CJ5nZRjO7HngYGGhmK4CB/uciIS3GF8WdA9vyzs39SIqL5toxMxkxfg67Dhz2OppIQFht/vU/Ly/P5efn19rxRI6luLSMZyeu4u8TV5KSEMN/XdCBC7vkYGZeRxP5CTOb5ZzLq2w/3SkqdVJctI87B7bl49tPpUl6AneMn8sNY/PZsveQ19FEqk2FLnVau0YpvPubU7jvvPZMXbWDgY9PZty0dbrLVMKSCl3qPJ//Sph/jTiNzrmp3Pf+Qq54cRprdhzwOprICVGhi/g1a5DIazf05i+XnMySLYUMenIyT325QjM4SthQoYscwcy4vGdTvrhzAGe1z+Lxz5cz6Mmv+XqFboqT0KdCFzmKrJR4nr2qO2Ov64VzjiGjZ3Dr67PZVqjVkSR0qdBFjmNA2wwmjDiN357Vls8Wb+PMx75i1NerKS0r9zqayE+o0EUqER/j446z2vD5b0+jR7N0HvpkCec/PYX8tT+ehFTEWyp0kSpq1iCRMdf25Pmru7P3UAmXPv8td709T4tUS8hQoYucADNjUKdsvrhzADed1pL3527ijEe/4rlJq3Q1jHhOhS5SDYlx0dxzbns+++0A+rRswF8mLGXg45OZsHCLFtMQz6jQRWqgRcNERg3N49XrexEfE8XwcbO58sVpLN5c6HU0qYNU6CIB0L9NBv+8vT9/uqgjy7bu4/ynv+aedxewY79WSZLao0IXCZBoXxRD+jZn0u9P59f9WvB2/gZ+9tdJPPPvFRw8XOp1PKkDVOgiAZZaL4b7L+jAhBGn0a9VAx79bDkD/jqJ16av0/XrElQqdJEgaZ2ZxMhr8njn5r40q1+Pe99byM+f0B9OJXhU6CJB1qNZfd4e3pcXr8nDF2UMHzebwX//humrd3odTSKMCl2kFpgZAztk8ekd/Xnkks5s3VvE5SOnMfSlGczbsMfreBIhtASdiAeKSsoY881anv9qFXsOlnBW+0xGnNWWTo1TvY4mIaiqS9DVqNDNbC2wDygDSis7oApd5If2FZUw9pu1jJy8msKiUs7umMWIs9rSPjvF62gSQmqz0POcczuqsr8KXeToCotKeGnKGkZ/vYZ9xaWcd3I2d5zVhrZZyV5HkxBQ1UKPro0wInJ8KfExjDirLdf2a8GoKat5acoaPlmwhbM7ZnHL6a3pnJvmdUQJAzU9Q18D7AYc8IJzbuRR9hkGDANo2rRpj3Xr1lX7eCJ1xe4Dh3l56hrGfLOWwqJS+rdpyC2nt6Z3i/qYmdfxpJbV1pBLjnNus5llAp8DtznnJh9rfw25iJyYfUUljJu2ntFTVrNj/2HymqVzy+mt+dlJGSr2OqRWCv1HB3wA2O+ce/RY+6jQRaqnqKSMN2du4IWvVrF5bxHtGiVz/aktuLBrDnHRPq/jSZBVtdCrfR26mSWaWfJ3nwM/BxZW9/uJyLHFx/gY2q85k+46nb9e2hnn4K5/zOfUv0zkmX+vYNeBw15HlBBQ7TN0M2sJvOd/Gg287pz78/FeozN0kcBwzjFl5Q5Gfb2Gr5YXEB8TxSXdc7nu1Ba0ykjyOp4EWK0PuVSFCl0k8JZv28dLU9bw7pxNHC4t58x2mVx/agv6tmqgcfYIoUIXqWN27C9m3LR1vPrtOnYeOEzrzCSu6t2Ui7vnkpoQ43U8qQEVukgdVVRSxkfzNjNu+nrmbdhDQoyPi7rmcHWfZppaIEyp0EWEhZv2Mm7aOj6Yu5lDJWV0aZLG1b2bckGXHOJjdHVMuFChi8j39h4q4d3ZGxk3bR2rCg6QEh/NBV1y+GVeE7rkpmqsPcSp0EXkJ5xzTFu9izdnrufThVspLi2nbVYSl/bIZXC3XDKS47yOKEehQheR4yosKuHjeVt4e9YG5qzfgy/KOP2kDC7tkcvPTsrUkEwIUaGLSJWt3L6Pt2dt5N3ZmyjYV0xyfDRnd2zEhV1y6NeqAdE+rYXjJRW6iJyw0rJypq7ayYdzN/PZoq3sKy6lQWIs556czYVdc+jRNJ2oKI231zYVuojUSFFJGZOWFfDRvM18sWQbxaXl5KTGc36XHM7u2IhuTdJU7rVEhS4iAbO/uJQvFm/jo3mb+Wp5AaXljozkOAZ2yOLnHbLo26qBJgkLIhW6iATF3kMlTFq2nc8WbWPSsu0cOFxGUlw0Pzspg7M7NmLASRmkxOvO1EBSoYtI0BWVlPHtqp38a9FWvliyjR37D+OLMro3TWNA2wwGtM2kY06KhmZqSIUuIrWqrNwxZ/1uJi0r4KvlBSzYtBeABomx9G/TkAEnZdC/TQYNk3St+4lSoYuIp3bsL+brFQVMXr6DycsL2Omfs71do2T6tGxAn5b16dWiAfUTYz1OGvpU6CISMsrLHYs2FzJ5RQHfrtpJ/rpdFJWUA3BSVjJ9Wtand8sG5DVPJzM53uO0oUeFLiIh63BpOQs27WHa6l1MW72T/LW7OVRSBkDjtAS6NU2jW9N0ujVNo2NOSp2/gkaFLiJho6SsnAWb9jJ73W7mbNjD3PV72LTnEACxvija56TQNTeVDjkpdMhOpU1WUp2amqCqhR5dG2FERI4nxhdF96bpdG+a/v22bYVFzFm/hzkbdjNn/R7+MWsjB76tOIv3RRmtM5LokJNC++xk2jVKoXVmEtmp8XV65sganaGb2SDgb4APGOWce/h4++sMXUSqq7zcsX7XQRZvKWTx5sLvP24tLPp+n3qxPlpmJNIqI+n/H5mJNEmvR2Jc+J6/Bn3Ixcx8wHJgILARmAlc6ZxbfKzXqNBFJNB27i9m2bZ9rC44wKqC/awqOMCq7fu/H7L5Tv3EWHLTE/yPejRJT6BxegJZKfFkJMfRIDEOX4heL18bQy69gJXOudX+A44HLgKOWegiIoHWICmOfklx9GvV8AfbDx4uZXXBAVbvOMDG3QfZsOsQG3cfZOmWfXyxZDuHS8t/sH+UVXyvjKQ4MpLjyEyOIz0xlpT4aFITYkjxP1ITYkiJjyEpLpr4mCjion3ERUeFxM1TNSn0xsCGI55vBHrXLI6ISGDUi42mU+PUo66jWl7u2LG/mA27D1Gwr4iCfcVs31dMgf+xfV8xy7buY/fBwxT/qPiPJTY6irjoKOJjfMT6ovBFGVEGUWZERRn/M/hkerWoH+i3+QM1KfSj/XP0k/EbMxsGDANo2rRpDQ4nIhIYUVFGZko8mSmVX/NeVFJGYVEJhYdK2XuohMJDJew9VMLBw2UUlZRRVFpGcUn59x+LS8soLi3HOSh3jrJyh3OQGBf8q3JqUugbgSZHPM8FNv94J+fcSGAkVIyh1+B4IiK1Lj7GR3yMj8xkr5NUribLkMwE2phZCzOLBa4APgxMLBEROVHVPkN3zpWa2a3Av6i4bPEl59yigCUTEZETUqMLM51z/wT+GaAsIiJSA1r5VUQkQqjQRUQihApdRCRCqNBFRCKECl1EJELU6nzoZlYArKvmyxsCOwIYx0t6L6EnUt4H6L2Eqpq8l2bOuYzKdqrVQq8JM8uvymxj4UDvJfREyvsAvZdQVRvvRUMuIiIRQoUuIhIhwqnQR3odIID0XkJPpLwP0HsJVUF/L2Ezhi4iIscXTmfoIiJyHGFV6Gb2ppnN9T/WmtlcrzPVhJndZmbLzGyRmT3idZ7qMLMHzGzTET+Xc73OVFNm9nszc2bWsPK9Q5OZ/cnM5vt/Jp+ZWY7XmarLzP5qZkv97+c9M0vzOlN1mNkv/b/r5WYWlKtdwqrQnXOXO+e6Oue6Au8A73qdqbrM7HQq1mDt7JzrCDzqcaSaeOK7n4t/Bs6wZWZNqFj4fL3XWWror865zv7flY+B+70OVAOfA52cc52pWJj+Ho/zVNdC4GJgcrAOEFaF/h0zM+Ay4A2vs9TAzcDDzrliAOfcdo/zSIUngP/gKMsphhPnXOERTxMJ4/fjnPvXA5NAAAACD0lEQVTMOVfqfzqNitXRwo5zbolzblkwjxGWhQ70B7Y551Z4HaQG2gL9zWy6mX1lZj29DlQDt/r/d/glM0v3Okx1mdmFwCbn3DyvswSCmf3ZzDYAVxHeZ+hHug741OsQoapGC1wEg5l9ATQ6ypfudc594P/8SsLg7Px474WK//bpQB+gJ/CWmbV0IXjZUSXv4zngT1ScAf4JeIyKX7qQVMl7+SPw89pNVH2V/a445+4F7jWze4Bbgf+q1YAnoCq/92Z2L1AKvFab2U5EFfsreMcPwf44LjOLBjYBPZxzG73OU11mNoGKIZdJ/uergD7OuQJPg9WAmTUHPnbOdfI4ygkzs5OBL4GD/k3fLXreyzm31bNgAWBmzYBPwvHn8h0zGwoMB850zh2sbP9QZmaTgN875/ID/b3DccjlLGBpOJe53/vAGQBm1haIJQwnITKz7COeDqbiDz9hxzm3wDmX6Zxr7pxrDmwEuodrmZtZmyOeXggs9SpLTZnZIOAPwIXhXubBFnJDLlVwBWEw3FIFLwEvmdlC4DAwNBSHW6rgETPrSsWQy1rgJm/jiN/DZnYSUE7FDKfDPc5TE88AccDnFddDMM05F3bvx8wGA08DGcAnZjbXOXd2QI8Rnh0iIiI/Fo5DLiIichQqdBGRCKFCFxGJECp0EZEIoUIXEYkQKnQRkQihQhcRiRAqdBGRCPF/Azb9Q3BajRgAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def gradient_descent(theta_0, lr, nb_iters, dJ_t, J_theta):\n", + " # puis on reprend les étapes vues en cours\n", + " theta = theta_0\n", + " \n", + " # on initialise les séries pour le plot\n", + " x = [theta]\n", + " y = [J_theta(theta)]\n", + " \n", + " for t in range(nb_iters): \n", + " # calcul de theta\n", + " theta = theta - lr * dJ_t(theta)\n", + " # ajout de la valeur au plot\n", + " x.append(theta)\n", + " y.append(J_theta(theta))\n", + " \n", + " # affichage du plot\n", + " plt.plot(x,y)\n", + " \n", + " return theta\n", + "\n", + "# On appelle la fonction \n", + "gradient_descent(-7, 0.01, 1000, dJ_theta, J)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 7\n", + "Assuming that you are setting nb_iters equals to 100 what is the solution θ̂ when varying nb_iters in\n", + "[-8, -1, 7] and lr in [0.1, 0.01, 0.001, -0.01, 0.8, 1.01]. Does the estimated solution always\n", + "the same? What are pros and cons about these hyperparameters and GD in general?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 8\n", + "Now assume the function J(θ) = sin(2θ + 1), what is the solution θ̂ given by GD?" + ] + }, + { + "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 +} diff --git a/Archis Applications/Exercices/TP1/Exercice 2.ipynb b/Archis Applications/Exercices/TP1/Exercice 2.ipynb new file mode 100644 index 0000000..4344cce --- /dev/null +++ b/Archis Applications/Exercices/TP1/Exercice 2.ipynb @@ -0,0 +1,426 @@ +{ + "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": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "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": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ] + }, + "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": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ] + }, + "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 +} diff --git a/Archis Applications/Exercices/TP2/.ipynb_checkpoints/Exercice 1-checkpoint.ipynb b/Archis Applications/Exercices/TP2/.ipynb_checkpoints/Exercice 1-checkpoint.ipynb new file mode 100644 index 0000000..57a4822 --- /dev/null +++ b/Archis Applications/Exercices/TP2/.ipynb_checkpoints/Exercice 1-checkpoint.ipynb @@ -0,0 +1,326 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'data': array([[6.3200e-03, 1.8000e+01, 2.3100e+00, ..., 1.5300e+01, 3.9690e+02,\n", + " 4.9800e+00],\n", + " [2.7310e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9690e+02,\n", + " 9.1400e+00],\n", + " [2.7290e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9283e+02,\n", + " 4.0300e+00],\n", + " ...,\n", + " [6.0760e-02, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9690e+02,\n", + " 5.6400e+00],\n", + " [1.0959e-01, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9345e+02,\n", + " 6.4800e+00],\n", + " [4.7410e-02, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9690e+02,\n", + " 7.8800e+00]]),\n", + " 'target': array([24. , 21.6, 34.7, 33.4, 36.2, 28.7, 22.9, 27.1, 16.5, 18.9, 15. ,\n", + " 18.9, 21.7, 20.4, 18.2, 19.9, 23.1, 17.5, 20.2, 18.2, 13.6, 19.6,\n", + " 15.2, 14.5, 15.6, 13.9, 16.6, 14.8, 18.4, 21. , 12.7, 14.5, 13.2,\n", + " 13.1, 13.5, 18.9, 20. , 21. , 24.7, 30.8, 34.9, 26.6, 25.3, 24.7,\n", + " 21.2, 19.3, 20. , 16.6, 14.4, 19.4, 19.7, 20.5, 25. , 23.4, 18.9,\n", + " 35.4, 24.7, 31.6, 23.3, 19.6, 18.7, 16. , 22.2, 25. , 33. , 23.5,\n", + " 19.4, 22. , 17.4, 20.9, 24.2, 21.7, 22.8, 23.4, 24.1, 21.4, 20. ,\n", + " 20.8, 21.2, 20.3, 28. , 23.9, 24.8, 22.9, 23.9, 26.6, 22.5, 22.2,\n", + " 23.6, 28.7, 22.6, 22. , 22.9, 25. , 20.6, 28.4, 21.4, 38.7, 43.8,\n", + " 33.2, 27.5, 26.5, 18.6, 19.3, 20.1, 19.5, 19.5, 20.4, 19.8, 19.4,\n", + " 21.7, 22.8, 18.8, 18.7, 18.5, 18.3, 21.2, 19.2, 20.4, 19.3, 22. ,\n", + " 20.3, 20.5, 17.3, 18.8, 21.4, 15.7, 16.2, 18. , 14.3, 19.2, 19.6,\n", + " 23. , 18.4, 15.6, 18.1, 17.4, 17.1, 13.3, 17.8, 14. , 14.4, 13.4,\n", + " 15.6, 11.8, 13.8, 15.6, 14.6, 17.8, 15.4, 21.5, 19.6, 15.3, 19.4,\n", + " 17. , 15.6, 13.1, 41.3, 24.3, 23.3, 27. , 50. , 50. , 50. , 22.7,\n", + " 25. , 50. , 23.8, 23.8, 22.3, 17.4, 19.1, 23.1, 23.6, 22.6, 29.4,\n", + " 23.2, 24.6, 29.9, 37.2, 39.8, 36.2, 37.9, 32.5, 26.4, 29.6, 50. ,\n", + " 32. , 29.8, 34.9, 37. , 30.5, 36.4, 31.1, 29.1, 50. , 33.3, 30.3,\n", + " 34.6, 34.9, 32.9, 24.1, 42.3, 48.5, 50. , 22.6, 24.4, 22.5, 24.4,\n", + " 20. , 21.7, 19.3, 22.4, 28.1, 23.7, 25. , 23.3, 28.7, 21.5, 23. ,\n", + " 26.7, 21.7, 27.5, 30.1, 44.8, 50. , 37.6, 31.6, 46.7, 31.5, 24.3,\n", + " 31.7, 41.7, 48.3, 29. , 24. , 25.1, 31.5, 23.7, 23.3, 22. , 20.1,\n", + " 22.2, 23.7, 17.6, 18.5, 24.3, 20.5, 24.5, 26.2, 24.4, 24.8, 29.6,\n", + " 42.8, 21.9, 20.9, 44. , 50. , 36. , 30.1, 33.8, 43.1, 48.8, 31. ,\n", + " 36.5, 22.8, 30.7, 50. , 43.5, 20.7, 21.1, 25.2, 24.4, 35.2, 32.4,\n", + " 32. , 33.2, 33.1, 29.1, 35.1, 45.4, 35.4, 46. , 50. , 32.2, 22. ,\n", + " 20.1, 23.2, 22.3, 24.8, 28.5, 37.3, 27.9, 23.9, 21.7, 28.6, 27.1,\n", + " 20.3, 22.5, 29. , 24.8, 22. , 26.4, 33.1, 36.1, 28.4, 33.4, 28.2,\n", + " 22.8, 20.3, 16.1, 22.1, 19.4, 21.6, 23.8, 16.2, 17.8, 19.8, 23.1,\n", + " 21. , 23.8, 23.1, 20.4, 18.5, 25. , 24.6, 23. , 22.2, 19.3, 22.6,\n", + " 19.8, 17.1, 19.4, 22.2, 20.7, 21.1, 19.5, 18.5, 20.6, 19. , 18.7,\n", + " 32.7, 16.5, 23.9, 31.2, 17.5, 17.2, 23.1, 24.5, 26.6, 22.9, 24.1,\n", + " 18.6, 30.1, 18.2, 20.6, 17.8, 21.7, 22.7, 22.6, 25. , 19.9, 20.8,\n", + " 16.8, 21.9, 27.5, 21.9, 23.1, 50. , 50. , 50. , 50. , 50. , 13.8,\n", + " 13.8, 15. , 13.9, 13.3, 13.1, 10.2, 10.4, 10.9, 11.3, 12.3, 8.8,\n", + " 7.2, 10.5, 7.4, 10.2, 11.5, 15.1, 23.2, 9.7, 13.8, 12.7, 13.1,\n", + " 12.5, 8.5, 5. , 6.3, 5.6, 7.2, 12.1, 8.3, 8.5, 5. , 11.9,\n", + " 27.9, 17.2, 27.5, 15. , 17.2, 17.9, 16.3, 7. , 7.2, 7.5, 10.4,\n", + " 8.8, 8.4, 16.7, 14.2, 20.8, 13.4, 11.7, 8.3, 10.2, 10.9, 11. ,\n", + " 9.5, 14.5, 14.1, 16.1, 14.3, 11.7, 13.4, 9.6, 8.7, 8.4, 12.8,\n", + " 10.5, 17.1, 18.4, 15.4, 10.8, 11.8, 14.9, 12.6, 14.1, 13. , 13.4,\n", + " 15.2, 16.1, 17.8, 14.9, 14.1, 12.7, 13.5, 14.9, 20. , 16.4, 17.7,\n", + " 19.5, 20.2, 21.4, 19.9, 19. , 19.1, 19.1, 20.1, 19.9, 19.6, 23.2,\n", + " 29.8, 13.8, 13.3, 16.7, 12. , 14.6, 21.4, 23. , 23.7, 25. , 21.8,\n", + " 20.6, 21.2, 19.1, 20.6, 15.2, 7. , 8.1, 13.6, 20.1, 21.8, 24.5,\n", + " 23.1, 19.7, 18.3, 21.2, 17.5, 16.8, 22.4, 20.6, 23.9, 22. , 11.9]),\n", + " 'feature_names': array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',\n", + " 'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# plot target VS CRIM\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/applications/anaconda3/lib/python3.7/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36mshow\u001b[0;34m(*args, **kw)\u001b[0m\n\u001b[1;32m 251\u001b[0m \"\"\"\n\u001b[1;32m 252\u001b[0m \u001b[0;32mglobal\u001b[0m \u001b[0m_show\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 253\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_show\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 254\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 255\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/applications/anaconda3/lib/python3.7/site-packages/matplotlib/backend_bases.py\u001b[0m in \u001b[0;36mshow\u001b[0;34m(cls, block)\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0mblock\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 207\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mblock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 208\u001b[0;31m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmainloop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 209\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[0;31m# This method is the one actually exporting the required methods.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/applications/anaconda3/lib/python3.7/site-packages/matplotlib/backends/_backend_tk.py\u001b[0m in \u001b[0;36mmainloop\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1073\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mstaticmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1074\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmainloop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1075\u001b[0;31m \u001b[0mTk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmainloop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/applications/anaconda3/lib/python3.7/tkinter/__init__.py\u001b[0m in \u001b[0;36mmainloop\u001b[0;34m(n)\u001b[0m\n\u001b[1;32m 555\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmainloop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 556\u001b[0m \u001b[0;34m\"\"\"Run the main loop of Tcl.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 557\u001b[0;31m \u001b[0m_default_root\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmainloop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 558\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 559\u001b[0m \u001b[0mgetint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "# plot target VS CRIM\n", + "plt.scatter(X[:,0], Y)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# c'est inexploitable, on log\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/applications/anaconda3/lib/python3.7/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36mshow\u001b[0;34m(*args, **kw)\u001b[0m\n\u001b[1;32m 251\u001b[0m \"\"\"\n\u001b[1;32m 252\u001b[0m \u001b[0;32mglobal\u001b[0m \u001b[0m_show\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 253\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_show\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 254\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 255\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/applications/anaconda3/lib/python3.7/site-packages/matplotlib/backend_bases.py\u001b[0m in \u001b[0;36mshow\u001b[0;34m(cls, block)\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0mblock\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 207\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mblock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 208\u001b[0;31m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmainloop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 209\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[0;31m# This method is the one actually exporting the required methods.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/applications/anaconda3/lib/python3.7/site-packages/matplotlib/backends/_backend_tk.py\u001b[0m in \u001b[0;36mmainloop\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1073\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mstaticmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1074\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmainloop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1075\u001b[0;31m \u001b[0mTk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmainloop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/applications/anaconda3/lib/python3.7/tkinter/__init__.py\u001b[0m in \u001b[0;36mmainloop\u001b[0;34m(n)\u001b[0m\n\u001b[1;32m 555\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmainloop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 556\u001b[0m \u001b[0;34m\"\"\"Run the main loop of Tcl.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 557\u001b[0;31m \u001b[0m_default_root\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmainloop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 558\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 559\u001b[0m \u001b[0mgetint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "# c'est inexploitable, on log \n", + "plt.scatter(np.log(X[:,0]), Y)\n", + "plt.show()" + ] + }, + { + "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 +} diff --git a/Archis Applications/Exercices/TP2/Exercice 1.py b/Archis Applications/Exercices/TP2/Exercice 1.py new file mode 100644 index 0000000..a2359f8 --- /dev/null +++ b/Archis Applications/Exercices/TP2/Exercice 1.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +""" +Exercice 1 du cours 2 de machine learning avec F.Baradel +""" +import matplotlib + +matplotlib.use("TkAgg") + +import matplotlib.pyplot as plt +import numpy as np + +from sklearn.datasets import load_boston +from sklearn.linear_model import LinearRegression + +boston = load_boston() + +boston + +X = boston['data'] +Y = boston['target'] +X.shape + +n_train = 300 + +crim = X[:, 0].copy() + +""" 4. Right now we will be using only the first features called CRIM for + modelling the target variable. Plot CRIM vs target with and without normalizing your data. + What do you observe? +""" +# plot target VS CRIM +plt.scatter(crim, Y) +plt.show() + +# c'est inexploitable, on log +plt.scatter(np.log(crim), Y) +plt.show() + +# C'est mieux +#on écrit la fonction de normalisation + +def normalize (y): + return (y - np.min(y)) / (np.max(y) - np.min(y)) + +"""5. Use LinearRegression() for modelling target with CRIM on the training set and compute the predicted +values for the validation set.""" + + + +model = LinearRegression().fit(crim[:n_train].reshape(-1, 1), Y[:n_train]) + + +w, b = model.coef_, model.intercept_ + +print(w, b) + + +""" 6. Plot the predictions and the actual ground-truth for the training and the validation set.""" +print("entrainement") +preds = model.predict(crim[:n_train].reshape(-1, 1)) +plt.scatter(crim[:n_train], preds, color="green") +plt.scatter(crim[:n_train], Y[:n_train], color="red") +plt.show() + +n_valid = 400 + +print("validation") +valids = model.predict(crim[n_train:n_valid].reshape(-1,1)) +plt.scatter(crim[n_train:n_valid], valids, color="green") +plt.scatter(crim[n_train:n_valid], Y[n_train:n_valid], color="orange") +plt.show() + +# On utilise maintenant le log . Je m'a planté et ait cru que c'était la normalisation d'ou les noms fallacieux. +# Ne pas oublier de caler l'exponentielle (réciproque de log) pour remettre valeur dans le bon champ + +print(" avec log") +normY = np.log(Y) + +model = LinearRegression().fit(crim[:n_train].reshape(-1, 1), normY[:n_train]) +print("entrainement") +normPreds = np.exp(model.predict(crim[:n_train].reshape(-1, 1))) +plt.scatter(crim[:n_train], normPreds, color="green") +plt.scatter(crim[:n_train], np.exp(normY[:n_train]), color="red") +plt.show() + +print("validation") +normValids = np.exp(model.predict(crim[n_train:n_valid].reshape(-1,1))) +plt.scatter(crim[n_train:n_valid], normValids, color="green") +plt.scatter(crim[n_train:n_valid], np.exp(normY[n_train:n_valid]), color="orange") +plt.show + + +""" +7. Implement a function which is computing the Root-Mean-Square-Error (RMSE). What is the RMSE on +the training set and on the validation set? + + On veut calculer un score, pour savoir si le modèle est bon ou non + on définit une fonction qui prend mes prédiciton,s mes valeurs, et retourne le mean square error +(ŷi-yi)² + à calculer sur le trainig set et le validation set + + Ensuite modéliser log(target) = w +b.CRIM et MSE train/val +""" + +def mse(preds, vals): + return np.mean((preds - vals)**2) + +mse(preds, Y[:n_train]) +mse(valids, Y[n_train:n_valid]) + +# meme chose avec log +mse(normPreds, Y[:n_train]) +mse(normValids, Y[n_train:n_valid]) + + +# Ensuite, faire la meme chose avec une deuxièm variabl du tableau X : ZN +crimZn = X[:, :2] + +model = LinearRegression().fit(crimZn[:n_train].reshape(-1, 2), Y[:n_train]) + + +w, b = model.coef_, model.intercept_ + +print(w, b) + +print("entrainement") +preds = model.predict(crim[:n_train].reshape(-1, 2)) +plt.scatter(crimZn[:n_train], preds, color="green") +plt.scatter(crimZn[:n_train], Y[:n_train], color="red") +plt.show() + +n_valid = 400 + +print("validation") +valids = model.predict(crim[n_train:n_valid].reshape(-1,1)) +plt.scatter(crim[n_train:n_valid], valids, color="green") +plt.scatter(crim[n_train:n_valid], Y[n_train:n_valid], color="orange") +plt.show() diff --git a/Archis Applications/Exercices/TP2/tp_2.pdf b/Archis Applications/Exercices/TP2/tp_2.pdf new file mode 100644 index 0000000..84edeb0 Binary files /dev/null and b/Archis Applications/Exercices/TP2/tp_2.pdf differ diff --git a/Archis Applications/Introduction au Machine Learning.md b/Archis Applications/Introduction au Machine Learning.md index 3a039cd..bebc8ca 100644 --- a/Archis Applications/Introduction au Machine Learning.md +++ b/Archis Applications/Introduction au Machine Learning.md @@ -145,7 +145,7 @@ Comme dans la réalité on a beaucoup trop de données pour s'appuyer sur toutes ### Exemple -Nous sommes de charmants vendeurs de gales ambulants. On se pose la question : "Quand température est de $x$, combien je vais vendre de glace ?". On s'appuie sur plusieurs expériences de cas réels où on a vendu $y$ glaces alors que la température était de $x$. +Nous sommes de charmants vendeurs de glaces ambulants. On se pose la question : "Quand la température est de $x$, combien je vais vendre de glace ?". On s'appuie sur plusieurs expériences de cas réels où on a vendu $y$ glaces alors que la température était de $x$. On va résoudre le problème en partant du principe qu'on va vendre $wx + b$ glaces, où x est la température. Si $x = 0$ on va vendre $b$ glaces. $b$ est appelé l'intercepte, et $w$ la pente. @@ -160,4 +160,49 @@ Le chapeau indique la prédiction. Pour trouver le coût moyen (de tous les poin À la fin des exercies on mate un graph avec trois méthodes : closed-form, gradient descend et stochastic gradient descent. On remarque que les 3 sont très proches. -On voit ensuite comment faire une descente de gradient en 3 lignes de code : scikit-learn \ No newline at end of file +On voit ensuite comment faire une descente de gradient en 3 lignes de code : scikit-learn + +### Régression linéaire multivariée + +Même principe que linéaire, mais avec un nombre *p* de variables et un concept de vecteurs. + +## Overfitting + +La problématique en ML c'est de généraliser. Nous, humains, on peut généraliser et extrapoler vite (on voit deux chats on peut vite dire si ce qu'on voit ensuite est un chat ou non). En ML, y a besoin de beaucoup plus de données. + +Pour résumer la généralisation: + +On divise le dataset en 3 : donnés d’apprentissage, de validation et de test (genre 70%/15%/15%). On entraîne la machine uniquement avec les données d'apprentissage. Une fois qu'elle a suffisamment appris, on essaye ses déductions sur la base de validation (on donne x on demande de trouver ŷ (on connaît y nous, on peut donc comparer avec)). On retravaille ensuite l'algo sur les données d'apprentissage et puis on recommence la validation. Au bout d'un certain temps, on passe au test : on fait calculer le total des ŷ et on voit le pourcentage de réussite global, sans avoir accès aux ŷ trouvés. + +L'objectif, c'est d'éviter l'underfitting et l'overfitting. L'over c'est de trop coller aux données qu'on a, et l'under c'est d'en être trop éloigné. Donc la solution va consister à alterner entre l'un et l'autre pour se rapprocher d'un modèle optimal : "good fit". + +On va donc pour ça partir de fonctions complexes, et tâcher de simplifier ces fonctions. + +### Tips and tricks + +La normalisation : dans un wx + b, on tente de minimiser le w. Il y a normalisation L2 et normalisation L1. Pour la L2, on obtient toujours quelque chose de convexe. La L1, non. Donc la L1 est plutôt utile pour faire de la sélection de variable. + +Si on ajoute L1 et L2, c'est l'"Elastic Net". Qu'on ajoute L1, L2 ou L1+L2 à la fonction de coût, on obtient des résultats différents. Il faut aussi pondérer l'hyperparamètre C pour pas qu'il soit trop petit ou trop grand. + +#### Numerical and Categorical variable + +Il s'agit de regrouper des variables ou de changer leur type en leur assignant des nombres. Sur une variable constante par exemple (de 0 à n), on peut décréter que de x à x' on est dans la variable [1,0,0], de x'' à x''' [O,1,0] et tout le reste [0,0,1]. + +#### Normalisation, standardisation + +L'idée est de ne pas se retrouver à donner plus d'importance à un paramètre qui a un champ plus large que d'autres (genre l'age de 1 à 100 va valoir plus que la taille de 0 à 2) on ramène tout à "de 0 à 1". + +Formule de normalisation de j pour sa donnée x : $\bar x^j = \frac{x^j - min^j}{max^j - min^j}$ + +Le Z-score, normalise en fonction de la moyenne, non plus en fonction min et max : c'est plus robuste : $\hat x = \frac{x^j - \mu^j}{\sigma^j}$ + +#### Transformation de cible + +L'idée est, sur des paramètres difficiles à expliquer, d'arriver sur des données plus "jolies à voir", plus facilement exploitables pour nous. Dans l'exemple sur le PDF, on a juste appliqué la fonction log aux données. + +#### Interaction entre les variables + +Parfois il ne suffit pas de prendre les paramètres mais de regarder les relations entre eux : on appelle ça une interaction. Les interactions consistent à rajouter un terme (paramètre) qui est le produit des deux paramètres. + +$y = b +w_1.age + w_2 .taille +w_3.age.taille$ +