Deux formules pour la même variance
Exercice supplémentaire · niveau 3 (difficile) · sciences numériques et technologie (seconde), chapitre 5 — Les fonctions · Lire une fonction statistique
Énoncé
La variance peut se calculer de deux façons : , ou . Les programmer toutes deux, vérifier qu'elles coïncident sur [4, 6, 8, 10, 12], puis les comparer sur [1000000.1, 1000000.2, 1000000.3].
Corrigé
def variance_A(L):
m = sum(L) / len(L)
return sum((x - m)**2 for x in L) / len(L)
def variance_B(L):
m = sum(L) / len(L)
return sum(x*x for x in L) / len(L) - m*m
print(variance_A([4, 6, 8, 10, 12])) # 8.0
print(variance_B([4, 6, 8, 10, 12])) # 8.0
L = [1000000.1, 1000000.2, 1000000.3]
print(variance_A(L)) # 0.006666... (correct)
print(variance_B(L)) # une valeur très différente, parfois négative
Sur la première liste, les deux formules donnent — elles sont algébriquement équivalentes, le développement de le montre.
Sur la seconde, la formule B s'effondre. Elle calcule la différence de deux nombres énormes et presque égaux (de l'ordre de ) dont le résultat attendu est minuscule : les chiffres significatifs se détruisent mutuellement, et il ne reste que du bruit d'arrondi. Il arrive même qu'elle renvoie une variance négative, ce qui est impossible.
Deux formules mathématiquement égales ne sont pas deux programmes égaux. C'est un phénomène de calcul en machine, pas de mathématiques.
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.