Thursday, December 15, 2016

Moving Average Queue

Una serie de tiempo es una secuencia de observaciones de una variable aleatoria periódica. Ejemplos de ello son la demanda mensual de un producto, la inscripción anual de primer año en un departamento de la universidad y los flujos diarios en un río. Las series temporales son importantes para la investigación operativa porque son a menudo los impulsores de los modelos de decisión. Un modelo de inventario requiere estimaciones de las demandas futuras, un modelo de programación y dotación de personal para un departamento universitario requiere estimaciones del flujo futuro de estudiantes y un modelo para proporcionar advertencias a la población en una cuenca requiere estimaciones de flujos fluviales para el futuro inmediato. El análisis de series temporales proporciona herramientas para seleccionar un modelo que describe las series temporales y utilizar el modelo para predecir eventos futuros. Modelar la serie temporal es un problema estadístico porque los datos observados se utilizan en procedimientos computacionales para estimar los coeficientes de un supuesto modelo. Los modelos suponen que las observaciones varían aleatoriamente sobre un valor medio subyacente que es una función del tiempo. En estas páginas, se restringe la atención al uso de datos de series de tiempo históricas para estimar un modelo dependiente del tiempo. Los métodos son apropiados para el pronóstico automático a corto plazo de la información de uso frecuente donde las causas subyacentes de la variación del tiempo no están cambiando marcadamente en el tiempo. En la práctica, los pronósticos derivados de estos métodos son posteriormente modificados por analistas humanos que incorporan información no disponible a partir de los datos históricos. Nuestro objetivo principal en esta sección es presentar las ecuaciones para los cuatro métodos de pronóstico utilizados en el complemento de predicción: promedio móvil, suavizado exponencial, regresión y suavizado exponencial doble. Estos son llamados métodos de suavizado. Los métodos no considerados incluyen la predicción cualitativa, regresión múltiple, y métodos autorregresivos (ARIMA). Los interesados ​​en una cobertura más amplia deben visitar el sitio de principios de pronóstico o leer uno de los varios libros excelentes sobre el tema. Utilizamos el libro Previsión. Por Makridakis, Wheelwright y McGee, John Wiley amp Sons, 1983. Para utilizar el libro de Ejemplos de Excel, debe tener instalado el complemento de Pronóstico. Elija el comando Relink para establecer los vínculos al complemento. Esta página describe los modelos utilizados para la predicción simple y la notación utilizada para el análisis. Este método de pronóstico más simple es el pronóstico del promedio móvil. El método simplemente promedios de las últimas m observaciones. Es útil para series de tiempo con una media que cambia lentamente. Este método considera todo el pasado en su pronóstico, pero pesa la experiencia reciente más fuertemente que menos reciente. Los cálculos son simples porque sólo la estimación del período anterior y los datos actuales determinan la nueva estimación. El método es útil para series de tiempo con una media que cambia lentamente. El método del promedio móvil no responde bien a una serie cronológica que aumenta o disminuye con el tiempo. Aquí incluimos un término de tendencia lineal en el modelo. El método de regresión se aproxima al modelo mediante la construcción de una ecuación lineal que proporciona el ajuste por mínimos cuadrados a las últimas observaciones m. Tengo un programa de registro de datos científicos que he estado desarrollando durante varios años. Ahora necesitamos agregar alguna funcionalidad para que produzca una media móvil de los datos que se están recopilando. Puedo crear una cola de myDataClass para hacer el amortiguador del fifo pero me preguntaba cuál sería la mejor manera de hacer el promediar. Como se puede ver en el ejemplo de código siguiente, myDataClass contiene varias estructuras de datos, algunas de las cuales pueden promediarse y otras que no pueden (por ejemplo, la cadena). La pregunta principal es si hay una manera fácil de lograr esto o necesito escribir código para promediar cada elemento dentro de myDataClass o debería rediseñar miDataClass Gracias. Martes, 12 de julio de 2011 9:14 Respuestas Personnaly, crearía una clase QuotDataQueue (de MyDataClass) que se deshace si el recuento en la cola pasa 10 elementos. De esta manera, nunca tendrá que cuidar el número de elementos en la cola de su código, esto será cuidar de dentro de la clase de cola Marcado como respuesta por Mike Feng Moderador miércoles, 20 de julio de 2011 13:56 Tuesday, July 12, 2011 9:40 am Después de un poco más de investigación, supongo que he encontrado la solución para usted. Puede utilizar el método CopyTo para copiar los elementos de la izquierda en la cola en una matriz. Tenga en cuenta que no calcular el promedio, sólo mostró cómo se puede obtener la base de sus cálculos, pero que es sólo la adición de sus propios cálculos en torno a su regla de negocio para eso. Marcado como respuesta por Mike Feng Moderador Miércoles, 20 de julio de 2011 13:56 Viernes, 15 de julio de 2011 5:16 Basado en mi comprensión, su requisito es algo como esto: Este es el dato en la cola: myDataClass1. Datadbl 2.1 datastr quotsomeString1quot dataarraydbl una matriz doble myDataClass2. Datadbl 3.5 datastr quotsomeString2quot dataarraydbl una matriz doble myDataClass10. Datadbl 9.1 datastr quotsomeString10quot dataarraydbl una matriz doble Ahora, usted desea calcular el número medio de feeds de datadbl en cada objeto myDataClass, y obtener el número promedio de datos de datos. Si es así, te sugeriré que hagas lo mismo que Crazypenie sugirió: construye una nueva clase llamada DataQueue: Espero que esto sea útil, si he entendido mal cualquier cosa, por favor no dude en avisarme. Mike Feng MSFT MSDN Soporte de la comunidad Feedback para nosotros Obtenga o solicite un ejemplo de código de Microsoft Recuerde marcar las respuestas como respuestas si las ayudan y las desmarcan si no proporcionan ayuda. Marcado como respuesta por Mike Feng Moderador miércoles, 20 de julio de 2011 13:55 Viernes, 15 de julio de 2011 3:33 Gracias Cor, podría hacerlo así pero myDataClass es bastante grande y el sistema de registro puede estar funcionando para Un largo tiempo por lo que es más eficiente para mí a las copias basura de la clase que realmente no necesitan para calcular el promedio. La cola parecía la manera más fácil de lograr esto. Mi pregunta principal es, sin embargo, cómo promedio de una clase como esta estoy recibiendo la sensación de que voy a tener que escribir el código que lo hace específicamente para cada tipo de datos en myDataClass. Clase pública myDataClass Martes 12 de Julio de 2011 10:40 AM Según mi comprensión, su requisito es algo como esto: Este es el dato en la cola: myDataClass1. Datadbl 2.1 datastr quotsomeString1quot dataarraydbl una matriz doble myDataClass2. Datadbl 3.5 datastr quotsomeString2quot dataarraydbl una matriz doble myDataClass10. Datadbl 9.1 datastr quotsomeString10quot dataarraydbl una matriz doble Ahora, usted desea calcular el número medio de feeds datadbl en cada objeto myDataClass, y obtener el número promedio de dataarydbl feild. Si es así, te sugeriré que hagas lo mismo que Crazypenie sugirió: construye una nueva clase llamada DataQueue: Espero que esto sea útil, si he entendido mal cualquier cosa, por favor no dude en avisarme. Mike Feng MSFT MSDN Soporte de la comunidad Feedback para nosotros Obtenga o solicite un ejemplo de código de Microsoft Recuerde marcar las respuestas como respuestas si las ayudan y las desmarcan si no proporcionan ayuda. Marcado como respuesta por Mike Feng Moderador miércoles, 20 de julio de 2011 13:55 Viernes, 15 de julio de 2011 3:33 AMI tengo un programa de registro de datos científicos que he estado desarrollando desde hace varios años. Ahora necesitamos agregar alguna funcionalidad para que produzca una media móvil de los datos que se están recopilando. Puedo crear una cola de myDataClass para hacer el amortiguador del fifo pero me preguntaba cuál sería la mejor manera de hacer el promediar. Como se puede ver en el ejemplo de código siguiente, myDataClass contiene varias estructuras de datos, algunas de las cuales pueden promediarse y otras que no pueden (por ejemplo, la cadena). La pregunta principal es si hay una manera fácil de lograr esto o necesito escribir código para promediar cada elemento dentro de myDataClass o debería rediseñar miDataClass Gracias. Martes, 12 de julio de 2011 9:14 Respuestas Personnaly, crearía una clase QuotDataQueue (de MyDataClass) que se deshace si el recuento en la cola pasa 10 elementos. De esta manera, nunca tendrá que cuidar el número de elementos en la cola de su código, esto será cuidar de dentro de la clase de cola Marcado como respuesta por Mike Feng Moderador miércoles, 20 de julio de 2011 13:56 Tuesday, July 12, 2011 9:40 am Después de un poco más de investigación, supongo que he encontrado la solución para usted. Puede utilizar el método CopyTo para copiar los elementos de la izquierda en la cola en una matriz. Tenga en cuenta que no calcular el promedio, sólo mostró cómo se puede obtener la base de sus cálculos, pero que es sólo la adición de sus propios cálculos en torno a su regla de negocio para eso. Marcado como respuesta por Mike Feng Moderador Miércoles, 20 de julio de 2011 13:56 Viernes, 15 de julio de 2011 5:16 Basado en mi comprensión, su requisito es algo como esto: Este es el dato en la cola: myDataClass1. Datadbl 2.1 datastr quotsomeString1quot dataarraydbl una matriz doble myDataClass2. Datadbl 3.5 datastr quotsomeString2quot dataarraydbl una matriz doble myDataClass10. Datadbl 9.1 datastr quotsomeString10quot dataarraydbl una matriz doble Ahora, usted desea calcular el número medio de feeds de datadbl en cada objeto myDataClass, y obtener el número promedio de datos de datos. Si es así, te sugeriré que hagas lo mismo que Crazypenie sugirió: construye una nueva clase llamada DataQueue: Espero que esto sea útil, si he entendido mal cualquier cosa, por favor no dude en avisarme. Mike Feng MSFT MSDN Soporte de la comunidad Feedback para nosotros Obtenga o solicite un ejemplo de código de Microsoft Recuerde marcar las respuestas como respuestas si las ayudan y las desmarcan si no proporcionan ayuda. Marcado como respuesta por Mike Feng Moderador miércoles, 20 de julio de 2011 13:55 Viernes, 15 de julio de 2011 3:33 Gracias Cor, podría hacerlo así pero myDataClass es bastante grande y el sistema de registro puede estar funcionando para Un largo tiempo por lo que es más eficiente para mí a las copias basura de la clase que realmente no necesitan para calcular el promedio. La cola parecía la manera más fácil de lograr esto. Mi pregunta principal es, sin embargo, cómo promedio de una clase como esta estoy recibiendo la sensación de que voy a tener que escribir el código que lo hace específicamente para cada tipo de datos en myDataClass. Clase pública myDataClass Martes 12 de Julio de 2011 10:40 AM Según mi comprensión, su requisito es algo como esto: Este es el dato en la cola: myDataClass1. Datadbl 2.1 datastr quotsomeString1quot dataarraydbl una matriz doble myDataClass2. Datadbl 3.5 datastr quotsomeString2quot dataarraydbl una matriz doble myDataClass10. Datadbl 9.1 datastr quotsomeString10quot dataarraydbl una matriz doble Ahora, usted desea calcular el número medio de feeds datadbl en cada objeto myDataClass, y obtener el número promedio de dataarydbl feild. Si es así, te sugeriré que hagas lo mismo que Crazypenie sugirió: construye una nueva clase llamada DataQueue: Espero que esto sea útil, si he entendido mal cualquier cosa, por favor no dude en avisarme. Mike Feng MSFT MSDN Soporte de la comunidad Feedback para nosotros Obtenga o solicite un ejemplo de código de Microsoft Recuerde marcar las respuestas como respuestas si las ayudan y las desmarcan si no proporcionan ayuda. Marcado como respuesta por Mike Feng Moderador Miércoles, 20 de julio de 2011 13:55 Viernes, 15 de julio de 2011 3:33 Promedios / Promedio móvil simple Promedios / Promedio móvil simple Le recomendamos que resuelva esta tarea de acuerdo con la descripción de la tarea, utilizando Cualquier idioma que usted conozca. Calculando el promedio móvil simple de una serie de números. Crear una función / clase / instancia con estado que toma un punto y devuelve una rutina que toma un número como argumento y devuelve una media móvil simple de sus argumentos hasta ahora. Un promedio móvil simple es un método para calcular un promedio de una corriente de números haciendo sólo el promedio de los últimos 160 P 160 números de la corriente 160, donde 160 P 160 se conoce como el período. Se puede implementar llamando a una rutina de iniciación con 160 P 160 como su argumento, 160 I (P), 160 que debe devolver una rutina que cuando se llama con miembros individuales sucesivos de un flujo de números, calcula la media de (arriba A), los últimos 160 P 160 de ellos, permite llamar a este 160 SMA (). La palabra 160 estado 160 en la descripción de la tarea se refiere a la necesidad de 160 SMA () 160 para recordar cierta información entre las llamadas a ella: 160 El período, 160 P 160 Un contenedor ordenado de al menos los últimos 160 P 160 números de cada uno de Sus llamadas individuales. El estado 160 también significa que las llamadas sucesivas a 160 I (), 160 el inicializador, 160 deben devolver rutinas separadas que no 160 comparten el estado guardado para que puedan ser utilizadas en dos flujos independientes de datos. El pseudo-código para una implementación de 160 SMA 160 es: Esta versión utiliza una cola persistente para contener los valores p más recientes. Cada función devuelta desde init-moving-average tiene su estado en un átomo que contiene un valor de cola. Esta implementación utiliza una lista circular para almacenar los números dentro de la ventana al principio de cada indicador de iteración se refiere a la celda de lista que contiene el valor que acaba de salir de la ventana y que se reemplazará con el valor simplemente añadido. Uso de un cierre En la actualidad, este sma no puede ser nogc porque asigna un cierre en el montón. Algún análisis de escape podría eliminar la asignación de montón. Uso de una edición de estructura Esta versión evita la asignación de montón del cierre manteniendo los datos en el marco de pila de la función principal. La misma salida: Para evitar que las aproximaciones de punto flotante sigan acumulándose y creciendo, el código podría realizar una suma periódica en toda la matriz de cola circular. Esta implementación produce dos objetos (de función) compartiendo estado. Es idiomático en E separar la entrada de la salida (leer de la escritura) en lugar de combinarlos en un objeto. La estructura es la misma que la implementación de la Desviación EstándarE. El programa de elixir siguiente genera una función anónima con un período incrustado p, que se utiliza como el período de la media móvil simple. La función run lee la entrada numérica y la pasa a la función anónima recién creada, y luego inspecciona el resultado a STDOUT. La salida se muestra a continuación, con el promedio, seguido por la entrada agrupada, formando la base de cada media móvil. Erlang tiene cierres, pero variables inmutables. Una solución entonces es utilizar procesos y un mensaje simple que pasa la API basada. Los lenguajes de matriz tienen rutinas para calcular los avarages de deslizamiento para una secuencia dada de ítems. Es menos eficiente realizar bucle como en los siguientes comandos. Pide continuamente una entrada I. Que se añade al final de una lista L1. L1 se puede encontrar pulsando 2ND / 1, y la media se puede encontrar en List / OPS Pulse ON para terminar el programa. Función que devuelve una lista que contiene los datos promediados del argumento suministrado Programa que devuelve un valor simple en cada invocación: list es la lista que se promedia: p es el período: 5 devuelve la lista promedio: Ejemplo 2: Utilizando el programa movinav2 , 5) - Inicializando el cálculo del promedio móvil, y definir el período de 5 movinav2 (3, x): x - nuevos datos en la lista (valor 3), y el resultado se almacenará en la variable x, y se muestra movinav2 (4, : X - nuevos datos (valor 4), y el nuevo resultado se almacenará en la variable x, y se mostrará (43) / 2. Descripción de la función movinavg: variable r - es el resultado (la lista de promedios) que se devolverá variable i - es la variable de índice, y apunta al final de la sub-lista de la lista de promediar. Variable z - una variable auxiliar La función utiliza la variable i para determinar qué valores de la lista serán considerados en el siguiente cálculo promedio. En cada iteración, la variable i apunta al último valor de la lista que se utilizará en el cálculo promedio. Así que sólo tenemos que averiguar cuál será el primer valor en la lista. Por lo general, hay que tener en cuenta los elementos p, por lo que el primer elemento será el indexado por (i-p1). Sin embargo, en las primeras iteraciones, el cálculo será normalmente negativo, por lo que la siguiente ecuación evitará los índices negativos: max (i-p1,1) o, ordenando la ecuación, max (i-p, 0) 1. Pero el número de elementos en las primeras iteraciones también será menor, el valor correcto será (índice final - comenzar índice 1) o, ordenando la ecuación, (i - (max (ip, 0) 1), y luego , (I - max (ip, 0)). La variable z tiene el valor común (max (ip), 0) así que el beginindex será (z1) y los numberofelements serán (iz) mid (list, z1, iz) devolverá la lista de valor que será la suma promedio .) Los sumará (.) / (Iz) ri los medirá y almacenará el resultado en el lugar apropiado en la lista de resultados Usando un cierre y creando una función Necesito hacer un seguimiento de los últimos 7 días de horas de trabajo en un piso Bucle de lectura de archivos. Se utiliza para medir la fatiga de las listas de trabajo. En este momento tengo algo que funciona, pero parece bastante detallado y no estoy seguro de si theres un patrón thats más sucinto. Actualmente, tengo una clase de Java con una matriz estática para sostener los últimos datos de x días, entonces como leo a través del archivo, cortar el primer elemento y mover los otros 6 (por una semana rodando total) de vuelta por uno. El procesamiento de esta matriz estática se realiza en su propio método es decir. Mi pregunta: es esto un enfoque de diseño razonable, o hay algo obviamente obvio y simple para hacer esta tarea Gracias chicos preguntó Aug 30 11 at 14:33 Muchas gracias chicos: Tengo el mensaje: utilizar un objeto de nivel superior y explotar el Métodos relevantes o un tampón circular. Grandes respuestas, todas ellas. Cuando piensas en ello, siempre necesitas tener acceso a toda la matriz para que puedas deshacerte de esa primera entrada, la cual no estaba seguro por mi cuenta. I39m aliviado de que no me había perdido un liner 1 y estaba básicamente en una pista razonable, si no eficiente y concisa Esto es lo que me encanta sobre este sitio: de alta calidad, las respuestas pertinentes de las personas que conocen su sht. Ndash Pete855217 Aug 30 11 at 15:05 Por qué inicializar runningTotal a null Cuál es su tipo Donde se declara haría bien si se ponen algunos ejemplos de código que se asemejan a código real de Java. Continuando, mi crítica sería la siguiente: su función hace demasiado. Una función o método debe ser cohesivo. Más apropiadamente, deben hacer una cosa y una sola cosa. Peor aún, lo que sucede en su bucle for cuando x 5 Copia runningTotal6 en runningTotal5. Pero entonces usted tiene dos copias del mismo valor en la posición 5 y 6. En su diseño, su función mueve / baraja los artículos en su arsenal calcula el total imprime materia al error estándar devuelve el total Hace demasiado. Mi primera sugerencia es no mover cosas alrededor en la matriz. En su lugar, implementar un búfer circular y utilizarlo en lugar de la matriz. Se simplificará su diseño. Mi segunda sugerencia es dividir las cosas en funciones que son coherentes: tener una estructura de datos (un buffer circular) que le permite agregar (y que cae la entrada más antigua siempre que alcanza su capacidad.) Tener la estructura de datos implementar un Interator tiene una función que calcula el total en el iterador (no te importa si estás calculando el total de una matriz, lista o bufer circular). No lo llaman total. Llámelo suma, que es lo que está computando. Eso es lo que hago :) That39s gran información luis, sin embargo recuerde que esta función es una pequeña parte de la funcionalidad de la clase, y sería excesivo agregar demasiado código para hacerlo perfecto. Usted es técnicamente correcto, y entiendo que mi código hace mucho 39 pero al mismo tiempo a veces es mejor errar en el lado del código más pequeño, más claro que ir para la perfección. Teniendo en cuenta mis habilidades de Java, incluso haciendo que el pseudocódigo que describe compilar tendría que soplar mi presupuesto en esto (), pero gracias por la descripción clara. Ndash Pete855217 Aug 31 11 at 2:23 Hmmm, no se trata de la perfección, sino de las prácticas industriales establecidas que hemos conocido durante las últimas 3 décadas. El código limpio siempre es un particionado. Tenemos décadas de evidencia que indican que este es el camino a seguir en el caso general (en términos de costo-eficiencia, reducción de defectos, comprensión, etc.). A menos que sea un código desechable para una cosa de una sola vez. Nunca es costoso hacer esto cuando uno comienza cualquier análisis del problema de esta manera. Codificación 101, descomponer el problema y el código sigue, ni exceso ni difícil) ndash luis. espinal Ago 31 11 at 15:55 Su tarea es demasiado simple y el aproach que ha adoptado es sin duda bueno para el trabajo. Sin embargo, si desea utilizar un mejor diseño, debe deshacerse de todo ese movimiento de números que mejor utilizar una cola FIFO y hacer buen uso de los métodos push y pop de esa manera el código no reflejar cualquier movimiento de datos, sólo las dos acciones lógicas De datos nuevos y eliminar datos anteriores a 7 días. Respondió 30 ago a las 14:49


No comments:

Post a Comment