Skip to content
This repository has been archived by the owner on Jan 13, 2024. It is now read-only.

Commit

Permalink
update unit test add a notebook
Browse files Browse the repository at this point in the history
  • Loading branch information
sdpython committed Sep 2, 2017
1 parent aa7aa46 commit 6620745
Show file tree
Hide file tree
Showing 5 changed files with 159 additions and 15 deletions.
157 changes: 150 additions & 7 deletions _doc/notebooks/td1a/integrale_rectangle_correction.ipynb
Expand Up @@ -409,7 +409,7 @@
"\n",
"$$I(n)=\\frac{i}{n}\\sum_{i=1}^n \\frac{i}{n} = \\frac{n(n+1)}{2n^2} = \\frac{n+1}{2n} = \\frac{1}{2} + \\frac{1}{2n}$$\n",
"\n",
"On en d\u00e9duit que $I(n+1) - I(n) = \\frac{1}{2n+2} - \\frac{1}{2n} \\sim O(\\frac{1}{n^2})$. Autrement dit, l'algorithme s'arr\u00eate d\u00e8s que $\\frac{1}{n^2} < precision$ mais la somme des diff\u00e9rences n'est pas n\u00e9gligeable : \n",
"On en d\u00e9duit que $I(n+1) - I(n) = \\frac{1}{2n+2} - \\frac{1}{2n} \\sim O(\\frac{1}{n^2})$. Autrement dit, l'algorithme s'arr\u00eate d\u00e8s que $\\frac{1}{n^2} < precision$ mais la somme des diff\u00e9rences qui resteraient \u00e0 calculer si on continuait n'est pas n\u00e9gligeable : \n",
"\n",
"$$\\sum_{i>k} I(n+1) - I(n) \\sim \\frac{1}{k}$$\n",
"\n",
Expand All @@ -420,7 +420,116 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"La seconde version multiplie les calculs par deux \u00e0 chaque fois et c'est co\u00fbteux aussi."
"La seconde version multiplie le nombre de calculs par deux \u00e0 chaque fois m\u00eame si elle \u00e9vite de recalculer les m\u00eames valeurs. Une fois qu'on a commenc\u00e9 une s\u00e9rie, il faut aller jusqu'au bout. C'est int\u00e9ressant si la fonction \u00e0 int\u00e9grer est longue \u00e0 calculer."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Calcul de Monte Carlo\n",
"\n",
"Ce calcul consiste simplement \u00e0 tirer des valeurs al\u00e9atoirement dans l'intervalle \u00e0 int\u00e9grer puis \u00e0 en faire la moyenne."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.4893983727648405"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import random\n",
"\n",
"def integrale_mc(f, a, b, n):\n",
" somme = 0\n",
" for i in range(0, n):\n",
" x = random.uniform(a, b)\n",
" somme += f(x)\n",
" return somme / n\n",
"\n",
"# On v\u00e9rifie ave un cas simple.\n",
"integrale_mc(lambda x: x, 0, 1, 100)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On peut appeler plusieurs fois la fonction et faire la moyenne des valeurs obtenues pour obtenir un algorithme qui s'arr\u00eate \u00e0 partir d'une certaine pr\u00e9cision."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.49213636503614805, 100)"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def integrale_mc_precise(f, a, b, n0, precision):\n",
" val = integrale(f, a, b, n0)\n",
" moy = val\n",
" moy0 = None\n",
" nb = 1\n",
" while moy0 is None or abs(moy - moy0) / moy0 > precision:\n",
" val += integrale_mc(f, a, b, n0)\n",
" nb += 1\n",
" moy0 = moy\n",
" moy = val / nb\n",
" return moy, n0\n",
"\n",
"integrale_mc_precise(lambda x: x, 0, 1, 100, 1e-4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Quand s'arr\u00eater ?\n",
"\n",
"L'int\u00e9grale de [Monte Carlo](https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Monte-Carlo) est une variable al\u00e9atoire qui est une moyenne. $I_n(f)=\\frac{1}{n} \\sum_{i=1}^n f((b-a)U_i + b)$ o\u00f9 $U_i$ est une variable al\u00e9atoire uniforme dans l'intervalle $[0,1]$. $f((b-a)U_i + b)$ est une variable al\u00e9atoire qui n'est a priori pas uniforme. Elle est born\u00e9e si fonction $f$ est born\u00e9e. En utilisant le th\u00e9or\u00e8me centrale limite, on sait que $\\sqrt{n}I_n(f)$ tend vers une loi normale dont on peut majorer la variance par $M^2$ o\u00f9 $M=max(\\{f(x) | x \\in [a,b]\\})$. Il suffit ensuite de choisir un $n$ suffisant grand telle sorte que l'intervalle de confiance \u00e0 95% soit suffisamment petit. Si $p$ est la pr\u00e9cision, $\\frac{1.96 M}{\\sqrt{n}} < \\frac{p}{2}$ et donc $n > \\frac{16M^2}{p^2}$.\n",
"\n",
"Pour une pr\u00e9cision \u00e0 $10^{-2}$ :"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.5005932463661332"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"integrale_mc(lambda x: x, 0, 1, int(16e4))"
]
},
{
Expand All @@ -429,7 +538,7 @@
"source": [
"## Mesure du temps\n",
"\n",
"Les temps ne sont pas vraiment comparables puisque les pr\u00e9cisions ne sont pas \u00e9quivatentes."
"Les temps ne sont pas vraiment comparables puisque les conditions d'arr\u00eat de chaque fonction ne correspondent pas aux m\u00eame pr\u00e9cisions."
]
},
{
Expand All @@ -441,7 +550,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"21 \u00b5s \u00b1 1.79 \u00b5s per loop (mean \u00b1 std. dev. of 7 runs, 100000 loops each)\n"
"14.6 \u00b5s \u00b1 172 ns per loop (mean \u00b1 std. dev. of 7 runs, 100000 loops each)\n"
]
}
],
Expand All @@ -458,7 +567,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"24.3 \u00b5s \u00b1 2.05 \u00b5s per loop (mean \u00b1 std. dev. of 7 runs, 10000 loops each)\n"
"20.2 \u00b5s \u00b1 403 ns per loop (mean \u00b1 std. dev. of 7 runs, 10000 loops each)\n"
]
}
],
Expand All @@ -475,7 +584,24 @@
"name": "stdout",
"output_type": "stream",
"text": [
"819 \u00b5s \u00b1 10.3 \u00b5s per loop (mean \u00b1 std. dev. of 7 runs, 1000 loops each)\n"
"20 \u00b5s \u00b1 102 ns per loop (mean \u00b1 std. dev. of 7 runs, 10000 loops each)\n"
]
}
],
"source": [
"%timeit integrale_mc_precise(f, a, b, n, 1e-4)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"783 \u00b5s \u00b1 13.6 \u00b5s per loop (mean \u00b1 std. dev. of 7 runs, 1000 loops each)\n"
]
}
],
Expand All @@ -492,14 +618,31 @@
"name": "stdout",
"output_type": "stream",
"text": [
"36 ms \u00b1 9.92 ms per loop (mean \u00b1 std. dev. of 7 runs, 10 loops each)\n"
"25 ms \u00b1 364 \u00b5s per loop (mean \u00b1 std. dev. of 7 runs, 10 loops each)\n"
]
}
],
"source": [
"%timeit integrale_precise_2n(lambda x: x, 0, 1, 10, 1e-4)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"283 \u00b5s \u00b1 4.98 \u00b5s per loop (mean \u00b1 std. dev. of 7 runs, 1000 loops each)\n"
]
}
],
"source": [
"%timeit integrale_mc_precise(lambda x: x, 0, 1, 10, 1e-4)"
]
},
{
"cell_type": "code",
"execution_count": null,
Expand Down
11 changes: 6 additions & 5 deletions _doc/notebooks/td1a/td1a_cenonce_session6.ipynb
Expand Up @@ -258,8 +258,9 @@
],
"source": [
"import random\n",
"class Piece :\n",
" def tirage_aleatoire(self, precedent) :\n",
"\n",
"class Piece:\n",
" def tirage_aleatoire(self, precedent):\n",
" return random.randint(0,1)\n",
" def moyenne_tirage(self, n):\n",
" # ....\n",
Expand Down Expand Up @@ -287,6 +288,7 @@
"outputs": [],
"source": [
"import random\n",
"\n",
"class PieceTruquee(Piece):\n",
" # ......\n",
" pass"
Expand All @@ -307,7 +309,6 @@
},
"outputs": [],
"source": [
"import random\n",
"if random.random() <= 0.7 :\n",
" # ... faire une chose avec la probabilit\u00e9 0.7\n",
" pass\n",
Expand Down Expand Up @@ -421,8 +422,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
"0.5\n",
"0.67\n"
"0.49\n",
"0.59\n"
]
}
],
Expand Down
2 changes: 1 addition & 1 deletion _unittests/ut_dnotebooks/test_1_2_3_coverage_notebook3.py
Expand Up @@ -96,7 +96,7 @@ def valid(cell):
return True

self.a_test_notebook_runner(
"interro_rapide_20_minutes_2014_11", "exams")
"interro_rapide_20_minutes_2014_11", "exams", valid=valid)

def test_notebook_td1a_cenonce_session1(self):
fLOG(
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Expand Up @@ -14,6 +14,7 @@ dbfread
duecredit
folium
forestci
gensim
geopy
ggplot
jyquickhelper
Expand Down
3 changes: 1 addition & 2 deletions src/ensae_teaching_cs/automation/notebook_test_helper.py
Expand Up @@ -88,7 +88,6 @@ def clean_function_1a(code):
"return ....",
"return [ .... ]",
"def __init__(self, ...) :",
"if random.random() <= 0.7 :",
"dictionnaire_depart.items() [0]",
"iterateur(0,10) [0]",
"# ...... à remplir",
Expand Down Expand Up @@ -129,7 +128,7 @@ def execute_notebooks(folder, notebooks, filter, clean_function=None,
fLOG=noLOG, deepfLOG=noLOG, replacements=None, dump=None,
additional_path=None):
"""
Execute a list of notebooks.
Executes a list of notebooks.
@param folder folder
@param notebooks list of notebooks
Expand Down

0 comments on commit 6620745

Please sign in to comment.