Экспоненциальная скользящая средняя, ​​отобранная в разное время - PullRequest
48 голосов
/ 21 июня 2009

У меня есть непрерывное значение, для которого я хотел бы вычислить экспоненциальное скользящее среднее . Обычно я бы использовал стандартную формулу для этого:

  • S n = & alpha; Y + (1- & alpha;) S n-1

где S n - новое среднее значение, & alpha; альфа, Y - образец, а S n-1 - предыдущее среднее значение.

К сожалению, из-за различных проблем у меня нет согласованного времени выборки. Я могу знать, что могу производить выборку не более одного раза в миллисекунду, но из-за неподконтрольных мне факторов я не могу взять образец в течение нескольких миллисекунд за раз. Однако, более вероятным случаем является то, что я просто делаю выборку немного раньше или позже: вместо выборки в 0, 1 и 2 мс. Я выбираю при 0, 0,9 и 2,1 мс. Я ожидаю, что, независимо от задержек, моя частота дискретизации будет намного выше предела Найквиста, и поэтому мне не нужно беспокоиться о наложении алиасов.

Я считаю, что могу справиться с этим более или менее разумным образом, изменяя альфа соответствующим образом в зависимости от времени, прошедшего с последнего образца.

Часть моих рассуждений о том, что это сработает, заключается в том, что EMA «интерполирует линейно» между предыдущей точкой данных и текущей. Если мы рассмотрим расчет EMA из следующего списка выборок с интервалами t: [0,1,2,3,4]. Мы должны получить тот же результат, если мы используем интервал 2t, где входные данные становятся [0,2,4], верно? Если бы ЕМА предположило, что в момент времени t 2 значение равно 2 с момента времени t 0 , это будет то же самое, что вычисление интервала t, вычисленное по [0,2,2 4,4], чего он не делает. Или это вообще имеет смысл?

Может кто-нибудь сказать мне, как правильно изменить альфа? «Пожалуйста, покажите свою работу». Т.е., покажи мне математику, которая доказывает, что твой метод действительно работает правильно.

Ответы [ 8 ]

47 голосов
/ 22 июня 2009

Этот ответ основан на моем хорошем понимании фильтров нижних частот («экспоненциальное скользящее среднее» на самом деле является просто однополюсным фильтром нижних частот), но на моем смутном понимании того, что вы ищете. Я думаю, что вы хотите следующее:

Во-первых, вы можете немного упростить уравнение (выглядит сложнее, но проще в коде). Я собираюсь использовать «Y» для вывода и «X» для ввода (вместо S для вывода и Y для ввода, как вы сделали).

Y n = & alpha; X + (1- & alpha;) Y n-1 & rarr; Y n = Y n-1 + & alpha; (X - Y n-1 )

какие коды:

 Y += alpha * (X-Y);

Во-вторых, значение & alpha; здесь «равно» 1-е - & Delta; t / & tau; , где & Delta; t - время между выборками, а & tau; постоянная времени фильтра нижних частот. Я говорю «равно» в кавычках, потому что это хорошо работает, когда & Delta; t / & tau; мало по сравнению с 1, и & alpha; = 1-е - & Delta; t / & tau; & asymp; & Delta; T / & тау ;. (Но не слишком маленький: вы столкнетесь с проблемами квантования, и если вы не прибегаете к каким-то экзотическим методам, вам обычно требуется дополнительное N бит разрешения в переменной состояния S, где N = -log 2 ( & alpha;).) Для больших значений & Delta; t / & tau; эффект фильтрации начинает исчезать, пока вы не дойдете до точки, где & alpha; близко к 1, и вы в основном просто назначаете вход для выхода.

Это должно правильно работать с переменными значениями & Delta; t (изменение & Delta; t не очень важно, пока альфа мала, иначе вы столкнетесь с некоторыми довольно странными проблемами Найквиста / псевдонимами / т. Д.), И если вы работаете с процессором, в котором умножение дешевле деления или важны проблемы с фиксированной запятой, то рассчитайте заранее & omega; = 1 / & tau ;, и попробуйте приблизить формулу для & alpha;.

Если вы действительно хотите знать, как получить формулу

* * & Тысяча тридцать один альфа; = 1-е - & Delta; t / & tau;

затем рассмотрим источник его дифференциального уравнения:

Y + & tau; dY / dt = X

, которое, когда X является функцией единичного шага, имеет решение Y = 1 - e -t / & tau; . Для малых значений & Delta; t производная может быть аппроксимирована & Delta; Y / & Delta; t, давая

Y + & tau; & Delta; Y / & Delta; t = X

& Delta; Y / & Delta; t = (X-Y) / & tau;

& delta; Y = (X-Y) (& delta; t / & tau;) = & alpha; (X-Y)

и "экстраполяция" & alpha; = 1-e - & Delta; t / & tau; происходит из-за попытки сопоставить поведение с функциональным случаем единичного шага.

6 голосов
/ 08 августа 2013

Посмотрите здесь: http://www.eckner.com/research.html

Посмотрите на вторую ссылку: "" Алгоритмы для неравномерно распределенных временных рядов: скользящие средние и другие скользящие операторы "

В документе описываются именно те алгоритмы программирования, которые вам нужны, я думаю.

2 голосов
/ 21 июня 2009

Это не полный ответ, но может быть началом. Это так далеко, как я получил с этим через час или около того игры; Я публикую это как пример того, что я ищу, и, возможно, как источник вдохновения для других, работающих над проблемой.

Я начинаю с S 0 , который является средним значением, полученным из предыдущего среднего S -1 и выборки Y 0 , взятой при t 0 . (t 1 - t 0 ) - мой интервал выборки и & alpha; устанавливается на то, что подходит для этого интервала выборки и периода, за который я хочу усреднить.

Я подумал, что произойдет, если я пропущу образец в t 1 и вместо этого придется обойтись образцом Y 2 , взятым в t 2 ? Ну, мы можем начать с расширения уравнения, чтобы увидеть, что случилось бы, если бы у нас было Y 1 :

  • S 2 = & alpha; Y 2 + (1- & alpha;) S 1 , где S 1 = & alpha; Y 1 + (1- & alpha;) S 0

Подставив:

  • S 2 = & alpha; Y 2 + (1- & alpha;) (& alpha; Y 1 + (1- & alpha;) S 0 )
  • S 2 = & alpha; Y 2 + (1- & alpha;) & alpha; Y 1 + (1- & alpha;) (1- & alpha ;) S 0
  • S 2 = & alpha; Y 2 + (1- & alpha;) & alpha; Y 1 + (1- & alpha;) 2 S 0

Я замечаю, что ряд, кажется, расширяется бесконечно, потому что мы можем заменить S n в правой части на неопределенный срок:

  • S 2 = & alpha; Y 2 + (1- & alpha;) & alpha; Y 1 + (1- & alpha;) 2 (& alpha; Y 0 + (1- & alpha;) S -1 )
  • S 2 = & alpha; Y 2 + (1- & alpha;) & alpha; Y 1 + (1- & alpha;) 2 & alpha; Y 0 + (1- & alpha;) 3 S -1
  • и т.д.

Хорошо, так что на самом деле это не многочлен (глупый я), но если мы умножим начальный член на единицу, то увидим шаблон:

  • S 2 = (1-альфа;) 0 & alpha; Y 2 + (1-альфа;) & alpha; Y 1 + (1- & alpha;) 2 & alpha; Y 0 + (1- & alpha;) 3 S -1

Хм: это экспоненциальный ряд. Удивительный сюрприз! Представьте себе, что выход из уравнения для экспоненциальной скользящей средней!

Так или иначе, у меня есть это x 0 + x 1 + x 2 + x 3 + ... что происходит , и я уверен, что я чувствую запах e или натуральный логарифм, который бьет здесь, но я не могу вспомнить, куда я направлялся дальше, прежде чем у меня закончится время.

1 голос
/ 22 июня 2009

Используя немного другой & alpha; что равно (1- & alpha; ответ на вопрос ), основная формула для добавления нового значения Y к существующему среднему значению S 0 выглядит следующим образом:

S (Y, S 0 ) =

(1- & alpha;) Y + & alpha; S 0 =

Y - & alpha; Y + & alpha; S 0 =

Y + & alpha; (S 0 -Y)

Если мы теперь добавим длину временного интервала t и предположим, что просто & alpha; зависит от того т, эта формула выглядит так:

S (Y, т, S 0 ) = Y + & alpha; t (S 0 -Y)

Теперь предположим, что t = t 1 + t 2 . Если среднее значение создается путем добавления двух значений Y для временных интервалов времени t 1 и t 2 , полученное среднее значение выглядит следующим образом:

S (Y, т 2 , S (Y, т 1 , S 0 )) =

Y + & alpha; t 2 (S (Y, t 1 , S 0 ) - Y) =

Y + & alpha; t 2 ((Y + & alpha; t 1 (S 0 -Y)) - Y) =

Y + & alpha; t 2 & alpha; t 1 (S 0 -Y)

Если это среднее значение должно быть таким же, как если бы весь интервал t был бы добавлен сразу, из этого следует, что & alpha; t = & alpha; t 1 * * & тысяча девяносто шесть альфа; * * т тысяча девяносто-семь 2 . Определение & alpha; который удовлетворяет этому требованию, будет:

& alpha; x : = A x (для некоторой константы A)

Потому что:

& alpha; t = A t = A т 1 + т 2 = A т 1 A т 2 = & Альфа; * * т тысяча сто тридцать два 1 * ** +1135 тысяча сто тридцать четыре * & альфа; T 2 * 1 138 ** ** 1140 одна тысяча сто тридцать девять *

В результате получается следующая функция усреднения:

S (Y, т, S 0 ) = Y + A t (S 0 -Y)

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

1 голос
/ 21 июня 2009

Допустим, мы бы хотели получить экспоненциальное среднее затухание для непрерывной функции. Однако у нас нет всех значений этой функции, только несколько образцов. Эта формула получит средневзвешенное значение выборок, которые у нас есть, с весами, которые они имели бы в непрерывном среднем.

Множитель n = Альфа Время n -Время n-1

Сумма n = Val n + Сумма n-1 * Множитель n

Счет n = 1 + Счет n-1 * Множитель n

Среднее n = Сумма n / Счет n

1 голос
/ 21 июня 2009

Любой ответ на этот вопрос или любое доказательство правильности такого ответа сильно зависит от данных, которые вы измеряете.

Если ваши образцы были взяты при t 0 = 0 мс, t 1 = 0,9 мс и t 2 = 2,1 мс, но вы выбрали & alpha; основан на интервалах в 1 мс, и поэтому вы хотите локально скорректировать & alpha; n , доказательство правильности выбора будет означать знание значений выборки при t = 1 мс и t = 2 мс.

Это приводит к вопросу: можете ли вы разумно интерполировать свои данные, чтобы иметь разумные предположения о том, какими могли быть промежуточные значения? Или вы можете даже интерполировать само среднее значение?

Если ни один из них невозможен, то, насколько я понимаю, логическим выбором промежуточного значения Y (t) является последнее вычисленное среднее значение , т. Е. Y (t) & asymp ; S n , где n является максимальным, так что t n

Этот выбор имеет простое следствие: Leave & alpha; один, независимо от того, какая разница во времени.

Если, с другой стороны, возможно интерполировать ваши значения, то это даст вам усредненные выборки с постоянным интервалом. И наконец, если даже можно интерполировать само среднее значение, это сделает вопрос бессмысленным.

0 голосов
/ 21 июня 2009

Это похоже на открытую проблему в моем списке задач. У меня есть одна схема, разработанная до некоторой степени, но у меня пока нет математической работы, чтобы поддержать это предложение.

Обновление и резюме: Хотелось бы, чтобы коэффициент сглаживания (альфа) не зависел от коэффициента компенсации (который я называю здесь бета). Превосходный ответ Джейсона, уже принятый здесь, прекрасно работает для меня.

Первый шаг.

  • Если вы также можете измерить время с момента последней выборки (в округленных кратных значениях от вашего постоянного времени выборки - так, 7,8 мс с момента последней выборки составило бы 8 единиц), это можно использовать для многократного применения сглаживания. Примените формулу 8 раз в этом случае. Вы фактически сделали сглаживание более смещенным в сторону текущего значения.

Второй шаг.

  • Чтобы получить лучшее сглаживание, нам нужно настроить альфа при применении формулы 8 раз в предыдущем случае.

Что пропустит это сглаживающее приближение?

  • В приведенном выше примере уже пропущено 7 образцов
  • Это было приблизительно на шаге 1 с сглаженным повторным применением текущего значения еще 7 раз
  • Если мы определим коэффициент аппроксимации бета , который будет применяться вместе с альфа (как альфа * бета, а не просто альфа), мы будем предполагать, что 7 пропущенных выборок были плавно меняется между предыдущим и текущим значениями выборки.
0 голосов
/ 21 июня 2009

Я бы оставил значение alpha в покое и заполнил недостающие данные.

Поскольку вы не знаете, что происходит в то время, когда вы не можете выполнять выборку, вы можете заполнить эти выборки нулями или оставить прежнее значение стабильным и использовать эти значения для EMA. Или некоторую обратную интерполяцию, как только у вас будет новый образец, заполните пропущенные значения и пересчитайте EMA.

Я пытаюсь понять, что у вас есть вход x[n], в котором есть отверстия. Невозможно обойти тот факт, что вам не хватает данных. Таким образом, вы можете использовать удержание нулевого порядка, или установить его в ноль, или какую-то интерполяцию между x[n] и x[n+M], где M - это число пропущенных выборок и n начала пропуска. Возможно, даже используя значения до n.

...