Tuesday, December 6, 2016

Implementación Del Promedio Móvil Ponderado


Estoy tratando de calcular el promedio móvil de una señal. El valor de la señal (un doble) se actualiza al azar. Estoy buscando una manera eficiente de calcular su tiempo promedio ponderado en una ventana de tiempo, en tiempo real. Podría hacerlo yo mismo, pero es más difícil de lo que pensaba. La mayoría de los recursos que he encontrado en Internet están calculando el promedio móvil de la señal periódica, pero la mina se actualiza al azar. Alguien sabe buenos recursos para que El truco es el siguiente: Usted recibe actualizaciones en tiempos aleatorios mediante la actualización de void (tiempo int, valor de float). Sin embargo, también es necesario realizar un seguimiento cuando una actualización se cae de la ventana de tiempo, por lo que se establece una alarma que se llama en el momento N que elimina la actualización anterior de ser considerado de nuevo en el cálculo. Si esto sucede en tiempo real, puede solicitar al sistema operativo que realice una llamada a un método void dropoffoldestupdate (int time) que se llamará en el momento N Si se trata de una simulación, no puede obtener ayuda del sistema operativo y necesita Hágalo manualmente. En una simulación llamaríamos métodos con el tiempo suministrado como un argumento (que no se correlaciona con el tiempo real). Sin embargo, una suposición razonable es que las llamadas están garantizadas de tal manera que los argumentos de tiempo están aumentando. En este caso, debe mantener una lista ordenada de valores de hora de alarma y, para cada llamada de actualización y lectura, compruebe si el argumento de tiempo es mayor que el de la lista de alarmas. Mientras que es mayor que usted hace el proceso relacionado con la alarma (caiga la actualización más vieja), quite la cabeza y compruebe otra vez hasta que se procesen todas las alarmas antes del tiempo dado. A continuación, haga la llamada de actualización. Hasta ahora he asumido que es obvio lo que haría para el cálculo real, pero voy a elaborar por si acaso. Supongo que tienes un método float read (tiempo int) que usas para leer los valores. El objetivo es hacer que esta llamada sea lo más eficiente posible. Por lo tanto, no calcula el promedio móvil cada vez que se llama al método de lectura. En su lugar precompute el valor a partir de la última actualización o la última alarma y ajuste este valor por un par de operaciones de punto flotante para explicar el paso del tiempo desde la última actualización. (Es decir, un número constante de operaciones excepto para tal vez procesar una lista de alarmas acumuladas). Esperemos que esto esté claro - este debería ser un algoritmo bastante simple y bastante eficiente. Otra optimización. Uno de los problemas restantes es si un gran número de actualizaciones se producen dentro de la ventana de tiempo, entonces hay un largo tiempo para que no hay ni lecturas ni actualizaciones, y luego una lectura o actualización viene adelante. En este caso, el algoritmo anterior será ineficaz en la actualización incremental del valor para cada una de las actualizaciones que está cayendo. Esto no es necesario porque sólo nos preocupamos por la última actualización más allá de la ventana de tiempo por lo que si hay una manera de dejar de manera eficiente todas las actualizaciones anteriores, que ayudaría. Para ello, podemos modificar el algoritmo para realizar una búsqueda binaria de actualizaciones para encontrar la actualización más reciente antes de la ventana de tiempo. Si hay relativamente pocas actualizaciones que deben eliminarse, puede actualizar incrementalmente el valor de cada actualización eliminada. Pero si hay muchas actualizaciones que necesitan ser eliminados, entonces uno puede volver a calcular el valor desde cero después de dejar las antiguas actualizaciones. Apéndice sobre Cálculo Incremental: Debo aclarar lo que quiero decir con el cálculo incremental anterior en la frase ajustar este valor por un par de operaciones en coma flotante para explicar el paso del tiempo desde la última actualización. Cálculo inicial no incremental: luego iterar sobre las actualizaciones relevantes en orden creciente de tiempo: movilidad (sum latupdate timesincelastupdate) / windowlength. Ahora si exactamente una actualización cae de la ventana pero no llega ninguna nueva actualización, ajuste la suma como: (note que es priorupdate que tiene su timestamp modificado para iniciar el inicio de la última ventana). Y si exactamente una actualización entra en la ventana, pero no hay nuevas actualizaciones se caen, ajustar la suma como: Como debe ser obvio, este es un bosquejo aproximado, pero esperemos que muestra cómo se puede mantener el promedio tal que es O (1) operaciones por actualización Sobre una base amortizada. Pero tenga en cuenta la optimización adicional en el párrafo anterior. También tenga en cuenta los problemas de estabilidad aludidos en una respuesta anterior, lo que significa que los errores de coma flotante pueden acumularse en un gran número de operaciones incrementales tales que existe una divergencia con respecto al resultado del cálculo completo que es significativo para la aplicación. Si una aproximación es correcta y hay un tiempo mínimo entre las muestras, puede intentar el super-muestreo. Tenga una matriz que represente intervalos de tiempo uniformemente espaciados que son más cortos que el mínimo, y en cada período de tiempo almacene la última muestra que fue recibida. Cuanto más corto sea el intervalo, más cercano será el promedio al valor verdadero. El período no debe ser mayor de la mitad del mínimo o existe la posibilidad de que falte una muestra. Respondió Dec 15 11 at 18:12 respondió Dec 15 11 at 22:38 Gracias por la respuesta. Una mejora que se necesita para realmente quotcachequot el valor de la media total por lo que don39t lazo todo el tiempo. Además, puede ser un punto menor, pero no sería más eficiente usar un deque o una lista para almacenar el valor, ya que asumimos que la actualización vendrá en el orden correcto. La inserción sería más rápida que en el mapa. Ndash Arthur 16 de diciembre a las 8:55 Sí, podría almacenar en caché el valor de suma. Resta los valores de las muestras que borres, agrega los valores de las muestras que insertas. También, sí, un dequeltpairltSample, Dategtgt podría ser más eficiente. Elegí el mapa para la legibilidad, y la facilidad de invocar map :: upperbound. Como siempre, escriba el código correcto primero, luego el perfil y mida los cambios incrementales. Ndash Rob Dic 16 11 at 15:00 Nota: Aparentemente esta no es la manera de abordar esto. Dejándolo aquí para referencia sobre lo que está mal con este enfoque. Compruebe los comentarios. ACTUALIZADO - basado en el comentario de Olis. No estoy seguro de la inestabilidad de la que habla. Utilice un mapa ordenado de los tiempos de llegada en función de los valores. Al llegar un valor agregue la hora de llegada al mapa ordenado junto con su valor y actualice la media móvil. Advirtiendo esto es pseudo-código: Allí. No se desarrolla completamente, pero tienes la idea. Cosas a tener en cuenta. Como dije lo anterior es pseudo código. Youll necesidad de elegir un mapa adecuado. No quite los pares a medida que pasa a través de lo que va a invalidar el iterador y tendrá que empezar de nuevo. Véase Olis comentar abajo también. Respondió Dec 15 11 at 12:22 Esto no funciona: no tiene en cuenta qué proporción de la longitud de la ventana de cada valor existe para. Además, este enfoque de sumar y luego restar es sólo estable para tipos enteros, no para flotantes. Ndash Oliver Charlesworth dic 15 11 at 12:29 OliCharlesworth - lo siento perdí algunos puntos clave en la descripción (doble y tiempo de ponderación). Voy a actualizar. Gracias. Ndash Dennis dic 15 11 at 12:33 La ponderación de tiempo es otro problema. Pero eso no es de lo que estoy hablando. Me refería al hecho de que cuando un nuevo valor entra por primera vez en la ventana de tiempo, su contribución al promedio es mínima. Su contribución continúa aumentando hasta que ingresa un nuevo valor. Ndash Oliver Charlesworth dic 15 11 at 12: 35net. sourceforge. openforecast. models Clase WeightedMovingAverageModel Un modelo de predicción de media móvil ponderada se basa en una serie temporal artificialmente construida en la que el valor para un período de tiempo dado es reemplazado por la media ponderada de ese valor Y los valores para un cierto número de períodos de tiempo precedentes. Como puede haberse adivinado a partir de la descripción, este modelo se adapta mejor a datos de series de tiempo, es decir, datos que cambian con el tiempo. Dado que el valor pronosticado para cualquier período dado es un promedio ponderado de los períodos anteriores, entonces el pronóstico siempre parecerá rezagarse detrás de los aumentos o disminuciones en los valores observados (dependientes). Por ejemplo, si una serie de datos tiene una tendencia alcista hacia arriba, entonces un promedio ponderado de la media móvil proporcionará generalmente una subestimación de los valores de la variable dependiente. El modelo de media móvil ponderada, al igual que el modelo de media móvil, tiene una ventaja sobre otros modelos de predicción en el sentido de que suaviza los picos y valles (o valles) en un conjunto de observaciones. Sin embargo, al igual que el modelo de media móvil, también tiene varias desventajas. En particular, este modelo no produce una ecuación real. Por lo tanto, no es tan útil como una herramienta de pronóstico a medio y largo plazo. Sólo se puede utilizar de forma fiable para predecir unos cuantos períodos en el futuro. Desde: 0.4 Autor: Steven R. Gould Campos heredados de la clase net. sourceforge. openforecast. models. AbstractForecastingModel WeightedMovingAverageModel () Construye un nuevo modelo de predicción del promedio móvil ponderado. WeightedMovingAverageModel (double weights) Construye un nuevo modelo de predicción de promedio móvil ponderado, usando los pesos especificados. Forecast (double timeValue) Devuelve el valor de pronóstico de la variable dependiente para el valor dado de la variable de tiempo independiente. GetForecastType () Devuelve un nombre de una o dos palabras de este tipo de modelo de pronóstico. GetNumberOfPeriods () Devuelve el número actual de períodos utilizados en este modelo. GetNumberOfPredictors () Devuelve el número de predictores utilizados por el modelo subyacente. SetWeights (pesos dobles) Establece los pesos utilizados por este modelo de predicción del promedio móvil ponderado a los pesos dados. ToString () Esto debe anularse para proporcionar una descripción textual del modelo de pronóstico actual incluyendo, cuando sea posible, cualquier parámetro derivado utilizado. Métodos heredados de la clase net. sourceforge. openforecast. models. AbstractTimeBasedModel WeightedMovingAverageModel Construye un nuevo modelo de predicción de promedio móvil ponderado, usando los pesos especificados. Para que un modelo válido sea construido, debe llamar a init y pasar en un conjunto de datos que contiene una serie de puntos de datos con la variable de tiempo inicializada para identificar la variable independiente. El tamaño de la matriz de pesos se utiliza para determinar el número de observaciones que se utilizarán para calcular la media móvil ponderada. Adicionalmente, el período más reciente recibirá el peso definido por el primer elemento de la matriz, es decir, ponderaciones0. El tamaño de la matriz de pesos también se utiliza para determinar la cantidad de períodos futuros que pueden ser pronosticados con eficacia. Con una media móvil ponderada de 50 días, no podemos razonablemente - con ningún grado de exactitud - pronosticar más de 50 días más allá del último período para el cual se dispone de datos. Incluso los pronósticos cercanos al final de este rango probablemente no serán confiables. Nota sobre los pesos En general, los pesos que se pasan a este constructor deben sumar hasta 1,0. Sin embargo, como conveniencia, si la suma de los pesos no suma 1.0, esta implementación escala todos los pesos proporcionalmente de modo que sumen a 1.0. Parámetros: pesos - una serie de pesos a asignar a las observaciones históricas al calcular la media móvil ponderada. WeightedMovingAverageModel Construye un nuevo modelo de predicción de promedio móvil ponderado, utilizando la variable nombrada como variable independiente y los pesos especificados. Parámetros: independentVariable - el nombre de la variable independiente que se va a utilizar en este modelo. Pesos - una serie de pesos para asignar a las observaciones históricas al calcular el promedio móvil ponderado. WeightedMovingAverageModel Construye un nuevo modelo de predicción del promedio móvil ponderado. Este constructor está destinado a ser utilizado sólo por subclases (por lo tanto, está protegido). Cualquier subclase que utilice este constructor debe invocar posteriormente el método (protected) setWeights para inicializar los pesos que usará este modelo. WeightedMovingAverageModel Construye un nuevo modelo de predicción del promedio móvil ponderado usando la variable independiente dada. Parámetros: independentVariable - el nombre de la variable independiente que se va a utilizar en este modelo. SetWeights Establece los pesos utilizados por este modelo de predicción del promedio móvil ponderado a los pesos dados. Este método está destinado a ser utilizado sólo por subclases (por lo tanto está protegido), y sólo en conjunción con el (protegido) constructor de un argumento. Cualquier subclase que utiliza el constructor de un argumento debe llamar a setWeights antes de invocar el método AbstractTimeBasedModel. init (net. sourceforge. openforecast. DataSet) para inicializar el modelo. Nota sobre pesos En general, los pesos que se pasan a este método deben sumar 1,0. Sin embargo, como conveniencia, si la suma de los pesos no suma 1.0, esta implementación escala todos los pesos proporcionalmente de modo que sumen a 1.0. Parámetros: pesos - una serie de pesos a asignar a las observaciones históricas al calcular la media móvil ponderada. Forecast Devuelve el valor de pronóstico de la variable dependiente para el valor dado de la variable de tiempo independiente. Las subclases deben implementar este método de manera consistente con el modelo de predicción que implementan. Las subclases pueden hacer uso de los métodos getForecastValue y getObservedValue para obtener pronósticos y observaciones anteriores, respectivamente. Especificado por: forecast en la clase AbstractTimeBasedModel Parámetros: timeValue - el valor de la variable de tiempo para la que se requiere un valor de pronóstico. Devuelve: el valor de pronóstico de la variable dependiente para el tiempo dado. Tiros: IllegalArgumentException - si no hay datos históricos suficientes - observaciones pasadas a init - para generar una previsión para el valor de tiempo dado. GetNumberOfPredictors Devuelve el número de predictores utilizados por el modelo subyacente. Devuelve: el número de predictores utilizados por el modelo subyacente. GetNumberOfPeriods Devuelve el número actual de períodos utilizados en este modelo. Especificado por: getNumberOfPeriods en la clase AbstractTimeBasedModel Devuelve: el número actual de períodos utilizados en este modelo. GetForecastType Devuelve un nombre de una o dos palabras de este tipo de modelo de pronóstico. Mantenga esto corto. Una descripción más larga debe implementarse en el método toString. ToString Esto debe anularse para proporcionar una descripción textual del modelo de pronóstico actual incluyendo, cuando sea posible, cualquier parámetro derivado utilizado. Especificado por: toString en la interfaz ForecastingModel Overrides: toString en la clase AbstractTimeBasedModel Devuelve: una representación en cadena del modelo de pronóstico actual y sus parámetros. Definición del modelo de media móvil ponderada En el modelo de media móvil ponderada (estrategia de pronóstico 14), cada valor histórico se pondera Con un factor del grupo de ponderación en el perfil de pronóstico univariado. Fórmula para la media móvil ponderada El modelo de promedio móvil ponderado le permite ponderar los datos históricos recientes con más fuerza que los datos antiguos al determinar el promedio. Hacer esto si los datos más recientes son más representativos de lo que la demanda futura será que los datos más antiguos. Por lo tanto, el sistema es capaz de reaccionar más rápidamente a un cambio de nivel. Uso La exactitud de este modelo depende en gran medida de su elección de factores de ponderación. Si el patrón de series de tiempo cambia, también debe adaptar los factores de ponderación. Cuando se crea un grupo de ponderación, se introducen los factores de ponderación como porcentajes. La suma de los factores de ponderación no tiene que ser 100. No se calcula pronóstico ex post con esta estrategia de pronóstico.

No comments:

Post a Comment