Saturday 28 January 2017

C ++ Gleitender Durchschnitt

Ist es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Proben Ive gefunden, dass ich ein bisschen optimieren kann, indem Sie eine Fenstergröße, die eine Macht von zwei für Bit-Verschiebung statt zu teilen, aber nicht brauchen zu ermöglichen Ein Puffer wäre schön. Gibt es eine Möglichkeit, ein neues gleitendes Durchschnittsergebnis nur als Funktion des alten Ergebnisses und des neuen Beispiels auszudrücken, definieren Sie einen beispielhaften gleitenden Durchschnitt in einem Fenster von 4 Proben: Add new sample e: Ein gleitender Durchschnitt kann rekursiv implementiert werden , Aber für eine exakte Berechnung des gleitenden Durchschnitts müssen Sie sich an die älteste Eingangsabfrage in der Summe (dh die a in Ihrem Beispiel) erinnern. Für einen N-gleitenden Durchschnitt berechnen Sie: wobei yn das Ausgangssignal und xn das Eingangssignal ist. Gl. (1) können rekursiv geschrieben werden, also müssen Sie sich stets an die Stichprobe xn-N erinnern, um (2) zu berechnen. Wie von Conrad Turner angemerkt, können Sie stattdessen ein (unendlich langes) exponentielles Fenster verwenden, mit dem Sie die Ausgabe nur aus dem vergangenen Ausgang und dem aktuellen Eingang berechnen können. Dies ist jedoch kein normaler (ungewichteter) gleitender Durchschnitt, sondern ein exponentieller Wert Gewogenen gleitenden Durchschnitt, wo die Proben in der Vergangenheit ein geringeres Gewicht erhalten, aber (zumindest in der Theorie) man nie etwas vergessen (die Gewichte nur kleiner und kleiner für Proben weit in der Vergangenheit). Ich habe einen gleitenden Durchschnitt ohne einzelnen Element-Speicher für ein GPS-Tracking-Programm, das ich geschrieben habe. Ich beginne mit 1 Probe und dividiere durch 1, um die aktuelle Durchschn. Ich füge dann anothe Probe und dividiere durch 2 zu den aktuellen Durchschn. Das geht so lange weiter, bis ich auf die Länge des Durchschnitts komme. Jedes Mal danach, füge ich in der neuen Probe, erhalten Sie den Durchschnitt und entfernen Sie diesen Durchschnitt aus der Gesamtmenge. Ich bin kein Mathematiker, aber das schien ein guter Weg, es zu tun. Ich dachte, es würde den Magen eines echten Mathematik-Kerl, aber es stellt sich heraus, es ist eine der akzeptierten Möglichkeiten, es zu tun. Und es funktioniert gut. Denken Sie daran, dass je höher Ihre Länge, desto langsamer folgt es, was Sie folgen wollen. Das kann nicht die meiste Zeit, aber wenn folgende Satelliten, wenn Sie langsam sind, könnte die Spur weit von der tatsächlichen Position und es wird schlecht aussehen. Sie könnten eine Lücke zwischen dem Sat und den nachfolgenden Punkten haben. Ich wählte eine Länge von 15 aktualisiert 6 mal pro Minute, um eine ausreichende Glättung und nicht zu weit von der tatsächlichen Sat-Position mit den geglätteten Spur Punkte erhalten. Antwort # 2 am: November 16, um 23:03 Uhr Initialisierung insgesamt 0, count0 (jedes Mal, wenn ein neuer Wert dann ein Eingang (scanf), ein add totalnewValue, ein Inkrement (count), ein dividieren Durchschnitt (Gesamtzahl) Dies wäre ein gleitender Durchschnitt über Alle Eingänge Um den Durchschnitt über nur die letzten 4 Eingänge zu berechnen, benötigen Sie 4 Inputvariablen, vielleicht kopieren Sie jeden Eingang zu einem älteren inputvariable und berechnen dann den neuen gleitenden Durchschnitt als Summe der 4 Inputvariablen, geteilt durch 4 (Rechtsverschiebung 2 wäre Gut, wenn alle Eingänge waren positiv, um die durchschnittliche Berechnung beantwortet werden 3. Februar um 4:06 Das wird tatsächlich berechnen den Gesamtdurchschnitt und nicht den gleitenden Durchschnitt. Wenn Zähler größer wird der Einfluss eines neuen Eingangsprobe wird verschwindend kleiner ndash Hilmar Feb 3 15 at 13:53 Ihre Antwort 2016 Stack Exchange, IncExponential Verschieben von Durchschnitten für irreguläre Zeitreihen In der Zeitreihenanalyse gibt es oft eine Notwendigkeit für Glättung Funktionen, die schnell reagieren auf Änderungen im Signal. In der typischen Anwendung können Sie die Verarbeitung einer Eingangssignal in Echtzeit, und wollen solche Dinge wie die jüngsten Durchschnittswert zu berechnen, oder erhalten Sie eine augenblickliche Steilheit für sie. Aber reale Welt Signale sind oft laut. Bei einigen verrauschten Abtastungen wird der aktuelle Wert des Signals oder seine Steigung stark variieren. Moving Averages Die einfachste Glättungsfunktion ist ein gleitender Durchschnitt. Als Muster kommen Sie in einen Durchschnitt der neuesten N-Werte. Dies führt zu einer Verzögerung 8211 oder Latenz. Ihr Durchschnitt wird immer um die Breite des gleitenden Durchschnitts verzögert. Das obige Beispiel ist relativ teuer zu berechnen. Für jede Probe müssen Sie über die gesamte Größe des Fensters iterieren. Aber es gibt billigere Möglichkeiten 8211 die Summe aller Samples im Fenster in einem Puffer zu halten und die Summe einzustellen, wenn neue Samples kommen: Ein anderer Typ von gleitendem Durchschnitt ist der 8220gewichtete gleitende Durchschnitt8221, der für jede Position im Sample-Fenster gewichtet wird. Vor dem Mitteln multiplizieren Sie jede Probe mit dem Gewicht dieser Fensterposition. Technisch wird dies als 8220convolution8221 bezeichnet. Eine typische Gewichtungsfunktion wendet eine Glockenkurve auf das Probenfenster an. Dies ergibt ein Signal, das stärker auf die Mitte des Fensters abgestimmt ist und noch etwas tolerant gegenüber verrauschten Abtastwerten ist. In der Finanzanalyse verwenden Sie häufig eine Gewichtungsfunktion, die die jüngsten Stichproben mehr bewertet, um einen gleitenden Durchschnitt zu geben, der die jüngsten Stichproben genauer verfolgt. Ältere Proben erhalten zunehmend weniger Gewicht. Dadurch werden die Effekte der Latenz etwas etwas gemildert und dennoch eine gute Glättung gegeben: Mit einem gewichteten Mittelwert müssen Sie immer über die gesamte Fenstergröße für jede Probe iterieren (es sei denn, Sie können die zulässigen Gewichte auf bestimmte Funktionen beschränken). Der exponentielle gleitende Durchschnitt Eine andere Art von Durchschnitt ist der exponentielle gleitende Durchschnitt oder EMA. Dies ist oft verwendet, wo Latenz ist kritisch, wie in Echtzeit Finanzanalyse. In diesem Durchschnitt nehmen die Gewichte exponentiell ab. Jede Probe wird um einige Prozent kleiner bewertet als die nächstfolgende Probe. Mit dieser Einschränkung können Sie den gleitenden Durchschnitt sehr effizient berechnen. Wo alpha eine Konstante ist, die beschreibt, wie die Fenstergewichte im Laufe der Zeit abnehmen. Zum Beispiel, wenn jede Probe mit 80 des Wertes des vorherigen Samples gewichtet werden sollte, würden Sie Alpha 0.2 setzen. Je kleiner das Alpha wird, desto länger ist der gleitende Durchschnitt. (Z. B. wird es glatter, aber weniger reaktiv gegenüber neuen Proben). Die Gewichte für eine EMA mit alpha0.20 Wie Sie sehen können, müssen Sie für jede neue Stichprobe nur den Durchschnitt des vorherigen Mittelwertes berechnen. Also ist die Berechnung sehr sehr schnell. In der Theorie tragen alle vorhergehenden Proben zum gegenwärtigen Durchschnitt bei, aber ihr Beitrag wird mit der Zeit exponentiell kleiner. Dies ist eine sehr leistungsfähige Technik, und wahrscheinlich die beste, wenn Sie einen gleitenden Durchschnitt, der schnell auf neue Proben reagieren wollen, hat gute Glättungseigenschaften und ist schnell zu berechnen. Der Code ist trivial: EMA für irreguläre Zeitreihen Die Standard-EMA ist in Ordnung, wenn das Signal in regelmäßigen Zeitabständen abgetastet wird. Aber was ist, wenn Ihre Proben in unregelmäßigen Intervallen kommen Stellen Sie sich ein kontinuierliches Signal, das in unregelmäßigen Abständen abgetastet wird. Dies ist die übliche Situation in der Finanzanalyse. In der Theorie gibt es eine kontinuierliche Funktion für den Wert eines Finanzinstruments, aber Sie können nur dieses Signal Probe, wenn jemand tatsächlich führt einen Handel. So besteht Ihr Datenstrom aus einem Wert, plus die Zeit, zu der es beobachtet wurde. Eine Möglichkeit, dies zu bewältigen, besteht darin, das irreguläre Signal in ein reguläres Signal umzuwandeln, durch Interpolation zwischen Beobachtungen und Resampling. Aber das verliert Daten, und es führt wieder Latenz. Es ist möglich, eine EMA für eine unregelmäßige Zeitreihe direkt zu berechnen: In dieser Funktion geben Sie die aktuelle Stichprobe aus Ihrem Signal und dem vorherigen Sample sowie die Zeit zwischen den beiden und den vorherigen Wert zurück Funktion. So wie gut funktioniert diese Arbeit Um zu zeigen, I8217ve erzeugt eine Sinuswelle, dann probiert es in unregelmäßigen Abständen, und führte etwa 20 Lärm. Das ist das Signal wird zufällig variieren - 20 aus dem ursprünglichen 8220true8221 Sinus-Signal. Wie gut der irreguläre exponentielle gleitende Durchschnitt das Signal wiederherstellt. Die rote Linie ist die ursprüngliche Sinuswelle 8211, die in unregelmäßigen Intervallen abgetastet wird. Die blaue Linie ist das Signal mit dem Rauschen hinzugefügt. Die blaue Linie ist das einzige Signal, das die EMA sieht. Die grüne Linie ist die geglättete EMA. Sie sehen, dass es das Signal ziemlich gut erholt. Ein wenig wackelig, aber was kann man von solch einem verrauschten Quellsignal erwarten Es ist um 15 nach rechts verschoben, weil die EMA etwas Latenz einführt. Je mehr Sie wollen, desto mehr Latenz werden Sie sehen. Aber von diesem können Sie zB eine augenblickliche Steigung für ein lautes unregelmäßiges Signal berechnen. Was können Sie mit dem Hmm8230 tun. Ressourcen:


No comments:

Post a Comment