Friday, 17 November 2017

Moving Average Standard Abweichung Matlab


Ich habe eine Reihe von Daten x, y und ich versuche, den gleitenden Durchschnitt zu finden. Die x-Datennummern sind ganze Zahlen von 1 bis 100, während die y-Daten Zahlen von 0,01 bis 1 sind und sie haben auch eine Standardabweichung ydev (die wir ableiten, weil das Experiment mehrmals wiederholt wird). Ich versuche, den gleitenden Durchschnitt mit den 20 nächstgelegenen Nachbarn zu finden (mit Matlab): Der obige Weg leitet den gleitenden Durchschnitt ab, aber ich weiß nicht, wie man die Standardabweichung benutzt, die ich für jeden y-Datenpunkt habe, weil einige Datenpunkte viel haben Größere Standardabweichungen als andere, was bedeutet, dass sie nicht so zuverlässig sind wie andere (so dass sie wahrscheinlich weniger abwägen). Wie kann ich die Standardabweichung für jeden Datenpunkt in der obigen Berechnung angeben, die am 5. Juli 15 um 15:07 Uhr bewegte durchschnittliche oder bewegte Mediane. In Bezug auf die Frage quotHow kann ich die Standardabweichung für jeden Datenpunkt in der oben genannten Berechnung, es hängt davon ab, was Sie tun möchten. Sie sollten zuerst entscheiden, dass (was keine Programmierfrage ist). Ein Vorschlag: Kannst du den ganzen Satz von Daten für jedes x verwenden (anstatt nur die durchschnittliche und Standardabweichung) und berechnen meanmedian von diesem ndash Luis Mendo Jul 5 15 um 15:12 LuisMendo Ich wollte gleitenden Durchschnitt machen (ich bearbeitete die Code, um das zu reflektieren). Der Datensatz ist ein Zeitreihen-Experiment und es wurde mehrmals wiederholt (so habe ich Standardabweichungen für jeden Punkt). Ich möchte die Standardabweichung für jeden Punkt in meiner Berechnung des gleitenden Durchschnitts verwenden, weil ich will, dass die Punkte mit kleinerer Standardabweichung mehr als die Punkte mit größerer Standardabweichung wiegen. Ndash AL B Jul 5 15 um 16:50 Sagen Sie haben einen Vektor a. Dann eine andere Art zu schreiben bedeutet (a) als gewichteter Durchschnitt ist awts. Wo wts eins (1, numel (a)) numel (a). In deinem Fall hast du ein y (ind1 (i): ind2 (i)). Es klingt wie das, was Sie verwenden möchten, ist ein gewichteter gleitender Durchschnitt, wo Ihre Gewichte nicht mehr identisch sind, sondern mit der Standardabweichung der entsprechenden Werte gewählt werden. Angenommen, der Vektor sd hält die Standardabweichungen, Heres eine Möglichkeit, dies zu tun: Hier werden die Werte mit kleineren Standardabweichungen zu größeren Gewichten beitragen. Eine alternative Idee ist, den einfachen gleitenden Durchschnitt von y und Ihren Standardabweichungen sd zu berechnen. Und dann plotten sie nebeneinander. Dies hat den Vorteil, dass es mehr statistisch interpretierbar ist als die Auswahl von Gewichten als Funktion der Standardabweichungen. Below können Sie meine C-Methode sehen, um Bollinger Bands für jeden Punkt zu berechnen (gleitender Durchschnitt, Up-Band, Down-Band). Wie Sie sehen können, verwendet diese Methode 2 für Loops, um die bewegte Standardabweichung mit dem gleitenden Durchschnitt zu berechnen. Es enthielt eine zusätzliche Schleife, um den gleitenden Durchschnitt über die letzten n Perioden zu berechnen. Diese konnte ich entfernen, indem ich den neuen Punktwert zu Beginn des Loops zum totalaverage hinzufüge und den i - n Punktwert am Ende der Schleife beseitige. Meine Frage ist jetzt grundsätzlich: Kann ich die restliche innere Schleife in einer ähnlichen Weise entfernen, die ich mit dem gleitenden Durchschnitt gehandhabt habe, fragte Jan 31 13 um 21:45 Die Antwort ist ja, können Sie. Mitte der 80er Jahre entwickelte ich gerade einen solchen Algorithmus (vermutlich nicht original) in FORTRAN für eine Prozessüberwachungs - und Steuerungsanwendung. Leider war das vor über 25 Jahren und ich erinnere mich nicht an die genauen Formeln, aber die Technik war eine Erweiterung des einen für bewegte Durchschnitte, mit Berechnungen zweiter Ordnung statt nur linearen. Nach dem Betrachten deines Codes einige, denke ich, dass ich aussäumen kann, wie ich es damals getan habe. Beachten Sie, wie Ihre innere Schleife eine Summe von Quadraten macht: in der gleichen Weise, dass Ihr Durchschnitt ursprünglich eine Summe von Werten hatte. Die einzigen zwei Unterschiede sind die Reihenfolge (ihre Macht 2 anstelle von 1) und dass Sie den Durchschnitt subtrahieren Jeder Wert, bevor du ihn quadratst. Nun, das könnte unzertrennlich aussehen, aber in Wirklichkeit können sie getrennt werden: Jetzt ist der erste Begriff nur eine Summe von Quadraten, du gehst damit in der gleichen Weise, dass du die Summe der Werte für den Durchschnitt machst. Der letzte Term (k2n) ist nur die durchschnittliche quadratische Zeit der Periode. Da du das Ergebnis sowieso bis dahin teilt, kannst du einfach den neuen Mittelwert ohne die zusätzliche Schleife hinzufügen. Schließlich, im zweiten Term (SUM (-2vi) k), da SUM (vi) total kn können Sie es dann in diese ändern: oder nur -2k2n. Das ist -2 mal das durchschnittliche Quadrat, sobald die Periode (n) wieder aufgeteilt ist. Also die endgültige kombinierte Formel ist: (achten Sie darauf, die Gültigkeit davon zu überprüfen, da ich es aus der Oberseite meines Kopfes ableiten) Und die Einbindung in Ihren Code sollte so etwas aussehen: Das Problem mit Ansätzen, die die Summe der Quadrate berechnen Ist es und das Quadrat der Summen kann ziemlich groß werden, und die Berechnung ihres Unterschiedes kann einen sehr großen Fehler einführen. Also denkt an etwas Besseres Denn warum dies gebraucht wird, siehe den Wikipedia-Artikel über Algorithmen für die Berechnung von Varianz und John Cook auf Theoretische Erklärung für numerische Ergebnisse) Erstens, anstatt zu berechnen, die stddev lässt sich auf die Varianz konzentrieren. Sobald wir die Varianz haben, ist stddev nur die Quadratwurzel der Varianz. Angenommen, die Daten befinden sich in einem Array namens x Rolling ein n-Größe Fenster von einem kann man als die Entfernung der Wert von x0 und Hinzufügen der Wert von xn gedacht werden. Lets bezeichnen die Mittelwerte von x0..xn-1 bzw. x1..xn. Der Unterschied zwischen den Varianzen von x0..xn-1 und x1..xn ist, nach dem Auslöschen einiger Begriffe und Anwendung (ab) (ab) (ab): Daher ist die Varianz durch etwas gestört, das Sie nicht benötigt, um das zu pflegen Summe der Quadrate, die für die numerische Genauigkeit besser ist. Sie können den Mittelwert und die Varianz einmal am Anfang mit einem richtigen Algorithmus (Welfords Methode) berechnen. Danach musst du jedes Mal, wenn du einen Wert im Fenster x0 durch einen anderen xn ersetzen musst, den Durchschnitt und die Varianz so aktualisieren: Danke dafür. Ich habe es als Grundlage für eine Implementierung in C für die CLR verwendet. Ich entdeckte, dass in der Praxis können Sie so aktualisieren, dass newVar ist eine sehr kleine negative Zahl, und die sqrt scheitert. Ich habe eine if eingeführt, um den Wert auf Null für diesen Fall zu begrenzen. Nicht Idee, aber stabil. Dies geschah, als jeder Wert in meinem Fenster den gleichen Wert hatte (ich benutzte eine Fenstergröße von 20 und der Wert in Frage war 0,5, falls jemand versucht, es zu versuchen und zu reproduzieren.) Ndash Drew Noakes Jul 26 13 um 15:25 Ive Gebraucht commons-mathe (und dazu beigetragen, dass Bibliothek) für etwas sehr ähnlich zu diesem. Seine Open-Source, Portierung zu C sollte einfach sein, wie Shop-gekauft Kuchen (haben Sie versucht, eine Torte von Grund auf neu). Check it out: commons. apache. orgmathapi-3.1.1index. html. Sie haben eine StandardDeviation Klasse. Gehe in die Stadt beantwortet Jan 31 13 um 21:48 You39re Willkommen Sorry Ich didn39t haben die Antwort you39re suchen. Ich habe definitiv nicht bedeuten, Portierung der gesamten Bibliothek nur die minimale notwendige Code, die ein paar hundert Zeilen oder so sein sollte. Beachten Sie, dass ich keine Ahnung habe, welche gesetzlichen Urheberrechtsbeschränkungen Apache auf diesen Code hat, also musst du das heraus überprüfen. Wenn du es verfolgst, hier ist der Link. So dass Variance FastMath ndash Jason Jan 31 13 um 22:36 Die wichtigsten Informationen wurden bereits oben gegeben - aber vielleicht ist das immer noch von allgemeinem Interesse. Eine kleine Java-Bibliothek zur Berechnung des gleitenden Durchschnitts und der Standardabweichung steht hier zur Verfügung: githubtools4jmeanvar Die Implementierung basiert auf einer Variante der oben genannten Welfords-Methode. Methoden zum Entfernen und Ersetzen von Werten wurden abgeleitet, die für das Verschieben von Wertfenstern verwendet werden können. Was wäre der ideale Weg, um die mittlere und Standardabweichung eines Signals für eine Echtzeitanwendung zu finden. Id wie in der Lage sein, einen Controller auszulösen, wenn ein Signal mehr als 3 Standardabweichung des Mittelwertes für eine bestimmte Zeitspanne war. Ich nehme an, dass ein dedizierter DSP das ziemlich leicht machen würde, aber es gibt irgendeine Abkürzung, die möglicherweise nicht etwas so kompliziertes verlangt wird. Dec 3 11 um 5:11 Theres ein Fehler in Jason Rs Antwort, die in Knuths Art of Computer Programming vol diskutiert wird. 2. Das Problem kommt, wenn man eine Standardabweichung hat, die ein kleiner Bruchteil des Mittels ist: Die Berechnung von E (x2) - (E (x) 2) leidet unter einer schweren Empfindlichkeit gegenüber Gleitkomma-Rundungsfehlern. Sie können sogar versuchen, dies selbst in einem Python-Skript: Ich bekomme -128.0 als Antwort, die eindeutig nicht rechnerisch gültig ist, da die Mathematik prognostiziert, dass das Ergebnis nichtnegativ sein sollte. Knuth zitiert einen Ansatz (ich erinnere mich nicht an den Namen des Erfinders) für die Berechnung der laufenden Mittelwert und Standardabweichung, die so etwas wie folgt geht: und dann nach jedem Schritt ist der Wert von m der Mittelwert und die Standardabweichung kann als sqrt berechnet werden (Sn) oder sqrt (Sn-1) je nachdem, was ist Ihre Lieblings-Definition der Standardabweichung. Die Gleichung, die ich oben schreibe, ist etwas anders als die in Knuth, aber ihre rechnerisch äquivalent. Wenn ich noch ein paar Minuten habe, korrigiere ich die obige Formel in Python und zeige dir, dass du eine nichtnegative Antwort bekommst (die hoffentlich nah an den richtigen Wert ist). Update: hier ist es. Youll beachten Sie, dass es noch einige Rundungsfehler, aber es ist nicht schlecht, während naivestats nur pukes. Bearbeiten: Just noticed Belisariuss Kommentar zitiert Wikipedia, die den Knuth-Algorithmus erwähnt. Was wäre der ideale Weg, um die Mittel - und Standardabweichung eines Signals für eine Echtzeitanwendung zu finden. Id wie in der Lage sein, einen Controller auszulösen, wenn ein Signal mehr als 3 Standardabweichung des Mittelwertes für eine bestimmte Zeitspanne war. Der richtige Ansatz in Situationen wie diesem ist in der Regel zu einem exponentiell gewichteten laufenden Durchschnitt und Standardabweichung zu berechnen. Im exponentiell gewichteten Durchschnitt werden die Schätzungen des Mittelwerts und der Varianz in Richtung der letzten Probe vorgespannt, die Ihnen Schätzungen des Mittelwertes und der Abweichung über die letzten Tau-Sekunden gibt. Was ist wohl das, was du willst, anstatt das übliche arithmetische Mittel über alle Samples, die je gesehen wurden. Im Frequenzbereich ist ein exponentiell gewichteter durchschnittlicher Durchschnitt einfach ein echter Pole. Es ist einfach, im Zeitbereich zu implementieren. Zeitbereichsimplementierung Lasst Mittelwert und Mittelwert q die aktuellen Schätzungen des Mittelwerts und Mittelwertes des Quadrats des Signals sein. In jedem Zyklus aktualisieren Sie diese Schätzungen mit dem neuen Sample x: Hier ist 0 lt a lt 1 eine Konstante, die die effektive Länge des laufenden Mittels bestimmt. Wie man ein wählt, wird unten in der Analyse beschrieben. Was oben als ein imperatives Programm ausgedrückt wird, kann auch als ein Signalflussdiagramm dargestellt werden: Der obige Algorithmus berechnet yi a xi (1-a) y, wobei xi die Eingabe am Abtastwert i ist und yi die Ausgabe ist (dh die Schätzung von Der Mittelwert). Dies ist ein einfacher, einpoliger IIR-Filter. Unter der Z-Transformation finden wir die Übertragungsfunktion H (z) frac. Wenn wir die IIR-Filter in ihre eigenen Blöcke verwandeln, sieht das Diagramm nun so aus: Um in die kontinuierliche Domäne zu gelangen, machen wir die Substitution z e, wobei T die Abtastzeit ist und fs 1T die Abtastrate ist. Wenn wir 1- (1-a) e 0 lösen, finden wir, dass das kontinuierliche System einen Pol bei s frac log (1-a) hat. Ein Verfahren, das zuvor in einer eingebetteten Verarbeitungsanwendung verwendet wurde, besteht darin, die Akkumulatoren der Summe und der Summe der Quadrate des interessierenden Signals aufrechtzuerhalten: Verfolgen Sie auch den aktuellen Zeitpunkt i in den obigen Gleichungen (das heißt, die Nummer Von Proben, die Sie in die Akkumulatoren eingefügt haben). Dann sind die Sample-Mittelwerte und die Standardabweichung zum Zeitpunkt i: sigma2-Operatorname (X2) - (Operatorname (X)) 2 Ive verwendet diese erfolgreich in der Vergangenheit (obwohl ich nur mit Varianzschätzung, nicht Standardabweichung beschäftigt war), obwohl du Muss vorsichtig sein, über die numerischen Typen, die Sie verwenden, um die Akkumulatoren zu halten, wenn Sie sich über einen langen Zeitraum summieren, den Sie nicht überlaufen möchten. Bearbeiten: Zusätzlich zu dem obigen Kommentar zum Überlauf ist zu beachten, dass dies kein numerisch robuster Algorithmus ist, wenn er in Gleitkomma-Arithmetik implementiert wird, was möglicherweise große Fehler in den geschätzten Statistiken verursacht. Schau auf Jason Ss Antwort für einen besseren Ansatz in diesem Fall. Beantwortet Dec 6 11 um 13:34 Es scheint ein paar Tippfehler hier zu sein. Warum ist der Mittelwert unter dem Quadratwurzelzeichen für Sigma subtrahiert, sollte es mu2 sein, um die angezeigte Gleichung Sigma2 E (X2) - (E (X)) 2, nein auch, obwohl ich gewann, diese Antwort zu stimmen, stimme ich zu Jason S, dass es in diesem Ansatz numerische Probleme geben kann. Ndash Dilip Sarwate Jan 20 12 at 1:33 Ähnlich wie die bevorzugte Antwort oben (Jason S.), und auch aus der Formel von Knut (Vol.2, S. 232) abgeleitet, kann man auch eine Formel ableiten, um einen Wert zu ersetzen , Dh entfernen und einen Wert in einem Schritt hinzufügen. Nach meinen Tests liefert ersetzen eine bessere Präzision als die zweistufige removeadd Version. Der Code unten ist in Java, Mittel und s erhalten aktualisiert (globale Member Variablen), wie m und s oben in Jasons Post. Die Wertzählung bezieht sich auf die Fenstergröße n.

No comments:

Post a Comment