{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3d22f9ad-4990-43fb-9b79-cd2c03883b2a",
   "metadata": {},
   "source": [
    "# Simulation de variables aléatoires\n",
    "\n",
    "## Notebook jupyter\n",
    "Le notebook est un document interactif, qui permet de mélanger du texte et des lignes de code (pour nous, c'est du code `python`). Il est possible d'exécuter le code, de le modifier, et d'ajouter (ou de supprimer) des cellules de code ou de commentaire. Vous avez la possibilité d'enregistrer les modifications par le bouton correspondant dans la barre à outils en haut. \n",
    "\n",
    "Pour lire ou éditer un notebook (fichier au format .ipynb) vous pouvez utiliser deux environnements qui s'ouvrent dans un navigateur web: \n",
    "\n",
    "- `jupyter notebook` la version classique qui ouvre un serveur sur l'adresse `http://localhost:8888/`\n",
    "- `jupyter lab` la version plus moderne avec du code javascript pour \"une IDE\" plus dynamique `http://localhost:8888/lab`\n",
    "\n",
    "Dans la cellule de code suivante, vous voyez des instructions en `python`. Pour les exécuter, il faut d'abord cliquer dans la cellule pour la sélectionner, puis faire `Shift+Enter`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "6b5cb3c9-d75d-45a2-9b38-6d23db106605",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "20"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = 17\n",
    "x      # pour afficher la valeur de x on utilise print(x)\n",
    "y = x + 3\n",
    "y      # la dernière instruction est renvoyée, pour éviter l'affichage on peut mettre un ; à la fin: y; "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2cc77fce-ae6f-46e1-832d-973f4a208b03",
   "metadata": {
    "tags": []
   },
   "source": [
    "Les variables `x` et `y` sont désormais définies. Dans la suite, vous pouvez les utiliser et travailler avec. Autrement dit, les notebooks sont un moyen pour excécuter du code progressivement. \n",
    "Exécuter la cellule suivante pour calculer le carré de `y`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "0636fb2d-ff25-416e-93eb-1508df57d497",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "400"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y**2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43b7bcd0-660b-4a5d-9a05-daec70485e81",
   "metadata": {},
   "source": [
    "Au fur et à mesure que vous exécutez des cellules de code, vous voyez apparaître des numéros entre crochets à gauche de la cellule. Ces numéros vous aident à garder une trace de l'ordre dans lequel vous exécutez les cellules. Juste pour voir, revenez à la première cellule de code et modifiez la valeur de `y`. Puis, réexécutez la cellule. Cela change la sortie de la première cellule, mais pas de la deuxième (alors que la valeur de `y` a changé). Les numéros entre crochets vous permettent donc de vous répérer plus facilement.\n",
    "\n",
    "Parfois, quand on vient d'exécuter plein de cellules, on perd un peu le contrôle, et on ne sait plus quelles sont les valeurs actuelles des différentes variables. Dans ce cas, il vaut mieux de reprendre à zéro. Pour cela, sélectionnez **Kernel** en haut de la page et choissisez **Restart**. Vous pouvez observer que tous les numéros entre crochets disparaissent ainsi que toutes les sorties en-dessous des cellules de code. Un **Restart** du **Kernel** revient alors à supprimer tous les objets créés.\n",
    "\n",
    "Vous pouvez modifier un notebook comme bon vous semble. Par exemple pour ajouter une cellule, cliquer sur le symbole **+** dans la barre à outils. Cela crée une nouvelle cellule juste en-dessous de la dernière cellule sélectionnée. Par défaut, il s'agit d'une cellule de code dans laquelle vous pouvez écrire des instructions en `python`. Si la nouvelle cellule doit contenir du texte, il suffit de modifier son type par le menu déroulant en changeant **Code** en **Markdown**. Le **Markdown** permet d'écrire du texte, le formatage est très simple. Si cela vous intéresse, double-cliquez sur les cellules de type **Markdown** dans ce notebook pour voir comment ajouter un titre, mettre du texte **en gras** ou *en italique*, créer une liste etc. N'oubliez pas qu'il faut aussi exécuter les cellules **Markdown** en appuyant sur la flèche vers la droite dans la barre à outils."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "0d6df987-a11e-40ec-b640-dd80926fcba1",
   "metadata": {
    "attributes": {
     "classes": [],
     "eval": "FALSE",
     "id": ""
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "20"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x <- 17\n",
    "x\n",
    "y <- x + 3\n",
    "y"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "89f1ed13-aeb9-4f25-872e-fc540d6c1aec",
   "metadata": {},
   "source": [
    "Pour des rappels sur le langage `python` et sur le module `numpy` nous renvoyons sur les pages suivantes:\n",
    "\n",
    "- [rappels python](https://perso.lpsm.paris/~vlemaire/4ma074/tp/outils/bases_python.html): parcourir rapidement cette page pour se rafraichir la mémoire sur python\n",
    "- [numpy array](https://perso.lpsm.paris/~vlemaire/4ma074/tp/outils/numpy.html): structure de donnée que l'on utilisera tout au long de ce cours: **à connaitre rapidement!** \n",
    "\n",
    "Dans la cellule suivante, on charge les modules que l'on utilisera pendant ces séances de TP. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "ffd70230-5922-4067-a67f-f9747f4b2f71",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'seaborn'",
     "output_type": "error",
     "traceback": [
      "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
      "\u001b[31mModuleNotFoundError\u001b[39m                       Traceback (most recent call last)",
      "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[54]\u001b[39m\u001b[32m, line 4\u001b[39m\n\u001b[32m      2\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mscipy\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m stats\n\u001b[32m      3\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mmatplotlib\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mpyplot\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mplt\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m4\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mseaborn\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mas\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01msns\u001b[39;00m \u001b[38;5;66;03m# pour des jolis plot\u001b[39;00m\n\u001b[32m      5\u001b[39m sns.set_theme() \n",
      "\u001b[31mModuleNotFoundError\u001b[39m: No module named 'seaborn'"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from scipy import stats\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns # pour des jolis plot\n",
    "sns.set_theme() "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "203a42cd-983a-44c9-9338-3cd70c49c3f7",
   "metadata": {},
   "source": [
    "## Nombres pseudo-aléatoires\n",
    "\n",
    "Depuis la version 1.17 de `numpy` en juillet 2019, le module `random` a évolué. Vous trouverez encore beaucoup de code sur internet ou dans des livres qui n'utilisent pas la nouvelle syntaxe de ce module, mais dans ce cours nous utiliserons cette nouvelle syntaxe. La différence majeure (en dehors des algorithmes utilisés en interne) est l'utilisation d'un **objet** que nous appelerons `rng` de type `Generator` qui correspond au générateur de nombres pseudo-aléatoires. Pour simuler une loi classique on fera appel à **une méthode**. \n",
    "\n",
    "Par défaut, l'algorithme utilisé est le `PCG64` à la différence du Mersenne-Twister qui était le standard auparavant. \n",
    "\n",
    "Exécuter les commandes suivantes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "29e5839c-7d26-41f5-b365-08c93425a9d9",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Le type de l'objet rng est:  Generator(PCG64)\n",
      "Les méthodes utilisables avec l'objet rng sont:\n",
      " ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '_bit_generator', '_poisson_lam_max', 'beta', 'binomial', 'bit_generator', 'bytes', 'chisquare', 'choice', 'dirichlet', 'exponential', 'f', 'gamma', 'geometric', 'gumbel', 'hypergeometric', 'integers', 'laplace', 'logistic', 'lognormal', 'logseries', 'multinomial', 'multivariate_hypergeometric', 'multivariate_normal', 'negative_binomial', 'noncentral_chisquare', 'noncentral_f', 'normal', 'pareto', 'permutation', 'permuted', 'poisson', 'power', 'random', 'rayleigh', 'shuffle', 'spawn', 'standard_cauchy', 'standard_exponential', 'standard_gamma', 'standard_normal', 'standard_t', 'triangular', 'uniform', 'vonmises', 'wald', 'weibull', 'zipf']\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from numpy.random import default_rng\n",
    "\n",
    "rng = default_rng()\n",
    "print(\"Le type de l'objet rng est: \", rng)\n",
    "print(\"Les méthodes utilisables avec l'objet rng sont:\\n\", dir(rng))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "088f068a-b3d8-435a-b8f2-b7f93dc01e0d",
   "metadata": {},
   "source": [
    "L'objet `rng` est défini une fois pour toute et tout l'aléatoire de notre code se fera par des appels à des méthodes de cet objet. C'est un peu comme si on fixait un espace de probabilité $(\\Omega, \\mathcal{A}, \\mathbf{P})$ (notre espace de simulation) et que l'on construisait toutes les variables aléatoires sur cet espace.\n",
    "\n",
    "Vérifions tout d'abord que les nombres pseudo-aléatoires produits $(X_1, \\dots, X_n)$ sont uniforméments répartis et qu'il y a indépendance entre 2 tirages $X_k$ et $X_{k+1}$ pour $k=1,\\dots,n-1$. On fait cette vérification uniquement visuellement en traçant l'histogramme de l'échantillon $(X_1, \\dots, X_n)$ et le nuage de points des paires adjacentes $(X_k, X_{k+1})_{k=1,\\dots,n-1}$ (ce nuage doit remplir uniformément le carré unité $[0,1]\\times[0,1]$).\n",
    "\n",
    "Voici le graphique obtenu avec un échantillon de taille $n = 100\\,000$.\n",
    "\n",
    "![](img/pseudo_alea.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "daeadd7f-1b75-4b38-b6ad-f561c7cc88db",
   "metadata": {
    "tags": [
     "question"
    ]
   },
   "source": [
    "### Question: `rng.random`\n",
    "Lire la documentation de la fonction `rng.random`. Construire un échantillon `sample` de taille `100000`. Reproduire le graphe de l'histogramme de `sample` et des paires adjacentes ci-dessus (le nombre de `bins` pour l'histogramme est 20 et la taille d'un point est `s=0.5` de transparence `alpha=0.2`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "65fa00f3-0e1b-4824-8569-afe4153a2774",
   "metadata": {
    "tags": [
     "aremplir"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.35323184, 0.789911  , 0.60974182, ..., 0.29312551, 0.56997291,\n",
       "       0.35829361], shape=(10000,))"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "size = 10000\n",
    "sample = rng.random(size=size)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "74efe4f3",
   "metadata": {},
   "source": [
    "## La loi exponentielle\n",
    "\n",
    "On considère la loi exponentielle de paramètre $\\lambda = 2$. On rappelle la densité $f_\\lambda$ et l'inverse de la fonction de répartition (la fonction quantile) $F_\\lambda^{-1}$\n",
    "\n",
    "$$\n",
    "f_\\lambda(x) = \\lambda e^{-\\lambda x} \\mathbf{1}_{x > 0} \\quad \\text{et} \\quad \\forall u \\in [0, 1[, \\; F_\\lambda^{-1}(u) = \\frac{-\\log(1-u)}{\\lambda}.\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "41a0c5bf-664f-40f9-b4d3-00ebb13185bf",
   "metadata": {
    "tags": [
     "question"
    ]
   },
   "source": [
    "### Question: 2 façons de simuler\n",
    "\n",
    "On veut comparer 2 échantillons de taille $n = 10\\,000$ de la loi $\\mathcal{E}(\\lambda)$, $\\lambda = 2$:\n",
    "\n",
    "- le premier `sample_numpy` obtenu par un appel de `rng.exponential`\n",
    "- le second `sample_quantile` obtenu par transformation par $F_\\lambda^{-1}$ d'un échantillon $(U_1, \\dots, U_n)$ _i.i.d._ avec $U_i \\sim \\mathcal{U}([0, 1[)$.\n",
    "\n",
    "Vérifier que la moyenne de chacun de ces échantillons est proche de $\\frac{1}{\\lambda}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85822341-6d6f-42ab-b572-746f118d2adc",
   "metadata": {
    "tags": [
     "aremplir"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Empirical mean (numpy):  0.49625729219406495\n",
      "Empirical mean (numpy):  0.5067582769709692\n"
     ]
    }
   ],
   "source": [
    "lambd = 2\n",
    "size = 10000\n",
    "sample_numpy = rng.exponential(scale=1/lambd, size=size)\n",
    "print(\"Empirical mean (numpy): \", np.mean(sample_numpy))\n",
    "\n",
    "unifs = rng.random(size=size)\n",
    "sample_quantile = -np.log(unifs)/lambd\n",
    "print(\"Empirical mean (numpy): \", np.mean(sample_quantile))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e586765d-300c-4972-bfe9-79eedd75fb63",
   "metadata": {
    "tags": [
     "question"
    ]
   },
   "source": [
    "### Question: représentation graphique\n",
    "\n",
    "On compare graphiquement les histogrammes de ces échantillons `sample_numpy` et `sample_quantile` avec la densité de la loi exponentielle (de paramètre $\\lambda=2$). Ecrire le code pour obtenir le graphique suivante:\n",
    "\n",
    "![](img/expo.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5e89e544-d1f5-451a-bbc4-ae6f2c269f85",
   "metadata": {
    "tags": [
     "aremplir"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m = max(sample_numpy.max(), sample_quantile.max())\n",
    "\n",
    "u = np.linspace(0, m, 1000)\n",
    "f_u = lambd * np.exp(-lambd * u)\n",
    "                     \n",
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharey=True, layout='tight')\n",
    "ax1.hist(sample_numpy, bins=50, density=True, alpha=0.5, label='Numpy Exponential')\n",
    "ax2.hist(sample_quantile, bins=50, density=True, alpha=0.5, label='Numpy Exponential using F-1')\n",
    "\n",
    "for ax in (ax1, ax2):\n",
    "    ax.plot(u, f_u, label='Theoretical PDF')\n",
    "    ax.set_xlim(0, 3)\n",
    "    ax.legend()\n",
    "\n",
    "fig.suptitle('Comparison of Exponential Samples')\n",
    "plt.show()\n",
    "#plt.savefig('img/expo.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "821dc76d-5b0d-4146-8d36-e50b2e090f0e",
   "metadata": {
    "tags": [
     "question"
    ]
   },
   "source": [
    "### Question: utilisation de `scipy.stats`\n",
    "\n",
    "Reprendre les 2 questions précédentes en utilisant un objet `E` de classe `stats.expon`. Lire la documentation de cette classe et utiliser les méthodes `rvs` (avec l'argument `random_state=rng`), `ppf` et `pdf`. Le but est d'écrire un code qui pourrait s'executer avec n'importe quelle loi à densité (une classe qui contient un méthode `pdf` et non `pmf`). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2cc9836e-9f08-4044-bec8-bd15d51df564",
   "metadata": {
    "tags": [
     "aremplir"
    ]
   },
   "outputs": [],
   "source": [
    "from scipy import stats\n",
    "\n",
    "E = stats.expon(scale=1/lambd)  # scale = 1/lambd\n",
    "sample_scipy = E.rvs(size=5000, random_state=rng)\n",
    "\n",
    "unifs = rng.random(size=5000)\n",
    "sample_ppf = E.ppf(unifs) # inverse de la fonction quantile. Donc direcrement F-1\n",
    "\n",
    "m = max(sample_scipy.max(), sample_ppf.max())\n",
    "u = np.linspace(0, m, 100)\n",
    "f_u = E.pdf(u)\n",
    "\n",
    "# fig, (ax1, ax2) = plt.subplots() A continué"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c48b03e3-6de1-4bf0-8238-d5f11bb57a88",
   "metadata": {},
   "source": [
    "## Illustration de la méthode du rejet"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c709d792-02bc-427d-8be6-a05f700cf5df",
   "metadata": {},
   "source": [
    "On propose d'illustrer la méthode du rejet dans le cas d'une loi bêta de paramètres $\\alpha > 1$ et $\\beta > 1$. On rappelle la forme de la densité de la loi\n",
    "\n",
    "$$\n",
    "  f_{\\alpha, \\beta}(x) = \\frac{1}{B(\\alpha, \\beta)} \n",
    "  x^{\\alpha-1} (1-x)^{\\beta-1} \\mathbf{1}_{[0,1]}(x)\n",
    "$$\n",
    "\n",
    "où $B(\\alpha, \\beta)$ est la constante de normalisation de la loi. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14bc87a5-0b6b-4cc2-bce3-529bed7dde02",
   "metadata": {
    "tags": [
     "question"
    ]
   },
   "source": [
    "### Question: illustration du rejet\n",
    "\n",
    "Le but est de créer le graphique suivant représentant la méthode du rejet pour une loi bêta de paramètres $\\alpha = 1.5$ et $\\beta = 3$ et une loi auxiliaire qui est la loi uniforme sur $[0,1]$, c'est à dire $g(x) = \\mathbf{1}_{[0,1]}(x)$. La ligne rouge represente $c g(x)$ avec $c = 2$, la courbe bleue correspond à la densité $f_{\\alpha, \\beta}$, les points bleus sont les réalisations acceptées (parmi 5000 réalisations) et les points orangés sont les réalisations rejetées.\n",
    "\n",
    "![](img/rejet.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f427a3a8-4a48-40cf-b646-c33e9257a0ed",
   "metadata": {
    "tags": [
     "aremplir"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x400 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "alpha = 1.5\n",
    "beta = 3\n",
    "c = 2\n",
    "size = 5000\n",
    "\n",
    "distrib = stats.beta(a=alpha, b=beta)\n",
    "\n",
    "sample = rng.random(size=size)\n",
    "unif_test = rng.random(size=size)\n",
    "\n",
    "\n",
    "accepted = unif_test * c < distrib.pdf(sample)\n",
    "rejected = ~accepted\n",
    "\n",
    "X_distrib = sample[accepted]  # pour voir les échantillons acceptés\n",
    "\n",
    "fig, (ax1, ax2, ax3 , ax4) = plt.subplots(1, 2, figsize=(8, 4), sharey=True, layout='tight')\n",
    "\n",
    "u = np.linspace(0, m, 1000)\n",
    "f_u = distrib.pdf(u)\n",
    "\n",
    "\n",
    "\n",
    "ax1.hist(X_distrib, bins=50, density=True, alpha=0.5, label='Accepted Samples')\n",
    "ax2.hist(distrib.ppf(sample), bins=50, density=True, alpha=0.5, label='True distribution Samples')\n",
    "\n",
    "\n",
    "\n",
    "for ax in (ax1, ax2):\n",
    "    ax.plot(u, f_u, label='Theoretical PDF')\n",
    "    ax.set_xlim(0, 1)\n",
    "    ax.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8ad3c29e-0b2f-4946-ae5c-4a5b46773dca",
   "metadata": {
    "tags": [
     "question"
    ]
   },
   "source": [
    "### Question: optimisation de la constante $c$ \n",
    "\n",
    "La constante optimale $c$ que l'on peut utiliser dans cet exemple (en considérant $g(x) = \\mathbf{1}_{[0,1]}(x)$) est $c^* = \\max_{x \\in [0,1]} f_{\\alpha, \\beta}(x)=f_{\\alpha,\\beta}(x^*)$. On peut calculer explicitement ce maximum qui correspond au mode de la distribution bêta\n",
    "\n",
    "$$\n",
    "    x^* = \\operatorname{argmax}_{x \\in [0,1]} f_{\\alpha, \\beta}(x) = \\frac{\\alpha-1}{\\alpha + \\beta - 2} \\quad \\text{pour $\\alpha > 1, \\beta > 1$}.\n",
    "$$\n",
    "\n",
    "Dans un cas plus général on ne connaît pas forcément ce maximum mais on peut l'approcher et trouver une approximation par un algorithme type dichotomie ou descente de gradient (méthode de Newton). \n",
    "\n",
    "Utiliser la fonction `scipy.optimize.minimize_scalar` (après avoir lu la documentation) avec les options `bounds=(0, 1)` et `method=\"bounded\"` pour trouver la valeur $c^*$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9bef9537-5d4a-444b-b145-c1571cc43263",
   "metadata": {
    "tags": [
     "aremplir"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Maximum of the PDF found at x =  0.19999841528793666\n",
      "Constant c for rejection sampling:  1.878297101062972\n"
     ]
    }
   ],
   "source": [
    "from scipy import optimize\n",
    "\n",
    "res = optimize.minimize_scalar(lambda x: -distrib.pdf(x), bounds=(0, 1), method='bounded')\n",
    "print(\"Maximum of the PDF found at x = \", res.x)\n",
    "\n",
    "c = -res.fun\n",
    "\n",
    "print(\"Constant c for rejection sampling: \", c)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c132c2ad",
   "metadata": {},
   "source": [
    "## Loi binomiale: définition probabiliste _vs_ inverse de la fonction de répartition\n",
    "\n",
    "On veut comparer deux algorithmes pour la simulation d'une loi binomiale $X \\sim B(n, p)$, $n \\ge 2$, $p \\in ]0,1[$.\n",
    "\n",
    "- Le premier algorithme utilise la définition de la loi binomiale comme somme de $n$ variables aléatoires $(B_1, \\dots, B_n)$ indépendantes de Bernoulli de paramètre $p \\in ]0,1[$, $\\mathbf{P}[B_1 = 1] = p = 1 - \\mathbf{P}[B_1 = 0]$, \n",
    "\n",
    "$$\n",
    "  X = \\sum_{k=1}^n B_k. \n",
    "$$ \n",
    "\n",
    "- Le deuxième algorithme utilise l'inverse de la fonction de répartition de la loi binomiale. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bb82c513-e77d-4526-8b44-ebeaa2095461",
   "metadata": {
    "tags": [
     "question"
    ]
   },
   "source": [
    "### Question: algorithme 1.\n",
    "\n",
    "Compléter la fonction `binomial_from_def` qui implémente naïvement le premier algorithme et renvoie un échantillon de taille `size`. Attention cette première approche (la plus naturelle quand on débute) sera améliorée dans la suite. Ce n'est pas la façon optimale d'écrire le code en `numpy`.\n",
    "```\n",
    "def binomial_from_def(size: int, n: int=2, p: float=0.5):\n",
    "    \"\"\" \n",
    "    Draw samples from a binomial distribution B(n, p).\n",
    "    Algorithm: first implementation of sum of independent Bernoulli trials.\n",
    "    \"\"\"\n",
    "    def one_realization():\n",
    "        # code à écrire\n",
    "    # code à écrire\n",
    "    return sample\n",
    "```\n",
    "\n",
    "Vérifier que le code est correct en traçant l'histogramme d'un échantillon de taille $10\\,000$. Vous devez obtenir ce graphique:\n",
    "\n",
    "![](img/binom_def.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "421400d2-e23d-4dd7-b33d-14b99ef4dab9",
   "metadata": {
    "tags": [
     "aremplir"
    ]
   },
   "outputs": [],
   "source": [
    "def binomial_from_def(size: int, n: int=2, p: float=0.5):\n",
    "    \"\"\" \n",
    "    Draw samples from a binomial distribution B(n, p).\n",
    "    Algorithm: first implementation of sum of independent Bernoulli trials.\n",
    "    \"\"\"\n",
    "    def one_realization():\n",
    "        return np.sum(rng.random(n) < p)\n",
    "    \n",
    "    sample = np.array([one_realization() for _ in range(size)])\n",
    "    return sample"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7a2d477d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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ww8/uPvUsWH9+vXp9lWP0f1aLnL52Fu3bt2O2nMCAOQ8CfeKHT16tAtYPXv2dNMTJkywt99+255//nkbMGBAuuWbNm3qbhLvfildunTUtELgaaedZm3atEnXwDyjcHjcSDtk9uNcs12bzYqUNavSyix3ano5KlBEBu4hQ4bYypUrw/OKFCliixYtsmNh//79lj9//mw//li8z2eeeabNmjXLDh48aJ9++qndeOON7ofJU089FV6mYsWK9re//c0GDhwYnvfiiy+6+WvWrEm3Tq1P643tAQsAwDEvsdPJevHixda2bdv/rSB3bjc9b968pOyQtvHSSy+5k2psg/KXX37ZSpUqZXXr1nUnVp10jytfv2k2pq7Zi5eZ/bPXf/5qWvNTQOEnuBUrVsy9XpHzFOwCet+aNGniwnGrVq2iAqC88cYbdtZZZ7nqdZWwDh8+3AWcgELLlVde6dZZtGhRu/baa23z5s3pSt6effZZq1atmluPqAr4pptucuFdj7vgggvs888/d/e98MILbjuaDkq0NC9eVey6deusS5cuVqJECTvppJPcc5k/f767b/Xq1W7fypYt6/ZPPyQUqBKlUje9bqeeeqp17tzZunbtam++Gf3e9ejRwyZOnBg1T9OaH4+Gz4l9nwAAOC6C3bZt29yYbzqBRtK0BvhNBp3MFQZuuOGGqPnXX3+9C3wffPCBC3V///vfM63W2rdvn+3cuTPqllIKb691N9u5IXr+zo3/mZ+icJdVf/zjH23UqFGuBE8BRsE58PHHH1v37t3tzjvvtK+//tqVUClg/fnPf3b3p6WlueD0888/24cffuiqyr/77jsXfiKtWrXK/vnPf9rUqVNt2bJl4ep0VdP/61//cuFS4fHCCy9069Lj7777bleiFVSvx65TVB2q0ltVgSpoKQjee++9br+C+y+99FKbPXu2LV261C6++GK7/PLL45agJUKla/qhEemKK66wX375xT755BM3rb+a1vYAADjWjrsBip977jnXtqpChQpR82+++ebw/+vVq+dG6FdAUGmNqm1jjRgxwpUGHbXq1xn36ToCce7UvFxmMwaY1W6fsmrZw1FIC6q2VSXevn1727t3rytZ0+ukeUGpk0rsHnzwQRee1JZSgenLL7+077//3ipVquSWUXWkApnaRwZV7QpBmh9UrSv0qGONgl2BAgXcvEcf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yj+bei7q6a9B0rVdXYv622+/Tfp2pk6dahdddJE7LnT/smXLkv58NBzUfffd5465k046yS2jYag2bNiQ9Oejz5Q+Q9rOKaec4l43jUGa7O1EuvXWW90yGmor2du54YYb0n2eNNRWKp7PN998Y1dccYUbdFavn77XNapEsrcV7ztCt0ceeSSp29m1a5cbueLUU091n6E6deq44cmS/Xx08QK9T7q/cOHC7v3Jzmd1RBbOpXv37nXfp/q8FilSxI3GEXvBheNRjgh2kydPduPvqQvzkiVLrEGDBtauXbt0V7M4UhqyRetWiEyVDz/80B1on332mRvoWV/iOlFo28mkD6dClgaFViC54IIL7Morr7SvvvrKUkUn8KeeesoFylQ588wzbePGjeHbJ598kvRt/PLLL3b22Wdbvnz5XBj++uuv3TiOOvEl+/WKfC46HuSaa65J6nb+8pe/uKA/duxYdzLS9MMPP2xPPPGEJdtNN93knsff//53+/LLL92xrbCgoJzKz6aej4ZP0olIwUQnWn1H6Is9mdvR/RrOSa/hkchsO3v27HHfcwrj+qswqROWQkQytyOnn366Oy70XumzpB8bes80JFYytxN4/fXX3Xdfdscvzcp2FBQiP1evvPJK0rezevVqdxwoFM+ZM8e++OIL935FDvGVrG1FPhfdnn/+eReYFFKSuR2dYzVM2UsvveS+J/QDTUHvzTffTNp29ANMAey7776zN954w5YuXep+BOo7ItFz4IdZOJf269fP3nrrLZsyZYpbXj+OOnbsaMe9UA7QrFmzUJ8+fcLThw4dClWoUCE0YsSIlG1TL+3rr78eSrUtW7a4bX344Ycp39Ypp5wSevbZZ1Oy7l9//TVUs2bN0MyZM0Nt2rQJ3XnnnUnfxtChQ0MNGjQIpdp9990Xat26deho02t22mmnhdLS0pK63vbt24duvPHGqHkdO3YMde3aNanb2bNnTyhPnjyh6dOnR80/66yzQn/84x9T9tnU61WuXLnQI488Ep63ffv2UIECBUKvvPJK0rYT6fvvv3f3L126NNvrz8p2AgsWLHDL/fjjjyndzo4dO9xys2bNSvp21q1bF6pYsWJo+fLloSpVqoQee+yxbG8jo+306NEjdOWVVx7RerOync6dO4e6deuW1O1ktK1Yen4XXHBB0rdz5plnhh544IGkfnZjt7Ny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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "size = 10000\n",
    "n = 20\n",
    "p = 0.5\n",
    "\n",
    "sample_from_def = binomial_from_def(size, n, p)\n",
    "#print(\"Empirical mean of binomial samples: \", np.mean(sample_from_def))\n",
    "\n",
    "support = np.array(n+1)\n",
    "emprical_prop = np.bincount(sample_from_def, minlength=n+1) / size\n",
    "binom = stats.binom(n=n, p=p)\n",
    "\n",
    "\n",
    "fig, ax = plt.subplots(layout='tight')\n",
    "ax.bar(support, emprical_prop, alpha=0.5, label='Empirical PMF')\n",
    "ax.scatter(support, binom.pmf(support), label='Theoretical PMF')\n",
    "ax.vlines(support, 0, binom.pmf(support), color='C1', lw=2, alpha=0.1)\n",
    "\n",
    "ax.set_title('Binomial Distribution B({}, {})'.format(n, p))\n",
    "ax.set_xticks(np.linspace(0, n, n+1))\n",
    "ax.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aee9a93c-a97a-421e-8cca-8edbb6106ba6",
   "metadata": {
    "tags": [
     "question"
    ]
   },
   "source": [
    "### Question: algorithme 2. \n",
    "\n",
    "Ecrire une fonction `binomial_quantile` similaire à celle de la question précédente: qui prend les mêmes arguments et qui renvoie un échantillon de taille `size`. Vérifier graphiquement que l'échantillon produit vérifie la bonne distribution.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d3a2f3aa-a62b-4424-abb1-937de9c9278c",
   "metadata": {
    "tags": [
     "aremplir"
    ]
   },
   "outputs": [],
   "source": [
    "def binomial_quantile(size: int, n: int=2, p: float=0.5):\n",
    "    \"\"\" \n",
    "    Draw samples from a binomial distribution B(n, p).\n",
    "    Algorithm: inversion of the CDF using the quantile function.\n",
    "    \"\"\"\n",
    "    binom = stats.binom(n=n, p=p)\n",
    "    unifs = rng.random(size=size)\n",
    "    sample = binom.ppf(unifs).astype(int)\n",
    "    return sample"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e86c7583-1b18-4e4e-bd63-10b0d338b0e3",
   "metadata": {
    "tags": [
     "question"
    ]
   },
   "source": [
    "### Question: temps de calcul\n",
    "\n",
    "Pour mesurer le temps de calcul, on utilisera le module `timeit` de python. Dans l'environnement `jupyter` il est encore plus facile d'utiliser ce module grâce à une _magic_ commande appelée `%timeit`. Pour en savoir plus sur ces _magic_ commandes vous pouvez [consulter cette page de documentation](https://ipython.readthedocs.io/en/stable/interactive/magics.html).\n",
    "\n",
    "Pour mesurer le temps de calcul complet d'une cellule notebook on utilise `%%timeit`. Le résultat est une moyenne de plusieurs exécutions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7ea73959-5e7f-42bb-ab53-402ca77b7a23",
   "metadata": {
    "tags": [
     "aremplir"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "112 μs ± 463 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%%timeit \n",
    "size = 10000\n",
    "liste = [i for i in range(size)]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc5be755-f42f-4a5b-8006-547e11bd7f20",
   "metadata": {},
   "source": [
    "Pour mesurer le temps d'une seule instruction on utiliser `%timeit` en début de ligne. L'option `-o` permet de sauvegarder le résultat: les mesures des temps d'exécutions et les statistiques associées."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "daf24ad0-9500-4bf0-96a1-96d83b62a4d1",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "114 μs ± 1.36 μs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n"
     ]
    }
   ],
   "source": [
    "size = 10000\n",
    "%timeit liste = [i for i in range(size)] # pas de sauvegarde du résultat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7235e5a0-e0ec-4532-a115-00e5b1a7687e",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "112 μs ± 538 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n",
      "['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', '_precision', '_repr_pretty_', 'all_runs', 'average', 'best', 'compile_time', 'loops', 'repeat', 'stdev', 'timings', 'worst']\n",
      "Mean time:  0.00011154097856903847\n"
     ]
    }
   ],
   "source": [
    "timings = %timeit -o liste = [i for i in range(size)]\n",
    "print(dir(timings))\n",
    "print(\"Mean time: \", timings.average)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2454a0fe-4871-4087-8c78-0d764c9edd83",
   "metadata": {},
   "source": [
    "Comparer les temps d'exécutions des 2 fonctions `binomial_from_def` et `binomial_quantile` pour différentes valeurs de `size` (par exemple `10000` et `100000`) et de `n` (par exemple `20`, `50` et `200`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "5cfe44fe-e003-4e8a-8d05-e5c99eff7c3c",
   "metadata": {
    "tags": [
     "aremplir"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25 ms ± 280 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
      "3.06 ms ± 20.9 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
      "1.82 s ± 13.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
      "35 ms ± 256 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit sample_from_def = binomial_from_def(size, n, p)\n",
    "%timeit sample_from_quantile = binomial_quantile(size, n, p)\n",
    "\n",
    "%timeit sample_from_def = binomial_from_def(size, 100000, p)\n",
    "%timeit sample_from_quantile = binomial_quantile(size, 100000, p)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5da5597e-a686-43e8-95a1-b52e6fbdde9d",
   "metadata": {
    "tags": [
     "question"
    ]
   },
   "source": [
    "### Question: code plus efficace \n",
    "\n",
    "Le code de la fonction `binomial_from_def` n'est pas du tout optimal. En effet, en `numpy` (et dans la plupart des langages interprétés) lorsque c'est possible il faut simuler tout l'échantillon d'un coup sans boucle `for`. Dans l'algorithme 1., pour simuler un échantillon de taille `size` on a besoin de `size x n` variables de Bernoullis: on les simule donc d'un seul coup puis on somme uniquement sur l'axe 1 (c'est à dire l'axe de taille `n`). Cette réduction par axe donne un `np.array` de dimension 1 de taille `size`. \n",
    "\n",
    "Cette approche vectorielle est importante et sera utilisée dans la suite lorsque c'est possible.\n",
    "\n",
    "Ecrire la fonction `binomial_from_def_vec` qui implémente l'algorithme 1. de façon efficace et comparer les temps de calculs avec les fonctions précédentes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "21bd93c8-4932-4d12-953f-322b63ad4f6e",
   "metadata": {
    "tags": [
     "aremplir"
    ]
   },
   "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.13.5"
  },
  "toc-autonumbering": true,
  "toc-showcode": false,
  "toc-showtags": true
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
