Thursday 17 August 2017

Beweglich Durchschnittlich 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 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 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 Eingabe-Liste und ich kann nicht anders denken, um es effizienter zu machen, wenn jemand weiß, von einem besseren Weg, um das Ergebnis zuzuteilen, lass es mich wissen. HINWEIS das wäre viel schneller mit Ein numpy Array anstelle einer Liste, aber ich wollte alle Abhängigkeiten zu beseitigen Es wäre auch möglich, die Leistung durch Multi-Threaded Ausführung zu verbessern. Die Funktion geht davon aus, dass die Eingabe-Liste ist eindimensional, also seien Sie vorsichtig. UPD effizientere Lösungen wurden Vorgeschlagen von 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 Hier ist ein Handlung, die den Unterschied zwischen den Modi veranschaulicht, die am 24. März um 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 hat bessere Komplexität Ulrich Stern Sep 25 15 bei 0 31.Sie können einen laufenden Mittelwert berechnen. Zufällig, numpy schließt eine Faltenfunktion ein, 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, mit allen Mitgliedern gleich 1 N Die numpy Die Implementierung von convolve beinhaltet den Start-Transienten, 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. Hinweis Dass es sich um einen ähnlichen Modus handelt, der so aussieht, als ob er das anfängliche vorübergehende Problem ansprechen sollte, aber es spaltet es zwischen dem Anfang und dem Ende. Es entfernt den Übergang vom Ende, und der Anfang hat nicht einen Nun, ich denke, es ist eine Sache Von Prioritäten, ich brauche nicht die gleiche Anzahl von Ergebnissen auf Kosten der Erhalten einer Steigung in Richtung Null, dass isn t gibt es in den Daten BTW, hier ist ein Befehl, um den Unterschied zwischen den Modi Modi voll, gleiche, gültige Plot convolve zeigen 200,, 50, 50, Modus m für m in Modi Achse -10, 251, - 1, 1 1 Legende-Modi, lokal unteres Zentrum mit pyplot und numpy importierten Lapis Mar 24 14 bei 13 56.pandas ist dafür besser geeignet 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 Leistung mit jeder benutzerdefinierten reinen Python-Implementierung zu schlagen Hier ist eine Beispielleistung gegen zwei der vorgeschlagenen Lösungen. Es gibt auch schöne Möglichkeiten, wie man mit den Kantenwerten umgehen kann. Ich bin immer durch Signalverarbeitungsfunktion verärgert, die Ausgangssignale unterschiedlicher Form als die Eingangssignale zurückgibt, wenn sowohl Ein - als auch Ausgänge gleich sind, z. B. beide zeitlichen Signale, die es bricht Die Korrespondenz mit verwandter unabhängiger Variable zB Zeit, Häufigkeitserstellung Plotten oder Vergleich nicht eine direkte Sache sowieso, wenn Sie das Gefühl teilen, möchten Sie vielleicht die letzten Zeilen der vorgeschlagenen Funktion als gleiche Rückkehr y windowlen-1 - windowlen-1 Christian ändern O Reilly Aug 25 15 bei 19 56. Ein bisschen spät zur Party, aber ich habe meine eigene kleine Funktion, die nicht um die Enden oder Pads mit Nullen, die dann verwendet werden, um den Durchschnitt zu finden, als auch eine weitere Behandlung ist , Dass es auch das Signal an linear beabstandeten Punkten neu abtastet. Passen Sie den Code nach Belieben an, um andere Features zu erhalten. Die Methode ist eine einfache Matrixmultiplikation mit einem normalisierten Gaußschen Kernel. Eine einfache Verwendung auf einem sinusförmigen Signal mit addiertem normal verteiltem Rauschen Frage ist jetzt noch älter als wenn NeXuS schrieb darüber im letzten Monat, aber ich mag, wie sein Code mit Randfällen behandelt. Allerdings, weil es ein einfacher gleitender Durchschnitt ist, liegt es hinter den Daten, die sie anwenden, dachte ich, dass der Umgang mit Rand Fälle in einer befriedigenderen Weise als NumPy s Modi gültig, die gleich und voll erreicht werden könnte durch die Anwendung eines ähnlichen Ansatzes für eine Faltung basierte Methode. Mein Beitrag verwendet eine zentrale laufende Durchschnitt, um ihre Ergebnisse mit ihren Daten ausrichten Wenn es zwei wenige Punkte zur Verfügung stehen Das vollformatige Fenster, das verwendet werden soll, laufende Mittelwerte werden aus sukzessiv kleineren Fenstern an den Kanten des Arrays berechnet. Eigentlich von sukzessiv größeren Fenstern, aber das ist ein Implementierungsdetail. Es ist relativ langsam, weil es Falten verwendet und wahrscheinlich fussiert werden könnte Up ziemlich viel von einem wahren 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 I Ich habe einen Algorithmus implementiert, der dieses Problem gut behandeln kann, wenn dieses Problem als Input-Parameter deklariert wird. Mergenum kann als 2 Fensterbreite betrachtet werden 1.Ich kenne diesen Code ist ein wenig unleserlich, wenn du es nützlich machst und irgendwelche Expanationen willst Lassen Sie mich wissen, und ich werde diese Antwort aktualisieren Da das Schreiben einer Erklärung kann mir viel Zeit kosten, ich hoffe, ich tue es nur, wenn jemand es braucht Bitte verzeihen Sie mir für meine Faulheit. Wenn nur Sie interessiert sind in seiner ursprünglichen Version. Es ist sogar Mehr unleserlich wird die erste Lösung von Randproblemen befreit, indem man Nullen um das Array herum füllt, aber die zweite Lösung, die hier gepostet wird, behandelt sie in einer harten und direkten Weise. In meinem letzten Satz habe ich versucht zu zeigen, warum es hilft, floating point error Wenn zwei Werte Sind ungefähr die gleiche Größenordnung, dann fügt man ihnen weniger Präzision hinzu, als wenn man eine sehr große Zahl zu einer sehr kleinen addiert. Der Code kombiniert benachbarte Werte in einer Weise, dass auch Zwischensummen immer in der Größenordnung vernünftig nahe sein sollten, um das zu minimieren Gleitkomma-Fehler Nichts ist Narr-Beweis, aber diese Methode hat ein paar sehr schlecht umgesetzte Projekte in der Produktion gespeichert Mayur Patel 15. Dezember 14 um 17 22. Alleo Statt einen Hinzufügen pro Wert zu machen, wirst du zwei machen Der Beweis ist der gleiche wie der Bit-Flipping-Problem Allerdings ist der Punkt dieser Antwort nicht unbedingt Leistung, aber Präzision Memory-Nutzung für die Mittelung von 64-Bit-Werte würde nicht mehr als 64 Elemente im Cache, so dass es s freundlich in Speicher Nutzung auch Mayur Patel Dec 29 14 at 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 ihnen nicht finden können. Das Standardverhalten für die Faltung ist, dass die Werte vor dem Beginn unserer Sequenz 0 sind In formaler Weise konstruieren wir die Sequenz y für die Sequenz x, wo yi xi xi 1 xin n. This verwendet numpy s Faltungsfunktion Dies ist ein allgemeiner Zweck gleitenden durchschnittlichen Betrieb. Changing Gewichtungen macht einige Werte wichtiger Ausgleich passend ermöglicht es Ihnen, zu sehen Durchschnittlich wie um Punkt statt vor Punkt. Anstatt abschneidende Werte können wir die Anfangswerte an Ort und Stelle fixieren, wie in diesem Beispiel dargestellt.

No comments:

Post a Comment