Thursday 18 May 2017

Exponentialverschiebung Durchschnittlicher Filteralgorithmus

Ich habe im Wesentlichen ein Array von Werten wie folgt: Das obige Array ist oversimplified, Im sammeln 1 Wert pro Millisekunde in meinem realen Code und ich muss die Ausgabe auf einem Algorithmus, den ich schrieb, um die nächste Peak vor einem Zeitpunkt zu finden verarbeiten. Meine Logik schlägt fehl, weil in meinem Beispiel oben 0.36 die wahre Spitze ist, aber mein Algorithmus würde rückwärts schauen und sehen die sehr letzte Zahl 0.25 als die Spitze, als theres eine Abnahme zu 0.24 vor ihm. Das Ziel ist, diese Werte zu nehmen und einen Algorithmus auf sie, die glätten sie ein wenig, so dass ich mehr lineare Werte. (Dh: Id wie meine Ergebnisse curvy, nicht jaggedy) Ive wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden. Wie kann ich dies tun Es ist wirklich schwer für mich, mathematische Gleichungen zu lesen, gehe ich viel besser mit Code. Wie verarbeite ich Werte in meinem Array, die Anwendung einer exponentiellen gleitenden Durchschnittsberechnung, um sie herauszufordern, um einen exponentiellen gleitenden Durchschnitt zu berechnen. Müssen Sie einige Zustand zu halten und Sie benötigen einen Tuning-Parameter. Dies erfordert eine kleine Klasse (vorausgesetzt, Sie verwenden Java 5 oder höher): Instantiate mit dem Decay-Parameter, die Sie wollen (kann Abstimmung sollte zwischen 0 und 1) und dann mit Average () zu filtern. Beim Lesen einer Seite auf einige mathematische Rekursion, alles, was Sie wirklich wissen müssen, wenn Sie es in Code ist, dass Mathematiker gerne Indizes in Arrays und Sequenzen mit Indizes schreiben. (Theyve einige andere Anmerkungen außerdem, die nicht helfen.) Jedoch ist die EMA ziemlich einfach, da Sie nur an einen alten Wert erinnern müssen, der keine komplizierten Zustandarrays erfordert. Beantwortet Feb 8 12 at 20:42 TKKocheran: Ziemlich viel. Isn39t es schön, wenn die Dinge einfach sein können (Wenn Sie mit einer neuen Sequenz beginnen, erhalten Sie einen neuen Mittelwert.) Beachten Sie, dass die ersten paar Begriffe in der gemittelten Sequenz um ein bisschen durch Randeffekte springen, aber Sie erhalten diese mit anderen gleitenden Durchschnitten auch. Allerdings ist ein guter Vorteil, dass Sie die gleitende durchschnittliche Logik in die Mittelung einwickeln und experimentieren können, ohne den Rest des Programms zu viel zu stören. Ndash Donal Fellows Ich habe eine harte Zeit, Ihre Fragen zu verstehen, aber ich werde versuchen, trotzdem zu beantworten. 1) Wenn Ihr Algorithmus 0,25 statt 0,36 gefunden hat, dann ist es falsch. Es ist falsch, weil es eine monotone Zunahme oder Abnahme (das ist immer nach oben oder immer nach unten). Wenn Sie ALLE Ihre Daten nicht klassifizieren, sind Ihre Datenpunkte - wie Sie sie darstellen - nichtlinear. Wenn Sie wirklich den maximalen Wert zwischen zwei Zeitpunkten finden wollen, dann schneiden Sie Ihr Array von tmin zu tmax und finden Sie das Maximum dieses Unterarrays. 2) Nun ist das Konzept der gleitenden Durchschnitte sehr einfach: vorstellen, dass ich die folgende Liste haben: 1.4, 1.5, 1.4, 1.5, 1.5. Ich kann es glätten, indem ich den Durchschnitt von zwei Zahlen: 1.45, 1.45, 1.45, 1.5. Beachten Sie, dass die erste Zahl ist der Durchschnitt von 1,5 und 1,4 (zweite und erste Zahlen) die zweite (neue Liste) ist der Durchschnitt von 1,4 und 1,5 (dritte und zweite alte Liste) die dritte (neue Liste) der Durchschnitt von 1,5 und 1,4 (Vierte und dritte), und so weiter. Ich könnte es Zeitraum drei oder vier gemacht haben, oder n. Beachten Sie, wie die Daten viel glatter sind. Ein guter Weg, um zu sehen, gleitende Durchschnitte bei der Arbeit ist, gehen Sie zu Google Finance, wählen Sie eine Aktie (versuchen Tesla Motors ziemlich volatil (TSLA)) und klicken Sie auf Technische Daten am unteren Rand des Diagramms. Wählen Sie Moving Average mit einer bestimmten Periode und Exponential gleitenden Durchschnitt, um ihre Differenzen zu vergleichen. Exponentielle gleitende Durchschnitt ist nur eine weitere Ausarbeitung dieser, aber Gewichte die älteren Daten weniger als die neuen Daten ist dies ein Weg, um die Glättung nach hinten auszugleichen. Bitte lesen Sie den Wikipedia-Eintrag. Also, dies ist eher ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu klein. Viel Glück. Wenn Sie Probleme mit der Mathematik haben, könnten Sie mit einem einfachen gleitenden Durchschnitt statt exponentiell gehen. Also die Ausgabe erhalten Sie die letzten x-Terme durch x geteilt werden. Ungetestetes Pseudocode: Beachten Sie, dass Sie die Anfangs - und Endteile der Daten behandeln müssen, da deutlich, dass Sie die letzten 5 Ausdrücke nicht durchschnittlich sind, wenn Sie auf Ihrem 2. Datenpunkt sind. Außerdem gibt es effizientere Methoden, diesen gleitenden Durchschnitt (sum sum - älteste neueste) zu berechnen, aber dies ist, um das Konzept von dem, was passiert, zu bekommen. Beantwortet Feb 8 12 at 20: 41Exponential Moving Average - EMA Laden des Spielers. BREAKING DOWN Exponential Moving Average - EMA Die 12- und 26-Tage-EMAs sind die beliebtesten Kurzzeitmittelwerte und werden verwendet, um Indikatoren wie die gleitende durchschnittliche Konvergenzdivergenz (MACD) und den prozentualen Preisoszillator (PPO) zu erzeugen. Im Allgemeinen werden die 50- und 200-Tage-EMAs als Signale von langfristigen Trends verwendet. Trader, die technische Analyse verwenden finden fließende Mittelwerte sehr nützlich und aufschlussreich, wenn sie richtig angewendet werden, aber Chaos verursachen, wenn sie falsch verwendet werden oder falsch interpretiert werden. Alle gleitenden Mittelwerte, die gewöhnlich in der technischen Analyse verwendet werden, sind von Natur aus nacheilende Indikatoren. Folglich sollten die Schlussfolgerungen aus der Anwendung eines gleitenden Durchschnitts auf ein bestimmtes Marktdiagramm eine Marktbewegung bestätigen oder ihre Stärke belegen. Sehr oft, bis eine gleitende durchschnittliche Indikatorlinie eine Änderung vorgenommen hat, um eine bedeutende Bewegung auf dem Markt zu reflektieren, ist der optimale Punkt des Markteintritts bereits vergangen. Eine EMA dient dazu, dieses Dilemma zu einem gewissen Grad zu lindern. Da die EMA-Berechnung mehr Gewicht auf die neuesten Daten setzt, umgibt sie die Preisaktion etwas fester und reagiert damit schneller. Dies ist wünschenswert, wenn ein EMA verwendet wird, um ein Handelseintragungssignal abzuleiten. Interpretation der EMA Wie alle gleitenden Durchschnittsindikatoren sind sie für Trendmärkte viel besser geeignet. Wenn der Markt in einem starken und anhaltenden Aufwärtstrend ist. Zeigt die EMA-Indikatorlinie auch einen Aufwärtstrend und umgekehrt einen Abwärtstrend. Ein wachsamer Händler achtet nicht nur auf die Richtung der EMA-Linie, sondern auch auf das Verhältnis der Änderungsgeschwindigkeit von einem Balken zum nächsten. Wenn zum Beispiel die Preisaktion eines starken Aufwärtstrends beginnt, sich zu verflachen und umzukehren, wird die EMA-Rate der Änderung von einem Balken zum nächsten abnehmen, bis zu dem Zeitpunkt, zu dem die Indikatorlinie flacht und die Änderungsrate null ist. Wegen der nacheilenden Wirkung, von diesem Punkt, oder sogar ein paar Takte zuvor, sollte die Preisaktion bereits umgekehrt haben. Daraus folgt, dass die Beobachtung einer konsequenten Abschwächung der Veränderungsrate der EMA selbst als Indikator genutzt werden könnte, der das Dilemma, das durch den nacheilenden Effekt von gleitenden Durchschnitten verursacht wird, weiter beheben könnte. Gemeinsame Verwendung der EMA-EMAs werden häufig in Verbindung mit anderen Indikatoren verwendet, um signifikante Marktbewegungen zu bestätigen und deren Gültigkeit zu messen. Für Händler, die intraday und schnelllebigen Märkten handeln, ist die EMA mehr anwendbar. Häufig benutzen Händler EMAs, um eine Handel Bias zu bestimmen. Zum Beispiel, wenn eine EMA auf einer Tages-Chart zeigt einen starken Aufwärtstrend, eine Intraday-Trader-Strategie kann nur von der langen Seite auf einem Intraday-Diagramm zu handeln. Ein exponentieller Moving Average IIR Filter Filterung von Messgrößen eingebettete Mikrocontroller-basierte Schaltungen erforderlich ist Um den Mittelwert der Signale zu verfolgen und ihre Variabilität zu verringern. Da sich die Signale in ihrem Durchschnittswert über die Zeit ändern, muß das Filter ein Mittel haben, um alte Messungen zu verwerfen, während neue Proben aufgenommen werden. Das exponentiell gleitende, durchschnittliche unendliche Impulsantwort-Filter (IIR-Filter) ist seit vielen Jahrzehnten gut verstanden und wird weitgehend in der statistischen Analyse verwendet. Sie liefert ein rechnerisch einfaches Mittel zur Bestimmung des Mittelwertes einer Variablen, wenn das zugrunde liegende Modell der Variablen unbekannt ist. Wenn v n die zu filternde Variable ist, dann ist ein n-ter Schätzer für den Mittelwert: wobei a ein Gewichtskoeffizient ist, dessen Wert den Glättungsbetrag bestimmt. Je näher a auf 0 gesetzt ist, desto größer ist die Glättung. In einigen Fällen erzeugt der Algorithmus in dieser Form Zwischenergebnisse, die groß werden können. Um dies mit einer endlichen Präzisions-Integer-Arithmetik umzusetzen, wird es in eine etwas andere Form umgeformt, in der Zwischenergebnisse durch einen bekannten Wert begrenzt werden. Der Gewichtskoeffizient wird als 1/1 / c dargestellt. Wobei c eine Potenz von 2 ist. Die Leistung k kann erhöht werden, um die Glättung zu erhöhen, während die Beschränkung auf eine Potenz von 2 ermöglicht, daß Multiplikationen und Teilungen unter Verwendung von sehr schnellen Rechts - und Linksverschiebungsoperationen in einem Mikroprozessor implementiert werden. Die Größe cv av (n) wird verfolgt, um die Genauigkeit aufrechtzuerhalten: Wenn beispielsweise die Abtastwerte 8 Bit-Größen sind (wie in vielen der Algorithmen, die für die hier beschriebenen SMPS-Schaltungen beschrieben sind) und k als 8 gewählt wird, dann ist die Größe Cv av (n) kann als 16-Bit-Wert ohne Verlust von Information dargestellt werden (genau: 8k Bits, siehe unten). Sobald dies bestimmt ist, wird die Größe v av (n) durch eine einfache Rechtsverschiebung um k Stellen erhalten. An diesem Punkt gibt es einen Informationsverlust von weniger als 1 lsb Grße, der in die Unsicherheiten von vn absorbiert werden kann (man beachte jedoch, dass es Korrelationen in dieser verlorenen Information gibt, die systematische Fehler verursachen können). Unter der Annahme, daß die Variablen vi statistisch unabhängig sind, zeigt die Varianzanalyse, daß sie um einen Faktor 1 / (2c) reduziert ist. Für Schrittänderungen in v n ist die Zeitkonstante c Berechnungsintervalle. Das Verfolgen des Mittelwertes wird weniger genau, wenn die Zeitkonstante zunimmt, um mit der niedrigsten Frequenz im zugrundeliegenden Signalmodell vergleichbar zu werden. Obergrenze für den Mittelwert Der Filter beginnt mit v av (0) 0. Alle Messungen v n liegen zwischen 0 und kleiner als B (wobei B in unseren Beispielen normalerweise 256 beträgt). So arbeitet man am Anfang der Sequenz (die in der Praxis immer endlich ist), also nur B. Also ist der Maximalwert des verstärkten Durchschnitts cv av (n) cB, der im obigen Beispiel innerhalb einer 16-Bit-Zahl liegt. Gewichtung In dem Fall, in dem die Proben unterschiedliche statistische Wichtigkeit haben, das heißt, einige haben eine größere Fehlerwahrscheinlichkeit als andere, können Gewichte angewendet werden, um eine allgemeinere Form des Filters zu erzeugen. Diese Gewichte würden so gewählt, daß sie eine umgekehrte Beziehung zur Fehlerwahrscheinlichkeit haben. Wenn w n die anzuwendenden Gewichte sind, kann das folgende Filter verwendet werden: Die zweite Gleichung erzeugt eine IIR-Schätzung des Durchschnitts der Gewichte, die in der ersten Gleichung verwendet wird. Dies kann gezeigt werden, um eine ungehinderte Schätzung des Mittelwerts von v n mit einem Vergessensfaktor von (1-a) zu erzeugen. Wie zuvor wurden die modifizierten Mittelwerte cw av (n) und cw av (n) v av (n), die auf der linken Seite angegeben sind, verfolgt und die gewünschten Mengen durch einfache Teilung extrahiert Würde der Durchschnitt jeder Probe einen angemessenen Betrag von Rundungsfehler einführen. Hmm Ich frage mich, wenn die Trennung der gebrochenen Teil aus dem ganzen Teil helfen würde. Teilen Sie den ganzen Teil jeder Zahl durch den Zähler. Halten Sie drei laufende Summen: 1) der Durchschnitt der ganzen Teile, 2) der Rest von jeder Division und 3) der Bruchteil einer jeden Zahl. Jedes Mal, wenn der ganze Teil einer Zahl geteilt wird, wird das gesamte Teilergebnis zu der durchschnittlichen laufenden Summe addiert, und der Rest wird zu der verbleibenden laufenden Summe addiert. Wenn die verbleibende laufende Summe einen Wert größer oder gleich dem Zählwert erhält, wird sein dividiert durch die Zählung mit dem gesamten Teilergebnis zu der durchschnittlichen laufenden Summe addiert, und der Rest wird zu der restlichen laufenden Summe addiert. Auch wird bei jeder Berechnung der Bruchteil zur Bruchlaufsumme addiert. Wenn die Mittelung beendet ist, wird die verbleibende laufende Summe durch die Zählung geteilt, und das Ergebnis wird der durchschnittlichen laufenden Summe als eine fließende Zahl hinzugefügt. Zum Beispiel: Nun, was mit der fraktionalen laufenden Summe zu tun. Die Gefahr des Überlaufs ist hier viel weniger wahrscheinlich, obwohl es noch möglich ist, so dass man damit umgehen würde, wäre es, die gebrochene laufende Summe durch den Zähler am Ende aufzuteilen und es zu unserem Ergebnis hinzuzufügen: Eine Alternative wäre, den fraktionalen Betrieb zu überprüfen Summe bei jeder Berechnung, um zu sehen, ob sie größer oder gleich count ist. Wenn das passiert, tun Sie einfach das Gleiche, was wir mit der restlichen Summe machen. Ausgezeichnet Jomit Vaghela 6-Mar-07 20:00 Ich mochte, was Sie sagten, dass kleine Jobs schnell zu großen Jobs werden. Denken an Optimierung während Codierung ist eine gute Praxis. Große Anstrengung und Erklärung, Ist es möglich, einen gleitenden Durchschnitt in C zu implementieren, ohne die Notwendigkeit für ein Fenster von Proben Ive festgestellt, dass ich ein bisschen optimieren kann, indem Sie eine Fenstergröße, die eine Macht von zwei für Bit-Verschiebung statt zu ermöglichen Aber nicht brauchen einen 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). Initialize total 0, count0 (jedes Mal, wenn ein neuer Wert angezeigt wird) Dann ein Eingang (scanf), ein add totalnewValue, ein Inkrement (count), ein Divide-Durchschnitt (total / count) Dies wäre ein gleitender Durchschnitt über alle Eingänge Als nur die letzten 4 Eingänge, würde 4 Inputvariablen, vielleicht kopieren Sie jeden Eingang zu einer älteren inputvariable, dann die Berechnung der neuen gleitenden Durchschnitt als Summe der 4 Inputvariablen, geteilt durch 4 (rechte Verschiebung 2 wäre gut, wenn alle Eingänge waren Positiv, um die Durchschnittsberechnung durchzuführen


No comments:

Post a Comment