Adloun

Moyenne et variance en un seul parcours

Exercice d'entraînement · niveau 2 · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Parcours de listes et coût

Énoncé

Écrire indicateurs(L) qui renvoie le couple (moyenne, variance empirique) d'une liste de nombres, en un seul parcours et sans utiliser np.mean ni np.var. Combien d'opérations la fonction effectue-t-elle ?

Corrigé

Le code.

def indicateurs(L):
    # somme et somme des carres, accumulees en un seul passage
    n = len(L)
    s, s2 = 0, 0
    for x in L:
        s = s + x
        s2 = s2 + x * x
    moyenne = s / n
    variance = s2 / n - moyenne * moyenne
    return moyenne, variance

print(indicateurs([2, 4, 4, 4, 5, 5, 7, 9]))   # (5.0, 4.0)

Pourquoi c'est correct. La variance empirique est par définition . En développant le carré :

puisque . C'est la formule de Kœnig-Huygens, et c'est elle qui permet de ne conserver que deux accumulateurs, et , au lieu de mémoriser la liste pour un second passage.

Vérification à la main sur l'exemple : la somme vaut , donc ; la somme des carrés vaut , donc . ✔

Le coût. La boucle fait tours, chacun à coût constant (deux additions, une multiplication) : le nombre d'opérations est de l'ordre de . La version « naïve » — calculer d'abord la moyenne, puis reparcourir pour les écarts — fait opérations, du même ordre mais deux fois plus lente, et exige que la liste soit encore disponible au second passage.

La limite de la méthode. Sur des nombres très grands et très proches les uns des autres, et deviennent presque égaux et leur différence perd des chiffres significatifs. On peut alors observer une variance légèrement négative — impossible mathématiquement, et signe que la formule développée a atteint ses limites numériques.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.