Экспоненциальная скользящая средняя, ​​выбранная в разное время

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

  • S n = Y + (1-) S n-1

где S n - это новое среднее значение, - это альфа, Y - это выборка, а S n-1 - это предыдущее среднее значение.

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

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

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

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


person cjs    schedule 21.06.2009    source источник
comment
Вы не должны получать одну и ту же EMA для разных входных данных. Думайте о EMA как о фильтре, дискретизация на 2t эквивалентна понижающей дискретизации, и фильтр будет давать другой результат. Мне это ясно, поскольку [0,2,4] содержит более высокие частотные компоненты, чем [0,1,2,3,4]. Если не вопрос, как мне изменить фильтр на лету, чтобы он давал такой же результат. Возможно, я что-то упускаю?   -  person freespace    schedule 21.06.2009
comment
Но ввод не отличается, просто он реже отбирается. [0,2,4] с интервалами 2t аналогичен [0, , 2,, 4] с интервалами t, где _ указывает, что выборка игнорируется   -  person cjs    schedule 22.06.2009


Ответы (8)


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

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

Y n = X + (1-) Y n-1 Y n = Y n-1 + ( X - Y n-1)

какие коды для:

 Y += alpha * (X-Y);

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

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

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

= 1-е -t /

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

Y + dY / dt = X

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

Y + Y / t = X

Y / t = (X-Y) /

Y = (X-Y) (t /) = (X-Y)

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

person Jason S    schedule 22.06.2009
comment
Да, это в точности решает мою проблему, которая заключалась в том, чтобы ввести в уравнение дельта-t. Я также очень ценю дополнительные подсказки по реализации, а также краткое альтернативное описание однополюсного фильтра нижних частот. - person cjs; 23.06.2009
comment
Не могли бы вы подробнее рассказать о попытках сопоставить поведение? Я понимаю ваше решение для непрерывного времени Y = 1 - exp(-t/τ) и его обобщение до масштабированной ступенчатой ​​функции с величиной x и начальным условием y(0), но я не вижу, как объединить эти идеи для достижения вашего результата. - person Rhys Ulerich; 05.05.2013
comment
оценить как непрерывную, так и дискретную версии при t = (дельта t) = первый дискретный временной шаг, и вычислить альфа так, чтобы непрерывные и дискретные результаты имели одинаковое значение - person Jason S; 05.05.2013
comment
Если Δt становится равным 0, то α также становится равным 0, поэтому Y не изменяется. Это кажется правильным, только если Y уже представляет большое количество событий. Если, например, одновременно происходят только два события, не должен ли правильный ответ быть средним из двух? - person shaunc; 28.08.2016

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

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

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

person Bent Tranberg    schedule 08.08.2013
comment
Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши друзья-пользователи имели некоторое представление о том, что это такое и почему. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно отключен. - person user2084795; 23.06.2015

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

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

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

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

Подставляя:

  • S 2 = Y 2 + (1 -) (Y 1 + (1-) S 0)
  • S 2 = Y 2 + (1-) Y 1 + (1 -) (1-) S 0
  • S 2 = Y 2 + (1-) Y 1 + (1-) 2 S 0

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

  • S 2 = Y 2 + (1-) Y 1 + (1-) 2 (Y 0 + (1-) S -1)
  • S 2 = Y 2 + (1-) Y 1 + (1-) 2 Y 0 + (1-) 3 S -1
  • и Т. Д.

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

  • S 2 = (1-) 0 Y 2 + (1-) Y 1 + (1-) 2 Y 0 + (1-) 3 S -1

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

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

person cjs    schedule 21.06.2009

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

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

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

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

Этот выбор имеет простое следствие: оставьте в покое, какой бы ни была разница во времени.

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

person balpha    schedule 21.06.2009
comment
Я бы подумал, что могу интерполировать свои данные: учитывая, что я отбираю их с дискретными интервалами, я уже делаю это со стандартной EMA! В любом случае, предположим, что мне нужно доказательство, показывающее, что оно работает так же хорошо, как и стандартная EMA, которая также даст неверный результат, если значения не изменяются достаточно плавно между периодами выборки. - person cjs; 21.06.2009
comment
Но вот что я говорю: если вы считаете EMA интерполяцией ваших значений, все готово, если вы оставите альфа как есть (потому что вставка самого последнего среднего значения в качестве Y не меняет среднего). Если вы говорите, что вам нужно что-то, что работает так же хорошо, как и стандартная EMA - что не так с оригиналом? Если у вас нет дополнительной информации об измеряемых данных, любые локальные корректировки альфа-канала будут в лучшем случае произвольными. - person balpha; 21.06.2009
comment
То есть вы говорите, что переход, скажем, с 1 на 2 в течение 1 или 10 секунд должен иметь такой же эффект на 100-секундное скользящее среднее? - person cjs; 22.06.2009
comment
Если вы заполните пропущенные значения значением текущей скользящей средней, именно это и произойдет, потому что S_new = alpha * Y + (1-alpha) * S_old = alpha * S_old + (1-alpha) * S_old = S_old. - person balpha; 22.06.2009
comment
Верно, поэтому я считаю, что вы не хотите этого делать. Интуитивно скользящее среднее не считает, что сигнал постоянно был предыдущим средним значением от t (n) до t (n + 1), с внезапным изменением на новую выборку в t (n + 1), иначе он мог бы иметь чтобы изменить среднее значение гораздо меньше, чем это происходит, потому что сигнал был на уровне, отличном от предыдущего среднего только в течение бесконечно малого промежутка времени. - person cjs; 23.06.2009
comment
В качестве примера рассмотрим S0 = 1, Y0 = 2, alpha = 0,5. Новое среднее значение после выборки Y0, S1, составляет 1,5. Это разумное среднее значение, если сигнал постоянно перемещался от 1 до 2 за период времени; неразумно, если сигнал оставался на 1 до того, как закончился период времени, а затем внезапно перешел на 2. - person cjs; 23.06.2009
comment
Вы описываете линейную интерполяцию измеренных значений. Если вы считаете это целесообразным, почему бы вам не рассчитать EMA через постоянные интервалы, взяв Y (t) = Y_n + (Y_n + 1 - Y_n) * (t_n + 1 - t_n) / (t - t_n), где n и n + 1 a ближайшие измерения до и после времени t = d * i, где i - интервал натурального числа da? - person balpha; 23.06.2009

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

S (Y, S 0) =

(1-α) Y + αS 0 =

Y - αY + αS 0 =

Y + α (S 0 -Y)

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

S (Y, t, S 0) = Y + α t (S 0 -Y)

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

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

Y + α t 2 (S (Y, t 1, S 0) - Y) =

Y + α t 2 ((Y + α t 1 (S 0 -Y)) - Y) =

Y + α t 2 α t 1 (S 0 -Y)

Если это среднее значение должно быть таким же, как если бы весь интервал t был бы добавлен сразу, из этого следует, что α t = α t 1 α t 2. Определение α, которое удовлетворяет этому требованию, будет следующим:

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

Так как:

α t = A t = A t 1 + t 2 = A < sup> t 1 A t 2 = α t 1 α t 2

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

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

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

person sth    schedule 21.06.2009
comment
Это более или менее похоже на решение, которое я имел в виду. К сожалению, сейчас я не могу точно уследить за доказательством, но я сяду и посмотрю на него более внимательно в следующие день или два. - person cjs; 22.06.2009

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

Множитель n = Alpha Time n -Time n-1

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

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

Среднее n = Сумма n / Количество n

person yairchu    schedule 21.06.2009
comment
Проверьте stackoverflow.com/editing-help, stackoverflow.com/questions/31657/ - person nik; 21.06.2009
comment
Вы также можете посмотреть исходный код одного из сообщений: stackoverflow.com/ ревизий / - person sth; 22.06.2009
comment
Я использую HTML-теги sup и sub для надстрочных и подстрочных индексов, а также использую * a в начале уравнения с пустой строкой вверху и внизу. - person cjs; 22.06.2009

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

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

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

person freespace    schedule 21.06.2009
comment
Потратив час или около того немного на математику для этого, я думаю, что простое изменение альфы на самом деле даст мне правильную интерполяцию между двумя точками, о которых вы говорите, но гораздо более простым способом. Кроме того, я думаю, что изменение альфа также будет правильно работать с выборками, взятыми между стандартными интервалами выборки. Другими словами, я ищу то, что вы описали, но пытаюсь использовать математику, чтобы найти простой способ сделать это. - person cjs; 21.06.2009
comment
Не думаю, что есть такой зверь, как правильная интерполяция. Вы просто не знаете, что произошло в то время, когда вы не отбираете пробы. Хорошая и плохая интерполяция подразумевает некоторое знание того, что вы пропустили, так как вам нужно измерить это, чтобы судить, хорошая или плохая интерполяция. Тем не менее, вы можете установить ограничения, например, с максимальным ускорением, скоростью и т. Д. Я думаю, что если вы знаете, как моделировать недостающие данные, вы просто смоделируете недостающие данные, а затем примените алгоритм EMA без изменений, скорее чем изменение альфы. Просто мой 2с :) - person freespace; 21.06.2009
comment
Это именно то, что я имел в виду, редактируя вопрос 15 минут назад: вы просто не знаете, что произошло в то время, когда вы не производите выборку, но это правда, даже если вы выполняете выборку через каждый назначенный интервал. Таким образом, мое размышление Найквиста: до тех пор, пока вы знаете, что форма волны не меняет направления чаще, чем каждые две выборки, фактический интервал выборки не имеет значения и должен иметь возможность варьироваться. Мне кажется, что уравнение EMA точно рассчитывается так, как если бы форма волны линейно изменялась от последнего значения выборки к текущему. - person cjs; 21.06.2009
comment
Я не думаю, что это совсем правда. Теорема Найквиста требует минимум 2 выборок за период, чтобы можно было однозначно идентифицировать сигнал. Если вы этого не сделаете, вы получите псевдоним. Это будет то же самое, что выборка как f_s1 какое-то время, затем f_s2, затем обратно к f_s1, и вы получите сглаживание данных при выборке с f_s2, если f_s2 ниже предела Найквиста. Я также должен признаться, что не понимаю, что вы имеете в виду под линейным изменением формы волны от последней выборки к текущей. Не могли бы вы объяснить? Ура, Стив. - person freespace; 21.06.2009
comment
Правильно. Предположим, моя номинальная частота дискретизации составляет, скажем, 250 отсчетов за период, но она может упасть до дюжины отсчетов за период. Полагаю, это по-прежнему оставляет мне достаточно высокую частоту дискретизации. - person cjs; 21.06.2009
comment
Я обновил вопрос, чтобы обсудить линейное поведение EMA. - person cjs; 21.06.2009

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

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

Первый шаг.

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

Второй шаг.

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

Что будет упускать это приближение сглаживания?

  • В приведенном выше примере уже пропущено 7 образцов.
  • Это было аппроксимировано на шаге 1 с помощью сглаженного повторного применения текущего значения еще 7 раз.
  • Если мы определим коэффициент приближения бета, который будет применяться вместе с альфа (как альфа * бета, а не только альфа), мы будем предполагать, что 7 пропущенных выборок менялись плавно между предыдущим и текущим значениями выборки.
person nik    schedule 21.06.2009
comment
Я действительно подумал об этом, но немного поработал с математикой, и я пришел к выводу, что вместо того, чтобы восемь раз применять формулу с выборочным значением, я могу выполнить расчет нового альфа, который позволит мне применить формулу один раз и дать мне тот же результат. Кроме того, это автоматически решит проблему смещения отсчетов относительно точного времени отсчета. - person cjs; 21.06.2009
comment
Одно приложение в порядке. Я пока не уверен, насколько хорошо аппроксимируются 7 пропущенных значений. Если из-за непрерывного движения значение сильно колеблется в течение 8 миллисекунд, приближения могут быть совсем не соответствующими действительности. Но тогда, если вы выполняете выборку с интервалом 1 мс (самое высокое разрешение, исключая отсроченные выборки), вы уже поняли, что джиттер в пределах 1 мс не имеет значения. Работает ли это рассуждение для вас (я все еще пытаюсь убедить себя). - person nik; 21.06.2009
comment
О, подождите, вы говорите, что можете вычислить новую альфа-константу, которую можно использовать всегда, независимо от задержки при выборке? Я считаю, что это маловероятно. - person nik; 21.06.2009
comment
Я говорю, что можно вычислить новую альфа для любого интервала на основе эталонного альфа и разницы между фактическим интервалом и эталонным интервалом. - person cjs; 21.06.2009
comment
Правильно. Это коэффициент бета из моего описания. Бета-фактор будет вычислен на основе интервала разницы и текущей и предыдущей выборок. Новая альфа будет (альфа * бета), но она будет использоваться только для этого образца. В то время как вы, кажется, «перемещаете» альфа в формуле, я склоняюсь к постоянному альфа (коэффициент сглаживания) и независимо вычисляемому бета (коэффициент настройки), который компенсирует выборки, пропущенные только что. - person nik; 21.06.2009