Friday 12 May 2017

Exponentiell Gleitender Durchschnitt Cuda


Für einen anderen Ansatz kannst du das exponentielle gleitende Durchschnittsfenster abschneiden und dann dein gefiltertes Signal berechnen, indem du eine Faltung zwischen deinem Signal und dem fensterförmigen Exponential machst. Die Faltung kann unter Verwendung der freien CUDA-FFT-Bibliothek (cuFFT) berechnet werden, da, wie Sie vielleicht wissen, die Faltung als die punktuelle Multiplikation der beiden Signale in der Fourier-Domäne ausgedrückt werden kann (Dies ist der treffende Name Faltungs-Theorem, Die mit einer Komplexität von O (n log (n)) läuft). Diese Art von Ansatz minimiert Ihren CUDA-Kernel-Code und läuft sehr sehr schnell, auch auf einer GeForce 570 Besonders wenn Sie alle Ihre Berechnungen in Single (Float) Präzision machen können. Ich würde vorschlagen, die oben genannte Differenzen Gleichung wie unten angegeben zu manipulieren und dann mit CUDA Thrust Primitiven. DIFFERENCE EQUATION MANIPULATION - EXPLICIT FORM DER UNTERSCHIEDLICHEN GLEICHUNG Durch einfache Algebra finden Sie folgendes: Dementsprechend ist die explizite Form folgendermaßen: CUDA THRUST IMPLEMENTATION Sie können das oben genannte Formular durch die folgenden Schritte implementieren: Initialisieren Sie eine Eingabefolge dinput to Alpha mit Ausnahme von dinput0 1. Definieren Sie einen Vektor d1overbetatothen gleich 1, 1beta, 1beta2, 1beta3. Multiplizieren Sie elementares Dinput durch d1overbetatothen Führen Sie einen Inklusivkanal aus, um die Sequenz des yn betan zu erhalten. Teilen Sie die obige Sequenz mit 1, 1beta, 1beta2, 1beta3 auf. Der oben genannte Ansatz kann für Linear Time-Varying (LTV) - Systeme empfohlen werden. Für Linear Time-Invariante (LTI) - Systeme kann der von Paul erwähnte FFT-Ansatz empfohlen werden. Ich stelle ein Beispiel für diesen Ansatz unter Verwendung von CUDA Thrust und cuFFT in meiner Antwort auf FIR Filter in CUDA. Ich habe im Wesentlichen eine Reihe von Werten wie folgt: Das obige Array ist vereinfacht, Im sammeln 1 Wert pro Millisekunde in meinem echten Code und ich Müssen die Ausgabe auf einem Algorithmus verarbeiten, den ich schrieb, um den nächstgelegenen Peak vor einem Zeitpunkt zu finden. Meine Logik scheitert, weil in meinem Beispiel oben, 0.36 ist die reale Spitze, aber mein Algorithmus würde nach hinten schauen und sehen die letzte Zahl 0,25 als die Spitze, als theres eine Abnahme auf 0,24 vor ihm. Das Ziel ist, diese Werte zu nehmen und einen Algorithmus an sie anzuwenden, der sie ein bisschen glättet, so dass ich mehr lineare Werte habe. (Dh: Id wie meine Ergebnisse zu curvy, nicht Jaggedy) Ive wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden. Wie kann ich das tun? Es ist wirklich schwer für mich, mathematische Gleichungen zu lesen, ich mache viel besser mit Code. Wie verarbeite ich Werte in meinem Array, indem du eine exponentielle gleitende durchschnittliche Berechnung anwende, um sie herauszufordern, um den 8. Februar 12 um 20:27 zu bitten, um einen exponentiellen gleitenden Durchschnitt zu berechnen. Du musst einen Zustand halten und du brauchst einen Tuning-Parameter. Dies fordert eine kleine Klasse (vorausgesetzt, du bist mit Java 5 oder höher): Instantiieren Sie mit dem Zerfallsparameter, den Sie wollen (kann die Abstimmung zwischen 0 und 1) und dann mit durchschnittlichen () zu filtern. Beim Lesen einer Seite auf einige mathematische Wiederholung, alles, was Sie wirklich wissen müssen, wenn es in Code ist, dass Mathematiker gerne Indizes in Arrays und Sequenzen mit Indizes schreiben. (Sie haben auch ein paar andere Notationen, was nicht hilft.) Allerdings ist die EMA ziemlich einfach, da man sich nur an einen alten Wert erinnern muss, keine komplizierten Zustand Arrays erforderlich. Antwortete Feb 8 12 um 20:42 TKKocheran: Ziemlich viel. Isn39t es schön, wenn es einfach sein kann (wenn man mit einer neuen Sequenz beginnt, bekomme du einen neuen Mittelwert.) Beachten Sie, dass die ersten paar Begriffe in der gemittelten Sequenz ein bisschen wegen der Brenneffekte umgehen werden, aber man bekommt diese mit anderen gleitenden Durchschnitten auch. Allerdings ist ein guter Vorteil, dass man die gleitende durchschnittliche Logik in den Mittelalter einpacken und experimentieren kann, ohne den Rest deines Programms zu stark zu stören. Ndash Donal Fellows Feb 9 12 at 0:06 Ich habe eine harte Zeit, Ihre Fragen zu verstehen, aber ich werde versuchen, trotzdem zu antworten. 1) Wenn dein Algorithmus 0,25 statt 0,36 gefunden hat, dann ist es falsch Es ist falsch, weil es eine monotone Zunahme oder Abnahme annimmt (das geht immer nach oben oder immer nach unten). Es sei denn, du durchschnittst alle deine Daten, deine Datenpunkte - wie du sie präsentierst - sind nichtlinear. Wenn Sie wirklich wollen, um den maximalen Wert zwischen zwei Punkten in der Zeit zu finden, dann schneiden Sie Ihr Array von tmin zu tmax und finden Sie die max dieser Subarray. 2) Nun ist das Konzept der gleitenden Durchschnitte sehr einfach: Stellen Sie sich vor, dass ich die folgende Liste habe: 1.4, 1.5, 1.4, 1.5, 1.5. Ich kann es glatt machen, 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 hätte es mal drei oder vier machen können, oder n. Beachten Sie, wie die Daten viel glatter sind. Ein guter Weg, um gleitende Durchschnitte bei der Arbeit zu sehen, ist, zu Google Finance zu gehen, eine Aktie auszuwählen (Tesla Motors ziemlich flüchtig (TSLA) auszuprobieren) und klicken Sie auf die Technik am unteren Rand des Diagramms. Wählen Sie Moving Average mit einem bestimmten Zeitraum und Exponential gleitenden Durchschnitt, um ihre Unterschiede zu vergleichen. Exponentieller gleitender Durchschnitt ist nur eine weitere Ausarbeitung von diesem, aber gewichtet die älteren Daten weniger als die neuen Daten ist dies ein Weg, um die Glättung nach hinten voranzutreiben. Bitte lesen Sie den Wikipedia-Eintrag. Also, das ist mehr ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu winzig. Viel Glück. Wenn du Schwierigkeiten mit der Mathematik hast, könntest du mit einem einfachen gleitenden Durchschnitt anstatt exponentiell gehen. Also die Ausgabe, die du bekommst, wäre die letzten x Begriffe geteilt durch x. Ungetesteter Pseudocode: Beachten Sie, dass Sie die Start - und Endteile der Daten behandeln müssen, da Sie deutlich die letzten 5 Begriffe haben, wenn Sie auf Ihrem 2. Datenpunkt sind. Auch gibt es effizientere Möglichkeiten, diesen gleitenden Durchschnitt zu berechnen (Summsumme - älteste neueste), aber das ist es, das Konzept zu bekommen, was passiert. Antwortete am 8. Februar 12 bei 20: 41Wenn man einen laufenden gleitenden Durchschnitt berechnet, ist der Mittelwert in der mittleren Zeitspanne sinnvoll. Im vorigen Beispiel berechneten wir den Durchschnitt der ersten 3 Zeiträume und platzierten ihn neben Periode 3. Wir hätten platzieren können Der Durchschnitt in der Mitte des Zeitintervalls von drei Perioden, das heißt, neben Periode 2. Das funktioniert gut mit ungeraden Zeiträumen, aber nicht so gut für gleichzeitige Zeiträume. Also, wo würden wir den ersten gleitenden Durchschnitt platzieren, wenn M 4 Technisch, würde der Moving Average bei t 2,5, 3,5 fallen. Um dieses Problem zu vermeiden, glätten wir die MAs mit M 2. Damit glätten wir die geglätteten Werte. Wenn wir eine gerade Anzahl von Ausdrücken beurteilen, müssen wir die geglätteten Werte glätten. Die folgende Tabelle zeigt die Ergebnisse mit M 4.

No comments:

Post a Comment