Monday 16 October 2017

Moving Average Glättung Python


Hmmm, es scheint, diese quoteasy zu implementieren Funktion ist eigentlich ziemlich einfach, falsch zu werden und hat eine gute Diskussion über Speicher Effizienz gefördert. Ich bin glücklich, mich aufzuräumen, wenn es bedeutet, dass etwas richtig gemacht wurde. Ndash Richard Sep 20 14 at 19:23 NumPys Mangel an einer bestimmten Domain-spezifischen Funktion ist vielleicht aufgrund der Core Teams Disziplin und Treue zu NumPys Prime Directive: bieten einen N-dimensionalen Array-Typ. Sowie Funktionen zum Erstellen und Indizieren dieser Arrays. Wie viele grundlegende Ziele, ist dieses nicht klein, und NumPy macht es brillant. Die (viel) größere SciPy enthält eine viel größere Sammlung von domänenspezifischen Bibliotheken (sogenannte Subpackages von SciPy Devs) - zum Beispiel numerische Optimierung (Optimierung), Signalverarbeitung (Signal) und Integralrechnung (integrieren). Meine Vermutung ist, dass die Funktion, die Sie nachher sind, in mindestens einem der SciPy-Unterpakete (scipy. signal vielleicht) aber ich würde zuerst in der Sammlung von SciPy Scikits aussehen. Identifizieren Sie die relevanten scikit (s) und suchen Sie die Funktion von Interesse dort. Scikits sind eigenständig entwickelte Pakete, die auf NumPySciPy basieren und auf eine bestimmte technische Disziplin gerichtet sind (zB Scikits-Image, Scikits-Learn etc.). Mehrere davon waren (vor allem die großartige OpenOpt für numerische Optimierung) hoch angesehene, reife Projekte lang Bevor er sich unter der relativ neuen scikits Rubrik wohnte. Die Scikits Homepage gern oben aufgelistet etwa 30 solcher Scikits. Obwohl zumindest einige von ihnen nicht mehr aktiv 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 Zeitreihenbibliothek. Pandas hat mehrere Funktionen, die verwendet werden können, um einen gleitenden Durchschnitt zu berechnen, das einfachste von diesen ist wahrscheinlich rollingmean. Die du so nimmst: Nun nenn einfach die Funktion rollingmean, die im Series-Objekt vorbeifährt und eine Fenstergröße. Die in meinem Beispiel unten ist 10 Tage. Überprüfen Sie, ob es funktioniert - z. B. 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 in der Pandas Dokumentation unter dem Rubrik beweglichen Fenster Funktionen eine zweite, verwandte Gruppe von Funktionen gruppiert In Pandas wird als exponentiell gewichtete Funktionen bezeichnet (zB ewma, die exponentiell verschobenen gewichteten Mittelwert berechnet). Die Tatsache, dass diese zweite Gruppe nicht in die erste (bewegte Fensterfunktionen) eingeschlossen ist, liegt vielleicht daran, dass die exponentiell gewichteten Transformationen nicht auf eine feste Länge zurückgreifen. Die Bearbeitungsdaten entfernen zufällige Variation und zeigen Trends und zyklische Komponenten Inhärent in der Sammlung von Daten Im Laufe der Zeit ist irgendeine Form von zufälliger Variation. Es gibt Methoden zur Verringerung der Aufhebung der Wirkung durch zufällige Variation. Eine häufig verwendete Technik in der Industrie ist Glättung. Diese Technik, wenn sie richtig angewendet wird, zeigt deutlich die zugrunde liegenden Tendenz, saisonale und zyklische Komponenten. Es gibt zwei verschiedene Gruppen von Glättungsmethoden Mittelungsmethoden Exponentielle Glättungsmethoden Mit den Mittelwerten ist der einfachste Weg, um Daten zu glätten. Wir werden zunächst einige Mittelungsmethoden untersuchen, wie zB den einfachen Durchschnitt aller vergangenen Daten. Ein Manager eines Lagers will wissen, wie viel ein typischer Lieferant in 1000 Dollar Einheiten liefert. Heshe nimmt eine Stichprobe von 12 Lieferanten, zufällig, erhalten die folgenden Ergebnisse: Die berechneten Mittelwert oder Durchschnitt der Daten 10. Der Manager beschließt, dies als die Schätzung für den Aufwand eines typischen Lieferanten zu verwenden. Ist das eine gute oder schlechte Schätzung Mittlerer quadratischer Fehler ist ein Weg, um zu beurteilen, wie gut ein Modell ist. Wir werden den mittleren quadratischen Fehler berechnen. Der fehlerhafte Betrag verbrachte abzüglich des geschätzten Betrags. Der Fehler quadriert ist der Fehler oben, quadriert. Die SSE ist die Summe der quadratischen Fehler. Die MSE ist der Mittelwert der quadratischen Fehler. MSE Ergebnisse zum Beispiel Die Ergebnisse sind: Fehler und quadratische Fehler Die Schätzung 10 Die Frage stellt sich: Können wir das Mittel, um Einkommen zu prognostizieren, wenn wir einen Trend vermuten Ein Blick auf die Grafik unten zeigt deutlich, dass wir dies nicht tun sollten. Durchschnittlich wiegt alle vergangenen Beobachtungen gleich Zusammenfassend heißt es, dass der einfache Durchschnitt oder Mittel aller vergangenen Beobachtungen nur eine nützliche Schätzung für die Prognose ist, wenn es keine Trends gibt. Wenn es Trends gibt, verwenden Sie unterschiedliche Schätzungen, die den Trend berücksichtigen. Der Durchschnitt wiegt alle vergangenen Beobachtungen gleichermaßen. Zum Beispiel ist der Mittelwert der Werte 3, 4, 5 gleich 4. Wir wissen natürlich, daß ein Mittelwert durch Addition aller Werte berechnet und die Summe durch die Anzahl der Werte dividiert wird. Eine weitere Möglichkeit, den Mittelwert zu berechnen, besteht darin, jeden Wert durch die Anzahl der Werte zu addieren, oder 33 43 53 1 1.3333 1.6667 4. Der Multiplikator 13 heißt das Gewicht. Im Allgemeinen: bar frac sum links (frac rechts) x1 links (frac rechts) x2,. , Links (frac rechts) xn. Die (links (frac rechts)) sind die gewichte und natürlich summieren sie auf 1. 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 anders denken, um es effizienter zu machen (eigentlich, wenn jemand von einem besseren Weg, das Ergebnis zuzuteilen weiß, lass es mich wissen). HINWEIS: Das wäre viel schneller mit einem numpy Array anstelle einer Liste, aber ich wollte alle Abhängigkeiten beseitigen. Es wäre auch möglich, die Leistung durch Multithread-Ausführung zu verbessern. Die Funktion geht davon aus, dass die Eingabeliste eindimensional ist. Sei also vorsichtig. UPD: Es wurden effizientere Lösungen von Alleo und Jasaarim vorgeschlagen. Sie können np. convolve dafür verwenden: Das Modusargument gibt an, wie die Kanten behandelt werden sollen. Ich wählte den gültigen Modus hier, weil ich denke, das ist, wie die meisten Leute erwarten, dass das Laufen bedeutet, zu arbeiten, aber Sie können andere Prioritäten haben. Hier ist eine Handlung, die den Unterschied zwischen den Modi veranschaulicht: beantwortet Mar 24 14 um 22:01 Ich mag diese Lösung, weil es sauber ist (eine Zeile) und relativ effizient (Arbeit in numpy). Aber alleo39s quotEfficient solutionquot mit numpy. cumsum hat eine bessere Komplexität. Ndash Ulrich Stern Sep 25 15 bei 0:31 Sie können einen laufenden Mittelwert berechnen mit: Zum Glück enthält numpy eine Faltenfunktion, die wir verwenden können, um die Dinge zu beschleunigen. Das laufende Mittel ist äquivalent zum Falten von x mit einem Vektor, der N lang ist, wobei alle Glieder gleich 1N 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 . Beachten Sie, dass convolve enthält einen gleichen Modus, der scheint, wie es sollte das Anfangsübergang Problem, aber es teilt es zwischen dem Anfang und Ende. Es entfernt den Übergang vom Ende, und der Anfang hat nichts. Nun, ich denke, es ist eine Frage von Prioritäten, ich brauche nicht die gleiche Anzahl von Ergebnissen auf Kosten des Erhaltens eines Hanges in Richtung Null, dass es hier in den Daten ist. BTW, hier ist ein Befehl, um den Unterschied zwischen den Modi zu zeigen: modes (39full39, 39same39, 39valid39) plot (convolve (one ((200,)), one ((50,)) 4750, modem)) für m in modi Achse (-10, 251, -1, 1.1) Legende (Modi, loc39lower center39) (mit pyplot und numpy importiert). Ndash lapis Mar 24 14 um 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 zurück, wenn die Eingabe ein Array ist. Es ist schwierig, Rollingmean in der Leistung mit jeder benutzerdefinierten reinen Python-Implementierung zu schlagen. Hier ist eine beispielhafte Leistung gegen zwei der vorgeschlagenen Lösungen: Es gibt auch schöne Möglichkeiten, wie man mit den Kantenwerten umgehen kann. I39m immer durch Signalverarbeitungsfunktion verärgert, die Ausgangssignale unterschiedlicher Form als die Eingangssignale zurückgibt, wenn beide Eingänge und Ausgänge von der gleichen Art sind (z. B. beide zeitlichen Signale). Es bricht die Korrespondenz mit verwandter unabhängiger Variable (z. B. Zeit, Frequenz), die das Plotten oder den Vergleich nicht eine direkte Substanz macht. Ohnehin, wenn ihr das Gefühl teilt, könnt ihr vielleicht die letzten Zeilen der vorgeschlagenen Funktion als ynp. convolve ändern (ww. sum (), s, mode39same39) return ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly Aug 25 15 at 19:56 Ein bisschen spät zur Party, aber Ive machte meine eigene kleine Funktion, die nicht um die Enden oder Pads mit Nullen, die dann verwendet werden, um den Durchschnitt auch zu finden. Als weiteres Verständnis 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 Kern. Ein einfacher Gebrauch auf einem sinusförmigen Signal mit addiertem normalem verteiltem Rauschen: Diese Frage ist jetzt noch älter als wenn NeXuS darüber im letzten Monat geschrieben hat, aber ich mag, wie sich sein Code mit Randfällen befasst. Allerdings, weil es ein einfacher gleitender Durchschnitt ist, liegen seine Ergebnisse hinter den Daten, auf die sie sich beziehen. Ich dachte, dass der Umgang mit Randfällen in einer befriedigenderen Weise als NumPys Modi gültig ist. gleich. Und voll könnte durch die Anwendung eines ähnlichen Ansatzes zu einer Faltung () basierte Methode erreicht werden. Mein Beitrag nutzt einen zentralen Laufdurchschnitt, um seine Ergebnisse mit ihren Daten auszurichten. Wenn für das vollformatige Fenster zwei wenige Punkte zur Verfügung stehen, werden laufende Mittelwerte aus aufeinanderfolgend kleineren Fenstern an den Kanten des Arrays berechnet. Tatsächlich, von sukzessiv größeren Fenstern, aber das ist ein Implementierungsdetail. Es ist relativ langsam, weil es convolve () verwendet. Und könnte wahrscheinlich ziemlich viel von einem wahren Pythonista aufgeholt werden, aber ich glaube, dass die Idee steht. Antwortete Jan 2 bei 0:28 np. convolve ist schön, aber langsam, wenn die Fensterbreite groß wird. Einige Antworten liefern mehr effiziente Algorithmen mit np. cumsum aber scheinen nicht in der Lage, Randwerte zu behandeln. Ich selbst habe einen Algorithmus implementiert, der dieses Problem gut behandeln kann, wenn dieses Problem deklariert wird als: Eingabeparameter mergenum kann als 2 Fensterbreite 1 gedacht werden. Ich weiß, dieser Code ist ein wenig unleserlich, wenn Sie es nützlich finden und wollen einige Expanationen, lass es mich wissen und krank aktualisieren diese Antwort. (Denn das Schreiben einer Erklärung kann mir viel Zeit kosten, ich hoffe ich mache es nur, wenn jemand es braucht. Bitte verzeihen Sie mir für meine Faulheit :)) Wenn Sie sich nur für die Originalversion interessieren: Es ist noch unleserlicher: die erste Lösung Befreit das Randproblem durch das Ausfüllen von Nullen um das Array, aber die zweite Lösung, die hier gepostet wird, verarbeitet es in einer harten und direkten Weise :) Lapis ja, aber wir sagen, dass Sie Cumsum-Methode auf dem ersten Tick verwenden und speichern Sie Ihre rollende durchschnittliche Array für die Nächstes tick Jeder Tick danach muss man nur den letzten gleitenden Mittelwert an Ihr Rolling Array im Speicher anhängen. Wenn du diese Methode verwende, kannst du die Dinge, die du bereits berechnet hast, nicht neu berechnen: Zuerst tickst du dir das Cumsum an, dann fügst du einfach das Zitat der letzten Periode ein, das 2x schneller für alle nachfolgenden Zecken ist. Ndash litepresence Wenn Sie sich entscheiden, Ihre eigenen zu rollen, anstatt eine vorhandene Bibliothek zu benutzen, bitte bewusst sein, Gleitpunkt Fehler und versuchen, seine Auswirkungen zu minimieren: Wenn alle Ihre Werte sind in etwa die gleiche Größenordnung , Dann wird dies dazu beitragen, die Präzision zu bewahren, indem man immer Werte von annähernd ähnlichen Größen addiert. In meinem letzten Satz habe ich versucht zu zeigen, warum es hilft Flimmerpunkt Fehler. Wenn zwei Werte annähernd die gleiche Größenordnung haben, dann fügt sie hinzu, dass sie weniger Präzision verliert, als wenn ihr eine sehr große Zahl zu einer sehr kleinen hinzugefügt habt. Der Code verknüpft quittierte Quottwerte in einer Weise, dass auch Zwischensummen immer in der Größenordnung vernünftig schließen müssen, um den Gleitkomma-Fehler zu minimieren. Nichts ist narrensicher, aber diese Methode hat ein paar sehr schlecht umgesetzte Projekte in der Produktion gespeichert. Ndash Mayur Patel Dec 15 14 at 17:22 Alleo: Anstatt einen zusätzlichen Wert pro Wert zu machen, wirst du zwei machen. Der Beweis ist der gleiche wie das Bit-Flipping-Problem. Allerdings ist der Punkt dieser Antwort nicht unbedingt Leistung, sondern Präzision. Die Speicherverwendung für die Mittelwertbildung von 64-Bit-Werten würde im Cache nicht mehr als 64 Elemente überschreiten. Ndash Mayur Patel 29 Dez 14 um 17:04 Uhr

No comments:

Post a Comment