Wednesday 15 November 2017

Moving Average Algorithm Implementierung


Ich muss den Überblick über die letzten 7 Tage Arbeitsstunden in einem Flat-File-Leseschleife zu halten. Seine verwendet werden, um die Ermüdbarkeit von Arbeitsplänen zu messen. Im Moment habe ich etwas, das funktioniert, aber es scheint ziemlich ausführlich und Im nicht sicher, ob theres ein Muster, das mehr prägnant ist. Derzeit habe ich eine Java-Klasse mit einem statischen Array, um die letzten x-Tage-Daten halten, dann, wie ich durch die Datei zu lesen, hacke ich das erste Element und verschieben die anderen 6 (für eine Woche rollen insgesamt) zurück um eins. Die Verarbeitung dieses statischen Arrays erfolgt in seinem eigenen Verfahren, dh. Meine Frage: ist dies eine vernünftige Design-Ansatz, oder gibt es etwas blendend offensichtlich und einfach, diese Aufgabe zu tun Danke Jungs gefragt Aug 30 11 at 14:33 Vielen Dank Jungs: I39ve bekam die Nachricht: Verwenden Sie ein übergeordnetes Objekt und nutzen die Relevante Methoden oder einen Ringpuffer. Große Antworten, alle von ihnen. Wenn Sie darüber nachdenken, benötigen Sie immer Zugriff auf das gesamte Array, so können Sie loswerden, dass erste Eintrag - die ich war nicht sicher, auf eigene Faust. I39m erleichtert, dass ich hadn39t verpasste einige 1 Liner und war im Grunde auf eine vernünftige, wenn nicht effizient und knapp Track Dies ist, was ich liebe über diese Website: qualitativ hochwertige, relevante Antworten von Menschen, die ihre sht kennen. Ndash Pete855217 Aug 11, 2010, um 15:05 Uhr Warum initialisieren Sie runningTotal auf null Was ist der Typ, wo es deklariert Es wäre gut, wenn Sie einige Code-Beispiele, die tatsächlichen Java-Code ähneln setzen. Im Übrigen wäre meine Kritik die folgende: Ihre Funktion hat zu viel. Eine Funktion oder Methode sollte zusammenhängend sein. Entsprechend sollten sie eine Sache und eins nur tun. Schlimmer noch, was passiert in Ihrer for-Schleife, wenn x 5 Sie kopieren runningTotal6 in runningTotal5. Aber dann haben Sie zwei Kopien des gleichen Wertes an Position 5 und 6. In Ihrem Entwurf, Ihre Funktion bewegt / shuffles die Einzelteile in Ihrem Array berechnet die Gesamtabzüge Stuff zu Standardfehler liefert die Summe Es tut zu viel. Mein erster Vorschlag ist nicht zu bewegen Zeug um in der Array. Stattdessen implementieren Sie einen kreisförmigen Puffer und verwenden Sie es statt des Arrays. Es vereinfacht Ihren Entwurf. Mein zweiter Vorschlag ist, Dinge in Funktionen zusammenzufassen, die zusammenhängen: haben Sie eine Datenstruktur (ein kreisförmiger Puffer), der Ihnen erlaubt, es hinzuzufügen (und das den ältesten Eintrag sinkt, wenn es seine Kapazität erreicht hat) Interator haben eine Funktion, die die Summe auf dem Iterator berechnet (Sie dont care, wenn Sie die Summe aus einem Array, Liste oder kreisförmigen bufer.) Dont nennen es insgesamt. Nennen Sie es Summe, die ist, was Sie berechnen. Das ist, was Id tun :) That39s große info luis, aber denken Sie daran, diese Funktion ist ein kleiner Teil der Funktionalität der Klasse, und es wäre Overkill zu viel Code hinzufügen, um es perfekt. Sie sind technisch korrekt, und ich verstehe, dass mein Code zu viel 39 macht, aber gleichzeitig ist es manchmal besser, auf der Seite des kleineren, klareren Codes zu irren als für Perfektion zu gehen. Angesichts meiner Java-Fähigkeiten, auch die Herstellung der Pseudocode Sie beschreiben kompilieren würde ich blasen mein Budget auf diese (), aber danke für die klare Beschreibung. Ndash Pete855217 Aug 31 11 at 2:23 Hmmm, es geht nicht um Perfektion, sondern um etablierte industrielle Praktiken, die wir seit den letzten 3 Jahrzehnten kennen. Sauberer Code ist immer einer, der partitioniert ist. Wir haben jahrzehntelange Evidenz, die zeigen, dass dies der Weg ist, um in den allgemeinen Fall zu gehen (in Bezug auf Kosteneffizienz, Defektverkleinerung, Verständnis usw.). Es sei denn, es ist Wegwerf-Code für eine einmalige Art der Sache. Es ist niemals teuer, dies zu tun, wenn man auf diese Weise eine Problemanalyse startet. Codierung 101, brechen das Problem und der Code folgt, weder Overkill noch schwierig) ndash luis. espinal Ihre Aufgabe ist zu einfach und die Vorgehensweise Sie angenommen haben, ist sicherlich gut für den Job. Allerdings, wenn Sie ein besseres Design verwenden möchten, müssen Sie loszuwerden, dass alle die Anzahl der Bewegung Sie besser eine FIFO-Warteschlange und machen gute Verwendung von Push-und Pop-Methoden, die Art und Weise der Code reflektiert keine Datenbewegung, nur die beiden logischen Aktionen Von neuen Daten und entfernen Sie Daten, die älter als 7 Tage sind. Beantwortet Aug 30 11 um 14: 49Die Wissenschaftler und Ingenieure Leitfaden für digitale Signalverarbeitung Von Steven W. Smith, Ph. D. Ein enormer Vorteil des gleitenden Mittelfilters besteht darin, dass er mit einem sehr schnellen Algorithmus implementiert werden kann. Um diesen Algorithmus zu verstehen, stellen Sie sich vor, ein Eingangssignal, x, durch ein siebenpunktiges gleitendes Durchschnittsfilter zu führen, um ein Ausgangssignal y zu bilden. Nun wird untersucht, wie zwei benachbarte Ausgangspunkte y 50 und y 51 berechnet werden: Es sind fast dieselben Berechnungspunkte x 48 bis x 53 für y 50 und für y 51 zu addieren. Wenn y 50 bereits berechnet wurde Ist der effizienteste Weg zum Berechnen von y 51: Nachdem y 51 unter Verwendung von y 50 gefunden worden ist, kann y 52 aus der Probe y 51 und so weiter berechnet werden. Nachdem der erste Punkt in y berechnet ist, können alle anderen Punkte mit nur einer Addition und Subtraktion pro Punkt gefunden werden. Dies kann in der Gleichung ausgedrückt werden: Beachten Sie, dass diese Gleichung zwei Datenquellen verwendet, um jeden Punkt in der Ausgabe zu berechnen: Punkte von der Eingabe und vorher berechnete Punkte von der Ausgabe. Dies wird als rekursive Gleichung bezeichnet, dh das Ergebnis einer Berechnung wird in zukünftigen Berechnungen verwendet. (Der Begriff rekursive hat auch andere Bedeutungen, vor allem in der Informatik). Kapitel 19 behandelt eine Vielzahl von rekursiven Filtern genauer. Beachten Sie, dass sich das gleitende, durchschnittliche rekursive Filter sehr von den typischen rekursiven Filtern unterscheidet. Insbesondere haben die meisten rekursiven Filter eine unendlich lange Impulsantwort (IIR), bestehend aus Sinusoiden und Exponentialen. Die Impulsantwort des gleitenden Mittelwertes ist ein Rechteckimpuls (endliche Impulsantwort oder FIR). Dieser Algorithmus ist aus mehreren Gründen schneller als andere digitale Filter. Erstens gibt es nur zwei Berechnungen pro Punkt, unabhängig von der Länge des Filterkerns. Zweitens sind Addition und Subtraktion die einzigen mathematischen Operationen, während die meisten digitalen Filter eine zeitaufwändige Multiplikation erfordern. Drittens ist das Indexierungsschema sehr einfach. Jeder Index in Gl. 15-3 durch Addieren oder Subtrahieren von ganzzahligen Konstanten gefunden, die berechnet werden können, bevor die Filterung beginnt (d. h. p und q). Weiter kann der gesamte Algorithmus mit Ganzzahldarstellung durchgeführt werden. Abhängig von der verwendeten Hardware können ganze Zahlen mehr als eine Größenordnung schneller als der Gleitpunkt sein. Überraschenderweise arbeitet die Ganzzahldarstellung besser als der Gleitkommawert mit diesem Algorithmus, zusätzlich zu dem, was schneller ist. Der Rundungsfehler der Gleitpunktarithmetik kann zu unerwarteten Ergebnissen führen, wenn Sie nicht vorsichtig sind. Stellen Sie sich zum Beispiel ein 10.000 Probensignal vor, das mit diesem Verfahren gefiltert wird. Der letzte Abtastwert im gefilterten Signal enthält den akkumulierten Fehler von 10.000 Additionen und 10.000 Subtraktionen. Dies erscheint im Ausgangssignal als Driftversatz. Integers dont haben dieses Problem, weil es keine Round-off-Fehler in der Arithmetik. Wenn Sie mit diesem Algorithmus Fließkommazahlen verwenden müssen, zeigt das Programm in Tabelle 15-2, wie ein doppelter Präzisionsakkumulator verwendet wird, um diese Drift zu eliminieren. In der Statistik ist ein einfacher gleitender Durchschnitt ein Algorithmus, der das ungewichtete Mittel der letzten n Abtastwerte berechnet. Der Parameter n wird oft als Fenstergröße bezeichnet, da der Algorithmus als Fenster betrachtet werden kann, das über die Datenpunkte gleitet. Unter Verwendung einer rekursiven Formulierung des Algorithmus wird die Anzahl der Operationen, die pro Probe erforderlich sind, auf eine Addition, eine Subtraktion und eine Division reduziert. Da die Formulierung unabhängig von der Fenstergröße n ist. Die Laufzeitkomplexität ist O (1). D. h. Die rekursive Formel des ungewichteten gleitenden Mittelwertes ist, wobei avg der rollende Mittelwert und x ein Datenpunkt ist. Wenn also das Fenster nach rechts gleitet, fällt ein Datenpunkt, der Schwanz, aus und ein Datenpunkt, der Kopf, bewegt sich hinein. Implementierung Eine Implementierung des einfachen gleitenden Mittels muss folgendes berücksichtigen Algorithmusinitialisierung Solange Das Fenster nicht vollständig mit Werten belegt wird, schlägt die rekursive Formel fehl. Lagerung Der Zugriff auf das Heizelement ist erforderlich, was je nach Implementierung eine Speicherung von n Elementen erfordert. Meine Implementierung verwendet die vorgestellte Formel, wenn das Fenster vollständig mit Werten gefüllt wird, und wechselt andererseits auf die Formel, die den Mittelwert aktualisiert, indem die Summe der vorherigen Elemente neu berechnet wird. Beachten Sie, dass dies aufgrund der Gleitpunktarithmetik zu numerischen Instabilitäten führen kann. Was den Speicherverbrauch angeht, verwendet die Implementierung Iteratoren zum Verfolgen von Kopf - und Schwanz-Elementen. Dies führt zu einer Implementierung mit konstantem Speicherbedarf unabhängig von der Fenstergröße. Hier ist die Aktualisierungsprozedur, die das Fenster nach rechts verschiebt. In. NET die meisten der Sammlungen ihre Enumeratoren ungültig, wenn die zugrundeliegende Sammlung geändert wird. Die Implementierung setzt jedoch auf gültige Enumeratoren. Insbesondere bei streamingbasierten Anwendungen muss die zugrundeliegende Sammlung geändert werden, wenn ein neues Element eintrifft. Eine Möglichkeit, dies zu bewältigen, besteht darin, eine einfache kreisförmige Sammlung von fester Größe der Größe n1 zu erstellen, die ihre Iteratoren niemals ungültig macht und alternativ ein Element hinzufügt und die Verschiebung aufruft. Ich wünschte, ich könnte herausfinden, wie man tatsächlich implementieren, da die Test-Funktion ist sehr verwirrend, me8230 Muss ich Daten in Array konvertieren, dann SMA SMA SMA (20, Array) für eine 20-Periode SMA laufen Wie behandle ich Shift () - Funktion Ist es notwendig, Konstruktoren zu implementieren. (Entschuldigen Sie das Durcheinander). Nein Sie don8217t müssen Ihre Daten in ein Array zu konvertieren, solange Ihre Daten implementiert IEnumerable1 und die Aufzählung Typ ist doppelt. Soweit Ihr privates Messaging betroffen ist, müssen Sie das DataRow zu etwas umwandeln, das von den doppelten Werten aufzählbar ist. Ihr Ansatz funktioniert. Shift, verschiebt das Fenster um eine Position nach links. Für einen Datensatz von etwa 40 Werten und eine 20-stündige SMA haben Sie 21 Positionen das Fenster passt in (40 8211 20 1). Jedes Mal, wenn Sie Shift () aufrufen, wird das Fenster um eine Position nach links verschoben, und Average () gibt die SMA für die aktuelle Fensterposition zurück. Das heißt, der ungewichtete Durchschnitt aller Werte innerhalb des Fensters. Darüber hinaus ermöglicht meine Implementierung, die SMA zu berechnen, auch wenn das Fenster nicht vollständig am Anfang gefüllt ist. Also im Wesentlichen Hope dies hilft. Alle weiteren Fragen COPYRIGHT NOTICE Christoph Heindl und cheind. wordpress, 2009-2012. Unerlaubte Verwendung und / oder Vervielfältigung dieses Materials ohne ausdrückliche und schriftliche Genehmigung von diesem Blog-Autor und / oder Inhaber ist streng verboten. Auszüge und Links können verwendet werden, sofern Christoph Heindl und cheind. wordpress mit entsprechender und konkreter Orientierung zum Originalinhalt volle und klare Gutschrift erteilt werden. kürzliche Posts

No comments:

Post a Comment