Ich habe eine Reihe von Listen mit Zahlen, z.
[0] (0.01, 0.01, 0.02, 0.04, 0.03)
[1] (0.00, 0.02, 0.02, 0.03, 0.02)
[2] (0.01, 0.02, 0.02, 0.03, 0.02)
...
[n] (0.01, 0.00, 0.01, 0.05, 0.03)
Ich möchte den Mittelwert und die Standardabweichung an jedem Index einer Liste über alle Array-Elemente hinweg effizient berechnen.
Um den Mittelwert zu ermitteln, habe ich das Array durchlaufen und den Wert an einem bestimmten Index einer Liste summiert. Am Ende teile ich jeden Wert in meiner "Durchschnittsliste" durch n
(ich arbeite mit einer Population, nicht mit einer Stichprobe aus der Population).
Um die Standardabweichung zu machen, durchlaufe ich erneut, nachdem ich den Mittelwert berechnet habe.
Ich möchte vermeiden, das Array zweimal durchzugehen, einmal für den Mittelwert und dann einmal für die SD (nachdem ich einen Mittelwert habe).
Gibt es eine effiziente Methode zur Berechnung beider Werte, bei der das Array nur einmal durchlaufen wird? Jeder Code in einer interpretierten Sprache (z. B. Perl oder Python) oder Pseudocode ist in Ordnung.
quelle
Antworten:
Die Antwort ist die Verwendung des Welford-Algorithmus, der nach den "naiven Methoden" in:
Es ist numerisch stabiler als die in anderen Antworten vorgeschlagene einfache Summe von Quadratsammlern mit zwei Durchgängen oder online. Die Stabilität ist nur dann wirklich wichtig, wenn Sie viele Werte haben, die nahe beieinander liegen, da sie in der Gleitkomma-Literatur zu einer sogenannten " katastrophalen Löschung " führen.
Möglicherweise möchten Sie auch den Unterschied zwischen der Division durch die Anzahl der Stichproben (N) und N-1 in der Varianzberechnung (quadratische Abweichung) auffrischen. Die Division durch N-1 führt zu einer unvoreingenommenen Schätzung der Varianz aus der Stichprobe, während die Division durch N im Durchschnitt die Varianz unterschätzt (da die Varianz zwischen dem Stichprobenmittelwert und dem wahren Mittelwert nicht berücksichtigt wird).
Ich habe zwei Blogeinträge zu diesem Thema geschrieben, in denen weitere Details behandelt werden, darunter das Löschen früherer Werte online:
Sie können sich auch mein Java-Gerät ansehen. Die Javadoc-, Quell- und Unit-Tests sind alle online:
stats.OnlineNormalEstimator
stats.OnlineNormalEstimator.java
test.unit.stats.OnlineNormalEstimatorTest.java
quelle
Die grundlegende Antwort besteht darin, die Summe von x (nennen Sie es 'sum_x1') und x 2 (nennen Sie es 'sum_x2') zu akkumulieren, während Sie gehen. Der Wert der Standardabweichung ist dann:
wo
Dies ist die Standardabweichung der Stichprobe. Sie erhalten die Populationsstandardabweichung mit 'n' anstelle von 'n - 1' als Divisor.
Möglicherweise müssen Sie sich über die numerische Stabilität der Differenz zwischen zwei großen Zahlen Gedanken machen, wenn Sie mit großen Stichproben arbeiten. Weitere Informationen finden Sie in den externen Referenzen in anderen Antworten (Wikipedia usw.).
quelle
int
in C die Summe der Quadrate speichern, treten bei den von Ihnen aufgelisteten Werten Überlaufprobleme auf.Hier ist eine wörtliche reine Python-Übersetzung der Implementierung des Welford-Algorithmus von http://www.johndcook.com/standard_deviation.html :
https://github.com/liyanage/python-modules/blob/master/running_stats.py
Verwendung:
quelle
Vielleicht nicht das, was Sie gefragt haben, aber ... Wenn Sie ein numpy-Array verwenden, erledigt es die Arbeit effizient für Sie:
Übrigens gibt es in diesem Blog-Beitrag einige interessante Diskussionen und Kommentare zu One-Pass-Methoden zur Berechnung von Mitteln und Abweichungen:
quelle
Das Python-Runstats-Modul ist genau für diese Art von Dingen gedacht . Installieren Sie Runstats von PyPI:
Runstats-Zusammenfassungen können den Mittelwert, die Varianz, die Standardabweichung, die Schiefe und die Kurtosis in einem einzigen Datenlauf erzeugen. Wir können dies verwenden, um Ihre "laufende" Version zu erstellen.
Statistikzusammenfassungen basieren auf der Knuth- und Welford-Methode zur Berechnung der Standardabweichung in einem Durchgang, wie in Art of Computer Programming, Vol. 2, p. 232, 3. Auflage. Der Vorteil davon sind numerisch stabile und genaue Ergebnisse.
Haftungsausschluss: Ich bin der Autor des Python-Runstats-Moduls.
quelle
Statistics
eine.pop
Methode gäbe , mit der auch fortlaufende Statistiken berechnet werden könnten.runstats
führt keine interne Werteliste , daher bin ich mir nicht sicher, ob dies möglich ist. Pull-Anfragen sind jedoch willkommen.Statistics :: Descriptive ist ein sehr anständiges Perl-Modul für diese Art von Berechnungen:
Ausgabe:
quelle
Schauen Sie sich PDL an (ausgesprochen "Piddle!").
Dies ist die Perl-Datensprache, die für hochpräzise Mathematik und wissenschaftliches Rechnen entwickelt wurde.
Hier ist ein Beispiel mit Ihren Zahlen ....
Welches produziert:
Werfen Sie einen Blick auf PDL :: Primitive für weitere Informationen über die statsover Funktion. Dies scheint darauf hinzudeuten, dass ADEV die "Standardabweichung" ist.
Es kann sich jedoch um PRMS (das Sinans Statistics :: Descriptive-Beispiel zeigt) oder RMS (das NsPy-Beispiel von ars zeigt) handeln. Ich denke einer dieser drei muss stimmen ;-)
Weitere PDL-Informationen finden Sie unter:
quelle
Wie groß ist dein Array? Machen Sie sich keine Sorgen, wenn Sie nicht zig Millionen Elemente lang sind. Der Code ist einfach und leicht zu testen.
Ich würde es vorziehen, die mathematische Erweiterung des numpy- Arrays zu verwenden, um Ihr Array von Arrays in ein numpy-2D-Array zu konvertieren und die Standardabweichung direkt zu erhalten:
Wenn dies keine Option ist und Sie eine reine Python-Lösung benötigen, lesen Sie weiter ...
Wenn Ihr Array ist
Dann ist die Standardabweichung:
Wenn Sie entschlossen sind, Ihr Array nur einmal zu durchlaufen, können die laufenden Summen kombiniert werden.
Dies ist bei weitem nicht so elegant wie die oben beschriebene Lösung zum Listenverständnis.
quelle
Sie können sich den Wikipedia-Artikel über Standardabweichung ansehen , insbesondere den Abschnitt über schnelle Berechnungsmethoden.
Ich habe auch einen Artikel gefunden, der Python verwendet. Sie sollten in der Lage sein, den darin enthaltenen Code ohne große Änderungen zu verwenden: Unterschwellige Nachrichten - Ausführen von Standardabweichungen .
quelle
Ich denke, dieses Problem wird Ihnen helfen. Standardabweichung
quelle
Hier ist ein "Einzeiler", der über mehrere Zeilen verteilt ist und einen funktionalen Programmierstil aufweist:
quelle
quelle
Wie die folgende Antwort beschreibt: Bietet Pandas / Scipy / Numpy eine kumulative Standardabweichungsfunktion? Das Python Pandas-Modul enthält eine Methode zur Berechnung der laufenden oder kumulativen Standardabweichung . Dafür müssen Sie Ihre Daten in einen Pandas-Datenrahmen (oder eine Serie, wenn es sich um 1D handelt) konvertieren, aber dafür gibt es Funktionen.
quelle
Ich möchte das Update folgendermaßen ausdrücken:
so dass eine One-Pass-Funktion folgendermaßen aussehen würde:
Beachten Sie, dass dies die Stichprobenvarianz (1 / N) berechnet, nicht die unvoreingenommene Schätzung der Populationsvarianz (die einen 1 / (N-1) -Normalisierungsfaktor verwendet). Im Gegensatz zu den anderen Antworten
var
wächst die Variable, die die laufende Varianz verfolgt, nicht proportional zur Anzahl der Stichproben. Zu allen Zeiten ist es nur die Varianz des bisher gesehenen Satzes von Stichproben (es gibt keine endgültige "Division durch n", um die Varianz zu erhalten).In einer Klasse würde es so aussehen:
Dies funktioniert auch für gewichtete Proben:
quelle