vivir vida ventajas valores todos tipos son sociedad sociales simple que puede promedio ponderado movil morales los humanos fundamentales existen eticos estadistica ejemplos ejemplo desventajas cuales contabilidad centrado algorithm theory moving-average

algorithm - vida - valores morales



Aliviar los valores a lo largo del tiempo: ¿promedio móvil o algo mejor? (5)

Estoy codificando algo en este momento en el que tomo un montón de valores a lo largo del tiempo desde una brújula de hardware. Esta brújula es muy precisa y se actualiza muy a menudo, con el resultado de que si se agita ligeramente, termino con un valor extraño que es muy inconsistente con sus vecinos. Quiero suavizar esos valores.

Después de leer un poco, parece que lo que quiero es un filtro de paso alto, un filtro de paso bajo o un promedio móvil. Promedio móvil que puedo seguir, simplemente mantenga un historial de los últimos 5 valores o lo que sea, y use el promedio de esos valores en sentido descendente en mi código donde una vez solo estaba usando el valor más reciente.

Eso debería, creo, suavizar esos caprichos, pero me parece que probablemente sea bastante ineficiente, y este es probablemente uno de esos Problemas Conocidos para Programadores Adecuados a los que hay una solución muy buena de Matemáticas Inteligentes.

Sin embargo, soy uno de esos horribles programadores autodidactas sin una pizca de educación formal en nada que esté vagamente relacionado con CompSci o Matemáticas. Leer un poco sugiere que puede tratarse de un filtro de paso alto o bajo, pero no encuentro nada que explique en términos comprensibles para un hackeo como yo cuál sería el efecto de estos algoritmos en una matriz de valores, y mucho menos cómo la matemática funciona La respuesta dada here , por ejemplo, técnicamente responde mi pregunta, pero solo en términos comprensibles para aquellos que probablemente ya saben cómo resolver el problema.

Sería una persona muy encantadora e inteligente que podría explicar el tipo de problema que es y cómo funcionan las soluciones, en términos comprensibles para un graduado de Artes.


Promedio móvil puedo superar ... pero me parece que probablemente sea bastante ineficiente.

Realmente no hay razón para que una media móvil sea ineficiente. Mantiene la cantidad de puntos de datos que desea en algún búfer (como una cola circular). En cada nuevo punto de datos, abre el valor más antiguo y lo resta de una suma, e inserta el más nuevo y lo agrega a la suma. Entonces, cada nuevo punto de datos realmente solo implica un pop / push, una adición y una resta. Su promedio móvil es siempre esta suma variable dividida por la cantidad de valores en su memoria intermedia.

Se vuelve un poco más complicado si recibe datos simultáneamente de varios hilos, pero dado que sus datos provienen de un dispositivo de hardware que me parece muy dudoso.

Ah, y también: ¡los terribles programadores autodidactas se unen! ;)


Si está tratando de eliminar el valor impar ocasional, un filtro de paso bajo es la mejor de las tres opciones que ha identificado. Los filtros de paso bajo permiten cambios a baja velocidad, como los causados ​​al girar una brújula a mano, mientras que rechazan los cambios de alta velocidad, como los causados ​​por golpes en la carretera, por ejemplo.

Un promedio móvil probablemente no sea suficiente, ya que los efectos de un solo "blip" en sus datos afectarán a varios valores posteriores, dependiendo del tamaño de su ventana de promedio móvil.

Si los valores impares se detectan fácilmente, es posible que esté mejor con un algoritmo de eliminación de fallas que los ignora por completo:

if (abs(thisValue - averageOfLast10Values) > someThreshold) { thisValue = averageOfLast10Values; }

Aquí hay un gráfico guick para ilustrar:

El primer gráfico es la señal de entrada, con un problema desagradable. El segundo gráfico muestra el efecto de un promedio móvil de 10 muestras. El gráfico final es una combinación del promedio de 10 muestras y el algoritmo simple de detección de fallas que se muestra arriba. Cuando se detecta la falla, se utiliza el promedio de 10 muestras en lugar del valor real.


Si su promedio móvil tiene que ser largo para lograr el alisado requerido, y realmente no necesita una forma particular de núcleo, entonces estará mejor si usa un promedio móvil en descomposición exponencial:

a(i+1) = tiny*data(i+1) + (1.0-tiny)*a(i)

donde elige tiny para ser una constante apropiada (por ejemplo, si elige minúsculo = 1- 1 / N, tendrá la misma cantidad de promedios que una ventana de tamaño N, pero se distribuirá de manera diferente sobre puntos anteriores).

De todos modos, dado que el siguiente valor de la media móvil depende solo de la anterior y sus datos, no tiene que mantener una cola ni nada. Y puede pensar en esto como algo así como: "Bueno, tengo un nuevo punto, pero realmente no confío en él, así que voy a mantener el 80% de mi estimación anterior de la medición, y solo confíe en este nuevo punto de datos 20% ". Eso es más o menos lo mismo que decir: "Bueno, solo confío en este nuevo punto en un 20%, y usaré otros 4 puntos en los que confío la misma cantidad", excepto que en lugar de tomar explícitamente los otros 4 puntos, estás asumiendo que el promedio que hiciste la última vez fue razonable para que puedas usar tu trabajo previo.


Una media móvil exponencialmente en descomposición se puede calcular "a mano" con solo la tendencia si usa los valores adecuados. Consulte http://www.fourmilab.ch/hackdiet/e4/ para obtener una idea sobre cómo hacer esto rápidamente con un bolígrafo y papel si está buscando una "media móvil exponencialmente suavizada con un 10% de suavizado". Pero dado que tienes una computadora, probablemente quieras hacer cambios binarios en lugar de desplazamientos decimales;)

De esta forma, todo lo que necesita es una variable para su valor actual y otra para el promedio. El siguiente promedio se puede calcular a partir de eso.


hay una técnica llamada puerta de rango que funciona bien con muestras espúreas de baja ocurrencia. asumiendo el uso de una de las técnicas de filtro mencionadas anteriormente (promedio móvil, exponencial), una vez que tenga un historial "suficiente" (una Constante de Tiempo) puede probar la nueva muestra de datos entrantes por razonabilidad, antes de que se agregue al cálculo.

se requiere algún conocimiento de la velocidad de cambio máxima razonable de la señal. la muestra bruta se compara con el valor suavizado más reciente, y si el valor absoluto de esa diferencia es mayor que el rango permitido, esa muestra se descarta (o se reemplaza con alguna heurística, por ejemplo, una predicción basada en la pendiente; diferencial o la valor de predicción de "tendencia" a partir del suavizado exponencial doble)