La façon la plus efficace de calculer l'exécution d'un écart-type?
J'ai un tableau de listes de nombres, par exemple:
[0] (0.01, 0.01, 0.02, 0.04, 0.03)
[1] (0.00, 0.02, 0.02, 0.03, 0.02)
[2] (0.01, 0.02, 0.02, 0.03, 0.02)
...
[n] (0.01, 0.00, 0.01, 0.05, 0.03)
Ce que je voudrais faire est efficace de calculer la moyenne et l'écart-type à chaque index d'une liste, dans tous les éléments du tableau.
À faire la moyenne, j'ai été une boucle par le choix et la somme de la valeur à un index donné une liste. À la fin, j'ai diviser chaque valeur de mon "moyennes" liste par n
.
À faire l'écart-type, je boucle à travers encore une fois, maintenant que j'ai la moyenne calculée.
Je voudrais éviter de passer par le tableau à deux reprises, une fois pour la moyenne et puis, une fois pour la SD (après j'ai une moyenne).
Est-il une méthode efficace pour le calcul de ces deux valeurs, seulement en passant par le tableau une fois? Tout le code dans un langage interprété (par exemple, Perl ou Python) ou pseudo-code est très bien.
- Langue différente, mais même algorithme: stackoverflow.com/questions/895929/...
- Merci, je vais vérifier que l'algorithme de sortir. Ressemble à ce dont j'ai besoin.
- Merci de m'indiquer la bonne réponse, dmckee. Je tiens à vous donner la "meilleure réponse" case à cocher, si vous souhaitez prendre un moment pour ajouter votre réponse ci-dessous (si vous souhaitez que les points).
- Aussi, il y a plusieurs exemples dans le rosettacode.org/wiki/Standard_Deviation
- Wikipédia a un Python de mise en œuvre de en.wikipedia.org/wiki/...
Vous devez vous connecter pour publier un commentaire.
La réponse est d'utiliser Welford de l'algorithme, qui est très clairement définie après le "naïf méthodes", dans:
Il est numériquement plus stable que soit la passe de deux ou en ligne simple somme des carrés des collectionneurs suggéré dans d'autres réponses. La stabilité n'est vraiment important quand vous avez beaucoup de valeurs qui sont proches les uns des autres comme ils le conduire à ce qui est connu comme "catastrophique annulation" en virgule flottante, la littérature.
Vous pouvez également balayer vers le haut sur la différence entre les divisant par le nombre d'échantillons (N) et N-1 dans le calcul de l'écart (écart au carré). En divisant par N-1 conduit à une estimation non biaisée de la variance de l'échantillon, alors qu'en divisant par N, en moyenne, sous-estime la variance (car elle ne prend pas en compte l'écart entre la moyenne de l'échantillon et la moyenne vraie).
J'ai écrit deux entrées de blog sur le sujet que d'aller dans plus de détails, y compris la façon de supprimer les valeurs précédentes en ligne:
Vous pouvez également prendre un coup d'oeil à mon Java mettre en œuvre; la javadoc, la source, et les tests unitaires sont tous en ligne:
stats.OnlineNormalEstimator
stats.OnlineNormalEstimator.java
test.unit.stats.OnlineNormalEstimatorTest.java
La réponse de base est d'accumuler la somme des deux x (appelons cela la "sum_x1') et x2 (appelons cela la "sum_x2'), comme vous allez. La valeur de l'écart-type est alors:
où
C'est l'écart-type d'échantillon; vous obtenez l'écart type de population à l'aide de " n "au lieu de" n - 1 " comme le diviseur.
Vous pouvez avoir besoin de vous soucier de la stabilité numérique de la prise de la différence entre les deux grands nombres si vous travaillez avec des échantillons de grande taille. Aller pour les références externes dans d'autres réponses (Wikipedia, etc) pour plus d'informations.
Peut-être pas ce que vous demandez, mais ... Si vous utilisez un tableau numpy, il va faire le travail pour vous, de manière efficace:
Par le façon, il ya une intéressante discussion dans ce blog et les commentaires sur une passe de méthodes pour le calcul des moyennes et des variances:
Ici est un littéral pur Python traduction de la Welford, l'algorithme de mise en œuvre de http://www.johndcook.com/standard_deviation.html:
https://github.com/liyanage/python-modules/blob/master/running_stats.py
Utilisation:
La Python "runstats" Module est pour ce genre de chose. Installer "runstats" de PyPI:
"Runstats" résumés peuvent produire de la moyenne, la variance, l'écart-type, coefficient d'asymétrie et le coefficient d'aplatissement en un seul passage de données. Nous pouvons l'utiliser pour créer votre "running" version.
Statistiques sommaires sont basés sur les Knuth et de Welford méthode pour le calcul de la déviation standard en une seule passe comme décrit dans l'Art de la Programmation Informatique, Vol 2, p. 232, 3e édition. L'avantage de cette est numériquement stable et la précision des résultats.
Avertissement: je suis l'auteur du Python "runstats" module.
Statistics
a un.pop
méthode de déploiement de la statistique pourrait également être calculé.Statistiques::Descriptif est un très décent module Perl pour ces types de calculs:
De sortie:
Ont un coup d'oeil à PDL (prononcé "piddle!").
C'est le Perl de Données de la Langue qui est conçu pour la haute précision des mathématiques et de l'informatique scientifique.
Voici un exemple d'utilisation de vos figures....
Qui produit:
Jetez un oeil à PDL::Primitive pour plus d'informations sur le statsover de la fonction. Ceci semble suggérer que l'ADEV est le "écart-type".
Toutefois, il peut-être les personnes à mobilité RÉDUITE (qui Sinan Statistiques::Descriptive exemple montre) ou RMS (qui ars NumPy montre l'exemple). Je suppose que l'une de ces trois doit être droit 😉
Pour plus d'PDL informations, jetez un oeil à:
Quelle est la taille de votre tableau? Sauf si c'est des milliards d'éléments de long, ne vous inquiétez pas sur la boucle par deux fois. Le code est simple et facile de tester.
Ma préférence serait d'utiliser la numpy tableau de mathématiques de l'extension de convertir votre tableau de tableaux dans un numpy tableau 2D et obtenir l'écart-type directement:
Si ce n'est pas une option et que vous avez besoin d'un pur Python solution, continuez à lire...
Si votre tableau est
Puis l'écart-type est:
Si vous êtes déterminé à boucle à travers votre tableau qu'une seule fois, les cumuls peuvent être combinés.
Ce n'est pas aussi élégant que la liste de compréhension de la solution ci-dessus.
Je pense que cette question va vous aider. Écart-type
Vous pouvez consulter l'article de Wikipedia sur Écart-Type, en particulier la section sur le Rapide des méthodes de calcul.
Il y a aussi un article que j'ai trouvé qui utilise Python, vous devriez être en mesure d'utiliser le code sans trop de changement: Les Messages Subliminaux - L'Exécution Des Écarts-Types.
Comme la réponse suivante décrit:
Ne pandas/scipy/numpy fournir une norme cumulative fonction d'écart?
Le Python Pandas module contient une méthode pour calculer l'exécution ou la cumulé écart-type.
Pour cela, vous devrez convertir vos données dans une pandas dataframe (ou une série si c'est 1D), mais il existe des fonctions pour que.
Voici un "one-liner", réparties sur plusieurs lignes de la programmation fonctionnelle style:
Je tiens à exprimer la mise à jour de cette façon:
que l'un passe-fonction devrait ressembler à ceci:
noter que c'est le calcul de la variance de l'échantillon (1/N), et non l'estimation non biaisée de la variance de population (qui utilise un 1/(N-1) normalzation facteur). Contrairement à d'autres réponses, la variable,
var
, qui est suivi de l'exécution de la variance n'augmente pas en proportion du nombre d'échantillons. En tout temps, elle est juste la variance de l'ensemble des échantillons vu jusqu'à présent (il n'y a pas de finale "en divisant par n" dans l'obtention de la variance).Dans une classe, il devrait ressembler à ceci:
Cela fonctionne aussi pour les pondérée des échantillons: