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

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

  • 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], верно? Если бы EMA предположил, что при t 2 значение было равно 2, поскольку t 0, это будет то же самое, что и расчет интервала t, вычисляемый на [0,2, 2,4,4], чего он не делает. Или это имеет смысл вообще?

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

Ответ 1

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

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

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

который кодирует:

 Y += alpha * (X-Y);

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

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

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

& альфа; = 1-e - & 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; исходит из попытки сопоставить поведение с корпусом функции шага.

Ответ 2

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

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

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

Ответ 3

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

Я начинаю с 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- & альфа;) 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- & alpha;) 0 & alpha; Y 2 + (1- & alpha;) & alpha; Y 1 + (1- & alpha;) 2 & alpha; Y 0 + (1- & alpha;) 3 S -1суб >

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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

Множитель n= Alpha Время n -Time n-1

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

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

Avg n= Sum n/Count n

Ответ 6

Используя немного отличающийся & 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 и считать, что just & alpha; зависит от t, эта формула выглядит так:

S (Y, t, S 0) = Y + & alpha; 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 + & 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 t 1 + t 2 = A t 1 A t 2 = & Альфа; <суб > т <суб > 1суб > суб > & альфа; <суб > т <суб > 2суб > суб >

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Первый шаг.

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

Второй шаг.

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

Что будет сглаживать сглаживание?

  • Он уже пропустил 7 образцов в приведенном выше примере
  • Это было аппроксимировано на шаге 1 с сплющенным повторным применением текущего значения еще 7 раз
  • Если мы определяем коэффициент аппроксимации beta​​b > , который будет применяться вместе с alpha (как альфа * бета вместо просто альфа), мы будем считать, что 7 пропущенных образцы плавно менялись между предыдущими и текущими значениями образца.