Pourquoi ne numpy (mts) donner un résultat différent de matlab (mts)?
J'ai essayer de convertir un code matlab pour numpy et compris que numpy a un résultat différent avec la fonction std.
dans matlab
std([1,3,4,6])
ans = 2.0817
dans numpy
np.std([1,3,4,6])
1.8027756377319946
Est-ce normal? Et comment dois-je gérer cela?
Vous devez vous connecter pour publier un commentaire.
La fonction NumPy
np.std
prend un paramètre optionnelddof
: "Delta Degrés de Liberté". Par défaut, c'est0
. Mis à1
pour obtenir le MATLAB résultat:Pour ajouter un peu plus de contexte, dans le calcul de la variance (dont l'écart type est la racine carrée) en général, nous pouvons diviser par le nombre de valeurs que nous avons.
Mais si l'on sélectionne un échantillon aléatoire de
N
éléments d'une plus grande distribution et de calculer la variance, la division parN
peut conduire à une sous-estimation de l'effectif de la variance. Pour résoudre ce problème, nous pouvons réduire le nombre on divise par (les degrés de liberté) à un nombre inférieurN
(généralementN-1
). Leddof
paramètre permet de modifier le diviseur par le montant que nous le préciser.À moins d'avis contraire, NumPy permettra de calculer le biaisée estimateur de la variance (
ddof=0
, en divisant parN
). C'est ce que vous voulez si vous travaillez avec l'ensemble de la distribution (et non pas un sous-ensemble de valeurs qui ont été choisis au hasard à partir d'une diffusion plus large). Si leddof
paramètre est donné, NumPy divise parN - ddof
à la place.Le comportement par défaut de MATLAB
std
est de corriger le biais de variance de l'échantillon en divisant parN-1
. Cela se débarrasse de certains (mais pas tous) de la partialité dans l'écart-type. C'est probablement ce que vous voulez si vous êtes en utilisant la fonction sur un échantillon aléatoire d'une distribution plus importante.La belle réponse par @hbaderts donne de plus amples détails mathématiques.
std([1 3 4 6],1)
est équivalent à NumPy par défaut denp.std([1,3,4,6])
. Tout cela est très clairement expliqué dans la documentation de Matlab et de NumPy, donc je recommande fortement que le po assurez-vous de les lire dans l'avenir.L'écart-type est la racine carrée de la variance. La variance d'une variable aléatoire
X
est défini commeUn estimateur de la variance serait
où , il peut être démontré que cet estimateur ne converge pas à la vraie variance, mais à
Si vous choisissez au hasard des échantillons et de l'estimation de la moyenne de l'échantillon et de la variance, vous devrez utiliser un corrigé (non biaisée) estimateur
qui convergeront vers est également appelé de Bessel de correction.
Maintenant, par défaut, MATLABs
std
calcule la impartiale estimateur avec le terme de correctionn-1
. NumPy toutefois (comme @ajcr expliqué) calcule la biaisée estimateur sans terme de correction par défaut. Le paramètreddof
permet de définir n'importe quel terme de correctionn-ddof
. Par la mise à 1, vous obtenez le même résultat que dans MATLAB.De même, MATLAB permet d'ajouter un second paramètre
w
, qui spécifie la "pesée régime". La valeur par défaut,w=0
, les résultats en terme de correctionn-1
(estimateur non biaisé), tandis que pourw=1
, que n est utilisé comme terme de correction (estimateur biaisé).n
aller en haut de la notation somme, il est allé à l'intérieur de la somme.Pour les personnes qui ne sont pas de grands avec des statistiques, simpliste guide est:
Inclure
ddof=1
si vous êtes le calcul denp.std()
pour un échantillon prélevé à partir de votre ensemble de données complet.Assurer
ddof=0
si vous êtes le calcul denp.std()
de la populationLa DDOF est inclus pour les échantillons dans le but de contrer les biais qui peuvent se produire dans les chiffres.