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

  • 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], чего не происходит. Или это вообще имеет смысл?

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

54
cjs 21 Июн 2009 в 17:05

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 / τ и попробуйте аппроксимировать формулу для α.

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

-Δt / τ

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

Y + τ dY / dt = X

-t / τ

Y + τ ΔY / Δt = X

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

ΔY = (X-Y) (Δt / τ) = α (X-Y)

-Δt / τ

54
cjs 22 Июн 2009 в 23:42

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

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

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

8
Bent Tranberg 8 Авг 2013 в 08:22

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

Я начинаю с 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 < sub> 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 < sub> 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 или натурального логарифма здесь, но я не могу вспомнить, куда я направлялся дальше, пока у меня не закончилось время.

2
cjs 21 Июн 2009 в 14:38

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

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

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

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

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

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

1
balpha 21 Июн 2009 в 15:08

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

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

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

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

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

1
yairchu 22 Июн 2009 в 13:07

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

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

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

0
freespace 21 Июн 2009 в 13:35

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

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

Первый шаг.

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

Второй шаг.

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

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

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

Используя немного другое значение α, равное (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 t 1 A t 2 = α t 1 α t 2

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

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

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

1
Community 20 Июн 2020 в 09:12