Ich habe im Wesentlichen ein Array von Werten wie folgt. Das oben genannte Array ist vereinfacht, ich sammle 1 Wert pro Millisekunde in meinem realen Code und ich muss die Ausgabe auf einem Algorithmus verarbeiten, den ich schrieb, um den nächstgelegenen Peak vor einem Zeitpunkt zu finden 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, da es eine Abnahme auf 0 24 vor it. The Ziel ist, diese Werte zu nehmen Und wendet einen Algorithmus an sie an, die sie ein bisschen glätten wird, damit ich mehr lineare Werte habe, dh ich mag meine Resultate, um curvy zu sein, nicht jaggedy. Ich wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden Wie kann ich Tu es das ist es wirklich schwer für mich, mathematische Gleichungen zu lesen, ich befasse mich viel besser mit Code. Wie verarbeite ich Werte in meinem Array und wende eine exponentielle gleitende durchschnittliche Berechnung an, um sie auch auszumachen. 8. Februar um 20 27.Zur berechnen Ein exponentieller gleitender Durchschnitt musst du einen Zustand halten und du brauchst einen Tuning-Parameter. Dies verlangt eine kleine Klasse, die davon ausgeht, dass du Java 5 oder höher benutzt. Mit dem Zerfallsparameter, den du tun möchtest, soll das Tuning zwischen 0 und 1 und dann sein Verwenden Sie den Durchschnitt zu filtern. Wenn das Lesen einer Seite auf einige mathematische Wiederholung, alles, was Sie wirklich wissen müssen, wenn Sie es in Code ist, dass Mathematiker gerne Indizes in Arrays und Sequenzen mit Indizes schreiben Sie ve ein paar andere Notationen als auch, was doesn t Hilfe Allerdings ist die EMA ziemlich einfach, da Sie nur einen alten Wert erinnern müssen keine komplizierten Zustand Arrays erforderlich. answered Feb 8 12 bei 20 42. TKKocheran Ziemlich viel Isn t it nice, wenn die Dinge einfach sein können Wenn Sie mit einer neuen Sequenz beginnen, Bekomme einen neuen Mittelwert Hinweis, dass die ersten paar Begriffe in der gemittelten Sequenz um ein bisschen wegen der Grenzeffekte springen, aber du bekommst die mit anderen gleitenden Durchschnitten auch Allerdings ist ein guter Vorteil, dass man die gleitende durchschnittliche Logik in den Mittelwert einpacken kann Und experimentiere ohne zu stören den Rest deines Programms zu viel Donal Fellows Feb 9 12 bei 0 06.Ich habe eine harte Zeit, um Ihre Fragen zu verstehen, aber ich werde versuchen zu beantworten anyway.1 Wenn Ihr Algorithmus gefunden 0 25 statt 0 36, Dann ist es falsch Es ist falsch, weil es eine monotone Zunahme oder Abnahme annimmt, die immer nach oben geht oder immer hinuntergeht, es sei denn, du durchschnittst alle deine Daten, deine Datenpunkte, wie du sie präsentierst --- sind nichtlinear Wenn du es wirklich willst Um den maximalen Wert zwischen zwei Punkten in der Zeit zu finden, dann schneide dein Array von tmin zu tmax und finde das Maximum dieses Subarray.2 Jetzt ist das Konzept der gleitenden Durchschnitte sehr einfach vorstellen, dass ich die folgende Liste 1 4, 1 5 habe , 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 der Durchschnitt von 1 5 und 1 4 Sekunden und erste Zahlen ist Die zweite neue Liste ist der Durchschnitt von 1 4 und 1 5 Drittel und zweite alte Liste die dritte neue Liste der Durchschnitt von 1 5 und 1 4 vierte und dritte, und so weiter hätte ich es Zeitraum drei oder vier, oder n Hinweis Wie die Daten viel glatter ist Ein guter Weg, um gleitende Durchschnitte bei der Arbeit zu sehen ist, um zu Google Finance zu gehen, wählen Sie eine Aktie Tesla Motors ziemlich volatile TSLA und klicken Sie auf technische an der Unterseite des Diagramms Wählen Sie Moving Average mit einem bestimmten Zeitraum und Exponentieller gleitender 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, das ist ein Weg, um die Glättung in Richtung der Rückseite vorzuwerfen Bitte lesen Sie die Wikipedia-Eintrag. So, das ist mehr Ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu winzigen Viel Glück. Wenn Sie Probleme mit der Mathematik haben, könnten Sie mit einem einfachen gleitenden Durchschnitt statt exponentiell Also die Ausgabe, die Sie erhalten würde die letzten x Begriffe geteilt werden Von x Ungetestetes Pseudocode. Hinweis, dass du die Anfangs - und Endteile der Daten behandeln musst, da du die letzten 5 Begriffe, wenn du auf deinem zweiten Datenpunkt bist, deutlich beurteilen kannst. Auch hier gibt es effizientere Berechnungsmethoden für diesen gleitenden Durchschnitt Summe - älteste neueste, aber dies ist, um das Konzept von dem, was passiert über. Erwerben 8. Februar 12 bei 20 41.Averages Einfache gleitende Durchschnitt. Beutzern Einfache gleitenden Durchschnitt Sie sind ermutigt, diese Aufgabe zu lösen, je nach der Aufgabe Beschreibung, mit Jede Sprache, die Sie den einfachen gleitenden Durchschnitt einer Reihe von Zahlen kennenlernen können. Erstellen Sie eine Stateful-Funktionsklasse-Instanz, die eine Periode annimmt und gibt eine Routine zurück, die eine Zahl als Argument annimmt und gibt einen einfachen gleitenden Durchschnitt ihrer Argumente so weit. Ein einfaches Bewegen Durchschnitt ist eine Methode zum Berechnen eines Durchschnitts eines Stroms von Zahlen durch nur Mittelung der letzten P-Zahlen aus dem Stream, wobei P als Periode bekannt ist. Es kann durch Aufruf einer Initialisierungsroutine mit P als sein Argument, IP, implementiert werden Sollte dann eine Routine zurückgeben, die, wenn sie mit einzelnen, aufeinanderfolgenden Mitgliedern eines Stroms von Zahlen aufgerufen wird, den Mittelwert von bis zu dem letzten P von ihnen berechnet, lasst uns diese SMA nennen. Das Wort, das in der Aufgabenbeschreibung zuständig ist, bezieht sich auf die Notwendigkeit von SMA Um sich an bestimmte Informationen zwischen Anrufen zu erinnern. Die Periode, P. An bestellt Container von mindestens die letzten P-Nummern aus jedem seiner einzelnen Anrufe. Stateful bedeutet auch, dass aufeinanderfolgende Anrufe an I, der Initialisierer, sollten separate Routinen, die nicht Teilen Sie den gespeicherten Zustand, damit sie auf zwei unabhängigen Datenströmen verwendet werden können. Pseudocode für eine Implementierung von SMA ist. Diese Version verwendet eine persistente Warteschlange, um die aktuellsten p-Werte zu halten Jede Funktion, die von init-moving-average zurückgegeben wird, hat ihren Status In einem Atom, das einen Warteschlangenwert hält. Diese Implementierung verwendet eine kreisförmige Liste, um die Zahlen innerhalb des Fensters am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert hält, der gerade aus dem Fenster herausgeht und durch die gerade ersetzt wird - added value. Using ein Closure edit. Currently dieser sma kann t nogc sein, weil es eine Schließung auf dem Heap zuteilt Einige Escape-Analyse könnte die Heap-Zuweisung entfernen. Using eine Struct-Edit. This Version vermeidet die Heap-Zuordnung der Schließung halten die Daten Im Stack-Frame der Hauptfunktion Gleiche Ausgabe. Um zu vermeiden, dass die Gleitkomma-Approximationen sich häufen und wachsen, könnte der Code eine periodische Summe auf dem gesamten kreisförmigen Warteschlangen-Array durchführen. Diese Implementierung erzeugt zwei Funktionsobjekte, die den Zustand teilen. Es ist idiomatisch in E Um die Eingabe von der Ausgabe zu lesen, die aus dem Schreiben gelesen wurde, anstatt sie in ein Objekt zu kombinieren. Die Struktur ist die gleiche wie die Implementierung der Standardabweichung E. Das Elixir-Programm unten erzeugt eine anonyme Funktion mit einer eingebetteten Periode p, die als Periode verwendet wird Der einfache gleitende Durchschnitt Die Run-Funktion liest numerische Eingabe und übergibt sie an die neu erstellte anonyme Funktion und prüft dann das Ergebnis auf STDOUT. Die Ausgabe wird unten angezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Basis jeder Bewegung bildet Average. Erlang hat Schließungen, aber unveränderliche Variablen Eine Lösung ist dann die Verwendung von Prozessen und eine einfache Nachricht übergeben basierte API. Matrix-Sprachen haben Routinen, um die Gleit-Avarages für eine bestimmte Sequenz von Items zu berechnen. Es ist weniger effizient zu Schleife wie im Folgenden Befehle. Kontinuierlich fordert eine Eingabe I, die am Ende einer Liste hinzugefügt wird L1 L1 kann durch Drücken von 2ND 1 gefunden werden, und Mittelwert finden Sie in Liste OPS. Press ON, um das Programm zu beenden. Funktion, die eine Liste mit dem zurückgibt Gemittelte Daten des gelieferten Arguments. Programm, das bei jedem Aufruf einen einfachen Wert zurückgibt, ist die Liste, die gemittelt wird p ist die Periode 5 gibt die gemittelte Liste zurück. Example 2 Mit dem Programm movinav2 i, 5 - Initialisierung der gleitenden Durchschnittsberechnung und definieren Zeitraum von 5 movinav2 3, xx - neue Daten im Listenwert 3 und Ergebnis wird auf Variable x gespeichert und angezeigt movinav2 4, xx - neuer Datenwert 4 und das neue Ergebnis wird auf Variable x gespeichert und angezeigt 4 3 2.Beschreibung der Funktion movinavg Variable r - ist das Ergebnis der gemittelten Liste, die zurückgegeben wird Variable i - ist die Indexvariable, und es zeigt auf das Ende der Unterliste die Liste gemittelte Variable z - ein Helfer Variable. Die Funktion verwendet die Variable i, um zu bestimmen, welche Werte der Liste in der nächsten Durchschnittsberechnung berücksichtigt werden. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird Out, die der erste Wert in der Liste sein wird. Normalerweise müssen wir p Elemente berücksichtigen, also wird das erste Element dasjenige sein, das von ip 1 indiziert wird. Allerdings wird bei den ersten Iterationen die Berechnung normalerweise negativ sein, so dass die folgende Gleichung negativ wird Indizes max ip 1,1 oder, Anordnen der Gleichung, max ip, 0 1 Aber die Anzahl der Elemente auf den ersten Iterationen wird auch kleiner sein, der korrekte Wert ist der Endindex - Startindex 1 oder die Anordnung der Gleichung i - Max ip, 0 1 1, und dann, i-max ip, 0 Variable z hält den gemeinsamen Wert max ip, 0 so dass der Anfangsindex z 1 ist und die Nummernbezüge iz. mid Liste, z 1, iz wird die Liste der Wert, der gemittelte Summe wird Summe sie Summe iz ri wird sie durchschnittlich und speichern Sie das Ergebnis an der entsprechenden Stelle in der Ergebnisliste. fp1 erstellt eine partielle Anwendung zur Festsetzung der in diesem Fall die zweite und dritte Parameter. Ein einfacher Moving Average Implementierung in Java. On mehrere Gelegenheiten, die ich wollte, um einfache Metriken in meinem Java-Anwendungen zu berechnen, zum Beispiel die Anzahl der Treffer pro Stunde oder Fehler während eines Zeitraums Während die Berechnung einfacher Metriken ist nicht schrecklich schwierig, es ist nur extra Arbeit und ich Ich verbringe diese Zeit auf dem Problembereich Ich war überrascht, keine weithin akzeptierten Lösungen für Metriken in Java zu finden. Ich fand Metriken, aber es schien ein bisschen zu kompliziert und nicht gut dokumentiert zu sein - Alles was ich wirklich wollte, war, einen gleitenden Durchschnitt zu berechnen Ich dachte über das Problem etwas mehr und entschied es ist nicht ein schwieriges Problem Hier ist meine Lösung. Dies funktioniert durch die Schaffung einer Reihe von Fenster Update-Frequenz Größe, dann ein Thread setzt die Zählung auf den nächsten Index in das Array auf der Update-Frequenz Die Zählung für das Intervall ist einfach Array i - Array i 1, das ist die jüngste Zählung abzüglich der ältesten Zählung Für ein 10 Minuten Intervall ist die älteste Zählung i 1 genau 10 Minuten alt. Um einen gleitenden Durchschnitt zu unserem Code hinzuzufügen, Ich brauche einen Zähler, mit AtomicLong. This Zähler sollte inkrementiert werden, basierend auf den Ereignissen, die Sie interessiert in Computing z. B. POST-Anfragen für einen REST-Service. Wir müssen die Implementierung mit Zugriff auf den Zähler und das wird durch die GetCount-Schnittstelle erreicht wird hier Ich werde einen gleitenden Durchschnitt mit einem 5-Minuten-Fenster erstellen, das jede Sekunde aktualisiert. Und um den aktuellen Durchschnitt zu erhalten, rufen wir einfach die getAverage-Methode an. Ein wichtiges Implementierungsdetail ist, wie die Array-Größe bestimmt wird, indem sie das Fenster durch die Aktualisierungshäufigkeit teilen So a Großes Fenster mit einer häufigen Aktualisierungshäufigkeit kann eine beträchtliche Menge an Speicher verbrauchen In diesem Beispiel ist die Arraygröße vernünftig 300 Wenn wir jedoch einen 24-Stunden-Gleitender Durchschnitt mit einem Intervall von 1 Sekunde erstellt haben, wäre die Größe 86400 A eine vernünftigere Aktualisierungshäufigkeit für ein 24-Stunden-Periode kann alle 5 Minuten Array-Größe von 288.Another Betrachtung der Wahl des Fensters und Update-Frequenz ist das Fenster muss durch die Frequenz teilbar sein Zum Beispiel ein 2 Minuten Fenster mit einer 6 Sekunden Update-Frequenz ist ok, aber eine 7 Sekunden Update-Frequenz ist nicht, da es nicht durch 120 teilbar ist Eine IllegalArgumentException wird ausgelöst, wenn die Fenstermodul-Aktualisierungshäufigkeit nicht Null ist. Diese Implementierung erfordert einen Thread pro gleitenden Durchschnitt, was nicht sehr effizient ist Eine bessere Lösung wäre, einen Thread zu teilen Viele Mittelwerte Update I ve aktualisiert den Code, um einen Thread hier zu teilen. Lastly, da s ein Anfangszustand Problem wir don t haben noch Daten für das gesamte Fenster Zum Beispiel, wenn Sie ein 5 Minuten Fenster und nur 15 Sekunden Daten haben Diese Implementierung kehrt zurück Null bis wir 5 Minuten Daten haben Ein weiterer Ansatz ist es, den Durchschnitt zu schätzen Angenommen, wir haben eine Anzahl von 10 in 30 Sekunden, dann können wir den Durchschnitt als 40 in 2 Minuten schätzen. Allerdings besteht die Gefahr eines signifikanten Fehlers durch Extrapolieren unvollständiger Daten , Wenn wir in 2 Sekunden einen Pause von 20 Hits hatten, schätzen wir 1200 pro 2 Minuten, was aller Wahrscheinlichkeit nach weg ist.
No comments:
Post a Comment