{ "cells": [ { "cell_type": "markdown", "id": "59a065e8", "metadata": {}, "source": [ "# NeuralTreeNet et coût\n", "\n", "La classe *NeuralTreeNet* convertit un arbre de décision en réseau de neurones. Si la conversion n'est pas exacte mais elle permet d'obtenir un modèle différentiable et apprenable avec un algorithme d'optimisation à base de gradient. Ce notebook compare le temps d'éxécution entre un arbre et le réseau de neurones." ] }, { "cell_type": "code", "execution_count": 1, "id": "e6ad71f6", "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "id": "52d5e7f8", "metadata": {}, "source": [ "## Jeux de données\n", "\n", "On construit un jeu de données aléatoire." ] }, { "cell_type": "code", "execution_count": 2, "id": "0abef0bf", "metadata": {}, "outputs": [], "source": [ "import numpy\n", "\n", "X = numpy.random.randn(10000, 10)\n", "y = X.sum(axis=1) / X.shape[1]\n", "X = X.astype(numpy.float64)\n", "y = y.astype(numpy.float64)" ] }, { "cell_type": "code", "execution_count": 3, "id": "8850b4e7", "metadata": {}, "outputs": [], "source": [ "middle = X.shape[0] // 2\n", "X_train, X_test = X[:middle], X[middle:]\n", "y_train, y_test = y[:middle], y[middle:]" ] }, { "cell_type": "markdown", "id": "12c4a84c", "metadata": {}, "source": [ "## Caler un arbre de décision" ] }, { "cell_type": "code", "execution_count": 4, "id": "1c0b0169", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.6225001966466359, 0.37938295559354807)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.tree import DecisionTreeRegressor\n", "\n", "tree = DecisionTreeRegressor(max_depth=7)\n", "tree.fit(X_train, y_train)\n", "tree.score(X_train, y_train), tree.score(X_test, y_test)" ] }, { "cell_type": "code", "execution_count": 5, "id": "6b158b44", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.37938295559354807" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import r2_score\n", "\n", "r2_score(y_test, tree.predict(X_test))" ] }, { "cell_type": "markdown", "id": "36db83ef", "metadata": {}, "source": [ "Covnersion de l'arbre en réseau de neurones" ] }, { "cell_type": "code", "execution_count": 6, "id": "60e3e6ac", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0
average absolute error0.208776
max absolute error1.427806
\n", "
" ], "text/plain": [ " 0\n", "average absolute error 0.208776\n", "max absolute error 1.427806" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pandas import DataFrame\n", "from mlstatpy.ml.neural_tree import NeuralTreeNet, NeuralTreeNetRegressor\n", "\n", "xe = X_test.astype(numpy.float32)\n", "expected = tree.predict(xe)\n", "\n", "nn = NeuralTreeNetRegressor(NeuralTreeNet.create_from_tree(tree, arch=\"compact\"))\n", "got = nn.predict(xe)\n", "me = numpy.abs(got - expected).mean()\n", "mx = numpy.abs(got - expected).max()\n", "DataFrame([{\"average absolute error\": me, \"max absolute error\": mx}]).T" ] }, { "cell_type": "markdown", "id": "559f0a25", "metadata": {}, "source": [ "La conversion est loin d'être parfaite. La raison vient du fait que les fonctions de seuil sont approchées par des fonctions sigmoïdes. Il suffit d'une erreur minime pour que la décision prenne un chemin différent dans l'arbre et soit complètement différente." ] }, { "cell_type": "markdown", "id": "c1ad28cf", "metadata": {}, "source": [ "## Conversion au format ONNX" ] }, { "cell_type": "code", "execution_count": 7, "id": "b01518ec", "metadata": {}, "outputs": [], "source": [ "from skl2onnx import to_onnx\n", "\n", "onx_tree = to_onnx(tree, X[:1].astype(numpy.float32))\n", "onx_nn = to_onnx(nn, X[:1].astype(numpy.float32))" ] }, { "cell_type": "markdown", "id": "f59994a5", "metadata": {}, "source": [ "Le réseau de neurones peut être représenté comme suit." ] }, { "cell_type": "code", "execution_count": 8, "id": "a33fedcb", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "opset: domain='' version=21\n", "input: name='X' type=dtype('float32') shape=['', 10]\n", "init: name='Ma_MatMulcst' type=dtype('float32') shape=(10, 127)\n", "init: name='Ad_Addcst' type=dtype('float32') shape=(127,)\n", "init: name='Mu_Mulcst' type=dtype('float32') shape=(1,) -- array([4.], dtype=float32)\n", "init: name='Ma_MatMulcst1' type=dtype('float32') shape=(127, 128)\n", "init: name='Ad_Addcst1' type=dtype('float32') shape=(128,)\n", "init: name='Ma_MatMulcst2' type=dtype('float32') shape=(128, 1)\n", "init: name='Ad_Addcst2' type=dtype('float32') shape=(1,) -- array([0.], dtype=float32)\n", "MatMul(X, Ma_MatMulcst) -> Ma_Y02\n", " Add(Ma_Y02, Ad_Addcst) -> Ad_C02\n", " Mul(Ad_C02, Mu_Mulcst) -> Mu_C01\n", " Sigmoid(Mu_C01) -> Si_Y01\n", " MatMul(Si_Y01, Ma_MatMulcst1) -> Ma_Y01\n", " Add(Ma_Y01, Ad_Addcst1) -> Ad_C01\n", " Mul(Ad_C01, Mu_Mulcst) -> Mu_C0\n", " Sigmoid(Mu_C0) -> Si_Y0\n", " MatMul(Si_Y0, Ma_MatMulcst2) -> Ma_Y0\n", " Add(Ma_Y0, Ad_Addcst2) -> Ad_C0\n", " Identity(Ad_C0) -> variable\n", "output: name='variable' type=dtype('float32') shape=['', 1]\n" ] } ], "source": [ "from onnx_array_api.plotting.text_plot import onnx_simple_text_plot\n", "\n", "print(onnx_simple_text_plot(onx_nn))" ] }, { "cell_type": "markdown", "id": "857f2e42", "metadata": {}, "source": [ "## Temps de calcul des prédictions" ] }, { "cell_type": "code", "execution_count": 9, "id": "7c810819", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "584 μs ± 16.3 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" ] } ], "source": [ "from onnxruntime import InferenceSession\n", "\n", "oinf_tree = InferenceSession(onx_tree.SerializeToString())\n", "oinf_nn = InferenceSession(onx_nn.SerializeToString())\n", "\n", "%timeit tree.predict(xe)" ] }, { "cell_type": "code", "execution_count": 10, "id": "51f6c958", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "48.4 μs ± 1.16 μs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n" ] } ], "source": [ "%timeit oinf_tree.run(None, {'X': xe})" ] }, { "cell_type": "code", "execution_count": 11, "id": "ab1ff3a8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.28 ms ± 97.7 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" ] } ], "source": [ "%timeit oinf_nn.run(None, {'X': xe})" ] }, { "cell_type": "markdown", "id": "5d8ecaa5", "metadata": {}, "source": [ "Le temps de calcul est nettement plus long pour le réseau de neurones. Si l'arbre de décision a une profondeur de *d*, l'arbre de décision va faire exactement *d* comparaisons. Le réseau de neurones quant à lui évalue tous les seuils pour chaque prédiction, soit $2^d$. Vérifions cela en faisant variable la profondeur." ] }, { "cell_type": "markdown", "id": "b27675e4", "metadata": {}, "source": [ "## Temps de calcul en fonction de la profondeur" ] }, { "cell_type": "code", "execution_count": 12, "id": "ecef383a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 8/8 [00:04<00:00, 1.63it/s]\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
averagedeviationmin_execmax_execrepeatnumberttimecontext_sizedexp
00.0002070.0000450.0001530.00031720200.004147642skl
10.0001510.0002460.0000310.00082510100.001515642onx_tree
20.0001780.0000930.0001190.00037110100.001781642onx_nn
30.0002490.0000360.0002200.00036020200.004980643skl
40.0003120.0001560.0001130.00066110100.003117643onx_tree
50.0003520.0002040.0001820.00083110100.003523643onx_nn
60.0003390.0000730.0002570.00048720200.006775644skl
70.0003370.0004230.0000590.00153710100.003368644onx_tree
80.0006190.0003540.0002210.00132010100.006194644onx_nn
90.0003590.0000380.0003090.00045320200.007171645skl
100.0004730.0005650.0000640.00192310100.004729645onx_tree
110.0011970.0009440.0003090.00352910100.011973645onx_nn
120.0003860.0000220.0003590.00043920200.007715646skl
130.0007930.0007700.0000970.00244510100.007926646onx_tree
140.0015210.0009190.0006520.00382010100.015207646onx_nn
150.0004290.0000240.0004040.00049420200.008579647skl
160.0006580.0006620.0002070.00248410100.006575647onx_tree
170.0029250.0027700.0014890.01104810100.029251647onx_nn
180.0005080.0000590.0004520.00073320200.010157648skl
190.0012350.0012080.0001210.00384210100.012347648onx_tree
200.0046270.0042390.0029620.01730010100.046271648onx_nn
210.0005580.0000450.0004980.00070020200.011152649skl
220.0007450.0005400.0001380.00216610100.007449649onx_tree
230.0111270.0048560.0090140.02566710100.111265649onx_nn
\n", "
" ], "text/plain": [ " average deviation min_exec max_exec repeat number ttime \\\n", "0 0.000207 0.000045 0.000153 0.000317 20 20 0.004147 \n", "1 0.000151 0.000246 0.000031 0.000825 10 10 0.001515 \n", "2 0.000178 0.000093 0.000119 0.000371 10 10 0.001781 \n", "3 0.000249 0.000036 0.000220 0.000360 20 20 0.004980 \n", "4 0.000312 0.000156 0.000113 0.000661 10 10 0.003117 \n", "5 0.000352 0.000204 0.000182 0.000831 10 10 0.003523 \n", "6 0.000339 0.000073 0.000257 0.000487 20 20 0.006775 \n", "7 0.000337 0.000423 0.000059 0.001537 10 10 0.003368 \n", "8 0.000619 0.000354 0.000221 0.001320 10 10 0.006194 \n", "9 0.000359 0.000038 0.000309 0.000453 20 20 0.007171 \n", "10 0.000473 0.000565 0.000064 0.001923 10 10 0.004729 \n", "11 0.001197 0.000944 0.000309 0.003529 10 10 0.011973 \n", "12 0.000386 0.000022 0.000359 0.000439 20 20 0.007715 \n", "13 0.000793 0.000770 0.000097 0.002445 10 10 0.007926 \n", "14 0.001521 0.000919 0.000652 0.003820 10 10 0.015207 \n", "15 0.000429 0.000024 0.000404 0.000494 20 20 0.008579 \n", "16 0.000658 0.000662 0.000207 0.002484 10 10 0.006575 \n", "17 0.002925 0.002770 0.001489 0.011048 10 10 0.029251 \n", "18 0.000508 0.000059 0.000452 0.000733 20 20 0.010157 \n", "19 0.001235 0.001208 0.000121 0.003842 10 10 0.012347 \n", "20 0.004627 0.004239 0.002962 0.017300 10 10 0.046271 \n", "21 0.000558 0.000045 0.000498 0.000700 20 20 0.011152 \n", "22 0.000745 0.000540 0.000138 0.002166 10 10 0.007449 \n", "23 0.011127 0.004856 0.009014 0.025667 10 10 0.111265 \n", "\n", " context_size d exp \n", "0 64 2 skl \n", "1 64 2 onx_tree \n", "2 64 2 onx_nn \n", "3 64 3 skl \n", "4 64 3 onx_tree \n", "5 64 3 onx_nn \n", "6 64 4 skl \n", "7 64 4 onx_tree \n", "8 64 4 onx_nn \n", "9 64 5 skl \n", "10 64 5 onx_tree \n", "11 64 5 onx_nn \n", "12 64 6 skl \n", "13 64 6 onx_tree \n", "14 64 6 onx_nn \n", "15 64 7 skl \n", "16 64 7 onx_tree \n", "17 64 7 onx_nn \n", "18 64 8 skl \n", "19 64 8 onx_tree \n", "20 64 8 onx_nn \n", "21 64 9 skl \n", "22 64 9 onx_tree \n", "23 64 9 onx_nn " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from tqdm import tqdm\n", "from onnx_array_api.ext_test_case import measure_time\n", "\n", "data = []\n", "for d in tqdm(range(2, 10)):\n", " tree = DecisionTreeRegressor(max_depth=d)\n", " tree.fit(X_train, y_train)\n", " obs = measure_time(lambda tree=tree: tree.predict(xe), number=20, repeat=20)\n", " obs.update(dict(d=d, exp=\"skl\"))\n", " data.append(obs)\n", "\n", " nn = NeuralTreeNetRegressor(NeuralTreeNet.create_from_tree(tree, arch=\"compact\"))\n", "\n", " onx_tree = to_onnx(tree, X[:1].astype(numpy.float32))\n", " onx_nn = to_onnx(nn, X[:1].astype(numpy.float32))\n", " oinf_tree = InferenceSession(\n", " onx_tree.SerializePartialToString(), providers=[\"CPUExecutionProvider\"]\n", " )\n", " oinf_nn = InferenceSession(\n", " onx_nn.SerializePartialToString(), providers=[\"CPUExecutionProvider\"]\n", " )\n", "\n", " obs = measure_time(\n", " lambda oinf_tree=oinf_tree: oinf_tree.run(None, {\"X\": xe}), number=10, repeat=10\n", " )\n", " obs.update(dict(d=d, exp=\"onx_tree\"))\n", " data.append(obs)\n", "\n", " obs = measure_time(\n", " lambda oinf_nn=oinf_nn: oinf_nn.run(None, {\"X\": xe}), number=10, repeat=10\n", " )\n", " obs.update(dict(d=d, exp=\"onx_nn\"))\n", " data.append(obs)\n", "\n", "df = DataFrame(data)\n", "df" ] }, { "cell_type": "code", "execution_count": 14, "id": "871130aa", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAHHCAYAAAB3K7g2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB3bUlEQVR4nO3dd1QU5x7G8e/SOwICKggq9obdmMTYSzRGUzTVaHoxxfR2026KpudGTWK6mh4TTbFFjaYae4ldsXcEpUrbfe8fKyiCCooMC8/nHI7O7Ozsb3aX3YeZt9iMMQYRERERF+FmdQEiIiIipaHwIiIiIi5F4UVERERcisKLiIiIuBSFFxEREXEpCi8iIiLiUhReRERExKUovIiIiIhLUXgRERERl6LwIpXGtm3bsNlsfPrpp1aXUqyuXbvStWvXc7b/Z599FpvNds72fyYmTZpE48aN8fT0pFq1alaXU6yK9rydi/exzWbj2WefLbP9lae8vDweeeQRateujZubG4MGDSrXx69o7w9x8rC6ACkbJf3lmjdv3jn9AhXJt379eoYPH07fvn157LHH8PPzs6yWzMxMXnnllXMeIKXsffzxx7z66quMHDmSNm3aEBMTY3VJUgEovFQSkyZNKrQ8ceJEZs+eXWR9kyZNyrMsqcLmz5+Pw+Hgf//7H/Xr17e0lszMTJ577jmAIuHlP//5D4899pgFVUlJ/Prrr0RFRfHmm29aXYpUIAovlcT1119faPmff/5h9uzZRdaLlJcDBw4AVNjLRfk8PDzw8NBHYXnJyMjA39+/xNsfOHCgwr+HzoWsrCy8vLxwc1PrjuLoWalCHA4Hb731Fs2aNcPHx4fIyEhuv/12Dh06VGi7OnXqcMkllzB//nzatWuHr68vLVq0YP78+QB8//33tGjRAh8fH9q2bcvy5csL3X/48OEEBASwZcsW+vTpg7+/P7Vq1eK///0vJ05i/tVXX9G2bVsCAwMJCgqiRYsW/O9//zvtsRw+fJjhw4cTHBxMtWrVGDZsGIcPHy522/Xr13PllVcSGhqKj48P7dq148cffyzxc/a///2v4HjDw8Pp27cvS5YsKdjmk08+oXv37kRERODt7U3Tpk159913S7T/rKwsnn32WRo2bIiPjw81a9bk8ssvJyEhAXCevbDZbAXPfb6zbRexcOFC+vbtS3BwMH5+fnTp0oW//vqr0Db51/o3b97M8OHDqVatGsHBwdx4441kZmaecv916tThmWeeASA8PLxIm4t33nmHZs2a4e3tTa1atRgxYkSR169r1640b96ctWvX0q1bN/z8/IiKiuKVV14p8nineh63bdtGeHg4AM899xw2m61QPcW1acjLy+P5558nLi4Ob29v6tSpwxNPPEF2dnaR47zkkkv4888/6dChAz4+PtSrV4+JEyee8vnJV17v4xNt376du+66i0aNGuHr60tYWBiDBw9m27Ztp71v/nvvtdde48033yQ2NhZfX1+6dOnC6tWrC22b/1mQkJBAv379CAwM5LrrrgOcIebBBx+kdu3aeHt706hRI1577bWCz4j8x5k3bx5r1qwpeN3yfxdOd/98NpuNu+++m6lTp9K8eXO8vb1p1qwZM2fOLHJsf/75J+3bt8fHx4e4uDjGjx9/0ufhs88+o23btvj6+hIaGsrVV1/Nzp07C21Tp04dhg8fXuS+J16+zP89/+qrr/jPf/5DVFQUfn5+pKamnvTxqzwjldKIESPMiS/vLbfcYjw8PMytt95q3nvvPfPoo48af39/0759e5OTk1OwXWxsrGnUqJGpWbOmefbZZ82bb75poqKiTEBAgPnss89MTEyMGT16tBk9erQJDg429evXN3a7veD+w4YNMz4+PqZBgwZm6NChZuzYseaSSy4xgHnqqacKtvvll18MYHr06GHGjRtnxo0bZ+6++24zePDgUx6bw+EwF110kXFzczN33XWXGTNmjOnevbtp2bKlAcwnn3xSsO3q1atNcHCwadq0qXn55ZfN2LFjzUUXXWRsNpv5/vvvT/s8Dh8+3ADm4osvNm+99ZZ57bXXzMCBA82YMWMKtmnfvr0ZPny4efPNN82YMWNM7969DWDGjh1baF9dunQxXbp0KVjOy8szPXr0MIC5+uqrzdixY82oUaNM9+7dzdSpU40xxsybN88AZt68eYX2tXXr1iLH+swzzxR5zYszd+5c4+XlZTp16mRef/118+abb5qWLVsaLy8vs3DhwiL7a926tbn88svNO++8Y2655RYDmEceeeSUjzFlyhRz2WWXGcC8++67ZtKkSWblypWF9tuzZ08zZswYc/fddxt3d/ci78MuXbqYWrVqmdq1a5v77rvPvPPOO6Z79+4GMNOnTy/x85ienm7effddA5jLLrvMTJo0qdh6jjds2DADmCuvvNKMGzfO3HDDDQYwgwYNKrRd/u9KZGSkeeKJJ8zYsWNNmzZtjM1mM6tXrz7lc1Se72PAPPPMMwXL3377rYmPjzdPP/20ef/9980TTzxhQkJCTGxsrMnIyDjlvvLfey1atDB16tQxL7/8snnuuedMaGioCQ8PN/v27Sv0PHp7e5u4uDgzbNgw895775mJEycah8Nhunfvbmw2m7nlllvM2LFjzYABAwxgRo4caYwxJj093UyaNMk0btzYREdHF7xu+/btK9H9jz/2+Ph4U7NmTfP888+bt956y9SrV8/4+fmZgwcPFmy3atUq4+vra2JiYsyoUaPM888/byIjIwtej+O98MILxmazmauuusq888475rnnnjPVq1c3derUMYcOHSrYLjY21gwbNqzIc3jiZ0H+73nTpk1Nq1atzBtvvGFGjRp12teiKlN4qaRODC9//PGHAcznn39eaLuZM2cWWR8bG2sA8/fffxesmzVrlgGMr6+v2b59e8H68ePHF/lyzf/gv+eeewrWORwO079/f+Pl5WUSExONMcbcd999JigoyOTl5ZXq2KZOnWoA88orrxSsy8vLM507dy7yod+jRw/TokULk5WVVaiW888/3zRo0OCUj/Prr78awNx7771FbnM4HAX/z8zMLHJ7nz59TL169QqtO/ED6+OPPzaAeeONN066/7IOLw6HwzRo0MD06dOnyDHUrVvX9OrVq8j+brrppkL7uOyyy0xYWNgpH+f4++e/3sYYc+DAAePl5WV69+5dKPCOHTvWAObjjz8uWNelSxcDmIkTJxasy87ONjVq1DBXXHFFwbqSPI+JiYlFvsBPrDPfihUrDGBuueWWQts99NBDBjC//vprwbr835Xff/+90DF6e3ubBx988JTPT3m9j40pGl6Ke88uWLCgyPNdnPz3nq+vr9m1a1fB+oULFxrA3H///QXr8j8LHnvssWKP/YUXXii0/sorrzQ2m81s3ry5YF2XLl1Ms2bNzvj+gPHy8iq0buXKlQYo9EfIoEGDjI+PT6HPt7Vr1xp3d/dC749t27YZd3d38+KLLxZ67H///dd4eHgUWl/a8FKvXr1iXxspSpeNqohvv/2W4OBgevXqxcGDBwt+2rZtS0BAAPPmzSu0fdOmTenUqVPBcseOHQHo3r17odb++eu3bNlS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VatTjgQ8YMAALrjgAh577DG2bdtG06ZN+f7774u9Vj9u3DguvPBCWrRowa233kq9evXYv38/CxYsYNeuXaxcufKkj9OtWzeGDh3K22+/zaZNm+jbty8Oh4M//viDbt26cffdd9O7d++Cs0e333476enpfPDBB0RERBT7RXO8G264gYkTJ/LAAw+waNEiOnfuTEZGBnPmzOGuu+5i4MCBBAcHM3jwYMaMGYPNZiMuLo6ff/65SBulknJzc+PDDz/k4osvplmzZtx4441ERUWxe/du5s2bR1BQED/99NMZ7bskwsPDefzxx3nuuefo27cvl156KRs2bOCdd96hffv2ZzSoYkmeR19fX5o2bcrXX39Nw4YNCQ0NpXnz5jRv3rzI/uLj4xk2bBjvv/8+hw8fpkuXLixatIgJEyYwaNAgunXrVhZPRbm9j4tzySWXMGnSJIKDg2natCkLFixgzpw5hIWFlXgf9evX58ILL+TOO+8kOzubt956i7CwMB555JESHXu3bt148skn2bZtG/Hx8fzyyy/88MMPjBw5slDj2nNx/+I899xzzJw5k86dO3PXXXeRl5fHmDFjaNasWaE2VnFxcbzwwgs8/vjjbNu2jUGDBhEYGMjWrVuZMmUKt912Gw899BDg/IybPHkyffv2ZciQISQkJPDZZ5+dUX1ygvLs2iTlp7hxXowx5v333zdt27Y1vr6+JjAw0LRo0cI88sgjZs+ePQXbxMbGmv79+xe5L2BGjBhRaF1+t8lXX321YN2wYcOMv7+/SUhIML179zZ+fn4mMjLSPPPMM4W6x06ePNn07t3bREREGC8vLxMTE2Nuv/12s3fv3tMeX1JSkhk6dKgJCgoywcHBZujQoWb58uVFupgaY0xCQoK54YYbTI0aNYynp6eJiooyl1xyiZk8efJpHycvL8+8+uqrpnHjxsbLy8uEh4ebiy++2CxdurRgmx9//NG0bNnS+Pj4FIx7kd99d+vWrQXbndg90hhnl9Unn3zS1K1b13h6epoaNWqYK6+80iQkJBRsk5iYaK644grj5+dnQkJCzO23325Wr159xuO8GGPM8uXLzeWXX27CwsKMt7e3iY2NNUOGDDFz584tsr/juzobY8wnn3xS5NiKc7L7G+PsGt24cWPj6elpIiMjzZ133llofAxjiu8ia4zz/RUbG1toXUmex7///tu0bdvWeHl5Feo6XNzzlpuba5577rmC/dWuXds8/vjjhboqG3Py35XiXuvilNf7+PjjNcaYQ4cOmRtvvNFUr17dBAQEmD59+pj169eftGvv8Y7/nX/99ddN7dq1jbe3t+ncuXPB2Dn58j8LipOWlmbuv/9+U6tWLePp6WkaNGhgXn311UJd+I05+fugpPcv7nPLmOK7Mf/2228F75F69eqZ995776S/V99995258MILjb+/v/H39zeNGzc2I0aMMBs2bCi03euvv26ioqKMt7e3ueCCC8ySJUtO2lX622+/Lfa5kqJsxpRDyzepUoYPH87kyZOLvSwhIq5t27Zt1K1bl1dffbXgDINIeVObFxEREXEpCi8iIiLiUhReRERExKWozYuIiIi4FJ15EREREZei8CIiIiIupdINUudwONizZw+BgYHnbGZeERERKVvGGNLS0qhVq9Zp58OqdOFlz549RWY+FhEREdewc+fOIjORn6jShZf8Sbp27txJUFCQxdWIiIhISaSmplK7du1Ck22eTKULL/mXioKCghReREREXExJmnyowa6IiIi4FIUXERERcSkKLyIiIuJSKl2bl5Ky2+3k5uZaXYaUgJeX12m7zYmISNVR5cKLMYZ9+/Zx+PBhq0uREnJzc6Nu3bp4eXlZXYqIiFQAVS685AeXiIgI/Pz8NJBdBZc/6ODevXuJiYnR6yUiIlUrvNjt9oLgEhYWZnU5UkLh4eHs2bOHvLw8PD09rS5HREQsVqUaEuS3cfHz87O4EimN/MtFdrvd4kpERKQiqFLhJZ8uPbgWvV4iInK8KhleRERExHUpvIiIiIhLUXgRERERl6LwIiIiIiVijGH22v0YYyytQ+GlgnM4HIwaNYq6devi6+tLfHw8kydPxhhDz5496dOnT8GbKDk5mejoaJ5++mkA5s+fj81mY9q0abRs2RIfHx/OO+88Vq9ebeUhiYiICzLG8MK0ddw6cQmjZqy3tBaFlwpu1KhRTJw4kffee481a9Zw//33c/311/P7778zYcIEFi9ezNtvvw3AHXfcQVRUVEF4yffwww/z+uuvs3jxYsLDwxkwYICmRhARkVJ5e+5mPvpzKwANIgIsraVKDVLnarKzs3nppZeYM2cOnTp1AqBevXr8+eefjB8/ni+++ILx48dzww03sG/fPqZPn87y5cvx8Cj8sj7zzDP06tULgAkTJhAdHc2UKVMYMmRIuR+TiIi4no//3MqbczYC8PQlTRncrral9VS48LJz506GDh3KgQMH8PDw4KmnnmLw4MFWl2WJzZs3k5mZWRA88uXk5NC6dWsABg8ezJQpUxg9ejTvvvsuDRo0KLKf/OADEBoaSqNGjVi3bt25LV5ERCqFb5fs5L8/rwXg/p4NuenCuhZXVAHDi4eHB2+99RatWrVi3759tG3bln79+uHv7291aeUuPT0dgGnTphEVFVXoNm9vbwAyMzNZunQp7u7ubNq0qdxrFBGRymvm6r08+t0qAG65sC739qhvcUVOFS681KxZk5o1awJQo0YNqlevTnJycpUML02bNsXb25sdO3bQpUuXYrd58MEHcXNzY8aMGfTr14/+/fvTvXv3Qtv8888/xMTEAHDo0CE2btxIkyZNznn9IiLiun7fmMg9Xy7HYeCqdrV5sn+TCjPieakb7P7+++8MGDCAWrVqYbPZmDp1apFtxo0bR506dfDx8aFjx44sWrTojIpbunQpdrud2rWtvbZmlcDAQB566CHuv/9+JkyYQEJCAsuWLWPMmDFMmDCBadOm8fHHH/P555/Tq1cvHn74YYYNG8ahQ4cK7ee///0vc+fOZfXq1QwfPpzq1aszaNAgaw5KREQqvCXbkrlt0hJy7Yb+LWry0uUtKkxwgTMILxkZGcTHxzNu3Lhib//666954IEHeOaZZ1i2bBnx8fH06dOHAwcOFGzTqlUrmjdvXuRnz549BdskJydzww038P7775/BYVUezz//PE899RSjRo2iSZMm9O3bl2nTplGnTh1uvvlmnn32Wdq0aQPAc889R2RkJHfccUehfYwePZr77ruPtm3bsm/fPn766aeCyQ5FRESOt2ZPCjd+upisXAddGobz5lWtcHerOMEFwGbOYqQZm83GlClTCv0V37FjR9q3b8/YsWMB5zgltWvX5p577uGxxx4r0X6zs7Pp1asXt956K0OHDj3tttnZ2QXLqamp1K5dm5SUFIKCggptm5WVxdatW6lbty4+Pj4lPErXNX/+fLp168ahQ4eoVq2a1eWcsar2uomIWCUhMZ0h7y0gKSOH9nVCmHhTR3y93MvlsVNTUwkODi72+/tEZTrOS05ODkuXLqVnz57HHsDNjZ49e7JgwYIS7cMYw/Dhw+nevftpgws4x0EJDg4u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4sWLGT9+PC1btrS6lHLXrFkz5syZU7Ds4VF1Pj4OHTrEBRdcQLdu3ZgxYwbh4eFs2rSJkJAQq0srF4sXL8Zutxcsr169ml69ejF48GALqypfL7/8Mu+++y4TJkygWbNmLFmyhBtvvJHg4GDuvfdeq8srF7fccgurV69m0qRJ1KpVi88++4yePXuydu1aoqKiyrcYI6Vy4MABA5jffvvN6lIsFRISYj788EOryyhXaWlppkGDBmb27NmmS5cu5r777rO6pHLzzDPPmPj4eKvLsMyjjz5qLrzwQqvLqDDuu+8+ExcXZxwOh9WllJv+/fubm266qdC6yy+/3Fx33XUWVVS+MjMzjbu7u/n5558LrW/Tpo158skny70eXTYqpZSUFABCQ0MtrsQadrudr776ioyMDDp16mR1OeVqxIgR9O/fn549e1pdiiU2bdpErVq1qFevHtdddx07duywuqRy8+OPP9KuXTsGDx5MREQErVu35oMPPrC6LEvk5OTw2WefcdNNN5X55LcV2fnnn8/cuXPZuHEjACtXruTPP//k4osvtriy8pGXl4fdbsfHx6fQel9fX/7888/yL6jc45ILs9vtpn///uaCCy6wupRyt2rVKuPv72/c3d1NcHCwmTZtmtUllasvv/zSNG/e3Bw5csQYY6rcmZfp06ebb775xqxcudLMnDnTdOrUycTExJjU1FSrSysX3t7extvb2zz++ONm2bJlZvz48cbHx8d8+umnVpdW7r7++mvj7u5udu/ebXUp5cput5tHH33U2Gw24+HhYWw2m3nppZesLqtcderUyXTp0sXs3r3b5OXlmUmTJhk3NzfTsGHDcq9F4aUU7rjjDhMbG2t27txpdSnlLjs722zatMksWbLEPPbYY6Z69epmzZo1VpdVLnbs2GEiIiLMypUrC9ZVtfByokOHDpmgoKAqc+nQ09PTdOrUqdC6e+65x5x33nkWVWSd3r17m0suucTqMsrdl19+aaKjo82XX35pVq1aZSZOnGhCQ0OrVIDdvHmzueiiiwxg3N3dTfv27c11111nGjduXO61KLyU0IgRI0x0dLTZsmWL1aVUCD169DC33Xab1WWUiylTphT8sub/AMZmsxl3d3eTl5dndYmWaNeunXnsscesLqNcxMTEmJtvvrnQunfeecfUqlXLooqssW3bNuPm5mamTp1qdSnlLjo62owdO7bQuueff940atTIooqsk56ebvbs2WOMMWbIkCGmX79+5V6D2rychjGGu+++mylTpvDrr79St25dq0uqEBwOB9nZ2VaXUS569OjBv//+y4oVKwp+2rVrx3XXXceKFStwd3e3usRyl56eTkJCAjVr1rS6lHJxwQUXFBkiYePGjcTGxlpUkTU++eQTIiIi6N+/v9WllLvMzEzc3Ap/Zbq7u+NwOCyqyDr+/v7UrFmTQ4cOMWvWLAYOHFjuNVSdvo5naMSIEXzxxRf88MMPBAYGsm/fPgCCg4Px9fW1uLry8fjjj3PxxRcTExNDWloaX3zxBfPnz2fWrFlWl1YuAgMDad68eaF1/v7+hIWFFVlfWT300EMMGDCA2NhY9uzZwzPPPIO7uzvXXHON1aWVi/vvv5/zzz+fl156iSFDhrBo0SLef/993n//fatLKzcOh4NPPvmEYcOGValu8vkGDBjAiy++SExMDM2aNWP58uW88cYb3HTTTVaXVm5mzZqFMYZGjRqxefNmHn74YRo3bsyNN95Y/sWU+7keFwMU+/PJJ59YXVq5uemmm0xsbKzx8vIy4eHhpkePHuaXX36xuixLVbU2L1dddZWpWbOm8fLyMlFRUeaqq64ymzdvtrqscvXTTz+Z5s2bG29vb9O4cWPz/vvvW11SuZo1a5YBzIYNG6wuxRKpqanmvvvuMzExMcbHx8fUq1fPPPnkkyY7O9vq0srN119/berVq2e8vLxMjRo1zIgRI8zhw4ctqcVmTBUaHlBERERcntq8iIiIiEtReBERERGXovAiIiIiLkXhRURERFyKwouIiIi4FIUXERERcSkKLyIiIuJSFF5ExCV17dqVkSNHWl2GiFhA4UVERERcisKLiIiIuBSFFxGp8DIyMrjhhhsICAigZs2avP7661aXJCIWUngRkQrv4Ycf5rfffuOHH37gl19+Yf78+SxbtszqskTEIlVvXnMRcSnp6el89NFHfPbZZ/To0QOACRMmEB0dbXFlImIVnXkRkQotISGBnJwcOnbsWLAuNDSURo0aWViViFhJ4UVERERcisKLiFRocXFxeHp6snDhwoJ1hw4dYuPGjRZWJSJWUpsXEanQAgICuPnmm3n44YcJCwsjIiKCJ598Ejc3/e0lUlUpvIhIhffqq6+Snp7OgAEDCAwM5MEHHyQlJcXqskTEIjZjjLG6CBEREZGS0nlXERERcSkKLyIiIuJSFF5ERETEpSi8iIiIiEtReBERERGXovAiIiIiLkXhRURERFyKwouIiIi4FIUXERERcSkKLyIiIuJSFF5ERETEpSi8iIiIiEv5P8slL0pPbJl5AAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "piv = df.pivot(index=\"d\", columns=\"exp\", values=\"average\")\n", "piv.plot(logy=True, title=\"Temps de calcul en fonction de la profondeur\");" ] }, { "cell_type": "markdown", "id": "b30bbefe", "metadata": {}, "source": [ "L'hypothèse est vérifiée." ] }, { "cell_type": "code", "execution_count": 17, "id": "8b163d83", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.12" } }, "nbformat": 4, "nbformat_minor": 5 }