it-swarm.com.de

"Online" (Iterator) -Algorithmen zur Schätzung des statistischen Median, Modus, Schiefe, Kurtosis?

Gibt es einen Algorithmus zur Schätzung des Medianwerts, des Modus, der Schiefe und/oder der Kurtosis eines Wertesatzes, aber dies erfordert NICHT das gleichzeitige Speichern aller Werte im Speicher?

Ich möchte die grundlegenden Statistiken berechnen:

  • mittelwert: arithmetischer Durchschnitt
  • abweichung: 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
  • mode: am häufigsten gefundener Wert im Set
  • schiefe: tl; DR
  • kurtosis: tl; DR

Die Grundformeln für die Berechnung eines dieser Werte sind Grundschularithmetik, und ich kenne sie. Es gibt viele Statistikbibliotheken, die sie ebenfalls implementieren.

Mein Problem ist die große Anzahl (Milliarden) von Werten in den Sets, die ich handle: Wenn ich in Python arbeite, kann ich nicht einfach eine Liste oder einen Hash mit Milliarden von Elementen erstellen. Selbst wenn ich dies in C geschrieben habe, sind Milliarden-Arrays nicht zu praktisch.

Die Daten werden nicht sortiert. Es wird nach dem Zufallsprinzip von anderen Prozessen produziert. Die Größe jedes Satzes ist stark variabel und die Größen sind im Voraus nicht bekannt.

Ich habe bereits herausgefunden, wie man mit dem Mittelwert und der Abweichung ziemlich gut umgeht, indem ich jeden Wert im Satz in beliebiger Reihenfolge durchlaufe. (In meinem Fall nehme ich sie in der Reihenfolge, in der sie generiert werden.) Hier ist der Algorithmus, den ich verwende, nämlich 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 gilt:
    • Schrittweite.
    • Addieren Sie den Wert zur Summe.
    • Addiere das Quadrat des Wertes zu sum_of_squares.
  • Summe durch Anzahl dividieren, als variablen Mittelwert speichern.
  • Teilen Sie sum_of_squares durch count und speichern Sie als Variable mean_of_squares.
  • Quadrat-Mittelwert, Speichern als Quadrat-Mittelwert.
  • Quadrat_of_mean von mean_of_squares subtrahieren und als Varianz speichern.
  • Ausgabemittelwert und Varianz.

Dieser "Online" -Algorithmus weist Schwächen auf (z. B. Genauigkeitsprobleme, da sum_of_squares schnell größer wird als der ganzzahlige Bereich oder die Gleitkomma-Genauigkeit), 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 gibt, um die zusätzlichen Statistiken (Median, Modus, Schiefe, Kurtosis) zu schätzen. Ich könnte mit einem voreingenommenen Schätzer oder sogar mit einer Methode leben, die die Genauigkeit bis zu einem gewissen Grad beeinträchtigt, solange der Speicher, der zur Verarbeitung von N-Werten benötigt wird, wesentlich geringer ist als O (N).

Das Verweisen auf eine vorhandene Statistikbibliothek ist auch hilfreich, wenn die Bibliothek über Funktionen verfügt, um eine oder mehrere dieser Operationen "online" zu berechnen.

80
Ryan B. Lynch

Schiefe und Kurtosis

Die Online-Algorithmen für Skewness und Kurtosis (entlang der Linie der Varianz) finden Sie auf derselben Wiki-Seite hier die parallelen Algorithmen für Statistiken mit höherem Moment.

Median

Der Median ist hart ohne sortierte Daten. Wenn Sie wissen, wie viele Datenpunkte Sie haben, müssen Sie theoretisch nur teilweise sortieren, z. mit einem Auswahlalgorithmus . Bei Milliardenwerten hilft das jedoch nicht viel. Ich würde empfehlen, Frequenzzählungen zu verwenden, siehe den nächsten Abschnitt.

Median und Modus mit Frequenzzählungen

Wenn es sich um Ganzzahlen handelt, würde ich zählen Frequenzen , wahrscheinlich die höchsten und niedrigsten Werte jenseits eines bestimmten Wertes abschneiden, bei denen ich sicher bin, dass sie nicht mehr relevant sind. Für Floats (oder zu viele Ganzzahlen) würde ich wahrscheinlich Buckets/Intervalle erstellen und dann dieselbe Vorgehensweise wie für Ganzzahlen verwenden. Der (ungefähre) Modus und die Mittelberechnung wird aufgrund der Häufigkeitstabelle leicht.

Normal verteilte zufällige Variablen

Wenn es normal verteilt ist, würde ich die Bevölkerungsstichprobe mean , varance , skewness und kurtosis als Maximum-Likelihood-Schätzer für eine kleine Teilmenge verwenden. Die (Online-) Algorithmen, um diese zu berechnen, haben Sie jetzt schon. Z.B. Lesen Sie einige hunderttausend oder Millionen Datenpunkte ein, bis Ihr Schätzfehler klein genug ist. Stellen Sie einfach sicher, dass Sie zufällig aus Ihrem Set auswählen (z. B. dass Sie durch die Auswahl der ersten 100'000 Werte keine Verzerrung einführen). Der gleiche Ansatz kann auch für die Schätzung von Modus und Median für den Normalfall verwendet werden (für beide Mittelwerte gilt ein Schätzer).

Weitere Kommentare

Alle obigen Algorithmen können parallel ausgeführt werden (einschließlich vieler Sortier- und Auswahlalgorithmen, z. B. QuickSort und QuickSelect), falls dies hilfreich ist.

Ich habe immer angenommen (mit Ausnahme des Abschnitts über die Normalverteilung), dass wir über Momente, Median und Modus der Probe sprechen, nicht über Schätzer für theoretische Momente bei einer bekannten Verteilung.

Im Allgemeinen sollte das Abtasten der Daten (dh das Betrachten einer Teilmenge) angesichts der Datenmenge ziemlich erfolgreich sein, sofern alle Beobachtungen Realisierungen derselben Zufallsvariablen (gleiche Verteilungen) und der Momente, des Modus und sind Median existiert tatsächlich für diese Verteilung. Der letzte Vorbehalt ist nicht harmlos. Zum Beispiel existiert der Mittelwert (und alle höheren Momente) für die Cauchy-Verteilung nicht. In diesem Fall kann der Stichprobenmittelwert einer "kleinen" Teilmenge massiv vom Stichprobenmittelwert der gesamten Probe abweichen.

50
stephan

Ich verwende diese inkrementellen/rekursiven Mittelwert- und Medianschätzer, die beide konstanten Speicher verwenden:

mean += eta * (sample - mean)
median += eta * sgn(sample - median)

wobei eta ein Parameter für eine kleine Lernrate (z. B. 0,001) ist und sgn () die Signum-Funktion ist, die eine von {-1, 0, 1} zurückgibt. (Verwenden Sie eine Konstante eta, wenn die Daten nicht stationär sind und Sie Änderungen über die Zeit verfolgen möchten. Andernfalls können Sie für stationäre Quellen eta = 1/n für den Mittelwert-Schätzer verwenden, wo n ist die Anzahl der bisher gesehenen Proben. Leider scheint dies für den Median-Schätzer nicht zu funktionieren.)

Dieser Typ eines inkrementellen Mittelwertschätzers scheint überall verwendet zu werden, z. in unüberwachten neuronalen Netzwerk-Lernregeln, aber die mittlere Version scheint trotz ihrer Vorteile (Robustheit gegenüber Ausreißern) viel seltener zu sein. Es scheint, dass die Medianversion in vielen Anwendungen als Ersatz für den Mittelwertschätzer verwendet werden könnte.

Ich würde gerne einen inkrementellen Modusschätzer einer ähnlichen Form sehen ...

UPDATE

Ich habe gerade den inkrementellen Mittelwertschätzer modifiziert, um willkürliche Quantile zu schätzen. Im Allgemeinen gibt eine Quantilfunktion ( http://en.wikipedia.org/wiki/Quantile_function ) den Wert an, mit dem die Daten in zwei Brüche unterteilt werden: p und 1-p. Die folgenden Schätzungen schätzen diesen Wert inkrementell:

quantile += eta * (sgn(sample - quantile) + 2.0 * p - 1.0)

Der Wert p sollte innerhalb von [0,1] liegen. Dadurch wird die symmetrische Ausgabe {-1,0,1} der Funktion sgn () so verschoben, dass sie sich zu einer Seite neigt und die Datenabtastungen in zwei Bänke mit ungleicher Größe unterteilt (die Brüche p und 1-p der Daten sind geringer als/größer als die Quantil-Schätzung). Beachten Sie, dass sich für p = 0,5 der Median-Schätzer verringert.

53
Tyler Streeter

Ich habe den P-Square-Algorithmus für die dynamische Berechnung von Quantilen und Histogrammen ohne Speichern von Beobachtungen implementiert in einem ordentlichen Python-Modul, das ich als LiveStats geschrieben habe. Es sollte Ihr Problem ziemlich effektiv lösen. Die Bibliothek unterstützt jede Statistik, die Sie mit Ausnahme des Modus angeben. Ich habe noch keine zufriedenstellende Lösung für die Modusschätzung gefunden.

9
Sean

Ryan, ich fürchte, du machst nicht den Mittelwert und die Abweichung richtig ... Das kam vor ein paar Wochen hier . Und eine der Stärken der Online-Version (die eigentlich als Welford-Methode bezeichnet wird) ist die Tatsache, dass sie besonders genau und stabil ist, siehe die Diskussion hier . Eine der Stärken ist die Tatsache, dass Sie nicht die Gesamtsumme oder Gesamtsumme der Quadrate speichern müssen.

Ich kann mir keine Online-Herangehensweise an den Modus und den Mittelwert vorstellen, bei denen die gesamte Liste gleichzeitig betrachtet werden muss. Es kann jedoch durchaus sein, dass ein ähnlicher Ansatz als der für die Abweichung und den Mittelwert auch für die Schiefe und die Kurtosis gilt.

7
Jaime

Der in der Frage zitierte Wikipedia-Artikel enthält die Formeln zur Online-Berechnung der Schiefe und der Kurtosis.

Ich glaube, für den Modus ist dies online nicht möglich. Warum? Nehmen Sie an, dass alle Werte Ihrer Eingabe sich von dem letzten unterscheiden, der einen vorherigen dupliziert. In diesem Fall müssen Sie alle Werte berücksichtigen, die bereits in der Eingabe angezeigt wurden, um zu erkennen, dass der letzte Wert einen zuvor angezeigten Wert dupliziert und der häufigste ist.

Für den Median ist es fast derselbe - bis zur letzten Eingabe wissen Sie nicht, welcher Wert zum Median wird, wenn alle Eingabewerte unterschiedlich sind, da sie vor oder nach dem aktuellen Median liegen könnten. Wenn Sie die Länge der Eingabe kennen, können Sie den Median finden, ohne alle Werte im Speicher zu speichern. Sie müssen jedoch viele von ihnen speichern (ich denke, die Hälfte), da eine schlechte Eingabesequenz den Median im Die zweite Hälfte macht möglicherweise einen Wert aus der ersten Hälfte des Medianwerts.

(Beachten Sie, dass ich mich nur auf die exakte Berechnung beziehe.)

3

Wenn Sie über Milliarden von Datenpunkten verfügen, ist es wahrscheinlich nicht erforderlich, dass Sie genaue Antworten im Gegensatz zu engen Antworten benötigen. Wenn Sie über Milliarden von Datenpunkten verfügen, wird der zugrunde liegende Prozess, der sie generiert, im Allgemeinen einer statistischen Stationarität/Ergodizität/Mischeigenschaft gehorchen. Es kann auch wichtig sein, ob Sie erwarten, dass die Verteilungen angemessen kontinuierlich sind oder nicht. 

Unter diesen Umständen gibt es Algorithmen für Online, wenig Speicher, Schätzung von Quantilen (der Median ist ein Spezialfall von 0,5 Quantilen) sowie Modi, wenn Sie keine exakten Antworten benötigen. Dies ist ein aktives Feld der Statistik. 

beispiel für die Schätzung von Quantilen: http://www.computer.org/portal/web/csdl/doi/10.1109/WSC.2006.323014

beispiel für die Modusschätzung: Bickel DR. Robuste Schätzer für den Modus und die Schrägheit kontinuierlicher Daten. Computational Statistics und Datenanalyse. 2002; 39: 153–163. doi: 10.1016/S0167-9473 (01) 00057-3.

Dies sind aktive Felder der Berechnungsstatistik. Sie befinden sich in den Bereichen, in denen es keinen einzigen exakten Algorithmus gibt, sondern eine Vielfalt davon (statistische Schätzer, in Wahrheit), die unterschiedliche Eigenschaften, Annahmen und Leistungen aufweisen. Es ist experimentelle Mathematik. Es gibt wahrscheinlich Hunderte bis Tausende von Papieren zu diesem Thema.

Die letzte Frage ist, ob Sie wirklich Schiefe und Kurtosis selbst benötigen, oder eher einige andere Parameter, die bei der Bestimmung der Wahrscheinlichkeitsverteilung zuverlässiger sein können (vorausgesetzt, Sie haben eine Wahrscheinlichkeitsverteilung!). Erwarten Sie eine Gaußsche?

Haben Sie Möglichkeiten, die Daten zu bereinigen/vorzuverarbeiten, um sie größtenteils Gaußschesisch zu machen? (z. B. sind die Beträge für die Finanztransaktionen nach der Verwendung von Logarithmen oft etwas Gaußscher). Erwarten Sie endliche Standardabweichungen? Erwarten Sie fette Schwänze? Sind die Mengen, die Ihnen wichtig sind, in den Schwänzen oder in der Masse? 

2
Matt Kennel

Jeder sagt immer, dass man den Modus nicht online machen kann, aber das stimmt einfach nicht. Hier ist ein Artikel , der einen Algorithmus beschreibt, um genau dieses Problem zu lösen, das 1982 von Michael E. Fischer und Steven L. Salzberg von der Yale University entwickelt wurde. Aus dem Artikel: 

Der Majoritätsfindungsalgorithmus verwendet eines seiner Register für temporäre Speicherung eines einzelnen Elements aus dem Stream; Dieses Element ist das aktuelle Kandidat für die Mehrheit. Das zweite Register ist ein Zähler auf 0 initialisiert. Für jedes Element des Streams fragen wir den Algorithmus um die folgende Routine auszuführen. Wenn der Zähler 0 anzeigt, installieren Sie die aktuelles Stream-Element als neuer Majoritätskandidat (wobei ein beliebiges anderes Element, das sich möglicherweise bereits im Register befindet, ersetzt wird). Dann, wenn die aktuelles Element stimmt mit dem Mehrheitskandidaten überein, inkrementiert den Zähler; Andernfalls verringern Sie den Zähler. An diesem Punkt im Zyklus, wenn die Ein Teil des Streams, der bisher gesehen wurde, hat ein Majoritätselement, das Element ist im Kandidatenregister, und der Zähler hält einen Wert größer als 0. Was ist, wenn es keine Mehrheit gibt? Ohne einen zweiten Durchlauf durch die Daten - was in einer Stream-Umgebung nicht möglich ist - das Der Algorithmus kann hier nicht immer eine eindeutige Antwort geben Umstand. Es verspricht lediglich, die Mehrheit richtig zu identifizieren Element, wenn es eines gibt.

Es kann auch erweitert werden, um das obere N mit mehr Speicher zu finden. Dies sollte sich jedoch für den Modus lösen.

2
hackartist

Wenn Sie keine a priori parametrischen Kenntnisse der Verteilung haben, denke ich, müssen Sie alle Werte speichern. 

Abgesehen davon, dass Sie sich nicht mit irgendeiner pathologischen Situation befassen, ist das Heilmittel (Rousseuw und Bassett 1990) für Ihre Zwecke gut genug.

Ganz einfach geht es um die Berechnung des Medians von Median-Chargen. 

1
Edward Grace
0
user14717

median und Modus können nicht online berechnet werden, da nur der verfügbare Platz zur Verfügung steht. Da der Median und der Modus jedoch ohnehin "beschreibender" als "quantitativ" sind, können Sie sie z. durch Abtasten des Datensatzes.

Wenn die Daten auf lange Sicht normalverteilt sind, können Sie einfach den Mittelwert verwenden, um den Median zu schätzen.

Sie können den Median auch mithilfe der folgenden Methode schätzen: Legen Sie einen Medianwert M [i] für etwa 1.000.000 Einträge im Datenstrom fest, sodass M [0] der Median der ersten eine Million Einträge ist, M [1] der Median der zweiten eine Million Einträge usw. Verwenden Sie dann den Median von M [0] ... M [k] als Medianschätzer. Dies spart natürlich Platz und Sie können steuern, wie viel Speicherplatz Sie verwenden möchten, indem Sie den Parameter 1.000.000 "einstellen". Dies kann auch rekursiv verallgemeinert werden.

0
Antti Huima

OK Kumpel probiere diese:

für c ++:

double skew(double* v, unsigned long n){
    double sigma = pow(svar(v, n), 0.5);
    double mu = avg(v, n);

    double* t;
    t = new double[n];

    for(unsigned long i = 0; i < n; ++i){
        t[i] = pow((v[i] - mu)/sigma, 3);
    }

    double ret = avg(t, n);

    delete [] t;
    return ret;
}

double kurt(double* v, double n){
    double sigma = pow(svar(v, n), 0.5);
    double mu = avg(v, n);

    double* t;
    t = new double[n];

    for(unsigned long i = 0; i < n; ++i){
        t[i] = pow( ((v[i] - mu[i]) / sigma) , 4) - 3;
    }

    double ret = avg(t, n);

    delete [] t;
    return ret;
}

wo Sie sagen, Sie können bereits die Stichprobenvarianz (svar) und den Durchschnitt (avg) berechnen.

Schauen Sie sich auch Pearsons Näherungssache an. Bei einem so großen Datensatz wäre es ziemlich ähnlich . 3 (Mittelwert)/Standardabweichung

für Schwimmer hat der Modus keine Bedeutung. Normalerweise würde man sie in Behältern einer bestimmten Größe (wie 1/100 * (max - min)) kleben.

0
peter