Pregunta

Tengo un valor continuo para el que me gustaría para calcular una la media móvil exponencial de.Normalmente acababa de utilizar 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 que no tienen una constante de tiempo de la muestra.Yo lo sepa me puede degustar en la mayoría de los, digamos, de una vez por milisegundo, pero debido a factores que están fuera de mi control, no puede ser capaz de tomar una muestra para varios milisegundos en un momento.Un probable caso más común, sin embargo, es que simple muestra de un poco temprano o tarde:lugar de la toma de muestras en 0, 1 y 2 ms.Me muestra en 0, 0.9 y 2.1 ms.Yo anticipar que, independientemente de los retrasos, mi frecuencia de muestreo serán muy, muy por encima del límite de Nyquist, y así no tiene que preocuparse acerca de alias.

Creo que puedo lidiar con esto en un más o menos de forma razonable por la variación de la alfa adecuadamente, basado en la longitud de tiempo desde la última muestra.

Parte de mi razonamiento de que esto funciona es que la EMA "interpola linealmente entre el anterior punto de datos y la actual.Si tenemos en cuenta en el cálculo de un EMA de la siguiente lista de muestras a intervalos de t:[0,1,2,3,4].Debemos obtener el mismo resultado si queremos utilizar el intervalo de 2t, donde las entradas se convierten [0,2,4], ¿verdad?Si la EMA había asumido que, en t2 el valor había sido de 2 desde t0, que sería el mismo que el intervalo t de cálculo el cálculo de [0,2,2,4,4], que no está haciendo.O eso hace que sentido?

Alguien me puede decir cómo variar el alfa adecuadamente?"Por favor, mostrar su trabajo." I. e., muéstrame la matemática que demuestra que el método realmente está haciendo lo correcto.

¿Fue útil?

Solución

Esta respuesta se basa en mi buena comprensión de los filtros de paso bajo (" promedio móvil exponencial " en realidad es solo un filtro de paso bajo unipolar), pero mi vago entendimiento de lo que está buscando para. Creo que lo siguiente es lo que quieres:

Primero, puede simplificar un poco su ecuación (parece más complicada pero es más fácil en el código). Voy a usar & Quot; Y & Quot; para salida y " X " para entrada (en lugar de S para salida e Y para entrada, como lo ha hecho).

Y n = & # 945; X + (1 - & # 945;) Y n-1 & # 8594; Y n = Y n-1 + & # 945; (X - Y n-1 )

qué códigos para:

 Y += alpha * (X-Y);

Segundo, el valor de & # 945; aquí está " igual " a 1-e - & # 916; t / & # 964; donde & # 916; t es el tiempo entre muestras y & # 964; es la constante de tiempo del filtro de paso bajo. Digo & Quot; igual & Quot; entre comillas porque esto funciona bien cuando & # 916; t / & # 964; es pequeño en comparación con 1, y & # 945; = 1-e - & # 916; t / & # 964; & # 8776; & # 916; t / & # 964 ;. (Pero no demasiado pequeño: se encontrará con problemas de cuantificación y, a menos que recurra a algunas técnicas exóticas, generalmente necesitará N bits de resolución adicionales en su variable de estado S, donde N = -log 2 (& # 945;).) Para valores mayores de & # 916; t / & # 964; el efecto de filtrado comienza a desaparecer, hasta llegar al punto donde & # 945; está cerca de 1 y básicamente solo está asignando la entrada a la salida.

Esto debería funcionar correctamente con valores variables de & # 916; t (la variación de & # 916; t no es muy importante siempre que alfa sea pequeño, 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, precalcule & # 969; = 1 / & # 964 ;, y considere intentar aproximar la fórmula para & # 945 ;.

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

& # 945; = 1-e - & # 916; t / & # 964;

luego considere su fuente de ecuación diferencial:

Y + & # 964; dY / dt = X

que, cuando X es una función de paso unitario, tiene la solución Y = 1 - e -t / & # 964; . Para valores pequeños de & # 916; t, la derivada se puede aproximar por & # 916; Y / & # 916; t, produciendo

Y + & # 964; & # 916; Y / & # 916; t = X

& # 916; Y / & # 916; t = (X-Y) / & # 964;

& # 916; Y = (X-Y) (& # 916; t / & # 964;) = & # 945; (X-Y)

y la " extrapolación " de & # 945; = 1-e - & # 916; t / & # 964; proviene de intentar hacer coincidir el comportamiento con el caso de la función de paso de unidad.

Otros consejos

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

Mire el segundo enlace: " " Algoritmos para series de tiempo desigualmente espaciadas: promedios móviles y otros operadores rodantes "

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

Esta no es una respuesta completa, pero puede ser el comienzo de una. Está tan lejos como llegué con esto en aproximadamente una hora de juego; Lo publico como un ejemplo de lo que estoy buscando, y tal vez una inspiración para otros que trabajan en el problema.

Comienzo con S 0 , que es el promedio resultante del promedio anterior S -1 y la muestra Y 0 tomada en t 0 . (t 1 - t 0 ) es mi intervalo de muestra y & # 945; se establece en lo que sea apropiado para ese intervalo de muestra y el período durante el cual deseo promediar.

Pensé en lo que sucede si pierdo la muestra en t 1 y, en cambio, tengo que conformarme con la muestra Y 2 tomada en t 2 ? Bueno, podemos comenzar expandiendo la ecuación para ver qué hubiera pasado si hubiéramos tenido Y 1 :

  • S 2 = & # 945; Y 2 + (1 - & # 945;) S 1 , donde S 1 = & # 945; Y 1 + (1 - & # 945;) S 0

Sustituyendo:

  • S 2 = & # 945; Y 2 + (1 - & # 945;) (& # 945; Y 1 + (1 - & # 945;) S 0 )
  • S 2 = & # 945; Y 2 + (1 - & # 945;) & # 945; Y 1 + (1 - & # 945;) (1 - & # 945;) S 0
  • S 2 = & # 945; Y 2 + (1 - & # 945;) & # 945; Y 1 + (1 - & # 945;) 2 S 0

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

  • S 2 = & # 945; Y 2 + (1 - & # 945;) & # 945; Y 1 + (1 - & # 945;) 2 (& # 945; Y 0 + (1 - & # 945;) S -1 )
  • S 2 = & # 945; Y 2 + (1 - & # 945;) & # 945; Y 1 + (1 - & # 945;) 2 & # 945; Y 0 + (1 - & # 945;) < sup> 3 S -1
  • etc.

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

  • S 2 = (1 - & # 945;) 0 & # 945; Y 2 + (1- & # 945;) & # 945; Y 1 + (1 - & # 945;) 2 & # 945; Y 0 + (1 - & # 945;) 3 S -1

Hm: es una serie exponencial. ¡Quelle sorpresa! ¡Imagine que sale de la ecuación para un promedio móvil exponencial!

De todos modos, tengo este x 0 + x 1 + x 2 + x 3 +. ... lo que pasa, y estoy seguro de que estoy oliendo e o un logaritmo natural dando vueltas por aquí, pero no puedo recordar hacia dónde me dirijo antes de que se me acabe el tiempo.

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 se tomaron en t 0 = 0ms, t 1 = 0.9ms y t 2 = 2.1ms, pero usted elige de & # 945; se basa en intervalos de 1 ms y, por lo tanto, desea un & # 945; n ajustado localmente, la prueba de la corrección de la elección significaría conocer los valores de la muestra en t = 1ms y t = 2 ms.

Esto lleva a la pregunta: ¿Puede interpolar sus datos de manera razonable para tener una idea acertada de cuáles podrían haber sido los valores intermedios? ¿O incluso puedes interpolar el promedio en sí mismo?

Si ninguno de estos es posible, entonces, por lo que veo, la elección lógica de un valor intermedio Y (t) es el promedio calculado más recientemente , es decir Y (t) & # 8776; S n donde n es maxmial tal que t n & Lt; t.

Esta opción tiene una consecuencia simple: Deje & # 945; solo, sin importar la diferencia horaria.

Si, por otro lado, es posible interpolar sus valores, esto le dará muestras promediables de intervalo constante. Por último, si es posible interpolar el promedio en sí mismo, eso dejaría sin sentido la pregunta.

Al usar un & # 945 ligeramente diferente; que es igual a (1 - & # 945; el de la pregunta ), la fórmula básica para agregar un nuevo valor Y a un promedio existente de S 0 se ve así:

  

S (Y, S 0 ) =

     

(1 - & # 945;) Y + & # 945; S 0 =

     

Y - & # 945; Y + & # 945; S 0 =

     

Y + & # 945; (S 0 -Y)

Si ahora sumamos la longitud del intervalo de tiempo t y asumimos que solo & # 945; depende de esa t, esa fórmula se ve así:

  

S (Y, t, S 0 ) = Y + & # 945; t (S 0 -Y)

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

  

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

     

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

     

Y + αt2 ((Y + & # 945; t 1 (S 0 -Y)) - Y) =

     

Y + αt2αt1 ( S 0 -Y)

Si este promedio fuera el mismo que si se hubiera agregado todo el intervalo t de una vez, se deduce que & # 945; t = & # 945; t 1 & # 945; t 2 . Una definición de & # 945; que cumpla este requisito sería:

  

& # 945; x : = A x & nbsp; & nbsp; & nbsp; & nbsp; (para alguna constante A)

Porque:

  

& # 945; t = A t =   A t 1 + t 2 =   A t 1 A t 2 =   αt1αt2

Esto da como resultado la siguiente función de promedio:

  

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

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

Digamos que nos gustaría hacer un promedio de descomposición 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.

Multiplicador n = Alfa Tiempo n -Time n-1

Sum n = Val n + Sum n-1 * Multiplicador n

Count n = 1 + Count n-1 * Multiplicador n

Promedio n = Suma n / Cuenta n

Me gustaría salir de la alpha valor solo, y rellenar los datos que faltan.

Dado que usted no sabe lo que sucede durante el tiempo cuando usted no puede ejemplo, usted puede llenar en aquellas muestras con 0, o mantener el valor anterior estable y utilizar los valores de la EMA.O algunos de atrás de la interpolación de una vez que usted tiene una nueva muestra, rellene los valores que faltan, y se vuelve a calcular el EMA.

Lo que estoy tratando de llegar es que tiene una entrada x[n] que tiene agujeros.No hay ninguna manera de evitar el hecho de que faltan datos.Así que usted puede utilizar un cero de orden de retención, o se establece en cero, o algún tipo de interpolación entre x[n] y x[n+M], donde M es el número de desaparecidos de muestras y n el inicio de la brecha.Posiblemente incluso el uso de los valores antes de n.

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

Actualizar & amp; resumen: Me gustaría mantener el factor de suavizado (alfa) independiente del factor de compensación (al que me refiero aquí 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 múltiplos redondeados de su tiempo de muestreo constante, entonces 7.8 ms ya que la última muestra sería 8 unidades), eso podría usarse para aplicar el suavizado varias veces. Aplica la fórmula 8 veces en este caso. Efectivamente, ha realizado 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é perderá esta aproximación de suavizado?

  • Ya se han perdido 7 muestras en el ejemplo anterior
  • Esto se aproximó en el paso 1 con una nueva aplicación aplanada del valor actual 7 veces adicionales
  • Si definimos un factor de aproximación beta que se aplicará junto con alfa (como alfa * beta en lugar de solo alfa), asumiremos que los 7 fallaron las muestras estaban cambiando suavemente entre los valores de muestra anteriores y actuales.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top