Frage

Ich habe einen kontinuierlichen Wert für die ich möchte zu berechnen exponential moving average.Normalerweise würde ich nur verwenden die standard-Formel für diese:

  • Sn = aY + (1-α)Sn-1

wo Sn ist der neue Durchschnitt, α ist der alpha ist, Y die Stichprobe ist und Sn-1 ist der bisherige Durchschnitt.

Leider, aufgrund verschiedener Fragen habe ich nicht eine konsistente Probe Zeit.Ich weiß, ich kann Probe an die, sagen wir, einmal pro Millisekunde, aber aufgrund von Faktoren aus meiner Kontrolle, kann ich nicht in der Lage, eine Probe für mehrere Millisekunden zu einer Zeit.Eine wahrscheinlich häufiger Fall ist jedoch, dass ich einfache Probe ein wenig früh oder spät:anstelle der Probenahme bei 0, 1 und 2 ms.I-Probe bei 0, 0,9 und 2,1 ms.Ich erwarten, dass, ungeachtet der Verzögerungen, meine Abtastfrequenz weit, weit über der Nyquist-Grenze, und somit brauche ich keine sorgen um aliasing.

Ich denke, ich kann dies in einer mehr oder weniger vernünftigen Weise durch änderung der alpha passend, basierend auf der Länge der Zeit seit der letzten Probe.

Ein Teil meiner Argumentation, dass dies funktionieren wird, ist, dass die EMA "interpoliert Linear zwischen dem vorherigen Datenpunkt und dem aktuellen.Wenn wir Bedenken, dass die Berechnung einer EMA der folgenden Liste von Proben in Intervallen t:[0,1,2,3,4].Wir sollten das gleiche Ergebnis erhalten, wenn wir die Intervall-2t, wobei die Eingänge werden [0,2,4], richtig?Wenn die EMA hatte angenommen, dass der t2 der Wert hatte sich seit 2 seit t0,, das wäre das gleiche wie das Intervall t Berechnung Berechnung auf [0,2,2,4,4], die es nicht tun.Oder macht das Sinn?

Kann mir jemand sagen wie unterscheiden sich die alpha angemessen?"Bitte zeigen Sie Ihre Arbeit." I. e., zeigen Sie mir die Mathematik, die beweist, dass Ihre Methode wirklich das richtige zu tun.

War es hilfreich?

Lösung

Diese Antwort basierte auf mein gutes Verständnis von Tiefpaßfiltern ( „exponentiell gleitenden Durchschnitt“ ist eigentlich nur ein einpoligen Tiefpassfilter), aber mein trübes Verständnis von dem, was Sie suchen. Ich denke, die folgende ist, was Sie wollen:

Erstens können Sie Ihre Gleichung ein wenig (sieht komplizierter aus, aber es ist einfacher, in Code) vereinfachen. Ich werde „Y“ für die Ausgabe und „X“ für die Eingabe verwendet werden (für die Ausgabe und Y für die Eingabe statt S, wie Sie getan haben).

Y n = & alpha; X + (1-α) Y n-1 → Y n = Y n-1 + α (X - Y n-1 )

, die Codes zu:

 Y += alpha * (X-Y);

Zweitens hier der Wert von α ist „gleich“ 1-e & Delta; t / τ , wobei & Delta; t die Zeit zwischen den Proben ist, und τ ist die Zeitkonstante des Tiefpassfilters. Ich sage "gleich" in Anführungszeichen, weil dies gut funktioniert, wenn & Delta; t / τ klein ist im Vergleich zu 1, und α = 1-e & Delta; t / τ ≈ At / τ. (Aber nicht zu klein: Sie werden in Quantisierung Probleme laufen, und es sei denn, Sie auf einige exotische Techniken greifen Sie benötigen in der Regel eine zusätzliche N Bits Auflösung in Ihre Zustandsgröße S, wobei N = -log 2 (α)). Für größere Werte von & Delta; t / τ die Filterwirkung zu verschwinden beginnt, bis Sie zu dem Punkt, wo α nahe 1 ist, und Sie sind im Grunde die Zuweisung nur den Eingang zum Ausgang.

Dies sollte richtig funktionieren mit Werten von & Delta; t variiert (die Variation von & Delta; t ist nicht sehr wichtig, solange alpha klein ist, sonst werden Sie in einen eher seltsamen Nyquist issues / Aliasing / usw. ausgeführt werden), und wenn Sie arbeiten auf einem Prozessor, wo Multiplikation billiger als Division ist, oder Festpunkt Fragen sind wichtig, vorberechnen ω = 1 / τ, und prüft, versuchen, die Formel für α annähert.

Wenn Sie wirklich wissen wollen, wie die Formel ableiten

α = 1-e & Delta; t / τ

dann seine Differentialgleichung Quelle betrachten:

Y τ + dY / dt = X

, die, wenn X eine Einheitsschrittfunktion ist, hat die Lösung Y = 1 - e -t / τ . Für kleine Werte von & Delta; t, kann das Derivat durch AY / AT angenähert werden, wodurch man

τ Y + & Dgr; Y / & Dgr; t = X

& Delta; Y / & Dgr; t = (X-Y) / τ

& Delta; Y = (X-Y) (& Dgr; t / τ) = α (X-Y)

und die "Extrapolation" von α = 1-e & Delta; t / τ kommt aus versuchen, das Verhalten mit der Einheitssprungfunktion Fall übereinstimmen.

Andere Tipps

Haben Sie einen Blick hier: http://www.eckner.com/research.html

bei der zweiten Verbindung ein: "" Algorithmen für Ungleich-Spaced Time Series: Moving Averages und andere Rollen Operatoren "

Das Dokument beschreibt genau die Programmieralgorithmen Sie brauchen, denke ich.

Dies ist keine vollständige Antwort, sondern kann der Anfang sein. Es ist so weit, wie ich mit diesem in einer Stunde oder so zu spielen bekam; Ich poste es als ein Beispiel dafür, was ich suche, und vielleicht eine Inspiration für andere an dem Problem zu arbeiten.

Ich beginne mit S 0 , das ist der Durchschnitt aus dem vorherigen Mittelwert S -1 und die Probe Y 0 bei t 0 . (T 1 - t 0 ). Ist mein Abtastintervall und α eingestellt ist, was angemessen ist für das Abtastintervall und den Zeitraum, in dem ich mitteln will

ich darüber nachgedacht, was passiert, wenn ich die Probe bei t 1 verpassen und stattdessen mit der Probe Y 2 auskommen muß bei t 2 ? Nun, wir können durch eine Erweiterung der Gleichung beginnen zu sehen, was passiert wäre, wenn wir hatten Y 1 :

  • S 2 = & agr; Y 2 + (1-α) S 1 , wobei S 1 = & agr; Y 1 + (1-α) S 0

Setzt man:

  • S 2 = & agr; Y 2 + (1-α) (& agr; Y 1 + (1-α) S 0 )
  • S 2 = & agr; Y 2 + (1-α) & agr; Y 1 + (1-α) (1-α) S < sub> 0
  • S 2 = & agr; Y 2 + (1-α) & agr; Y 1 + (1-α) 2 S 0

Ich stelle fest, dass die Reihe unendlich auf diese Weise zu erweitern scheint, weil wir die S ersetzen kann n in der rechten Seite auf unbestimmte Zeit:

  • S 2 = & agr; Y 2 + (1-α) & agr; Y 1 + (1-α) 2 (& agr; Y 0 + (1-α) S -1 )
  • S 2 = & agr; Y 2 + (1-α) & agr; Y 1 + (1-α) 2 & agr; Y 0 + (1-α) 3 S -1
  • etc.

Ok, es ist also nicht wirklich ein Polynom (dumm von mir), aber wenn wir die anfänglichen Laufzeit von einem multiplizieren wir dann ein Muster erkennen:

  • S 2 = (1-α) 0 & agr; Y 2 + (1-α) & agr; Y 1 + (1-α) 2 & agr; Y 0 + (1-α) 3 S -1

Hm: es ist eine exponentielle Serie. Quelle surprise! Stellen Sie sich vor, dass für einen exponentiellen gleitenden Durchschnitt aus der Gleichung heraus kommt!

Wie auch immer, ich habe diese x 0 + x 1 + x 2 + x 3 +. .., was los ist, und ich bin sicher, dass ich e oder einen natürlichen Logarithmus bin riechend hier treten, aber ich kann mich nicht erinnern, wo ich als nächstes war auf dem Weg, bevor ich aus der Zeit lief.

Jede Antwort auf diese Frage, oder jeden Beweis der Richtigkeit einer solchen Antwort, hängt stark von der Daten, die Sie messen.

Wenn Ihre Proben wurden bei t genommen 0 = 0 ms, t 1 = 0.9ms und t 2 = 2.1ms, aber Ihre Wahl von α basierte auf 1ms-Intervallen, und deshalb wollen Sie, um ein lokal angepasst α n , der Nachweis der Richtigkeit der Wahl würde bedeuten, die Abtastwerte zu wissen, bei t = 1 ms und t = 2 ms.

Das führt zu der Frage: Können Sie Ihre Daten resonably interpolieren haben vernünftige Vermutungen von dem, was in-zwischen Werten gewesen sein könnte? Oder können Sie sogar interpoliert die durchschnittliche selbst?

Wenn beides nicht möglich ist, dann soweit ich es sehe, die logische Wahl eines In-zwischen-Wert Y (t) der zuletzt Durchschnitt berechnet , also Y (t) ≈ S n , wobei n maxmial so dass t n

Diese Wahl hat eine einfache Konsequenz. Lassen α allein, egal, was die Zeitdifferenz war

Wenn auf der anderen Seite ist es möglich, Ihre Werte zu interpolieren, dann wird dies Ihr averagable konstante Intervall Proben geben. Schließlich, wenn es überhaupt möglich ist, den Durchschnitt selbst zu interpolieren, das wäre macht die Frage sinnlos.

Durch eine etwas andere α verwenden, das gleich (1-α derjenige von der Frage ), wobei die Grundformel einen neuen Wert Y zu einem bestehenden Durchschnitt von S hinzuzufügen 0 sieht wie folgt aus:

  

S (Y, S 0 ) =

     

(1-α) Y + & alpha; S 0 =

     

Y - & agr; Y + aS 0 =

     

Y + α (S 0 -Y)

Wenn wir jetzt die Länge des Zeitintervalls t addieren und davon ausgehen, dass nur α an diesem t abhängt, dass Formel sieht wie folgt aus:

  

S (Y, T, S 0 ) = Y + α t (S 0 -Y)

Nehmen Sie nun an, dass t = t 1 + t 2 . Wenn die durchschnittliche indem zwei Werte von Y für die Zeitzeitintervalle t erstellt wird 1 und t 2 , der resultierende Mittelwert sieht wie folgt aus:

  

S (Y, t 2 , S (Y, t 1 , S 0 )) =

     

Y + α t 2 (S (Y, t 1 , S 0 ) - Y) =

     

Y + α t 2 ((Y + α t 1 (S 0 Y)) - Y) =

     

Y + α t 2 α t 1 (S 0 - Y)

Wenn dieser Durchschnitt soll das gleiche sein, wie wenn das ganze t Intervall auf einmal zugegeben worden wäre, so folgt, daß α t = α t 1 α t 2 . Eine Definition von α, die diese Anforderung erfüllt wäre:

  

α x : = A x (für eine Konstante A)

Denn:

  

α t = A t =   A t 1 + t 2 =   A t 1 A t 2 =   α t 1 α t 2

Dies ergibt sich folgende Mittelungsfunktion:

  

S (Y, T, S 0 ) = Y + A t (S 0 -Y)

Ich habe nicht wirklich dieses getestet, aber wenn die Annahmen ich Ihr Szenario passen mache dies sieht aus wie eine Mittelungsfunktion, die Variationen in den Abtastintervallen ganz gut umgehen kann.

Nehmen wir an, wir möchten, dass eine exponentiell abfallenden Durchschnitt auf eine kontinuierliche Funktion machen. Allerdings haben wir nicht alle haben die Werte dieser Funktion, nur ein paar Beispiele. Diese Formel würde einen gewichteten Durchschnitt der Proben, die wir mit den Gewichten haben sie sie in der kontinuierlichen Durchschnitt haben würde.

Multiplier n = Alpha Zeit n -Zeit n-1

Sum n = Val n + Summe n-1 * Multiplikator n

Count n = 1 + Count n-1 * Multiplier n

Avg n = Summe n / Count n

Ich würde den alpha Wert allein lassen, und die fehlenden Daten füllen.

Da Sie wissen nicht, was während der Zeit passiert, wenn Sie nicht probieren können, können Sie diese Proben mit 0s, füllen oder den vorherigen Wert stabil halten und die Werte für die EMA verwenden. Oder einige rückwärts Interpolation, sobald Sie eine neue Probe haben, füllen Sie die fehlenden Werte, und die EMA neu berechnet.

Was ich versuche zu erhalten, ist eine Eingabe x[n] hast, die Löcher aufweist. Es gibt keinen Weg, um die Tatsache zu bekommen Sie Daten fehlen. So können Sie eine Null-Ordnung halten, verwenden oder ihn auf Null setzen, oder irgendeine Art von Interpolation zwischen x[n] und x[n+M], wo M ist die Anzahl der fehlenden Proben und n der Beginn der Lücke. Eventuell sogar Werte vor n verwendet wird.

Dies ist ähnlich wie ein offenes problem auf meiner todo-Liste.Ich habe ein Schema ausgearbeitet, um einige Ausmaß, aber haben keine mathematische Arbeit, um diesen Vorschlag noch.

Update & Zusammenfassung:Behalten möchte den Glättungsfaktor (alpha) unabhängig vom kompensationsfaktor (die ich mich beziehe, als beta-Version hier).Jasons ausgezeichnete Antwort bereits akzeptiert hier funktioniert Super für mich.

Ersten Schritt.

  • Wenn Sie Messen auch die Zeit seit der letzten Probe aufgenommen wurde (in gerundeten vielfachen Ihrer Konstanten abtastzeit-so 7.8 ms seit dem letzten Beispiel 8 Stück),, dass könnte verwendet werden, gelten die Glättung mehrfach.Wenden Sie die Formel 8 mal in diesem Fall.Sie haben tatsächlich eine Glättung vorgespannt mehr auf den aktuellen Wert.

Zweite Schritt.

  • Um eine bessere Glättung, müssen wir zwicken die alpha, die beim anwenden der Formel 8 mal im vorherigen Fall.

Was wird dieser Glättung, approximation verpassen?

  • Es hat schon verpasst 7 Proben im obigen Beispiel
  • Dies war angenähert in Schritt 1 mit einem abgeflacht re-Anwendung des aktuellen Wertes zusätzlich 7 mal
  • Wenn wir definieren eine Annäherung Faktor beta angewendet werden, zusammen mit alpha (als alpha*beta statt nur alpha), nehmen wir an, dass sich die 7 verpassten samples wechseln nahtlos zwischen der vorherigen und der aktuellen sample-Werten.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top