{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img width=\"800px\" src=\"../fidle/img/00-Fidle-header-01.svg\"></img>\n",
    "\n",
    "# <!-- TITLE --> [POLR1] - Complexity Syndrome\n",
    "<!-- DESC --> Illustration of the problem of complexity with the polynomial regression\n",
    "<!-- AUTHOR : Jean-Luc Parouty (CNRS/SIMaP) -->\n",
    "\n",
    "## Objectives :\n",
    " - Visualizing and understanding under and overfitting\n",
    " \n",
    "## What we're going to do :\n",
    "\n",
    "We are looking for a polynomial function to approximate the observed series :  \n",
    "$ y = a_n\\cdot x^n + \\dots + a_i\\cdot x^i + \\dots + a_1\\cdot x + b $  \n",
    "\n",
    "\n",
    "## Step 1 - Import and init"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>\n",
       "\n",
       "div.warn {    \n",
       "    background-color: #fcf2f2;\n",
       "    border-color: #dFb5b4;\n",
       "    border-left: 5px solid #dfb5b4;\n",
       "    padding: 0.5em;\n",
       "    font-weight: bold;\n",
       "    font-size: 1.1em;;\n",
       "    }\n",
       "\n",
       "\n",
       "\n",
       "div.nota {    \n",
       "    background-color: #DAFFDE;\n",
       "    border-left: 5px solid #92CC99;\n",
       "    padding: 0.5em;\n",
       "    }\n",
       "\n",
       "div.todo:before { content:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1My44OTEyIiBoZWlnaHQ9IjE0My4zOTAyIiB2aWV3Qm94PSIwIDAgNTMuODkxMiAxNDMuMzkwMiI+PHRpdGxlPjAwLUJvYi10b2RvPC90aXRsZT48cGF0aCBkPSJNMjMuNDU2OCwxMTQuMzAxNmExLjgwNjMsMS44MDYzLDAsMSwxLDEuODE1NywxLjgyNEExLjgyMDksMS44MjA5LDAsMCwxLDIzLjQ1NjgsMTE0LjMwMTZabS0xMC42NjEyLDEuODIyQTEuODI3MiwxLjgyNzIsMCwxLDAsMTAuOTgsMTE0LjMsMS44MiwxLjgyLDAsMCwwLDEyLjc5NTYsMTE2LjEyMzZabS03LjcwNyw0LjU4NzR2LTVzLjQ4NjMtOS4xMjIzLDguMDIxNS0xMS45Njc1YTE5LjIwODIsMTkuMjA4MiwwLDAsMSw2LjA0ODYtMS4yNDU0LDE5LjE3NzgsMTkuMTc3OCwwLDAsMSw2LjA0ODcsMS4yNDc1YzcuNTM1MSwyLjgzNDcsOC4wMTc0LDExLjk2NzQsOC4wMTc0LDExLjk2NzR2NS4wMjM0bC4wMDQyLDcuNjgydjIuNGMuMDE2Ny4xOTkyLjAzMzYuMzkyMS4wMzM2LjU4NzEsMCwuMjEzOC0uMDE2OC40MTA5LS4wMzM2LjYzMzJ2LjA1ODdoLS4wMDg0YTguMzcxOSw4LjM3MTksMCwwLDEtNy4zNzM4LDcuNjU0N3MtLjk5NTMsMy42MzgtNi42OTMzLDMuNjM4LTYuNjkzNC0zLjYzOC02LjY5MzQtMy42MzhhOC4zNyw4LjM3LDAsMCwxLTcuMzcxNi03LjY1NDdINS4wODQzdi0uMDU4N2MtLjAxODktLjIyLS4wMjk0LS40MTk0LS4wMjk0LS42MzMyLDAtLjE5MjkuMDE2Ny0uMzgzNy4wMjk0LS41ODcxdi0yLjRtMTguMDkzNy00LjA0YTEuMTU2NSwxLjE1NjUsMCwxLDAtMi4zMTI2LDAsMS4xNTY0LDEuMTU2NCwwLDEsMCwyLjMxMjYsMFptNC4wODM0LDBhMS4xNTk1LDEuMTU5NSwwLDEsMC0xLjE2MzYsMS4xN0ExLjE3NSwxLjE3NSwwLDAsMCwyNy4yNjE0LDEyNC4zNzc5Wk05LjM3MzksMTE0LjYzNWMwLDMuMTA5MywyLjQxMzIsMy4zMSwyLjQxMzIsMy4zMWExMzMuOTI0MywxMzMuOTI0MywwLDAsMCwxNC43MzQ4LDBzMi40MTExLS4xOTI5LDIuNDExMS0zLjMxYTguMDc3Myw4LjA3NzMsMCwwLDAtMi40MTExLTUuNTUxOWMtNC41LTMuNTAzMy05LjkxMjYtMy41MDMzLTE0Ljc0MTEsMEE4LjA4NTEsOC4wODUxLDAsMCwwLDkuMzczOSwxMTQuNjM1WiIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxjaXJjbGUgY3g9IjMzLjE0MzYiIGN5PSIxMjQuNTM0IiByPSIzLjgzNjMiIHN0eWxlPSJmaWxsOiMwMTAxMDEiLz48cmVjdCB4PSIzNS42NjU5IiB5PSIxMTIuOTYyNSIgd2lkdGg9IjIuMDc3IiBoZWlnaHQ9IjEwLjU0NTgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIxLjYgMjQxLjExMjEpIHJvdGF0ZSgtMTU1Ljc0NikiIHN0eWxlPSJmaWxsOiMwMTAxMDEiLz48Y2lyY2xlIGN4PSIzOC44NzA0IiBjeT0iMTEzLjQyNzkiIHI9IjIuNDA4NSIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxjaXJjbGUgY3g9IjUuMjI0OCIgY3k9IjEyNC41MzQiIHI9IjMuODM2MyIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxyZWN0IHg9IjEuNDE2NCIgeT0iMTI0LjYzMDEiIHdpZHRoPSIyLjA3NyIgaGVpZ2h0PSIxMC41NDU4IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0LjkwOTcgMjU5LjgwNikgcm90YXRlKC0xODApIiBzdHlsZT0iZmlsbDojMDEwMTAxIi8+PGNpcmNsZSBjeD0iMi40MDkxIiBjeT0iMTM3LjA5OTYiIHI9IjIuNDA4NSIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxwYXRoIGQ9Ik0xOC4wNTExLDEwMC4xMDY2aC0uMDE0NlYxMDIuNjFoMi4zdi0yLjQyNzlhMi40MjI5LDIuNDIyOSwwLDEsMC0yLjI4NTQtLjA3NTVaIiBzdHlsZT0iZmlsbDojMDEwMTAxIi8+PHBhdGggZD0iTTM5LjQyMTQsMjcuMjU4djEuMDVBMTEuOTQ1MiwxMS45NDUyLDAsMCwwLDQ0LjU5NTQsNS43OWEuMjQ0OS4yNDQ5LDAsMCwxLS4wMjM1LS40MjI3TDQ2Ljc1LDMuOTUxNWEuMzg5Mi4zODkyLDAsMCwxLC40MjYyLDAsMTQuODQ0MiwxNC44NDQyLDAsMCwxLTcuNzU0MywyNy4yNTkxdjEuMDY3YS40NS40NSwwLDAsMS0uNzA0Ny4zNzU4bC0zLjg0MTktMi41MWEuNDUuNDUsMCwwLDEsMC0uNzUxNmwzLjg0MTktMi41MWEuNDUuNDUsMCwwLDEsLjY5NDYuMzc1OFpNNDMuMjMsMi41ODkyLDM5LjM4NzguMDc5NGEuNDUuNDUsMCwwLDAtLjcwNDYuMzc1OHYxLjA2N2ExNC44NDQyLDE0Ljg0NDIsMCwwLDAtNy43NTQzLDI3LjI1OTEuMzg5LjM4OSwwLDAsMCwuNDI2MSwwbDIuMTc3Ny0xLjQxOTNhLjI0NS4yNDUsMCwwLDAtLjAyMzUtLjQyMjgsMTEuOTQ1MSwxMS45NDUxLDAsMCwxLDUuMTc0LTIyLjUxNDZ2MS4wNWEuNDUuNDUsMCwwLDAsLjcwNDYuMzc1OGwzLjg1NTMtMi41MWEuNDUuNDUsMCwwLDAsMC0uNzUxNlpNMzkuMDUyMywxNC4yNDU4YTIuMTIwNiwyLjEyMDYsMCwxLDAsMi4xMjA2LDIuMTIwNmgwQTIuMTI0LDIuMTI0LDAsMCwwLDM5LjA1MjMsMTQuMjQ1OFptNi4wNzMyLTQuNzc4MS44MjU0LjgyNTVhMS4wNTY4LDEuMDU2OCwwLDAsMSwuMTE3NSwxLjM0MjFsLS44MDIsMS4xNDQyYTcuMTAxOCw3LjEwMTgsMCwwLDEsLjcxMTQsMS43MTEybDEuMzc1Ny4yNDE2YTEuMDU2OSwxLjA1NjksMCwwLDEsLjg3NTcsMS4wNHYxLjE2NDNhMS4wNTY5LDEuMDU2OSwwLDAsMS0uODc1NywxLjA0bC0xLjM3MjQuMjQxNkE3LjExLDcuMTEsMCwwLDEsNDUuMjcsMTkuOTNsLjgwMTksMS4xNDQyYTEuMDU3LDEuMDU3LDAsMCwxLS4xMTc0LDEuMzQyMmwtLjgyODguODQ4OWExLjA1NywxLjA1NywwLDAsMS0xLjM0MjEuMTE3NGwtMS4xNDQyLS44MDE5YTcuMTMzOCw3LjEzMzgsMCwwLDEtMS43MTEzLjcxMTNsLS4yNDE2LDEuMzcyNGExLjA1NjgsMS4wNTY4LDAsMCwxLTEuMDQuODc1N0gzOC40Njg0YTEuMDU2OCwxLjA1NjgsMCwwLDEtMS4wNC0uODc1N2wtLjI0MTYtMS4zNzI0YTcuMTM1NSw3LjEzNTUsMCwwLDEtMS43MTEzLS43MTEzbC0xLjE0NDEuODAxOWExLjA1NzEsMS4wNTcxLDAsMCwxLTEuMzQyMi0uMTE3NGwtLjgzNTUtLjgyNTVhMS4wNTcsMS4wNTcsMCwwLDEtLjExNzQtMS4zNDIxbC44MDE5LTEuMTQ0MmE3LjEyMSw3LjEyMSwwLDAsMS0uNzExMy0xLjcxMTJsLTEuMzcyNC0uMjQxNmExLjA1NjksMS4wNTY5LDAsMCwxLS44NzU3LTEuMDRWMTUuNzgyNmExLjA1NjksMS4wNTY5LDAsMCwxLC44NzU3LTEuMDRsMS4zNzU3LS4yNDE2YTcuMTEsNy4xMSwwLDAsMSwuNzExNC0xLjcxMTJsLS44MDItMS4xNDQyYTEuMDU3LDEuMDU3LDAsMCwxLC4xMTc1LTEuMzQyMmwuODI1NC0uODI1NEExLjA1NjgsMS4wNTY4LDAsMCwxLDM0LjMyNDUsOS4zNmwxLjE0NDIuODAxOUE3LjEzNTUsNy4xMzU1LDAsMCwxLDM3LjE4LDkuNDUxbC4yNDE2LTEuMzcyNGExLjA1NjgsMS4wNTY4LDAsMCwxLDEuMDQtLjg3NTdoMS4xNjc3YTEuMDU2OSwxLjA1NjksMCwwLDEsMS4wNC44NzU3bC4yNDE2LDEuMzcyNGE3LjEyNSw3LjEyNSwwLDAsMSwxLjcxMTIuNzExM0w0My43NjY2LDkuMzZBMS4wNTY5LDEuMDU2OSwwLDAsMSw0NS4xMjU1LDkuNDY3N1ptLTIuMDMsNi44OTg3QTQuMDQzMyw0LjA0MzMsMCwxLDAsMzkuMDUyMywyMC40MWgwQTQuMDQ2NSw0LjA0NjUsMCwwLDAsNDMuMDk1NSwxNi4zNjY0WiIgc3R5bGU9ImZpbGw6I2UxMjIyOSIvPjxwb2x5Z29uIHBvaW50cz0iMzkuNDEzIDM0Ljc1NyAzOS41MzcgMzQuNzU3IDM5LjY3NSAzNC43NTcgMzkuNjc1IDEwOS41MSAzOS41MzcgMTA5LjUxIDM5LjQxMyAxMDkuNTEgMzkuNDEzIDM0Ljc1NyAzOS40MTMgMzQuNzU3IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojOTk5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS13aWR0aDowLjMwODg1NDQ1MDU2MDE2MThweDtmaWxsLXJ1bGU6ZXZlbm9kZCIvPjwvc3ZnPg==);\n",
       "    float:left;\n",
       "    margin-right:20px;\n",
       "    margin-top:-20px;\n",
       "    margin-bottom:20px;\n",
       "}\n",
       "div.todo{\n",
       "    font-weight: bold;\n",
       "    font-size: 1.1em;\n",
       "    margin-top:40px;\n",
       "}\n",
       "div.todo ul{\n",
       "    margin: 0.2em;\n",
       "}\n",
       "div.todo li{\n",
       "    margin-left:60px;\n",
       "    margin-top:0;\n",
       "    margin-bottom:0;\n",
       "}\n",
       "\n",
       "div .comment{\n",
       "    font-size:0.8em;\n",
       "    color:#696969;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "</style>\n",
       "\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "<br>**FIDLE 2020 - Practical Work Module**"
      ],
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Version              : 2.0.7\n",
      "Notebook id          : POLR1\n",
      "Run time             : Wednesday 27 January 2021, 18:21:25\n",
      "TensorFlow version   : 2.2.0\n",
      "Keras version        : 2.3.0-tf\n",
      "Datasets dir         : /gpfswork/rech/mlh/uja62cb/datasets\n",
      "Run dir              : ./run\n",
      "Update keras cache   : False\n",
      "Save figs            : True\n",
      "Path figs            : ./run/figs\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import math\n",
    "import random\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import sys\n",
    "\n",
    "sys.path.append('..')\n",
    "import fidle.pwk as pwk\n",
    "\n",
    "datasets_dir = pwk.init('POLR1')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 2 - Dataset generation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/markdown": [
       "#### Generator :"
      ],
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Nomber of points=100  deg=7 bruit=2000\n"
     ]
    },
    {
     "data": {
      "text/markdown": [
       "#### Datasets :"
      ],
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100 points visibles sur 100)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div class=\"comment\">Saved: ./run/figs/POLR1-01-dataset</div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/markdown": [
       "#### Before normalization :"
      ],
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X        :      mean=     +0.1644  std=     +2.9720    min=     -4.8249    max=     +4.9626\n",
      "Y        :      mean=  +3725.5154  std=  +5588.8423    min=  -4444.4891    max= +20523.5943\n"
     ]
    },
    {
     "data": {
      "text/markdown": [
       "#### After normalization :"
      ],
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_norm   :      mean=     -0.0000  std=     +1.0000    min=     -1.6788    max=     +1.6144\n",
      "Y_norm   :      mean=     -0.0000  std=     +1.0000    min=     -1.4618    max=     +3.0056\n"
     ]
    }
   ],
   "source": [
    "# ---- Parameters\n",
    "\n",
    "n         = 100\n",
    "\n",
    "xob_min   = -5\n",
    "xob_max   = 5\n",
    "\n",
    "deg       =  7\n",
    "a_min     = -2\n",
    "a_max     =  2\n",
    "\n",
    "noise     =  2000\n",
    "\n",
    "# ---- Train data\n",
    "#      X,Y              : data\n",
    "#      X_norm,Y_norm    : normalized data\n",
    "\n",
    "X = np.random.uniform(xob_min,xob_max,(n,1))\n",
    "# N = np.random.uniform(-noise,noise,(n,1))\n",
    "N = noise * np.random.normal(0,1,(n,1))\n",
    "\n",
    "a = np.random.uniform(a_min,a_max, (deg,))\n",
    "fy = np.poly1d( a )\n",
    "\n",
    "Y = fy(X) + N\n",
    "\n",
    "# ---- Data normalization\n",
    "#\n",
    "X_norm = (X - X.mean(axis=0)) / X.std(axis=0)\n",
    "Y_norm = (Y - Y.mean(axis=0)) / Y.std(axis=0)\n",
    "\n",
    "# ---- Data visualization\n",
    "\n",
    "width = 12\n",
    "height = 6\n",
    "nb_viz = min(2000,n)\n",
    "\n",
    "def vector_infos(name,V):\n",
    "    m=V.mean(axis=0).item()\n",
    "    s=V.std(axis=0).item()\n",
    "    print(\"{:8} :      mean={:+12.4f}  std={:+12.4f}    min={:+12.4f}    max={:+12.4f}\".format(name,m,s,V.min(),V.max()))\n",
    "\n",
    "\n",
    "pwk.display_md('#### Generator :')\n",
    "print(f\"Nomber of points={n}  deg={deg} bruit={noise}\")\n",
    "\n",
    "pwk.display_md('#### Datasets :')\n",
    "print(f\"{nb_viz} points visibles sur {n})\")\n",
    "plt.figure(figsize=(width, height))\n",
    "plt.plot(X[:nb_viz], Y[:nb_viz], '.')\n",
    "plt.tick_params(axis='both', which='both', bottom=False, left=False, labelbottom=False, labelleft=False)\n",
    "plt.xlabel('x axis')\n",
    "plt.ylabel('y axis')\n",
    "pwk.save_fig(\"01-dataset\")\n",
    "plt.show()\n",
    "\n",
    "pwk.display_md('#### Before normalization :')\n",
    "vector_infos('X',X)\n",
    "vector_infos('Y',Y)\n",
    "\n",
    "pwk.display_md('#### After normalization :')         \n",
    "vector_infos('X_norm',X_norm)\n",
    "vector_infos('Y_norm',Y_norm)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 3 - Polynomial regression with NumPy\n",
    "### 3.1 - Underfitting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def draw_reg(X_norm, Y_norm, x_hat,fy_hat, size, save_as):\n",
    "    plt.figure(figsize=size)\n",
    "    plt.plot(X_norm, Y_norm, '.')\n",
    "\n",
    "    x_hat = np.linspace(X_norm.min(), X_norm.max(), 100)\n",
    "\n",
    "    plt.plot(x_hat, fy_hat(x_hat))\n",
    "    plt.tick_params(axis='both', which='both', bottom=False, left=False, labelbottom=False, labelleft=False)\n",
    "    plt.xlabel('x axis')\n",
    "    plt.ylabel('y axis')\n",
    "    pwk.save_fig(save_as)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Nombre de degrés : 1\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div class=\"comment\">Saved: ./run/figs/POLR1-02-underfitting</div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "reg_deg=1\n",
    "\n",
    "a_hat   = np.polyfit(X_norm.reshape(-1,), Y_norm.reshape(-1,), reg_deg)\n",
    "fy_hat  = np.poly1d( a_hat )\n",
    "\n",
    "print(f'Nombre de degrés : {reg_deg}')\n",
    "draw_reg(X_norm[:nb_viz],Y_norm[:nb_viz], X_norm,fy_hat, (width,height), save_as='02-underfitting')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 - Good fitting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Nombre de degrés : 5\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div class=\"comment\">Saved: ./run/figs/POLR1-03-good_fitting</div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "reg_deg=5\n",
    "\n",
    "a_hat   = np.polyfit(X_norm.reshape(-1,), Y_norm.reshape(-1,), reg_deg)\n",
    "fy_hat  = np.poly1d( a_hat )\n",
    "\n",
    "print(f'Nombre de degrés : {reg_deg}')\n",
    "draw_reg(X_norm[:nb_viz],Y_norm[:nb_viz], X_norm,fy_hat, (width,height), save_as='03-good_fitting')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.3 - Overfitting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Nombre de degrés : 24\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div class=\"comment\">Saved: ./run/figs/POLR1-04-over_fitting</div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "reg_deg=24\n",
    "\n",
    "a_hat   = np.polyfit(X_norm.reshape(-1,), Y_norm.reshape(-1,), reg_deg)\n",
    "fy_hat  = np.poly1d( a_hat )\n",
    "\n",
    "print(f'Nombre de degrés : {reg_deg}')\n",
    "draw_reg(X_norm[:nb_viz],Y_norm[:nb_viz], X_norm,fy_hat, (width,height), save_as='04-over_fitting')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "End time is : Wednesday 27 January 2021, 18:21:29\n",
      "Duration is : 00:00:05 537ms\n",
      "This notebook ends here\n"
     ]
    }
   ],
   "source": [
    "pwk.end()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "<img width=\"80px\" src=\"../fidle/img/00-Fidle-logo-01.svg\"></img>"
   ]
  }
 ],
 "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.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}