1import matplotlib.pyplot as plt
2import numpy as np
3import scipy.stats as stats
4import seaborn as sns
5from src.code.simulation.galton_watson import GaltonWatson
6from src.code.simulation.utils import plot_zn_distribution, test_loi_exponentielle
7from src.config.config import seed
8from src.utils.utils import init_notebook
1init_notebook(seed)

Simulation Galton-Watson#

Loi de Poisson#

λ = 1#

Soit \(L\) la loi de reproduction.

Nous avons \(L \sim {\mathrm {Poisson}}(1)\).

1poisson_1 = stats.poisson(1)
1gp1 = GaltonWatson(poisson_1)
2gp1
Processus Galton-Watson
- loi de reproduction L : poisson
- espérance E[L] = 1.0
- époque n = 0
- nombre de survivants Z_n = 1
1nb_survivants = gp1.simule(20)
1print(f"Il reste {nb_survivants} survivants au bout de {gp1.n} époques.")
Il reste 0 survivants au bout de 10 époques.
1plt.figure(figsize=(15, 10))
2gp1.plot_historique_descendants()
3plt.savefig("assets/img/number-of-children.png")
../_images/fceebd963677c4ebdf192676ff411407213a81158874fd8c3e0476d3004494d4.png
1# noinspection JupyterPackage
2plt.figure(figsize=(15, 10))
3gp1.plot_zn_sur_n()
4plt.savefig("assets/img/zn-over-n.png")
../_images/e5554a29dcf2da2c69c8ede541936bfd2354ba63b3ba9a02d03f91d4b799d35e.png

Arbre de Galton-Watson#

1plt.figure(figsize=(12, 10))
2gp1.plot_arbre()
3plt.savefig("assets/img/galton-watson-tree.png", transparent=True)
4plt.savefig("assets/img/galton-watson-tree.svg", transparent=True)
../_images/7b0ab33b76e174af3409128fd83643c84bc0e35726ccd174fe8a115cdfddb9b5.png
1gp1.plot_arbre(circular=True)
../_images/bf95bff27a9c12f8ab01dcf4f1ef07e455d87135aac18817cc47e3ffbe9d0d35.png

λ = 2#

1poisson_2 = stats.poisson(2)
1gp2 = GaltonWatson(poisson_2)
2gp2
Processus Galton-Watson
- loi de reproduction L : poisson
- espérance E[L] = 2.0
- époque n = 0
- nombre de survivants Z_n = 1
1nb_survivants = gp2.simule(20)
1print(f"Il reste {nb_survivants} survivants au bout de {gp2.n} époques.")
Il reste 680149 survivants au bout de 20 époques.
1gp2.plot_historique_descendants(logscale=True, affiche_moyenne=True)
../_images/794ee06319ba6b741ffb606576c5018ce23cb7223f31d6bf97743398f8025dfa.png
1gp2.plot_zn_sur_n(logscale=True)
../_images/3138f2f2fa3e4fdbf0569137b2a2d9ee114ee000fb3335d296c26621bd0455d2.png

Essais \(Z_n / n\)#

1nb_simulations = 10_000
2nb_epoques = 100
1simulations = gp1.lance_simulations(nb_simulations, nb_epoques)
2simulations = np.array(simulations)
1plt.figure(figsize=(25, 10))
2plot_zn_distribution(simulations, nb_epoques)
<Figure size 2500x1000 with 0 Axes>
../_images/11a34afcbee67604aa9359198b6cfa42d64ac9fbd5568ae5fc74674c7562b327.png
1np.sum(simulations > 0)
191
1zn_sup_zero = simulations[simulations > 0]
1plt.figure(figsize=(10, 10))
2plt.title("Distribution des $Z_n$,\n$n = 100$, et $Z_n > 0$")
3plt.hist(zn_sup_zero)
4plt.savefig("assets/img/zn-sup-zero-distribution.png")
../_images/843c34c599d57f52e9365c18aa3fee8122d237e42c66350d8d04c100109bd4cd.png
1lambda_estime = 1.0 / np.mean(zn_sup_zero / nb_epoques)
2print(f"{lambda_estime = }")
lambda_estime = 1.902959051509415
1loi_expo1 = stats.expon(scale=1 / lambda_estime)
1echantillon_expo = loi_expo1.rvs(size=len(zn_sup_zero))
 1plt.figure(figsize=(10, 10))
 2plt.title("Distribution de $Z_{n} / n$, $Z_n > 0$ avec $n = 100$")
 3sns.histplot(zn_sup_zero / nb_epoques, stat="probability", label="$Z_n / n$")
 4sns.histplot(
 5    echantillon_expo,
 6    stat="probability",
 7    label=f"Échantillon de loi exponentielle ($\\lambda = {lambda_estime: 0.2}$)",
 8)
 9
10plt.legend()
11
12plt.savefig("assets/img/zn-sup-zero-distribution-with-exponential.png")
../_images/dd2f563682b94f1b053c546b76e0a3faf971c61e6d53597b2248dcf87706b419.png
1test_loi_exponentielle(zn_sup_zero / nb_epoques)
(0.531818713902256, 0.057586680541798524)

Loi uniforme sur {0, 1, 2}#

Soit \(L\) la loi de reproduction.

Nous avons \(L \sim {\mathrm {Uniforme}}(0, 2)\).

1uniforme2 = stats.randint(0, 3)
1gu2 = GaltonWatson(uniforme2)
2gu2
Processus Galton-Watson
- loi de reproduction L : randint
- espérance E[L] = 1.0
- époque n = 0
- nombre de survivants Z_n = 1
1nb_survivants = gu2.simule(100)
1print(f"Il reste {nb_survivants} survivants au bout de {gu2.n} époques.")
Il reste 23 survivants au bout de 100 époques.
1gu2.plot_historique_descendants()
../_images/c7d7b5c947e58298697f4c979f7dad18d1d659f07afb393e6af62d2eb6297769.png
1gu2.plot_zn_sur_n()
../_images/f62d2efc625f9fe1df137d2d8cabb7aee8d0a982e68312bb73b8b8234761788b.png

Arbre de Galton-Watson#

1gu2.plot_arbre()
../_images/0cebdde148e428e231c8a5ceb3f9f172295b64272144bc639bf4a22ec6cc1610.png

Essais \(Z_n / n\)#

1nb_simulations = 10_000
2nb_epoques = 100
3
4simulations = gu2.lance_simulations(nb_simulations, nb_epoques)
1simulations = np.array(simulations)
1plot_zn_distribution(simulations, nb_epoques)
../_images/36288c465cd9007983615fb7f8e40537e3426eda4960515d37c2b9cefdd1d448.png
1np.sum(simulations > 0)
295
1zn_sup_zero = simulations[simulations > 0]
1plt.figure(figsize=(10, 10))
2plt.title("Distribution des $Z_n$ avec $Z_n > 0$")
3plt.hist(zn_sup_zero)
4
5plt.savefig("assets/img/zn-sup-zero-distribution-uniform.png")
../_images/80e4fca365a2916877b9364d488e9a4fba8514391d17ac9508150b8761bdfd05.png
1lambda_estime = 1.0 / np.mean(zn_sup_zero / nb_epoques)
2print(f"{lambda_estime = }")
lambda_estime = 2.6538323137819364
1loi_expo1 = stats.expon(scale=1 / lambda_estime)
1echantillon_expo = loi_expo1.rvs(size=len(zn_sup_zero))
 1plt.figure(figsize=(10, 10))
 2plt.title("Distribution de $Z_{n} / n$, $Z_n > 0$ avec $n = 100$")
 3sns.histplot(zn_sup_zero / nb_epoques, stat="probability", label="$Z_n / n$")
 4sns.histplot(
 5    echantillon_expo,
 6    stat="probability",
 7    label=f"Échantillon de loi exponentielle ($\\lambda = {lambda_estime: 0.2}$)",
 8)
 9
10plt.legend()
11plt.savefig("assets/img/zn-sup-zero-distribution-uniform-with-exponential.png")
../_images/d1204022e03f62757312b23eb61591e66186586658bd70bbe8bb21ad12c2bd81.png
1p_value, _ = test_loi_exponentielle(zn_sup_zero / nb_epoques)

Expérimentations#

1for _ in range(500):
2    gp1.reset()
3    gp1.simule(20)
4    gp1.plot_historique_descendants()
../_images/cd81e6fa2a3661e1ea3dc775a24894eb47bb6a64b3b8265d8711c190779655c2.png
1for _ in range(500):
2    gp1.reset()
3    gp1.simule(20)
4    gp1.plot_zn_sur_n()
../_images/2b42d546fba27e4957e4247691e53239c350e3af2234943f30bf813a1fe39f90.png