Media Móvil Exponencial Muestreada en Diferentes Momentos


Tengo un valor continuo para el que me gustaría calcular una media móvil exponencial. Normalmente usaría la fórmula estándar para esto:

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

Donde Sn es la nueva media, α es el alfa, Y es la muestra, y Sn-1 es el promedio anterior.

Desafortunadamente, debido a varios problemas no tengo un tiempo de muestra consistente. Puedo saber que puedo probar a lo sumo, digamos, una vez por milisegundo, pero debido a factores fuera de mi control, es posible que no pueda tomar una muestra durante varios milisegundos a la vez. Un caso probablemente más común, sin embargo, es que muestro un poco temprano o tarde: en lugar de muestrear a 0, 1 y 2 ms. Muestro a 0, 0.9 y 2.1 ms. Anticipo que, independientemente de los retrasos, mi frecuencia de muestreo estará muy, muy por encima del límite de Nyquist, y por lo tanto no necesito preocuparme por aliasing.

Creo que puedo lidiar con esto de una manera más o menos razonable variando el alfa apropiadamente, basado en el tiempo desde la última muestra.

Parte de mi razonamiento de que esto funcionará es que la EMA "interpola linealmente" entre el punto de datos anterior y el actual. Si consideramos calcular una EMA de la siguiente lista de muestras a intervalos t: [0,1,2,3,4]. Deberíamos obtener el mismo resultado si usamos intervalo 2t, donde las entradas se convierten en [0,2,4], ¿verdad? Si la EMA hubiera asumido que, en t2 el valor había sido 2 desde entonces t0, eso sería lo mismo que el cálculo de intervalo t calculando en [0,2,2,4,4], que no está haciendo. ¿O eso tiene sentido?

¿Puede alguien decirme cómo variar el alfa apropiadamente? "Por favor, muestre su trabajo."Es decir, muéstrame las matemáticas que prueban que tu método realmente está haciendo lo correcto.

Author: Curt J. Sampson, 2009-06-21

8 answers

Esta respuesta se basa en mi buena comprensión de los filtros de paso bajo ("media móvil exponencial" es realmente solo un filtro de paso bajo de un solo polo), pero mi comprensión nebulosa de lo que estás buscando. Creo que lo siguiente es lo que quieres:

Primero, puede simplificar su ecuación un poco (parece más complicado, pero es más fácil en código). Voy a usar "Y "para la salida y" X " para la entrada (en lugar de S para la salida y Y para la entrada, como has hecho).

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

Que codifica para:

 Y += alpha * (X-Y);

En segundo lugar, el valor de α aquí es "igual" a 1-e-Δt/τ donde Δt es el tiempo entre muestras, y τ es la constante de tiempo del filtro de paso bajo. Digo "igual" entre comillas porque esto funciona bien cuando Δt/τ es pequeño comparado con 1, y α = 1-e-Δt/τ ≈ Δt/τ. (Pero no demasiado pequeño: se encontrará con problemas de cuantificación, y a menos que recurra a algunas técnicas exóticas que por lo general, necesita un extra de N bits de resolución en su variable de estado S, donde N = - log2(α). ) Para valores más grandes de Δt / τ el efecto de filtrado comienza a desaparecer, hasta que llegas al punto donde α está cerca de 1 y básicamente solo asignas la entrada a la salida.

Esto debería funcionar correctamente con valores variables de Δt (la variación de Δt no es muy importante mientras alpha sea pequeña, de lo contrario se encontrará con algunos problemas de Nyquist bastante extraños / aliasing / etc.), y si está trabajando en un procesador donde la multiplicación es más barata que la división, o los problemas de punto fijo son importantes, precalcular ω = 1/τ, y considerar tratar de aproximar la fórmula para α.

Si realmente quieres saber cómo derivar la fórmula

Α = 1-e - Δt / τ

Entonces considere su ecuación diferencial fuente:

Y + τ dY / dt = X

Que, cuando X es una función de paso unitario, tiene la solución Y = 1 - e-t/τ. Para valores pequeños de Δt, la derivada se puede aproximar por ΔY / Δt, dando

Y + τ ΔY / Δt = X

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

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

Y la "extrapolación" de α = 1-e-Δt/τ viene de intentar hacer coincidir el comportamiento con el caso de la función de paso unitario.

 43
Author: Jason S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-22 23:42:58

, echa un vistazo aquí: http://www.eckner.com/research.html

Mira el segundo enlace: ""Algoritmos para Series Temporales Desigualmente Espaciadas: Medias Móviles y Otros Operadores de Rodadura"

El documento describe exactamente los algoritmos de programación que necesita, creo.

 6
Author: Bent Tranberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-08 08:22:33

Esta no es una respuesta completa, pero puede ser el comienzo de una. Es lo más lejos que llegué con esto en una hora más o menos de jugar; lo estoy publicando como un ejemplo de lo que estoy buscando, y tal vez una inspiración para otros que trabajan en el problema.

I empieza con S0, cual es el promedio resultante de la media anterior S-1 y la muestra Y0 tomado en t0. (t1 - t0) es mi intervalo de muestra y α se establece en lo que sea apropiado para ese intervalo de muestra y el período durante el cual deseo promediar.

Consideré qué sucede si dejo de tomar la muestra en t1 y en lugar de tener que hacerlo con el ejemplo Y2 tomado en t2? Bueno, podemos empezar expandiendo la ecuación para ver qué habría pasado si hubiéramos tenido Y1:

  • S2 = aY2 + (1-α)S1, donde S1 = aY1 + (1-α) S 0

Sustituyendo:

  • S2 = aY2 + (1-α)(aY1 + (1-α)S0)
  • S2 = aY2 + (1-α)aY1 + (1-α)(1-α)S0
  • S2 = aY2 + (1-α)aY1 + (1-α)2S0

Noto que la serie parece extenderse infinitamente de esta manera, porque podemos sustituir la S n en el lado derecho indefinidamente:

  • S2 = aY2 + (1-α)aY1 + (1-α)2(aY0 + (1-α)S-1)
  • S2 = aY2 + (1-α)aY1 + (1-α)2aY0 + (1-α)3S-1
  • etc.

Ok, así que no es realmente un polinomio (tonto yo), pero si multiplicamos el término inicial por uno, entonces vemos un patrón:

  • S2 = (1-α)0aY2 + (1-α)aY1 + (1-α)2aY0 + (1-α)3S-1

Hm: es una serie exponencial. Quelle surprise! Imagine que salir de la ecuación para una media móvil exponencial!

, de todos modos, tengo este x0 + x1 + x2 + x3 + ... la cosa va, y estoy seguro de que estoy oliendo e o un logaritmo natural pateando por aquí, pero no puedo recordar a dónde me dirigía antes de correr se acabó el tiempo.

 2
Author: Curt J. Sampson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-21 14:38:28

Cualquier respuesta a esta pregunta, o cualquier prueba de corrección de dicha respuesta, depende en gran medida de los datos que esté midiendo.

Si sus muestras fueron tomadas en t0=0ms, t1=0.9 em y t2=2.1 ms, pero su elección de α se basa en intervalos de 1-ms, y por lo tanto desea un αn ajustado localmente , la prueba de corrección de la elección significaría conocer los valores de la muestra en t=1ms y t=2ms .

Esto lleva a la pregunta: ¿Puede interpolar su ¿datos resonables para tener conjeturas sensatas de lo que podrían haber sido los valores intermedios? ¿O puedes incluso interpolar el promedio en sí?

Si ninguno de estos es posible, entonces hasta donde yo lo veo, la elección lógica de un valor intermedio Y (t) es el promedio calculado más recientemente, es decir, Y (t) ≈ S n donde n es maxmial tal que t n

Esta elección tiene una consecuencia simple: Deje a α en paz, sin importar cuál fuera la diferencia horaria.

Si, por el otro mano, es posible interpolar sus valores, entonces esto le dará muestras de intervalo constante promedio. Por último, si incluso es posible interpolar el promedio en sí, eso haría que la pregunta careciera de sentido.

 1
Author: balpha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-21 15:08:33

Usando un α ligeramente diferente que es igual a (1-α el de la pregunta ), la fórmula básica para agregar un nuevo valor Y a un promedio existente de S0 se ve así:

S (Y, S0) =

(1-α)Y + aS0 =

Y-aY + aS0 =

Y + α (S0-Y)

Si ahora sumamos la longitud del intervalo de tiempo t y asumimos que solo α depende de esa t, esa fórmula se ve como esto:

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

Supongamos Ahora que t = t1 + t2. Si el promedio se crea agregando dos valores de Y para intervalos de tiempo t1 y t2, el promedio resultante se ve así:

S(Y,t2, S(Y,t1,S0)) =

Y + αt2(S(Y,t1,S0) - Y) =

Y + αt2((Y + αt1(S0-Y)) - Y) =

Y + αt2αt1(S0-Y)

Si este promedio debe ser el mismo que si toda la t intervalo habría sido añadido a la vez, se sigue que αt = αt1αt2. Una definición de α que cumple este requisito sería:

Α x : = A x (para alguna constante A)

Porque:

Αt = At = Unt1 + t2 = Unt1 Unt2 = αt1αt2

Esto resulta en la siguiente función de promediación:

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

Realmente no he probado esto, pero si las suposiciones que hice se ajustan a su escenario, esto parece una función de promedio que puede manejar variaciones en los intervalos de muestreo bastante bien.

 1
Author: sth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-21 22:08:12

Digamos que nos gustaría hacer un promedio de decaimiento exponencial en una función continua. Sin embargo, no tenemos todos los valores de esa función, solo unas pocas muestras. Esta fórmula haría un promedio ponderado de las muestras que tenemos con los pesos que tendrían en el promedio continuo.

Multiplicadorn = AlfaTiempo an-Tiempon-1

Sumn = Valn + Sumn-1*Multiplier n

Conteon = 1 + Countn-1*Multiplicadorn

Avgn = Sumn/Conden

 1
Author: yairchu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-22 13:07:32

Dejaría el valor alpha solo, y completaría los datos que faltan.

Dado que no sabe lo que sucede durante el tiempo en que no puede muestrear, puede llenar esas muestras con 0s, o mantener estable el valor anterior y usar esos valores para el EMA. O alguna interpolación hacia atrás una vez que tenga una nueva muestra, rellene los valores faltantes y vuelva a calcular el EMA.

Lo que estoy tratando de conseguir es que tienes una entrada x[n] que tiene agujeros. No hay manera de evitar el hecho de que faltan datos. Así que puedes usar una retención de orden cero, o establecerla a cero, o algún tipo de interpolación entre x[n] y x[n+M], donde M es el número de muestras faltantes y n el inicio del espacio. Posiblemente incluso usando valores antes de n.

 0
Author: freespace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-21 13:35:06

Esto es similar a un problema abierto en mi lista de tareas pendientes. Tengo un esquema elaborado hasta cierto punto, pero no tengo trabajo matemático para respaldar esta sugerencia todavía.

Update & summary: Quisiera mantener el factor de suavizado (alfa) independiente del factor de compensación (que aquí me refiero como beta). La excelente respuesta de Jason ya aceptada aquí funciona muy bien para mí.

Primer paso.

  • Si también puede medir el tiempo desde que se tomó la última muestra (en redondeado múltiplos de su tiempo de muestreo constante, por lo que 7,8 ms desde la última muestra serían 8 unidades), que podrían usarse para aplicar el suavizado varias veces. Aplique la fórmula 8 veces en este caso. Usted ha hecho efectivamente un suavizado sesgado más hacia el valor actual.

Segundo paso.

  • Para obtener un mejor suavizado, necesitamos ajustar el alfa mientras aplicamos la fórmula 8 veces en el caso anterior.

¿ Qué hará esta aproximación de suavizado ¿señorita?

  • Ya ha perdido 7 muestras en el ejemplo anterior
  • Esto se aproximó en el paso 1 con una aplanada reaplicación del valor actual 7 veces
  • Si definimos un factor de aproximación beta que se aplicará junto con alfa (como alfa*beta en lugar de solo alfa), asumiremos que las 7 muestras perdidas estaban cambiando suavemente entre los valores de muestra anteriores y actuales.
 0
Author: nik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 07:22:09