Ich erstelle eine Komponente, die darauf abzielt, den Durchschnitt und die Varianz einer Metrik zu berechnen, die mit Ereignissen verbunden ist, die während der Zeit auftreten, aber mit einem begrenzten internen Speicher.
Stellen Sie sich vor, die Ereignisse sind Besucher, die einen Laden betreten, und die Metrik entspricht ihrem Alter.
Im Laufe der Zeit erhält meine Komponente Ereignisse mit dem Alter jedes Besuchers. Ich möchte nicht, dass meine Komponente die Geschichte jedes Zeitalters auswendig lernt. Idealerweise möchte ich nur eine leichte Komponente speichern: den Durchschnitt A
, die Varianz V und die Anzahl der Ereignisse N
.
Nach jedem Ereignis mit dem Alter E
möchte ich diese drei Werte aktualisieren:
N<=N+1
A<=(A*N+E)/(N+1)
V<=???
Wofür V
? Ich denke an etwas wie:
V<=(V*N+(E-A)^2)/(N+1)
Ich weiß, dass es nicht genau ist, da mein Vorgänger V
das Alte verwendet, A
was nicht mehr der Durchschnitt ist.
Q1 - Gibt es eine genaue Formel?
F2 - Wenn nicht, ist mein Vorschlag eine gute Schätzung? Ist es voreingenommen? Konvergiert es korrekt, wenn es N
zunimmt?
Q3 - Gibt es eine bessere Formel?
Antworten:
Ein guter und einfacher Algorithmus zur Online-Berechnung der Varianz wurde von Welford (1962) beschrieben. Unten sehen Sie die C ++ / Rcpp-Implementierung, die offline funktioniert, aber leicht an das Online-Szenario angepasst werden kann:
Wie Sie sehen können, braucht es nur vier Variablen speichern:
n
,delta
,msq
undmean
und berechnet Mittelwert und die Varianz gleichzeitig , wie man wollte.Welford, BP (1962). Hinweis zu einer Methode zur Berechnung korrigierter Summen von Quadraten und Produkten . Technometrics 4 (3): 419 & ndash; 420.
quelle
Die Varianz kann als proportional zur quadratischen Differenz zwischen jedem Wert und dem Mittelwert ausgedrückt werden oder (wie viele Threads hier in stats.SE dokumentiert sind, wie diese Antwort, die ich auf eine andere Frage geschrieben habe) alternativ als proportional zum Quadrat ausgedrückt werden paarweiser Unterschied zwischen jeder Probe.
Wir wissen also:
Angenommen, Sie fügen ein weiteres Beispiel hinzu, das als letzter Index indiziert ist, . Ihre vorherige Abweichung wäre:k
Ihre neue Varianz ist
Aber
Damit
Wie @ MarkL.Stone in den Kommentaren sagte, ist dies immer noch nicht effizient, da wir jedes behalten müssen . Erweitern wir also die Formel, um zu etwas Traktablerem zu gelangen.Xi
Die endgültige Form ist dann
Sie können diese Formel verwenden, um die Varianz in Bezug auf den Speicher effektiv zu aktualisieren. Sie können es auch ergänzen, um Stapel anstelle von Einzelpunktaktualisierungen zu verwenden.
Grundsätzlich müssen Sie den Durchschnitt, den Durchschnitt der quadratischen Stichproben und die Varianz bei jeder Iteration speichern und zum Aktualisieren der Varianzformel verwenden.
Des Weiteren
Dies reduziert die Anzahl der Mengen, die gelagert werden müssen, auf 2.
quelle
OK Andy W gab die Antwort. Indem Sie den Durchschnitt auf die gleiche Weise wie den E-Durchschnitt , können Sie .E2 V=exp(E2)−exp(E)2
quelle