rolling moving method español algorithm math average moving-average

algorithm - español - moving average method



¿Cómo calcular de manera eficiente el promedio sobre la marcha(promedio móvil)? (2)

Su solución es esencialmente la solución en línea óptima "estándar" para mantener una pista corriente de promedio sin almacenar grandes sumas y también mientras se ejecuta "en línea", es decir, puede procesar un número por vez sin tener que volver a otros números, y usted solo use una cantidad constante de memoria extra. Si desea una solución ligeramente optimizada en términos de precisión numérica, a costa de estar "en línea", suponiendo que sus números no son negativos, primero ordene sus números del más pequeño al más grande y luego procese en ese orden, el De la misma manera que lo haces ahora. De esta forma, si obtienes un grupo de números que son muy pequeños iguales y luego obtienes un número grande, podrás calcular el promedio con precisión sin desbordamiento, en oposición a si primero procesaste el número grande.

Yo se me ocurre esto

n=1; curAvg = 0; loop{ curAvg = curAvg + (newNum - curAvg)/n; n++; }

Creo que los aspectos más destacados de esta manera son:
- Evita grandes cantidades (y posible desbordamiento si suma y luego divide)
- guarda un registro (no es necesario almacenar la suma)

El problema podría ser un error de suma, pero supongo que, en general, habrá números equilibrados de redondeo hacia arriba y hacia abajo, de modo que el error no se resuma de forma espectacular.

¿Ves algún escollo en esta solución? ¿Tienes alguna mejor propuesta?


La fórmula anterior es absurda. Las matemáticas simples y la precisión dictarían:

n es el contador de iteraciones, AV está ejecutando en promedio, newVal es un valor nuevo

inicialización n=0 , AV=0

( (AV * n) + newVal ) / (n+1) = AV

No hay atajos, tienes que tener todos los números y dividirlos por el número de iteraciones, sin embargo puedes reconstruir uno de los números sabiendo qué iteración es, es un lanzamiento de mantener un total acumulado o volver a calcularlo . El tiempo para volver a calcular tiene un alto costo, el costo de almacenar un número probablemente bajo en términos de memoria y el código para volver a calcular sin duda sería más que la ubicación de la memoria para mantener el total y la iteración.