3 Stimmen

Alterung eines Datensatzes

Aus Gründen, die ich nicht näher erläutern 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 jüngste die größte Wirkung hat und die am wenigsten jüngste die kleinste Wirkung hat. Ich verwende eine Stichprobengröße von 10, aber das kann sich leicht ändern.

Gibt es irgendwelche einigermaßen einfachen Alterungsalgorithmen, die ich hier anwenden kann?

5voto

Anonymous Punkte 17529
  • Werfen Sie einen Blick auf die exponentielle Glättung . Das ist ziemlich einfach und könnte für Ihre Bedürfnisse ausreichend sein. Grundsätzlich wird neueren Beobachtungen relativ mehr Gewicht beigemessen als älteren.
  • Außerdem können Sie (je nach Anwendung) verschiedene Techniken des Verstärkungslernens in Betracht ziehen, z. B. Q-Learning o TD-Learning oder ganz allgemein jede Methode, die die Rabatt .

0voto

e.James Punkte 112528

Bei einer eingebetteten Steuerungsanwendung bin ich auf etwas Ähnliches gestoßen.

Die einfachste Möglichkeit, die ich fand, war ein 3/4-Filter. Dieser wird kontinuierlich auf den gesamten Datensatz angewendet:

current_value = (3*current_value + new_value)/4

Ich habe mich schließlich für einen FIR-Filter mit 16 Anzapfungen entschieden:

Übersicht
FIR-FAQ
Wikipedia-Artikel

0voto

Jonathan Leffler Punkte 694013

Es können viele Algorithmen zur gewichteten Mittelwertbildung verwendet werden.

Zum Beispiel für die Positionen I(n) für n = 1 bis N in der Reihenfolge (jüngste bis älteste):

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

0voto

ackb Punkte 562

Aus der Frage geht nicht eindeutig hervor, ob es sich um eine feste Länge handelt Daten zu tun haben oder ob kontinuierlich Daten eintreffen. Ein schönes physikalisches Modell für Letzteres wäre ein Tiefpassfilter, das einen Kondensator und einen Widerstand (R und C) verwendet. Angenommen Ihre Daten sind zeitlich äquidistant (ist das der Fall?), führt dies zu einer Aktualisierungsvorschrift

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

wobei Tau die Zeitkonstante des Filters ist. Im Grenzwert von Null Deltat ergibt dies einen exponentiellen Zerfall (alte Werte werden auf 1/e ihres Wertes reduziert nach Zeit Tau). In einer Implementierung brauchen Sie nur eine laufende gewichtete Summe U_aged zu führen.

deltat wäre 1 und Tau würde die "Alterungskonstante" angeben, die Anzahl der Schritte die nötig ist, um den Beitrag einer Probe auf 1/e zu reduzieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X