Старение набора данных - PullRequest
3 голосов
/ 06 марта 2009

По причинам, которые я бы предпочел не затрагивать, мне нужно отфильтровать набор значений, чтобы уменьшить дрожание. Для этого мне нужно иметь возможность усреднить список чисел, причем самые последние имеют наибольший эффект, а самые последние - наименьший. Я использую выборку размером 10, но это может легко измениться в какой-то момент.

Существуют ли достаточно простые алгоритмы старения, которые я могу применить здесь?

Ответы [ 4 ]

5 голосов
/ 06 марта 2009
  • Посмотрите на экспоненциальное сглаживание . Довольно просто, и может быть достаточно для ваших нужд. В основном недавние наблюдения имеют относительно больший вес, чем более старые.
  • Также (в зависимости от приложения) вы можете рассмотреть различные методы обучения с подкреплением, например Q-Learning или TD-Learning или вообще любой метод, включающий скидка .
0 голосов
/ 08 марта 2009

Не совсем ясно из вопроса, имеете ли вы дело с фиксированной длиной данные или если данные постоянно поступают. Хорошая физическая модель для последнего будет фильтр нижних частот, используя конденсатор и резистор (R и C). Если предположить, Ваши данные расположены на равном расстоянии друг от друга (не так ли?), что приводит к обновлению

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

где Тау - постоянная времени фильтра. В пределе нулевого дельта это дает экспоненциальный спад (старые значения будут уменьшены до 1 / е от их значения после время тау). В реализации вам нужно только сохранить текущую взвешенную сумму U_aged.

deltat будет 1, а Tau будет указывать «постоянную старения», количество шагов требуется уменьшить вклад образца до 1 / е.

0 голосов
/ 06 марта 2009

Можно использовать многие алгоритмы взвешенного усреднения.

Например, для элементов I (n) для n = 1 до N в последовательности (от самого нового до самого старого):

(SUM(I(n) * (N + 1 - n)) / SUM(n)
0 голосов
/ 06 марта 2009

Я столкнулся с чем-то похожим во встроенном управляющем приложении.

Самым простым вариантом, с которым я столкнулся, был фильтр 3/4. Это применяется непрерывно ко всему набору данных:

current_value = (3*current_value + new_value)/4

В конце концов я решил использовать 16-отводной FIR-фильтр:

Обзор
FIR FAQ
Статья в Википедии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...