2009-03-06 16 views
3

Aus Gründen, auf die ich lieber nicht eingehen möchte, muss ich eine Reihe von Werten filtern, um Jitter zu reduzieren. Zu diesem Zweck muss ich in der Lage sein, eine Liste von Zahlen zu mitteln, wobei die letzte die größte Wirkung hat und die letzte die geringste Wirkung hat. Ich verwende eine Stichprobengröße von 10, aber das könnte sich irgendwann ändern.Altern eines Datensatzes

Gibt es vernünftig einfache Alterungsalgorithmen, die ich hier anwenden kann?

+0

Also, automatisierter Aktienhandel dann;) Schauen Sie sich den Wikipedia-Artikel zur Halbwertszeit an (die Formel, nicht das Spiel) und wenden Sie das auf die Werte an. Auf diese Weise erhalten Sie einen zeitgewichteten Durchschnitt, der das tun sollte, was Sie brauchen. –

+0

Spannungen, eigentlich, aber eine gute Schätzung. –

Antwort

5
  • Werfen Sie einen Blick auf die exponential smoothing. Ziemlich einfach und könnte für Ihre Bedürfnisse ausreichen. Grundsätzlich werden neuere Beobachtungen relativ stärker gewichtet als die älteren.
  • Auch (abhängig von der Anwendung) möchten Sie vielleicht verschiedene Verstärkung lernen Techniken, zum Beispiel Q-Learning oder TD-Learning oder allgemein gesprochen jede Methode, die die Rabatt.
0

Ich stieß auf etwas ähnliches in einer eingebetteten Steuerungsanwendung.

Die einfachste Option, die ich stieß, war ein 3/4 Filter. Dies wird kontinuierlich über den gesamten Datensatz angewendet:

current_value = (3*current_value + new_value)/4 

entschied ich mich schließlich mit einem 16-Tap-FIR-Filter zu gehen, statt:

Overview
FIR FAQ
Wikipedia article

0

Viele gewichtete Mittel Algorithmen könnte verwendet werden.

Zum Beispiel für Artikel I (n) für n = 1 bis N in Folge (neu nach alt):

(SUM(I(n) * (N + 1 - n))/SUM(n) 
0

Es ist nicht ganz klar von der Frage, ob Sie mit fester Länge zu tun haben Daten oder wenn Daten kontinuierlich eintreffen. Ein schönes physikalisches Modell für das letztgenannte wäre ein Tiefpassfilter, der einen Kondensator und einen Widerstand (R und C) verwendet. Unter der Annahme, Ihre Daten in gleichen Abständen in zeitlichem Abstand (? Ist es), führt dies zu einem Update Rezepte

U_aged [n + 1] = U_aged [n] + deltat/Tau (U_raw [n + 1] - U_aged [ n])

wobei Tau die Zeitkonstante des Filters ist. In der Grenze von Nulldeltat gibt diese einen exponentiellen Abfall (alte Werte werden auf 1/e ihres Wertes nach Zeit Tau reduziert). In einer Implementierung müssen Sie nur eine laufende gewichtete Summe U_aged beibehalten.

Deltat wäre 1 und Tau würde die "Aging-Konstante" angeben, die Anzahl der Schritte dauert es, den Beitrag einer Probe zu 1/e zu reduzieren.

Verwandte Themen