Monday, 23 October 2017

Umzugsdurchschnittlich Effiziente Umsetzung


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. answered Feb 8 12 bei 20 41.A Einfache Moving Average Implementation in Java. On mehrere Gelegenheiten Ich wollte einfache Metriken in meinem Java-Anwendungen zu berechnen, Zum Beispiel die Anzahl der Treffer pro Stunde oder Fehler während eines Zeitraums Während das Berechnen einfacher Metriken ist nicht schrecklich schwierig, es ist nur extra Arbeit und ich würde lieber diese Zeit auf die Problem-Domain Ich war überrascht, keine weithin akzeptierten Lösungen zu finden Für metriken in Java habe ich Metriken gefunden, aber es schien ein bisschen zu kompliziert und nicht gut dokumentiert - Alles was ich wirklich wollte war, um einen gleitenden Durchschnitt zu berechnen, dachte ich über das Problem noch mehr und entschied es ist kein 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 die Update-Frequenz Die Zählung für das Intervall ist einfach Array i-Array i 1, die die jüngste Zählung ist Abzüglich der ältesten Zählung Für eine 10-Minuten-Intervall ist die älteste Zählung i 1 genau 10 Minuten alt. Um einen gleitenden Durchschnitt zu unserem Code hinzuzufügen, benötigen wir einen Zähler, mit AtomicLong. Dieser Zähler sollte auf der Grundlage der Ereignisse, die du erzählt hast, inkrementiert werden Interessiert an der Berechnung zB 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 werden Hier werde ich einen gleitenden Durchschnitt mit einem 5-Minuten-Fenster, das jede Sekunde aktualisiert. Und zu bekommen Der aktuelle Durchschnitt rufen wir einfach die getAverage-Methode an. Ein wichtiges Implementierungsdetail ist, wie die Arraygröße durch das Teilen des Fensters durch die Aktualisierungsfrequenz bestimmt wird. So kann ein großes Fenster mit einer häufigen Aktualisierungsfrequenz eine beträchtliche Menge an Speicher verbrauchen. In diesem Beispiel ist das Array Größe ist vernünftig 300 Allerdings, wenn wir eine 24 Stunden gleitenden Durchschnitt mit einem 1 Sekunde Intervall die Größe wäre 86400 Eine vernünftigere Update-Frequenz für eine 24-Stunden-Zeitraum könnte 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 teilbar ist durch 120 Eine IllegalArgumentException wird geworfen, wenn das Fenster Modul-Update-Frequenz ist nicht Null. Diese Implementierung erfordert einen Thread pro gleitenden Durchschnitt, was nicht sehr effizient ist Eine bessere Lösung wäre, einen Thread über viele Durchschnitte zu teilen Update Ich habe den Code aktualisiert, um einen Thread hier zu teilen. Lastly there s an Initialzustand Problem haben wir noch keine Daten für das ganze Fenster Zum Beispiel, wenn Sie ein 5 Minuten Fenster und nur 15 Sekunden Daten haben Diese Implementierung gibt null zurück, bis wir 5 Minuten Daten haben Ein weiterer Ansatz ist, 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 abschätzen. Allerdings besteht die Gefahr eines signifikanten Fehlers durch Extrapolieren von unvollständigen Daten. Wenn wir zum Beispiel in 2 Sekunden einen Pause von 20 Hits hatten, schätzen wir 1200 pro 2 Minuten, was in aller Wahrscheinlichkeit ist weit weg. Ich weiß, das ist erreichbar mit Boost wie pro. But ich möchte wirklich vermeiden, Boost Ich habe gegoogelt und nicht gefunden, keine geeigneten oder lesbaren Beispiele. Basically Ich möchte den gleitenden Durchschnitt zu verfolgen Von einem laufenden Strom von einem Strom von Gleitkommazahlen unter Verwendung der neuesten 1000 Zahlen als Datenbeispiel. Was ist der einfachste Weg, dies zu erreichen. Ich experimentierte mit der Verwendung eines kreisförmigen Arrays, exponentiell gleitenden Durchschnitt und ein einfacher gleitender Durchschnitt und gefunden Dass die Ergebnisse aus dem Rundschreiben Arrangement meine Bedürfnisse am besten gemacht. jpg Ihre Bedürfnisse sind einfach, können Sie nur versuchen, mit einem exponentiellen gleitenden Durchschnitt. Sie ​​einfach, Sie machen eine Akkumulator-Variable, und wie Ihr Code aussieht Bei jedem Sample aktualisiert der Code den Akkumulator mit dem neuen Wert Du wählst eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen dies. Sie müssen nur einen Wert von Alpha finden, wo die Wirkung einer bestimmten Probe nur etwa 1000 dauert Samples. Hmm, ich bin nicht wirklich sicher, dass dies für dich geeignet ist, jetzt, wo ich es hier hingelegt habe Das Problem ist, dass 1000 ein ziemlich langes Fenster für einen exponentiellen gleitenden Durchschnitt ist Ich bin mir nicht sicher, dass es ein Alpha gibt, das den Durchschnitt verbreiten würde Über die letzten 1000 Nummern, ohne Unterlauf in der Gleitkomma-Berechnung Aber wenn man einen kleineren Durchschnitt wünscht, wie 30 Zahlen oder so, ist dies eine sehr einfache und schnelle Art und Weise zu tun it. answered Jun 12 12 bei 4 44. 1 auf deinem Post Der exponentielle gleitende Durchschnitt kann es erlauben, dass das Alpha variabel ist. Damit kann es verwendet werden, um Zeitbasis-Mittelwerte zB Bytes pro Sekunde zu berechnen. Wenn die Zeit seit dem letzten Akkumulator-Update mehr als 1 Sekunde beträgt, lassen Sie alpha 1 1 sein. Andernfalls sind Sie Kann alpha be usecs seit letzter Aktualisierung 1000000 jxh Jun 12 12 at 6 21.Basically Ich möchte den gleitenden Durchschnitt eines laufenden Streams von einem Strom von Gleitkommazahlen mit den neuesten 1000 Zahlen als Datenbeispiel verfolgen. Hinweis, dass die Unten aktualisiert die Gesamtsumme als Elemente als ersetzt ersetzt, Vermeidung kostspielige ON Traversal, um die Summe zu berechnen - benötigt für den Durchschnitt - auf Anfrage. Total ist ein anderer Parameter von T zu unterstützen, zB mit einer langen langen, wenn insgesamt 1000 lange s, ein int Für char s oder ein doppeltes bis total float s. This ist ein bisschen fehlerhaft, dass Numsamples an INTMAX vorbeikommen könnten - wenn Sie sich vorstellen können, dass Sie eine vorzeichenlose lange lange verwenden oder ein zusätzliches bool Datenelement verwenden können, um aufzuzeichnen, wenn der Container zuerst gefüllt wird Während das Radfahren numsamples um das Array am besten dann umbenannt etwas Unschuldiges wie pos. answered Jun 12 12 bei 5 19.on geht davon aus, dass void Operator T Probe ist eigentlich void Operator T Probe oPless Jun 8 14 bei 11 52. oPless ahhh gut gesichtet tatsächlich ich meinte Für sie zu leeren Betreiber T Probe aber natürlich könnten Sie verwenden, was Notation Sie mochten, beheben, danke Tony D Jun 8 14 bei 14 27.

No comments:

Post a Comment