Friday 20 January 2017

Moving Average Ausreißer

Sagen, ich habe eine postgresql-Tabelle mit den folgenden Werten: Wenn ich postgresql den Durchschnitt zu berechnen, es gibt mir einen Durchschnitt von 24,8, weil der hohe Wert von 100 hat großen Einfluss auf die Berechnung. Während in der Tat möchte ich einen Durchschnitt irgendwo rund 6 finden und beseitigen die extreme (s). Ich bin auf der Suche nach einem Weg, um Extreme zu beseitigen und wollen dies zu tun statistisch korrekt. Die Extreme können nicht fixiert werden. Ich kann nicht sagen, wenn ein Wert über X ist, muss es beseitigt werden. Ich habe meinen Kopf auf den postgresql aggregate Funktionen gebückt, aber kann nicht meinen Finger auf das setzen, was für mich richtig ist zu verwenden. Postgresql kann auch die Standardabweichung berechnen. Sie könnten nur die Datenpunkte nehmen, die im Durchschnitt () - 2stddev () liegen, was etwa den 90 Datenpunkten am nächsten zum Durchschnitt entsprechen würde. Natürlich kann 2 auch 3 (95) oder 6 (99.995) sein, aber nicht auf die Zahlen aufgehängt werden, weil bei Anwesenheit eines Sammelausreißers nicht mehr mit einer Normalverteilung zu tun hat. Seien Sie sehr vorsichtig und überprüfen Sie, dass es wie erwartet funktioniert. Mind mit der Funktion ntile window. Es ermöglicht die einfache Isolierung von Extremwerten aus der Ergebnismenge. Lassen Sie uns sagen, dass Sie 10 von beiden Seiten der Ergebnismenge schneiden möchten. Dann geben Sie den Wert von 10 zu ntile und auf der Suche nach Werten zwischen 2 und 9 würde Ihnen das gewünschte Ergebnis. Beachten Sie auch, dass, wenn Sie weniger als 10 Datensätze haben, können Sie versehentlich schneiden mehr als 20, so stellen Sie sicher, dass die Gesamtmenge der Datensätze zu überprüfen. Ich habe einen Daemon, der in Daten von einigen Sensoren liest, und unter den Dingen, die es berechnet (neben einfach nur den Status melden) ist die durchschnittliche Zeit, die es braucht, damit die Sensoren zu ändern Von einem Wert zum anderen. Es hält einen laufenden Durchschnitt von 64 Datenpunkte und nimmt an, dass die Laufzeit relativ konstant ist. Leider, wie das folgende Diagramm zeigt, sind die Eingabedaten nicht die unberührtesten: (Jede Zeile stellt einen anderen Satz von Daten dar, die die X-Achse nicht wirklich etwas anderes als eine vage historische Zeitachse bedeutet). Meine offensichtliche Lösung für den Umgang damit wäre, ein Histogramm der Daten zu erstellen und wählen Sie dann den Modus. Ich frage mich, ob es andere Methoden, die bessere Leistung liefern würde oder wäre besser geeignet für den Betrieb mit einem laufenden Durchschnitt. Einige schnelle Wikipedia-Suchvorschläge Algorithmen für die Erkennung von Ausreißern kann auch geeignet sein. Simplicity ist ein Plus, da der Daemon in C. Edit geschrieben wird. Ich scoped aus Wikipedia und kam mit diesen verschiedenen Techniken: Chauvenets Kriterium: mit dem Mittelwert und Standardabweichung, berechnen die Wahrscheinlichkeit ein bestimmter Datenpunkt würde geschehen, und dann auszuschließen, wenn die Wahrscheinlichkeit ist eigentlich, dass schlecht ist weniger als 50. Während dies scheint Gut geeignet für die Korrektur eines laufenden Mittels on the fly, Im nicht ganz überzeugt von seiner Wirksamkeit: es scheint mit großen Datensätzen würde es nicht wollen, verwerfen datapoints. Grubbs-Test: Eine andere Methode, die die Differenz von der mittleren zur Standardabweichung verwendet, und hat einen Ausdruck für die Ablehnung der Hypothese von Ausreißern. Köcheabstand: Misst den Einfluss, den ein Datenpunkt auf eine Regression der kleinsten Quadrate hat, die unsere Anwendung wahrscheinlich ablehnen würde Überschritten 1 Abgeschnittenes Mittel: Verwerfen Sie das untere Ende und das hohe Ende, und nehmen Sie dann den Mittelwert als normal Jeder hat eine spezifische Erfahrung und kann zu diesen statistischen Techniken kommentieren Auch einige Bemerkungen über die physikalische Situation: waren die Messung der durchschnittlichen Zeit bis zur Fertigstellung Eine mechanische Waschmaschine, so dass seine Laufzeit sollte ziemlich konstant sein. Ich bin nicht sicher, ob es tatsächlich eine normale Verteilung hat. Bearbeiten 2. Eine weitere interessante Frage: Wenn der Daemon bootstrapping, wie in, doesnt haben alle früheren Daten zu analysieren, wie sollte es mit eingehenden Daten Einfach nicht tun keine Ausreißer Beschneiden Edit 3. Eine Sache noch. Wenn sich die Hardware so verändert, dass die Laufzeiten unterschiedlich werden, lohnt es sich, den Algorithmus so robust zu machen, dass er diese neuen Laufzeiten nicht verwerfen wird, sollte ich mich einfach erinnern, den Cache zu spülen, wenn das geschieht, fragte am 12. April 09 um 7 Uhr : 24


No comments:

Post a Comment