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

StackOverflow https://stackoverflow.com/questions/1023860

Вопрос

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

  • Sn = aY + (1-α)Сn-1

где Sn является новым средним значением, α - альфа, Y - выборка, а Sn-1 является предыдущим средним значением.

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

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

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

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

Это было полезно?

Решение

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

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

Yn = aX + (1-α)Yn-1 → Yn = Yn-1 + α(X - Yn-1)

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

 Y += alpha * (X-Y);

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

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

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

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

Другие советы

Взгляните сюда: http://www.eckner.com/research.html

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

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

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

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

Я подумал о том, что произойдет, если я пропущу выборку в момент t1 и вместо этого приходится довольствоваться образцом Y2 взято в момент t2?Что ж, мы можем начать с расширения уравнения, чтобы увидеть, что произошло бы, если бы у нас было Y1:

  • S2 = аЙ2 + (1-α)С1, где S1 = аЙ1 + (1-α)С0

Заменяющий:

  • S2 = аЙ2 + (1-α)(аУ1 + (1-α)С0)
  • S2 = аЙ2 + (1-α)аУ1 + (1-α)(1-α)С0
  • S2 = аЙ2 + (1-α)аУ1 + (1-α)2S0

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

  • S2 = аЙ2 + (1-α)аУ1 + (1-α)2(Ай0 + (1-α)С-1)
  • S2 = аЙ2 + (1-α)аУ1 + (1-α)2Ай0 + (1-α)3S-1
  • и т.д.

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

  • S2 = (1-α)0Ай2 + (1-α)аУ1 + (1-α)2Ай0 + (1-α)3S-1

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

Так или иначе, у меня есть этот x0 + x1 + x2 + x3 + ...дело идет, и я уверен, что чувствую запах e или здесь работает натуральный логарифм, но я не могу вспомнить, куда я направлялся дальше, пока у меня не закончилось время.

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

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

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

Если ни то, ни другое невозможно, то, насколько я вижу, логичным выбором промежуточного значения Y (t) является самое последнее рассчитанное среднее значение, т. е.Y(t) ≈ Sn где n - максимальное значение, такое, что tn<t.

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

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

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

S(Y,S0) =

(1-α)Y + Как0 =

Y - αY + αS0 =

Y + α (С0-Y)

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

S(Y, t, S0) = Y + αt0-Y)

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

S(Y, t2, S(Y,t10)) =

Y + αt2(S(Y,t10) - Y) =

Y + αt2((Y + αt10-Y)) - Y) =

Y + αt2αt10-Y)

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

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

Потому что:

αt = At = Аt1 + t2 = Аt1 At2 = αt1αt2

Это приводит к следующей функции усреднения:

S(Y, t, S0) = Y + At0-Y)

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

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

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

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

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

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

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

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

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

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

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

Первый шаг.

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

Второй шаг.

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

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

  • Он уже пропустил 7 образцов в приведенном выше примере
  • Это было приближено на шаге 1 с помощью сплющенный повторное применение текущего значения еще 7 раз
  • Если мы определим коэффициент аппроксимации бета это будет применяться вместе с альфа (как альфа * бета вместо просто alpha), мы будем предполагать, что 7 пропущенных выборок плавно менялись между предыдущими и текущими значениями выборки.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top