Was wäre der ideale Weg, um den Mittelwert und die Standardabweichung eines Signals für eine Echtzeitanwendung zu ermitteln? Ich möchte in der Lage sein, einen Controller auszulösen, wenn ein Signal für eine bestimmte Zeitspanne mehr als 3 Standardabweichungen vom Mittelwert aufweist.
Ich gehe davon aus, dass ein dedizierter DSP dies recht einfach tun würde, aber gibt es eine "Verknüpfung", die möglicherweise nicht so komplizierte Dinge erfordert?
statistics
real-time
measurement
jonsca
quelle
quelle
Antworten:
Die Antwort von Jason R weist einen Fehler auf, der in Knuths "Art of Computer Programming" vol. 2. Das Problem tritt auf, wenn Sie eine Standardabweichung haben, die einen kleinen Bruchteil des Mittelwerts darstellt: Die Berechnung von E (x ^ 2) - (E (x) ^ 2) ist sehr empfindlich gegenüber Gleitkomma-Rundungsfehlern.
Sie können dies sogar selbst in einem Python-Skript versuchen:
Ich erhalte -128.0 als Antwort, was eindeutig nicht rechnerisch gültig ist, da die Mathematik vorhersagt, dass das Ergebnis nicht negativ sein sollte.
Knuth zitiert einen Ansatz (ich erinnere mich nicht an den Namen des Erfinders) zur Berechnung des laufenden Mittelwerts und der Standardabweichung, der ungefähr so aussieht:
und dann ist der Wert von nach jedem Schritt
m
der Mittelwert, und die Standardabweichung kann alssqrt(S/n)
odersqrt(S/n-1)
abhängig davon berechnet werden, welche Ihre bevorzugte Definition der Standardabweichung ist.Die Gleichung, die ich oben schreibe, unterscheidet sich geringfügig von der in Knuth, ist jedoch rechnerisch äquivalent.
Wenn ich noch ein paar Minuten Zeit habe, codiere ich die obige Formel in Python und zeige, dass Sie eine nicht negative Antwort erhalten (die hoffentlich nahe am richtigen Wert liegt).
update: hier ist es.
test1.py:
Ergebnis:
Sie werden feststellen, dass es immer noch einige Rundungsfehler gibt, aber es ist nicht schlecht, während
naive_stats
nur Kotzen.Bearbeiten: Gerade bemerkt, dass Belisarius Wikipedia zitiert, in dem der Knuth-Algorithmus erwähnt wird.
quelle
Der richtige Ansatz in solchen Situationen besteht normalerweise darin, einen exponentiell gewichteten laufenden Durchschnitt und eine Standardabweichung zu berechnen. Im exponentiell gewichteten Durchschnitt werden die Schätzungen des Mittelwerts und der Varianz in Richtung der letzten Stichprobe verschoben, wodurch Sie Schätzungen des Mittelwerts und der Varianz über die letzten Sekunden erhalten. Diesτ ist wahrscheinlich das, was Sie möchten, und nicht der übliche arithmetische Durchschnitt über alle Stichproben jemals gesehen.
Im Frequenzbereich ist ein "exponentiell gewichteter laufender Durchschnitt" einfach ein echter Pol. Es ist einfach im Zeitbereich zu implementieren.
Zeitbereichsimplementierung
Sei
mean
undmeansq
sei die aktuelle Schätzung des Mittelwerts und des Mittelwerts des Quadrats des Signals. Aktualisieren Sie diese Schätzungen in jedem Zyklus mit der neuen Stichprobex
:Hier ist eine Konstante, die die effektive Länge des laufenden Durchschnitts bestimmt. So wählen Sie eine unten in „Analyse“ beschrieben wird.0 < a < 1 ein
Was oben als Imperativprogramm ausgedrückt wurde, kann auch als Signalflussdiagramm dargestellt werden:
Analyse
Wenn Sie die IIR-Filter in eigenen Blöcken zusammenfassen, sieht das Diagramm nun folgendermaßen aus:
Verweise
quelle
0 > a > 1
0 < a < 1
. Wenn Ihr System über eine Abtastzeit verfügtT
und Sie eine Durchschnittszeitkonstantetau
wünschen, wählen Siea = 1 - exp (2*pi*T/tau)
.z=1
(DC) inH(z) = a/(1-(1-a)/z)
und Sie erhalten 1.Eine Methode, die ich zuvor in einer eingebetteten Verarbeitungsanwendung verwendet habe, besteht darin, Akkumulatoren der Summe und der Quadratsumme des interessierenden Signals zu verwalten:
oder Sie können verwenden:
je nachdem, welche Methode zur Schätzung der Standardabweichung Sie bevorzugen . Diese Gleichungen basieren auf der Definition der Varianz :
Ich habe diese in der Vergangenheit erfolgreich verwendet (obwohl ich mich nur mit der Varianzschätzung befasst habe, nicht mit der Standardabweichung), obwohl Sie vorsichtig mit den numerischen Typen sein müssen, die Sie zum Halten der Akkumulatoren verwenden, wenn Sie eine Summierung durchführen möchten eine lange Zeitspanne; du willst nicht überlaufen.
Bearbeiten: Zusätzlich zu dem obigen Kommentar zum Überlauf sollte beachtet werden, dass dies kein numerisch robuster Algorithmus ist, wenn er in Gleitkomma-Arithmetik implementiert ist, was möglicherweise große Fehler in der geschätzten Statistik verursacht. Schauen Sie sich die Antwort von Jason S an, um einen besseren Ansatz in diesem Fall zu finden.
quelle
Ähnlich wie bei der obigen bevorzugten Antwort (Jason S.) und auch abgeleitet von der von Knut übernommenen Formel (Vol.2, S. 232) kann man auch eine Formel ableiten, um einen Wert zu ersetzen, dh einen Wert in einem Schritt zu entfernen und hinzuzufügen . Nach meinen Tests liefert "Ersetzen" eine bessere Präzision als die zweistufige Version "Entfernen / Hinzufügen".
Der folgende Code ist in Java,
mean
unds
aktualisiert werden ( „global“ Membervariablen), gleich wiem
unds
oben in Jasons Post. Der Wertcount
bezieht sich auf die Fenstergrößen
.quelle
Die Antwort von Jason und Nibot unterscheidet sich in einem wichtigen Aspekt: Die Methode von Jason berechnet den Standardwert und den Mittelwert für das gesamte Signal (da y = 0), während die von Nibot eine "laufende" Berechnung ist, dh, sie wiegt neuere Abtastwerte, die stärker sind als Abtastwerte aus der ferne Vergangenheit.
Da die Anwendung std dev und mean als Funktion der Zeit zu erfordern scheint, ist die Methode von Nibot wahrscheinlich die geeignetere (für diese spezielle Anwendung). Der wirklich schwierige Teil wird jedoch darin bestehen, den Teil mit der richtigen Zeitgewichtung zu finden. Das Beispiel von Nibot verwendet einen einfachen einpoligen Filter.
Die Auswahl des Tiefpassfilters richtet sich nach dem, was Sie über Ihr Signal wissen und nach der Zeitauflösung, die Sie für Ihre Schätzung benötigen. Niedrigere Grenzfrequenzen und eine höhere Ordnung führen zu einer besseren Genauigkeit, aber einer langsameren Reaktionszeit.
Um die Sache noch weiter zu komplizieren, wird ein Filter im linearen Bereich und ein anderer im quadratischen Bereich angewendet. Durch Quadrieren wird der spektrale Inhalt des Signals erheblich geändert, sodass Sie möglicherweise einen anderen Filter im Quadratbereich verwenden möchten.
Hier ist ein Beispiel, wie man Mittelwert, Effektivwert und Standardabweichung als Funktion der Zeit abschätzt.
quelle
y1 = filter(a,[1 (1-a)],x);
.