Saturday 8 April 2017

Moving Average Filter Scipy

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 nach Die Funktion von Interesse dort. Scikits sind unabhängig entwickelte Pakete auf der Grundlage von NumPy SciPy und gerichtet auf eine bestimmte technische Disziplin zB Scikits-Bild Scikits-Lernen usw. Mehrere von diesen waren vor allem die awesome OpenOpt für numerische Optimierung wurden hoch angesehen, reife Projekte lange Vor der Wahl zu wohnen unter der relativ neuen scikits rubric Die Scikits Homepage gern oben listet etwa 30 solcher Scikits, obwohl mindestens einige von denen sind nicht mehr unter aktiver Entwicklung. Nach diesem Rat würde Sie zu scikits-timeseries führen, aber das Paket ist nein Länger unter aktiver entwicklung In der Tat ist Pandas geworden, AFAIK, die de facto NumPy-basierte Zeitreihenbibliothek. 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 , Rufen Sie einfach die Funktion rollingmean passing in der Serie Objekt und eine Fenstergröße, die in meinem Beispiel unten ist 10 Tage. verifizieren, dass es w Orked - zB verglichene Werte 10 - 15 in der Originalreihe gegen die neue Serie geglättet mit rollenden Mittel. Die Funktion Rollingmean, zusammen mit etwa einem Dutzend oder so anderen Funktion sind informell gruppiert in der Pandas Dokumentation unter der Rubrik beweglichen Fenster Funktionen eine Sekunde , 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 in die ersten beweglichen Fensterfunktionen eingeschlossen ist, liegt vielleicht daran, dass die exponentiell gewichteten Transformationen nicht darauf ankommen Ein fester längenfenster. derwerted Jan 14 13 at 6 38.Ich weiß, das ist eine alte Frage, aber hier ist eine Lösung, die keine zusätzlichen Datenstrukturen oder Bibliotheken verwendet. Es ist linear in der Anzahl der Elemente der Eingabeliste und Ich kann nicht an irgendeine andere Weise denken, um es effizienter zu machen, wenn jemand weiß, von einem besseren Weg, um das Ergebnis zuzuteilen, lass es mich wissen. NOTE das wäre viel schneller mit einem numpy arr Ay statt einer Liste, aber ich wollte alle Abhängigkeiten zu beseitigen Es wäre auch möglich, die Leistung durch Multi-Thread-Ausführung zu verbessern. Die Funktion geht davon aus, dass die Eingabe-Liste ist eindimensional, also seien Sie vorsichtig. UPD effizientere Lösungen wurden von vorgeschlagen Alleo und jasaarim. Sie können für das verwenden. Das Modus-Argument spezifiziert, wie die Kanten behandeln Ich wählte den gültigen Modus hier, weil ich denke, dass s, wie die meisten Menschen erwarten, dass Laufen zu arbeiten, aber Sie können andere Prioritäten haben Hier ist eine Handlung, die Veranschaulicht den Unterschied zwischen den Modi. Siehe Mar 24 14 bei 22 01.Ich mag diese Lösung, weil es sauber ist eine Zeile und relativ effiziente Arbeit in numpy getan Aber Alleo s Effiziente Lösung mit besserer Komplexität Ulrich Stern Sep 25 15 bei 0 31. Sie können einen laufenden Mittelwert berechnen. Glücklicherweise enthält numpy eine Faltungsfunktion, die wir verwenden können, um die Dinge zu beschleunigen. Das laufende Mittel ist gleichbedeutend mit dem Falten von x mit einem Vektor, der N lang ist, wobei alle Glieder gleich 1 N sind Die numpy Implementierung von convolve beinhaltet den Start-Transient, also musst du die ersten N-1 Punkte entfernen. Auf meiner Maschine ist die schnelle Version 20-30 mal schneller, je nach Länge des Eingangsvektors und der Größe des Mittelungsfensters. Note, dass convolve enthält einen gleichen Modus, der scheint, wie es sollte die Anfangsübergang Problem, aber es teilt es zwischen dem Anfang und Ende. Es entfernt die vorübergehende aus dem Ende, und der Anfang doesn t haben eine Nun, ich denke, es Eine Frage der Prioritäten, ich brauche nicht die gleiche Anzahl von Ergebnissen auf Kosten der Erlangung einer Steigung in Richtung Null, dass isn t dort in den Daten BTW, hier ist ein Befehl, um den Unterschied zwischen den Modi Modi voll, gleiche, gültige Handlung zu zeigen Konvillieren 200,, man 50, 50, mode m für m in modi-achse -10, 251, - 1, 1 1 legenden-modi, loc-untere mit pyplot und numpy importierten lapis Mar 24 14 bei 13 56.pandas ist besser geeignet Für diese als NumPy oder SciPy seine Funktion rollingmean macht den Job bequem Es gibt auch ein NumPy-Array, wenn die Eingabe ein Array ist. Es ist schwierig, Rollingmean in der Leistung mit jeder benutzerdefinierten reinen Python-Implementierung zu schlagen Hier ist ein Beispiel Leistung gegen zwei der vorgeschlagenen Lösungen. Es gibt auch schöne Möglichkeiten, wie zu handeln Mit den Kantenwerten. Ich bin immer durch Signalverarbeitungsfunktion verärgert, die Ausgangssignale unterschiedlicher Form als die Eingangssignale zurückgibt, wenn beide Ein - und Ausgänge gleich sind, zB zeitliche Signale, die die Entsprechung mit der zugehörigen unabhängigen Variablen z. B. Zeit, Frequenz, Machen plotten oder Vergleich nicht eine direkte Angelegenheit sowieso, wenn Sie das Gefühl teilen, möchten Sie vielleicht die letzten Zeilen der vorgeschlagenen Funktion als gleiche Rückkehr ändern y windowlen-1 - windowlen-1 Christian O Reilly 25. August 15 um 19 56.A Biss spät zur Party, aber ich habe meine eigene kleine Funktion gemacht, die sich nicht um die Enden oder Pads mit Nullen wickelt, die dann verwendet werden, um den Durchschnitt zu finden, aber auch eine weitere Behandlung ist, dass es auch Re-Samples das Signal an linear beabstandeten Punkten Passen Sie den Code nach Belieben, um andere Features zu erhalten. Die Methode ist eine einfache Matrix-Multiplikation mit einem normalisierten Gaußschen Kernel. Ein einfacher Gebrauch auf einem sinusförmigen Signal mit zusätzlichen normalen verteilten Rauschen. Diese Frage ist jetzt sogar Älter als wenn NeXuS schrieb darüber im letzten Monat, aber ich mag, wie sein Code mit Randfällen behandelt Aber da es sich um einen einfachen gleitenden Durchschnitt handelt, liegt es an den Daten, die sie anwenden, ich dachte, dass der Umgang mit Randfällen in einem mehr Zufriedener Weg als die NumPy-Modi, die gleich und voll sind, können durch die Anwendung eines ähnlichen Ansatzes für eine faltungsbasierte Methode erreicht werden. Mein Beitrag nutzt einen zentralen laufenden Durchschnitt, um seine Ergebnisse mit ihren Daten auszurichten. Wenn es zwei wenige Punkte für die Vollgröße gibt Fenster zu verwenden, laufende Mittelwerte werden aus sukzessiv kleineren Fenstern an den Kanten des Arrays berechnet. Eigentlich aus sukzessive größeren Fenstern, aber das ist ein Implementierungsdetail. Es ist relativ langsam Weil es nervt und könnte wahrscheinlich ziemlich viel durch eine echte Pythonista, aber ich glaube, dass die Idee stands. answered Jan 2 bei 0 28. ist schön, aber langsam, wenn die Fensterbreite wächst groß Einige Antworten bieten mehr effecient Algorithmen Mit aber scheinen nicht in der Lage, Kantenwerte zu behandeln Ich selbst habe einen Algorithmus implementiert, der dieses Problem gut behandeln kann, wenn dieses Problem als Input-Parameter deklariert wird. Mergenum kann als 2 windowwidth gedacht werden 1.Ich kenne diesen Code ist ein wenig unleserlich wenn du bist Finde es nützlich und will einige Ausbreitungen, lass es mich wissen und ich werde diese Antwort aktualisieren Da das Schreiben einer Erklärung mir viel Zeit kostet, hoffe ich, dass ich es nur tue, wenn jemand es braucht. Bitte vergib mir für meine Faulheit. Wenn du nur bist Interessiert an seiner ursprünglichen version. It s noch mehr unleserlich die erste Lösung befreit Rand Problem durch padding Nullen um das Array, aber die zweite Lösung hier gehandhabt es in einer harten und direkten Weise. In meinem letzten Satz habe ich versucht zu indizieren E warum es hilft, floating point error Wenn zwei Werte ungefähr die gleiche Größenordnung sind, dann addiert man weniger Präzision, als wenn man eine sehr große Zahl zu einem sehr kleinen addiert. Der Code kombiniert benachbarte Werte in einer Weise, dass auch Zwischensummen sollte Immer vernünftig in der Größenordnung zu sein, um den Gleitkomma-Fehler zu minimieren Nichts ist narrensicher, aber diese Methode hat ein paar sehr schlecht umgesetzte Projekte in der Produktion gespeichert Mayur Patel 15.12. 14 bei 17 22. Alleo Anstatt einen zusätzlichen Wert pro Wert zu machen, Mache zwei Der Beweis ist der gleiche wie das Bit-Flipping-Problem Allerdings ist der Punkt dieser Antwort nicht unbedingt Leistung, aber Präzision Memory-Nutzung für die Mittelung 64-Bit-Werte würde nicht mehr als 64 Elemente im Cache, so ist es freundlich in Speicherverwendung auch Mayur Patel Dez 29 14 bei 17 04. Die folgenden Beispiele erzeugen einen gleitenden Durchschnitt der vorangegangenen WINDOW-Werte. Wir schneiden die ersten WINDOW -1 - Werte ab, da wir den Durchschnitt vor t nicht finden können Hem Das Standardverhalten für die Faltung besteht darin, anzunehmen, dass Werte vor dem Beginn unserer Sequenz 0 sind. Wir formulieren formal die Sequenz y für die Sequenz x, wobei yi xi xi 1 xin n. This macht die numpy s Faltungsfunktion Dies ist ein Allgemeingültige gleitende durchschnittliche Operation. Hochende Gewichtungen macht einige Werte wichtiger Versatz in geeigneter Weise ermöglicht es Ihnen, durchschnittlich wie um Punkt anstatt vor Punkt zu sehen. Anstatt abschneiden Werte können wir die Anfangswerte an Ort und Stelle, wie in diesem Beispiel veranschaulicht zu beheben.


No comments:

Post a Comment