Gibt es einen Algorithmus zum Schätzen des Medians, des Modus, der Schiefe und / oder der Kurtosis von Wertesätzen, für den jedoch NICHT alle Werte gleichzeitig im Speicher gespeichert werden müssen?
Ich möchte die Basisstatistik berechnen:
- Mittelwert: arithmetischer Durchschnitt
- Varianz: Durchschnitt der quadratischen Abweichungen vom Mittelwert
- Standardabweichung: Quadratwurzel der Varianz
- Median: Wert, der die größere Hälfte der Zahlen von der kleineren Hälfte trennt
- Modus: Häufigster Wert im Set
- Schiefe: tl; DR
- Kurtosis: tl; DR
Die Grundformeln für die Berechnung einer dieser Formeln sind Grundschularithmetik, und ich kenne sie. Es gibt auch viele Statistikbibliotheken, die sie implementieren.
Mein Problem ist die große Anzahl (Milliarden) von Werten in den Mengen, die ich verarbeite: In Python kann ich nicht einfach eine Liste oder einen Hash mit Milliarden von Elementen erstellen. Selbst wenn ich dies in C geschrieben habe, sind Arrays mit Milliarden Elementen nicht allzu praktisch.
Die Daten werden nicht sortiert. Es wird zufällig und spontan von anderen Prozessen produziert. Die Größe jedes Satzes ist sehr variabel und die Größen werden nicht im Voraus bekannt sein.
Ich habe bereits herausgefunden, wie ich mit dem Mittelwert und der Varianz ziemlich gut umgehen kann, indem ich jeden Wert in der Menge in beliebiger Reihenfolge durchlaufen habe. (In meinem Fall nehme ich sie in der Reihenfolge, in der sie generiert wurden.) Hier ist der Algorithmus, den ich verwende, mit freundlicher Genehmigung von http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm :
- Initialisieren Sie drei Variablen: count, sum und sum_of_squares
- Für jeden Wert:
- Inkrementanzahl.
- Addiere den Wert zur Summe.
- Addiere das Quadrat des Wertes zu sum_of_squares.
- Teilen Sie die Summe durch die Anzahl und speichern Sie sie als variablen Mittelwert.
- Teilen Sie sum_of_squares durch count und speichern Sie es als Variable mean_of_squares.
- Quadratischer Mittelwert, der als Quadrat_Mittelwert gespeichert wird.
- Subtrahieren Sie square_of_mean von mean_of_squares und speichern Sie es als Varianz.
- Ausgangsmittelwert und Varianz.
Dieser "Online" -Algorithmus weist Schwachstellen auf (z. B. Genauigkeitsprobleme, da sum_of_squares schnell größer als der ganzzahlige Bereich oder die Float-Genauigkeit wird), aber er gibt mir im Grunde das, was ich brauche, ohne jeden Wert in jedem Satz speichern zu müssen.
Ich weiß jedoch nicht, ob es ähnliche Techniken zur Schätzung der zusätzlichen Statistiken gibt (Median, Modus, Schiefe, Kurtosis). Ich könnte mit einem voreingenommenen Schätzer oder sogar einer Methode leben, die die Genauigkeit bis zu einem gewissen Grad beeinträchtigt, solange der zur Verarbeitung von N-Werten erforderliche Speicher wesentlich kleiner als O (N) ist.
Das Verweisen auf eine vorhandene Statistikbibliothek hilft auch, wenn die Bibliothek über Funktionen verfügt, mit denen eine oder mehrere dieser Operationen "online" berechnet werden können.