Thursday 23 November 2017

Algoritmo De Promedio Móvil Ponderado


Me gustaría resumir los promedios móviles de varias categorías diferentes al almacenar registros de registro. Imagine un servicio que guarda los registros del servidor web una entrada a la vez. Vamos a imaginar, no tenemos acceso a los registros registrados. Así que los vemos una vez, pero no tienen acceso a ellos más adelante. Para diferentes páginas, me gustaría saber el número total de visitas (fácil) un promedio reciente (como un mes o así) un promedio a largo plazo (más de un año) ¿Existe algún algoritmo inteligente / modelo de datos que permite guardar tales medias móviles Sin tener que recalcularlos mediante el resumen de grandes cantidades de datos que no necesitan un promedio exacto (exactamente 30 días o así), sino sólo los indicadores de tendencia. Así que algunos borrosos no es un problema en absoluto. Sólo debe asegurarse de que las nuevas entradas se ponderan más alto que los más antiguos. Una solución probablemente sería auto-crear registros estadísticos para cada mes. Sin embargo, ni siquiera necesito estadísticas del mes pasado, así que esto parece un exceso. Y no me daría una media móvil, sino más bien intercambiar a nuevos valores de mes a mes. Preguntó Nov 21 11 at 12:09 Una solución fácil sería mantener un total exponencial decadencia. Se puede calcular usando la siguiente fórmula: donde oldX es el valor antiguo de su total (en el tiempo oldT), newX es el nuevo valor de su total (en tiempo newT) delta es la contribución de nuevos eventos al total (por ejemplo El número de visitas de hoy) p es menor o igual a 1 y es el factor de desintegración. Si tomamos p 1 entonces tenemos el número total de hits. Disminuyendo p. Disminuimos efectivamente el intervalo que describe nuestro total. Respondió Nov 21 11 at 12:18 Puede ser una solución para usted. Puede agregar datos a almacenamiento intermedio agrupados por hora o día. Que la función de agrupación funcionará muy rápido, porque tendrá que agrupar pequeña cantidad de registros y inserciones será rápido también. Las decisiones de precisión depende de usted. Puede ser mejor que los algoritmos exponenciales auto-correlacionados porque se puede entender lo que se calcula más fácil y no requiere matemáticas cada paso. Para datos de último término, puede usar colecciones con límite de cantidad limitada de registros. Ellos apoyado nativamente por algunos DBs por ejemplo MongoDB. Este repo proporciona Exponentially Weighted Moving Average algoritmos, o EWMAs para abreviar, sobre la base de nuestra cuantificación comportamiento anormal hablar. Promedio móvil ponderado exponencialmente Una media móvil exponencialmente ponderada es una forma de calcular continuamente un tipo de promedio para una serie de números, a medida que llegan los números. Después de agregar un valor en la serie al promedio, su peso en el promedio disminuye exponencialmente con el tiempo. Esto distorsiona el promedio hacia datos más recientes. EWMAs son útiles por varias razones, principalmente su costo computacional y de memoria baratos, así como el hecho de que representan la reciente tendencia central de la serie de valores. El algoritmo EWMA requiere un factor de desintegración, alfa. Cuanto mayor sea el alfa, más el promedio está sesgado hacia la historia reciente. El alfa debe estar entre 0 y 1, y es típicamente un número bastante pequeño, tal como 0.04. Discutiremos la elección del alfa más adelante. El algoritmo trabaja así, en pseudocódigo: Multiplica el siguiente número en la serie por alfa. Multiplique el valor actual del promedio por 1 menos alfa. Agregue el resultado de los pasos 1 y 2 y guárdelo como el nuevo valor actual del promedio. Repita para cada número de la serie. Existen comportamientos de casos especiales para saber cómo inicializar el valor actual, y estos varían entre implementaciones. Una aproximación es comenzar con el primer valor en la serie otro es el promedio de los primeros 10 o más valores en la serie usando una media aritmética, y luego comenzar la actualización incremental de la media. Cada método tiene ventajas y desventajas. Puede ser útil mirarla gráficamente. Supongamos que la serie tiene cinco números, y elegimos alfa para que sea 0,50 por simplicidad. Heres la serie, con números en el barrio de 300. Ahora permite tomar la media móvil de esos números. Primero fijamos el promedio al valor del primer número. Luego multiplicamos el siguiente número por alfa, multiplicamos el valor actual por 1-alfa y los añadimos para generar un nuevo valor. Esto continúa hasta que terminemos. Observe cómo cada uno de los valores de la serie se decae a la mitad cada vez que se agrega un nuevo valor y la parte superior de las barras en la parte inferior de la imagen representa el tamaño de la media móvil. Es un promedio suavizado, o paso bajo, de la serie original. Considere una media móvil de desplazamiento de ventana de tamaño fijo (no una media móvil ponderada exponencialmente) que promedie las muestras de N anteriores. Cuál es la edad media de cada muestra Es N / 2. Supongamos ahora que se desea construir una EWMA cuyas muestras tengan la misma edad media. La fórmula para calcular el alfa requerido para esto es: alfa 2 / (N1). La prueba está en el libro Producción y análisis de las operaciones de Steven Nahmias. Por ejemplo, si usted tiene una serie de tiempo con muestras una vez por segundo, y desea obtener la media móvil en el minuto anterior, debe utilizar un alfa de .032786885. Esto, por cierto, es el alpha constante utilizado para este repositorio SimpleEWMA. Este repositorio contiene dos implementaciones del algoritmo EWMA, con diferentes propiedades. Todas las implementaciones se ajustan a la interfaz MovingAverage y el constructor devuelve ese tipo. Las implementaciones actuales suponen un intervalo de tiempo implícito de 1,0 entre cada muestra añadida. Es decir, el paso del tiempo es tratado como si fuera el mismo que la llegada de las muestras. Si necesita decadencia basada en el tiempo cuando las muestras no llegan precisamente a intervalos establecidos, este paquete no soportará sus necesidades en la actualidad. Un SimpleEWMA está diseñado para un bajo consumo de CPU y memoria. Tendrá un comportamiento diferente que el VariableEWMA por múltiples razones. No tiene período de calentamiento y utiliza un decaimiento constante. Estas propiedades le permiten usar menos memoria. También se comportará de manera diferente cuando su igual a cero, lo que se supone que significa no inicializado, por lo que si un valor es probable que se convierta en cero en el tiempo, entonces cualquier valor distinto de cero causará un salto brusco en lugar de un pequeño cambio. A diferencia de SimpleEWMA, esto admite una edad personalizada que debe almacenarse y, por lo tanto, utiliza más memoria. También tiene un tiempo de calentamiento cuando se comienza a agregar valores a la misma. Informará un valor de 0.0 hasta que haya añadido el número de muestras necesario. Utiliza una cierta memoria para almacenar el número de muestras agregadas a él. Como resultado, utiliza un poco más del doble de la memoria de SimpleEWMA. Vea aquí la documentación generada por GoDoc. Sólo aceptamos peticiones de tracción para correcciones menores o mejoras. Esto incluye: Pequeñas correcciones de errores Typos Documentación o comentarios Por favor, abra problemas para discutir nuevas características. Las solicitudes de extracción de nuevas características serán rechazadas, por lo que recomendamos bifurcar el repositorio y realizar cambios en el tenedor para su caso de uso. Este repositorio es Copyright (c) 2013 VividCortex, Inc. Todos los derechos reservados. Está licenciado bajo la licencia del MIT. Por favor, consulte el archivo LICENCIA para las condiciones de licencia aplicables. Algoritmo C para el latente de latencia exponencial media móvil Última modificación: 2012-08-13 He estado tratando de implementar un corte de baja frecuencia en c que esencialmente toma una corriente de números y suaviza la salida (Filtración de movimiento de alta frecuencia / jitter), sin embargo es importante que los números ponderados delanteros se consideran inmediatamente como los datos son críticos en el tiempo (es para controlar una base de simulación de movimiento utilizando la salida de un poco de software de juego). Tengo un algoritmo de media móvil ponderada de trabajo, pero podría hacer con algo un poco más sensible en la parte delantera, y he encontrado esto: - El pseudo-código es como sigue: Entradas: Precio (NumericSeries), Period (NumericSimple) Variables: ZLEMA Factor de precio 2 / (Período1) Retardo (Período-1) / 2 Fin de más comenzar Factor ZLEMA (2Precio-Pricelag) (1 factor) ZLEMA1 fin Ive translated Lo en C y mi código es como sigue: Sin embargo, doesnt parecen comportarse bastante como Id esperar. Parece estar casi allí, pero a veces me dan un valor ligeramente inferior a todos los elementos de la cola (cuando son todos más altos). Mi cola y el número de elementos en él se pasan como parámetros, con la más reciente en la parte delantera en todo momento, también pasar un contador de incremento a partir de 0 como lo requiere la función. No estoy seguro de Ive interpretado el significado de ZLEMA1 correctamente como no está claro en su pseudocódigo, por lo que he asumido que esto es la última llamada zlema y también estoy suponiendo que el precio realmente significa Price0. Tal vez Ive tiene este mal ¿Se supone que estoy copiando los valores reales zlema calculado de nuevo a mi cola original antes de la próxima llamada Yo no cambiar la cola original en todos los demás que sólo cambiar todos los valores de uno al final e insertar lo último al principio . El código que utilizo para hacer esto es: Sería muy agradecido si alguien con una mejor comprensión de las matemáticas podría satisfacer sanidad comprobar esto para mí para ver si he conseguido algo ligeramente mal Gracias de antemano si puede ayudar En primer lugar gracias a todos por Su entrada, muy apreciado Eso tiene sentido, supongo, entonces supongo que lo mejor que puedo esperar es simplemente un promedio móvil exponencial, aceptando que habrá un pequeño retraso, pero esto será minimizado por la ponderación de peso más pesado que el dado en tipcial ponderado Media móvil Tengo este algoritmo también, pero un problema similar en que los valores no parecen muy correctos (a menos que sea la naturaleza de la fórmula). Por ejemplo, digamos que mi matriz contiene 16 valores, todos los 0.4775 - la salida es 0.4983, pero Id esperar que sea 0.4775 ¿Te parece bien a ti. / Promedio móvil exponencial. / Float ema (float vals, int numVals, int currentSample) factor estático float 0 static float lastema 0 float ema if (currentSample lt 1) ema vals0 factor 2.0 / ((float) numVals) 1.0) o bien ema (factor vals0) (1,0-factor)) lastema ema return ema A la inversa, a veces la salida es más baja que cada una de las entradas, incluso si todas son más altas. Se llama de la misma manera que zlema (.) Arriba, con un contador de incremento. La fórmula y el pseudocódigo para este están aquí: - autotradingstrategy. wordpress / 2009/11/30 / expo nential-mo ving-avera ge / Gracias de nuevo, disculpas por mi malentendido de algunos de los conceptos básicos: (Saludos cordiales, Chris J As Para el código que publiqué, youre correcto sobre la situación del tamaño de la matriz. Eso debe ser fijado fácilmente En cuanto a sus preguntas: 1) La constante del filtro representa un cutoff de la frecuencia. Utilicé un Digital Signal Processing (DSP) para esta técnica. Es. wikipedia. org/wi ki / Low-pas sfilter es una explicación sencilla. Desea la sección Realización de tiempo discreto. En mi caso el A es el RC-Constant del que hablan. Así que la frecuencia que corta es por encima de 1 / (2piA). Si usted no tiene una comprensión de la teoría de Frecuencia-Dominio, esto puede ser complicado. En su caso, cuanto más alto usted hace A, menor será la frecuencia que este filtro permitirá, lo que significa que suavizará la curva cada vez más. Cuanto más bajo lo haces, más ruido se permite en el sistema. Recuerde que A debe ser mayor o igual que 1 para ser efectivo. Volví a conectar el XLS, esta vez sin el cambio de rand () números. Ajuste la constante A y observe cómo quotsmoothsquot (o filtros) de las variaciones de alta frecuencia. 2) El último punto de la matriz de entrada tiene el valor más reciente. 3) Lo mismo ocurre con la matriz de salida. El último es el valor más reciente. 5) El NUMVALS es arbitrario. Puede agregar continuamente a la matriz de entrada y salida tantas veces como le gustaría y no afectaría el filtro. En particular, utilicé 49 puntos. Pero puedo eliminar fácilmente los últimos 20 y las primeras 29 salidas seguirían siendo las mismas. La función no se basa en cuántos puntos se están utilizando. Me gustaría mencionar que he desarrollado esta función para una conversión de una sola vez. Si desea hacer una conversión para el siguiente valor sobre la marcha podría probar algo más simple (como adjunto). Otra vez Im oxidado en c. Espero que esto sea correcto. La única cosa que usted necesitaría suministrar es la constante de entrada y filtro. Déjeme saber si esto ayuda.

No comments:

Post a Comment