Python: Numpy écart-type d'erreur
C'est un test simple
import numpy as np
data = np.array([-1,0,1])
print data.std()
>> 0.816496580928
Je ne comprends pas comment ce résultat été généré? Évidemment:
( (1^0.5 + 1^0.5 + 0^0.5)/(3-1) )^0.5 = 1
et dans matlab, il me donne std([-1,0,1]) = 1
. Pourriez-vous m'aider à comprendre comment numpy.std()
fonctionne?
- En divisant par N-1 donne la variance de l'échantillon, mais NumPy calcule la variance de population.
- Donner à ceci un upvote parce que la différence entre la population et de l'écart-type d'échantillon est rarement prêté attention jusqu'à ce que les résultats ne correspondent pas aux - choisir un, et de savoir pourquoi vous l'utilisez, permettra à la fois d'aider à prévenir ce problème et aussi vous forcer à utilement réfléchir à votre problème un peu plus. (Tous dit de désagréable.).
Vous devez vous connecter pour publier un commentaire.
Le nœud de ce problème est que vous avez besoin de diviser par
N
(3), pasN-1
(2). Comme Iarsmans souligné, numpy va utiliser la variance de population, et non la variance de l'échantillon.Donc, la réponse est
sqrt(2/3)
qui est exactement cela:0.8164965...
Si vous arrive d'être en essayant délibérément d'utiliser une valeur différente (que la valeur 0 par défaut) pour les degrés de liberté, utilisez le mot-clé argument
ddof
avec une valeur positive autre que 0:... mais cela ici à réintroduire votre problème d'origine comme numpy va diviser par
N - ddof
.N-1
au lieu deN
. À l'aide deN
et puis, à l'aide deddof=1
serait, en effet, de réintroduire le problème d'origine!Il vaut la peine de lire la page d'aide de la fonction/méthode, avant de suggérer qu'il est incorrect. La méthode est exactement ce que le doc-chaîne indique qu'elle doit faire, divise par 3, car Par défaut
ddof
est zéro.:Lors de l'obtention dans NumPy à partir de Matlab, vous aurez probablement envie de garder les docs pour les deux à portée de main. Ils sont similaires, mais diffèrent souvent de petits détails importants. En gros, ils ont calculer l'écart-type différemment. Je vous recommandons fortement de vérifier la documentation pour tout ce que vous utilisez et qui calcule l'écart-type, si une calculatrice de poche ou un langage de programmation, car la valeur par défaut n'est pas (désolé!) normalisé.
Numpy STD: http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html
Matlab STD: http://www.mathworks.com/help/matlab/ref/std.html
La Numpy docs pour
std
sont un peu opaque, à mon humble avis, d'autant plus que NumPy docs sont généralement assez clair. Si vous lisez assez loin:The average squared deviation is normally calculated as x.sum() /N, where N = len(x). If, however, ddof is specified, the divisor N - ddof is used instead. In standard statistical practice, ddof=1 provides an unbiased estimator of the variance of the infinite population.
(En anglais par défaut est pop std dev, ensembleddof=1
pour l'échantillon std dev).Otoh, que, le Matlab docs faire clairement la différence de déclenchement de vous:
There are two common textbook definitions for the standard deviation s of a data vector X. [equations omitted] n is the number of elements in the sample. The two forms of the equation differ only in n – 1 versus n in the divisor.
Donc, par défaut, Matlab calcule l'écart-type d'échantillon (N-1 dans le diviseur, alors le plus gros pour compenser le fait, c'est un exemple) et Numpy calcule l'écart type de population (N dans le diviseur). Vous utilisez le
ddof
paramètre à passer à l'échantillon standard, ou de toute autre dénominateur vous voulez (ce qui va au-delà de mes connaissances des statistiques).Enfin, il n'est pas de l'aide sur ce problème, mais vous trouverez probablement ce utile à un certain point. http://wiki.scipy.org/NumPy_for_Matlab_Users
ddof
tels queddof ∉ {0, 1}
?