Existe-t-il un algorithme pour estimer la médiane, le mode, l'asymétrie et / ou le kurtosis d'un ensemble de valeurs, mais cela ne nécessite PAS de stocker toutes les valeurs en mémoire à la fois?
Je voudrais calculer les statistiques de base:
- moyenne: moyenne arithmétique
- variance: moyenne des écarts au carré de la moyenne
- écart type: racine carrée de la variance
- médiane: valeur qui sépare la plus grande moitié des nombres de la plus petite moitié
- mode: valeur la plus fréquente trouvée dans l'ensemble
- asymétrie: tl; dr
- kurtosis: tl; dr
Les formules de base pour calculer l'un de ces éléments sont l'arithmétique de l'école primaire, et je les connais. Il existe également de nombreuses bibliothèques de statistiques qui les implémentent.
Mon problème est le grand nombre (milliards) de valeurs dans les ensembles que je gère: en travaillant en Python, je ne peux pas simplement faire une liste ou un hachage avec des milliards d'éléments. Même si j'ai écrit cela en C, les tableaux de milliards d'éléments ne sont pas trop pratiques.
Les données ne sont pas triées. Il est produit au hasard, à la volée, par d'autres processus. La taille de chaque ensemble est très variable et les tailles ne seront pas connues à l'avance.
J'ai déjà compris comment gérer assez bien la moyenne et la variance, en parcourant chaque valeur de l'ensemble dans n'importe quel ordre. (En fait, dans mon cas, je les prends dans l'ordre dans lequel ils sont générés.) Voici l'algorithme que j'utilise, avec la permission de http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm :
- Initialisez trois variables: count, sum et sum_of_squares
- Pour chaque valeur:
- Nombre d'incrément.
- Ajoutez la valeur à additionner.
- Ajoutez le carré de la valeur à sum_of_squares.
- Divisez la somme par le nombre, en la stockant comme moyenne de la variable.
- Divisez sum_of_squares par count, en stockant comme variable mean_of_squares.
- Moyenne carrée, stockée sous forme de square_of_mean.
- Soustrayez square_of_mean de mean_of_squares, en stockant comme variance.
- Moyenne et variance de sortie.
Cet algorithme «en ligne» a des faiblesses (par exemple, des problèmes de précision car sum_of_squares devient rapidement plus grand que la plage entière ou la précision flottante), mais il me donne essentiellement ce dont j'ai besoin, sans avoir à stocker chaque valeur dans chaque ensemble.
Mais je ne sais pas s'il existe des techniques similaires pour estimer les statistiques supplémentaires (médiane, mode, asymétrie, kurtosis). Je pourrais vivre avec un estimateur biaisé, ou même une méthode qui compromet la précision dans une certaine mesure, tant que la mémoire nécessaire pour traiter N valeurs est sensiblement inférieure à O (N).
M'indiquer une bibliothèque de statistiques existante aidera aussi, si la bibliothèque a des fonctions pour calculer une ou plusieurs de ces opérations "en ligne".