Hmmm, es scheint, diese einfach zu implementieren Funktion ist eigentlich ziemlich einfach, falsch zu werden und hat eine gute Diskussion über Gedächtnis Effizienz gefördert Ich bin glücklich, aufblasen, wenn es bedeutet zu wissen, dass etwas richtig gemacht wurde Richard Sep 20 14 um 19 23.NumPy Der Mangel an einer bestimmten domänenspezifischen Funktion ist vielleicht auf die Disziplin des Core Teams zurückzuführen, und die Treue zu NumPy s Prime Directive bietet einen N-dimensionalen Array-Typ sowie Funktionen zum Erstellen und Indizieren dieser Arrays Wie viele grundlegende Ziele, diese Ist nicht klein, und NumPy macht es brillant. Die viel größere SciPy enthält eine viel größere Sammlung von Domain-spezifischen Bibliotheken namens Subpackages von SciPy Devs - zum Beispiel numerische Optimierung zu optimieren, Signal Processing Signal und integrale Kalkül integrieren. Meine Vermutung ist Dass die Funktion, die Sie nachher sind, in mindestens einem der SciPy-Unterpakete vielleicht aber ich würde zuerst in der Sammlung von SciPy Scikits identifizieren die relevanten scikit s und suchen Sie nach der Funktion des Interesses dort. Scikits sind unabhängig entwickelte Pakete auf NumPy basiert SciPy und gerichtet auf eine bestimmte technische Disziplin zB Scikits-Bild Scikits-Lernen usw. Mehrere von diesen waren vor allem die ehrfürchtigen OpenOpt für numerische Optimierung wurden hoch angesehen, reife Projekte lange vor der Wahl zu wohnen unter der relativ neuen Scikits Rubrik Die Scikits Homepage mochte Bis über listet etwa 30 solcher scikits auf, obwohl mindestens einige von ihnen nicht mehr unter aktiver entwicklung sind. Nach diesem Rat würde Sie zu scikits-timeseries führen, aber dieses Paket ist nicht mehr unter aktiver Entwicklung In Wirklichkeit ist Pandas geworden, AFAIK, die De facto NumPy-basierte Zeitreihen-Bibliothek. Pandas hat mehrere Funktionen, die verwendet werden können, um einen gleitenden Durchschnitt zu berechnen, das einfachste von diesen ist wahrscheinlich rollingmean, die Sie wie so verwenden. Nun, rufen Sie einfach die Funktion rollingmean passing in der Serie Objekt und ein Fenster Größe, die in meinem Beispiel unten ist 10 Tage. verifizieren, dass es funktioniert - zB verglichen Werte 10 - 15 in der ursprünglichen Serie gegen die neue Serie geglättet mit rollenden mean. The Funktion Rollingmean, zusammen mit etwa ein Dutzend oder so andere Funktion sind informell Gruppiert in der Pandas-Dokumentation unter dem Rubrikbewegungsfenster funktioniert eine zweite, verwandte Gruppe von Funktionen in Pandas wird als exponentiell gewichtete Funktionen bezeichnet, zB ewma, die exponentiell verschobenen gewichteten Durchschnitt berechnet. Die Tatsache, dass diese zweite Gruppe nicht im ersten bewegten Fenster enthalten ist Funktionen sind vielleicht, weil die exponentiell gewichteten Transformationen nicht auf ein fester Länge-Fenster angewiesen sind. derwerted Jan 14 13 bei 6 38. Um eine asymptotische Leistung von O n zu erreichen, wie die handcodierte Lösung, können Sie das Aggregat verwenden Funktion wie in. Der akkumulierte Wert, der als anonymer Typ implementiert wird, enthält zwei Felder Ergebnis enthält die Ergebnisliste, die bis jetzt aufgebaut ist. Das Lesen der letzten Perioden-1-Elemente Die Aggregatfunktion fügt den aktuellen Wert der Arbeitsliste hinzu, baut den aktuellen Durchschnitt und fügt sie hinzu Auf das Ergebnis und entfernt dann den ersten ältesten Wert aus der Arbeitsliste. Der Samen, dh der Startwert für die Akkumulation, wird aufgebaut, indem man die ersten Perioden-1-Elemente in die Arbeit und Initialisierung von Ergebnis in eine leere Liste setzt. Infolgedessen beginnt die Aggregation mit Element-Periode durch Überspringen von Perioden-1-Elementen am Anfang. In der funktionalen Programmierung ist dies ein typisches Verwendungsmuster für die Aggretate - oder Faltungsfunktion, btw. Die Lösung ist nicht funktional sauber, dass die gleichen Listenobjekte Arbeiten und Ergebnis in jedem Schritt wiederverwendet werden Ich bin mir nicht sicher, ob das zu Problemen führen könnte, wenn einige zukünftige Compiler versuchen, die Aggregate-Funktion automatisch zu parallellieren, andererseits bin ich auch nicht sicher, ob das überhaupt möglich ist. Eine rein funktionale Lösung sollte bei jedem Schritt neue Listen erstellen Dass C fehlende mächtige Listenausdrücke In irgendeinem hypothetischen Python-C-gemischten Pseudocode könnte man die Aggregationsfunktion schreiben. Was wäre ein bisschen eleganter in meiner bescheidenen Meinung. Geben Sie die Laufzeit von O n 2 an, da Sie mehr überspringen müssen Mehr Elemente bei jedem Schritt und afaik Skip Ich muss mich anrufen i mal Siehe meine Antwort für eine Lösung in O n Zeit Ich habe gerade die OPs Kommentar unten, dass er sie möglicherweise die Werte aus einer SQL DB in der Zukunft bekommen In diesem Fall I Würde von dieser Lösung stark abgestoßen werden MartinStettner Mar 3 11 bei 0 53. Für die effizienteste Möglichkeit, einen Moving Average mit LINQ zu berechnen, solltest du nicht LINQ verwenden. Stattdessen schlage ich vor, eine Helper-Klasse zu schaffen, die einen gleitenden Durchschnitt am meisten berechnet Effiziente Möglichkeit, mit einem kreisförmigen Puffer und kausal gleitenden durchschnittlichen Filter, dann eine Erweiterung Methode, um es zugänglich zu LINQ. First up, die gleitenden Durchschnitt. Diese Klasse bietet eine sehr schnelle und leichte Umsetzung eines MovingAverage-Filter Es schafft einen kreisförmigen Puffer von Länge N und berechnet eine Addition, eine Subtraktion und eine Multiplikation pro Datenpunkt angehängt, im Gegensatz zu den N Multiplikations-Adds pro Punkt für die Brute-Force-Implementierung. Die oben genannten Erweiterungsmethoden wickeln die MovingAverage-Klasse ein und erlauben das Einfügen in einen IEnumerable-Stream. Um dies in einer funktionelleren Weise zu tun, brauchst du eine Scan-Methode, die in Rx existiert, aber nicht in LINQ. Let s aussehen, wie es aussehen würde, wenn wir eine Scan-Methode haben. Und hier ist die Scan-Methode, genommen und angepasst Von hier aus. Dies sollte eine bessere Leistung haben als die Brute-Force-Methode, da wir eine laufende Summe verwenden, um die SMA zu berechnen. Um zu beginnen, müssen wir die erste Periode berechnen, die wir Seeds hier nennen. Dann ist jeder nachfolgende Wert, den wir aus dem angesammelten Saatgut berechnen Wert Um dies zu tun, brauchen wir den alten Wert, der t-delta ist und den neuesten Wert, für den wir die Serie zip, einmal von Anfang an und einmal von der delta verschoben. Am Ende machen wir einige Aufräumarbeiten durch Hinzufügen von Nullen für die Länge Der ersten Periode und das Hinzufügen des Anfangssamenwertes. Erweiterte Jun 19 13 bei 22 58. Einer der Hauptanwendungen für die Arduino-Platine liest und protokolliert die Sensordaten. Zum Beispiel überwacht man den Druck jede Sekunde des Tages Erzeugt Spikes in den Graphen man will auch einen Durchschnitt der Messungen haben Da die Messungen nicht statisch in der Zeit sind, was wir oft brauchen, ist ein laufender Durchschnitt Dies ist der Durchschnitt einer bestimmten Periode und sehr wertvoll bei der Trendanalyse. Simplest Form von Ein laufender Durchschnitt kann durch Code getan werden, der auf dem vorherigen laufenden Durchschnitt aufbaut. Wenn man nicht will, um Floating-Point-Mathematik zu verwenden - da dies Speicher aufnimmt und die Geschwindigkeit verringert - kann man das gleiche vollständig in der Integer-Domain tun Die Division von 256 In der Beispiel-Code ist ein Shift-Right 8, die ist schneller als sagen Division durch zB 100 Dies gilt für jede Macht von 2 als Teiler und man muss nur darauf achten, die Summe der Witterungen entspricht der Macht von 2 Und natürlich ein Sollte darauf achten, dass es keinen Zwischenüberlauf gibt, der mit unsigned long. Wenn Sie einen genaueren laufenden Durchschnitt benötigen, in concreto von den letzten 10 Messungen, benötigen Sie ein Array oder eine verknüpfte Liste, um sie zu halten Dieses Array fungiert als kreisförmiger Puffer und mit jedem Neue Messung die älteste wird entfernt Der laufende Durchschnitt wird berechnet als die Summe aller Elemente geteilt durch die Anzahl der Elemente in der Array Der Code für den laufenden Durchschnitt wird so etwas wie dies sein. Drawback dieses Codes ist, dass das Array alle halten Werte können ziemlich groß werden Wenn Sie eine Messung pro Sekunde haben und Sie wollen einen laufenden Durchschnitt pro Minute benötigen Sie eine Reihe von 60 ein Durchschnitt pro Stunde würde eine Array von 3600 Das könnte nicht auf diese Weise auf einem Arduino wie es nur getan werden 2K RAM Aber durch den Aufbau eines 2-stufigen Mittels kann man sich ganz gut verständigen, nicht für alle Messungen In psuedo code. As ein neues internes statisches Array wird für jede runningAverage Funktion benötigt, diese schreit als class. RunningAverage Bibliothek implementiert werden. Die runningAverage-Bibliothek macht eine Klasse der obigen Funktion, so dass sie mehrmals in einer Skizze verwendet werden kann. Entkuppelt die Add - und Avg-Funktion ein bisschen flexibler, zB man kann den Durchschnitt mehrfach anrufen, ohne eine Sache hinzuzufügen. Bitte beachten Sie, dass jeder Instanz der Klasse fügt ein eigenes Array hinzu, um Messungen zu halten, und das fügt dem Speicherverbrauch hinzu Die Schnittstelle der Klasse wird so klein wie möglich gehalten. Hinweis mit Version 0 2 Die Namen der Methoden werden alle beschreibender gemacht Kleine Skizze zeigt, wie es verwendet werden kann Ein zufälliger Generator wird verwendet, um einen Sensor zu imitieren. In Setup ist die myRA gelöscht, so können wir mit dem Hinzufügen neuer Daten beginnen. In der Schleife wird zuerst eine zufällige Zahl generiert und in einen Float umgewandelt, um myRA hinzugefügt zu werden Dann wird das runningAverage auf den seriellen Port gedruckt. Man könnte es auch auf einem LCD anzeigen oder über Ethernet versenden. Wenn 300 Artikel hinzugefügt werden, wird myRA gelöscht, um wieder von vorne zu beginnen. Um die Bibliothek zu benutzen, mache ich einen Ordner in deiner SKETCHBOOKPATH libaries mit dem Namen RunningAverage und setzen Sie die h und dort Optional ein Beispiel-Unterverzeichnis, um die Probe zu platzieren app.2011-01-30 initial version.2011-02-28 feste fehlende destruktor in h file.2011-02-28 entfernt default constructor.2012- - TrimValue Yuval Naveh hinzugefügt trimValue gefunden auf web.2012-11-21 refactored.2012-12-30 hinzugefügt fillValue refactored für publishing.2014-07-03 hinzugefügt Memory-Schutz-Code - wenn interne Array kann nicht zugeordnet werden Größe wird 0 Dies ist zu lösen Ausgabe beschrieben hier. Test extensively. Template class. RunningAverage h. RunningAverage.
No comments:
Post a Comment