2015-04-27 1 views
2

J'essaie de comprendre pourquoi ce processus me donne une mauvaise réponse.Erreur de calcul d'écart-type

Pour [1,2,3,4,5] Je reçois 1.2 au lieu de 1,414

def standard_deviation(number_list): 
    average = sum(number_list)/float(len(number_list)) 
    stdev = 0 
    for value in number_list: 
     stdev += math.sqrt((average - value)**2)/float(len(number_list)) 
    return stdev 

standard_deviation([1,2,3,4,5]) 
+0

Revérifier la formule dans votre texte. L'écart-type se divise souvent par 'len (number_list) -1'. – Teepeemm

Répondre

3

la formule vous mis en œuvre de manière incorrecte.

La définition est "L'écart-type est la racine carrée de la moyenne des écarts quadratiques par rapport à la moyenne". This numpy page explains it well (see the Notes section).

Le code math.sqrt((average - value)**2) ne fait pas ce que vous voulez; le sqrt et ** 2 sorte d'annuler l'un l'autre de sorte que le résultat est juste abs(average-value). La page numpy décrit succinctement l'implémentation sous la forme std = sqrt(mean(abs(x - x.mean())**2)).

La correction suivante à votre code fonctionnera mieux:

def standard_deviation(number_list): 
    average = sum(number_list)/float(len(number_list)) 
    sqdev = 0 
    for value in number_list: 
     sqdev += (average-value)**2 
    sqdev = sqdev/float(len(number_list)) 
    return math.sqrt(sqdev) 
+1

Est-ce que sqdev + = (valeur moyenne) ** 2/float (len (liste_numéro)) fonctionnera sur une ligne? – DDDD

+0

Oui, vous pouvez faire une moyenne courante. Il existe plusieurs façons d'optimiser la fonction en fonction de vos objectifs. – patrickmdnet