Comment calculer efficacement la moyenne et l’écart type pour une très grande série de nombres?

En C # dans Visual Studio sur Windows 7, je dois calculer l’écart moyen et l’écart type pour une grande série de nombres. Ces numéros sont lus dans un fichier. Il peut y avoir dix logements ou même plus. Si je ne veux pas les enregistrer dans une structure de données telle qu’un tableau ou une liste, car cela peut ne pas être efficace en termes de mémoire, comment effectuer le calcul de manière efficace.

Je dois aussi imprimer les chiffres dans un fichier.

Les réponses à Comment calculer un écart type [tableau] ne peuvent pas aider.

Toute aide serait appréciée !

Meilleur

Dix mille numéros ne sont rien. Quelques millions suffisent pour vous faire penser à la mémoire, mais ce n’est probablement pas suffisant pour que vous ayez un problème pour les mettre tous en mémoire.

Si vous atteignez des milliards, des milliards, ou plus, vous êtes probablement au sharepoint ne pas pouvoir les récupérer en mémoire. Il ne semble pas que vous soyez encore à ce point.

Vous pouvez tous les rassembler dans une List et ne pas avoir besoin de vous inquiéter.

Cela dit, la méthode Average de LINQ n’a pas besoin de charger tous les nombres avec impatience pour calculer la moyenne; il suffit de modifier une valeur agrégée à l’aide de l’élément “current”, puis de le supprimer pour que son empreinte mémoire soit très faible. On peut en dire autant de toutes les méthodes StdDev auxquelles vous avez lié la question. ils ont tous une faible empreinte mémoire constante .

Tout ce que vous avez à faire est de créer un IEnumerable qui représente une séquence de chiffres paresseusement remplie à partir de votre fichier, et vous pouvez y appeler ces méthodes. Il n’est pas nécessaire de les charger avec impatience dans la mémoire.

Pour calculer l’écart moyen et l’écart type tout en traitant un nombre à la fois:

Initialiser Count , Sum et SumOfSquares à zéro.

Lorsque vous recevez chaque numéro, ajoutez-en un à Count , ajoutez le nombre à Sum et ajoutez le carré du nombre à SumOfSquares .

Une fois que vous avez traité chaque nombre, définissez Mean to Sum / Count et définissez StandardDeviation sur Math.Sqrt(SumOfSquares / Count - Mean * Mean) .

Une dérivation pour cette dernière formule est indiquée dans la page Wikipedia pour l’écart type .

1 million de numéros (int 32 bits) prend environ 4 Mo de mémoire, ce qui est petit.

Chargez-les tous dans une liste de données int et vous pourrez les utiliser avec les méthodes linq intégrées.

Mise à jour: Comment faire les opérations avec linq:

statistiques mathématiques avec Linq