Moviendo La Matriz Promedio Java


Su interior está iterando toda la matriz de modo que es por eso que siempre obtiene el mismo promedio (el uno para toda la matriz), debe iterar desde 0 hasta el número actual de la externa para en su lugar. Su promedio móvil se está actualizando en función de j de su interior, ya que significa que anulará los valores anteriores de cada nuevo bucle, esto debe estar dentro de la externa en vez de la interna utilizando i como índice. Usted está dividiendo sum / j para calcular promedios, cada nuevo bucle interno j dividirá por 0 la primera suma. Creo que tenías intención de usar j1 en su lugar, el índice no es lo mismo que la longitud actual Consejos para solucionar problemas: Evite utilizar variables para arrays de bucle, debe usar array. length en su lugar. Para una cuestión de reproducir su problema, podría darnos el problema aislado en lugar de su código actual. Es decir: Imagínese si el error está en sus entradas, cómo podríamos creer que usted realmente las utilizó contestó el 4 de octubre a las 20:54 Usted está haciendo un lazo sobre todos los datos cada vez. Usted debe tener para j (o algo similar) para su promedio más íntimo. Además, movingAverageisum / j debe ser modificado para manejar el caso cuando j es 0. En particular, probablemente debería estar moviendoAverageisum / averageLength y debería aplicarse a la ranura movingAveragei fuera del bucle de promedio. Respondió Oct 4 13 at 20:42 La próxima vez, tome los comentarios sobre la asignación de la cuestión antes de publicarla. Pero ya que pareces muy nuevo en esto, piensa en cómo pasarías por los datos, y hacerlo hacerlo. Usted debe tratar de asegurarse de que cada bucle se detiene en el punto correcto, y recuerde que si se detendría cuando no hay más números, (como cuando se está haciendo el bucle interior y sólo se puede obtener 3 números más en lugar de 4) El programa también debe detenerse. Asegúrese de que su código está comprobando esto. Respondió Oct 4 13 at 20:56 Sin ningún detalle adicional, probablemente necesite una media móvil no ponderada. En cualquier punto Ai en el array de entrada A de longitud N (con 0ltiltN), ésa es simplemente la media de las entradas K anteriores del array, hasta e incluyendo Ai. Si no hay K tales valores, entonces el promedio de los valores (i1) de A0 a través de Ai. inclusivo. Un poco de pensamiento le mostrará que no necesita agregar todos los valores de K cada vez. Simplemente mantenga la suma y, al pasar al siguiente punto (esto es una media móvil), resta el valor que está siendo reemplazado y añada el nuevo valor que lo reemplazará. (Durante los primeros puntos K-1, simplemente agregue el nuevo valor a la suma y aumente su contador por 1.) En cualquier punto de este proceso, la media móvil es la suma actual dividida por el valor de recuento actual. En una media móvil, usted necesita tener algún tipo de tamaño de la ventana. El tamaño de la ventana es averageLength, por lo que se verá algo como esto: El bucle for comienza en los datos actuales y devuelve los puntos de datos averageLength y los suma. Sólo tendrá un promedio móvil cuando tenga que tiene cuando tiene suficientes puntos de datos y el promedio será la suma dividida por la longitud promedio. Nota: No probado sólo el código de sudo, pero esta es la idea. En varias ocasiones Ive quería calcular métricas simples en mis aplicaciones Java, por ejemplo, el número de visitas por hora, o los errores a lo largo de un período de tiempo . Mientras que el cálculo de métricas simples no es terriblemente difícil, su solo trabajo extra e Id pasan bastante tiempo en el dominio del problema. Me sorprendió no encontrar soluciones ampliamente aceptadas para métricas en Java. Encontré Metrics, pero parecía un poco complicado y no estaba bien documentado. Lo único que quería era calcular un promedio móvil. Pensé en el problema un poco más y decidí que no era un problema difícil. Heres my solution Esto funciona creando una matriz de tamaño de ventana / actualización de frecuencia, a continuación, un hilo fija el recuento al siguiente índice en la matriz en la frecuencia de actualización. El recuento para el intervalo es simplemente arrayi - arrayi1, que es el recuento más reciente menos el recuento más antiguo. Para un intervalo de 10 minutos, el recuento más antiguo (i1) tiene exactamente 10 minutos. Para agregar una media móvil a nuestro código primero necesitamos un contador, usando AtomicLong. Este contador se debe incrementar en función de los eventos que esté interesado en el cálculo (por ejemplo, solicitudes POST para un servicio REST). Tenemos que proporcionar la implementación con acceso al contador y que se logra a través de la interfaz GetCount. Aquí Ill crear un promedio móvil con una ventana de 5 minutos que se actualiza cada segundo. Y para obtener el promedio actual simplemente llamamos al método getAverage: Un detalle clave de la implementación es cómo se determina el tamaño del array: dividiendo la ventana por la frecuencia de actualización. Así que una ventana grande con una frecuente frecuencia de actualización puede consumir una cantidad significativa de memoria. En este ejemplo, el tamaño de la matriz es razonable 300. Sin embargo, si creamos una media móvil de 24 horas con un intervalo de 1 segundo, el tamaño sería 86400. Una frecuencia de actualización más razonable para un período de 24 horas podría ser cada 5 minutos (tamaño de la matriz de 288 ). Otra consideración de elegir la ventana y la frecuencia de actualización es que la ventana debe ser divisible por la frecuencia. Por ejemplo una ventana de 2 minutos con una frecuencia de actualización de 6 segundos está bien, pero una frecuencia de actualización de 7 segundos no es, ya que no es divisible por 120. Una IllegalArgumentException se lanza si la frecuencia de actualización del módulo de ventana no es cero. Esta implementación requiere un hilo por promedio móvil, que no es muy eficiente. Una mejor solución sería compartir un hilo entre muchos promedios. Actualización. He actualizado el código para compartir un hilo aquí. Por último, theres un problema de estado inicial: no tenemos datos todavía para toda la ventana. Por ejemplo, si tiene una ventana de 5 minutos y sólo 15 segundos de datos. Esta implementación devuelve null hasta que tengamos 5 minutos de datos. Otro enfoque es estimar el promedio. Supongamos que tenemos un recuento de 10 en 30 segundos, entonces podemos estimar el promedio como 40 en 2 minutos. Sin embargo, existe el riesgo de error significativo al extrapolar los datos incompletos. Por ejemplo, si tuviéramos una ráfaga de 20 impactos en 2 segundos, estaríamos calculando 1200 por 2 minutos, lo cual con toda probabilidad está muy lejos. No estoy seguro de la solución correcta, ya que sumando el promedio de cada muestra se introduciría una feria Cantidad de error de redondeo. Hmm. Me pregunto si separar la parte fraccionaria de la parte entera ayudaría. Divida la parte entera de cada número por el recuento. Mantenga tres cantidades corrientes: 1) El promedio de las partes enteras, 2) El resto de cada división, y 3) La parte fraccional de cada número. Cada vez que se divide la parte entera de un número, el resultado de la parte entera se añade a la suma corriente de funcionamiento y el resto se añade a la suma corriente restante. Cuando la suma corriente restante obtiene un valor mayor o igual que el recuento, se divide por el recuento con el resultado de la parte entera añadido a la suma corriente de funcionamiento y el resto se agrega a la suma corriente restante. Además, en cada cálculo, la parte fraccionaria se añade a la suma de ejecución fraccionaria. Cuando se termina el promedio, la suma corriente restante se divide por el recuento y el resultado se añade a la suma corriente de ejecución como un número flotante. Por ejemplo: Ahora qué hacer con la suma de ejecución fraccionaria. El peligro de desbordamiento es mucho menos probable aquí, aunque todavía es posible, así que una manera de manejarlo sería dividir la suma de ejecución fraccional por el recuento al final y agregarlo a nuestro resultado: Una alternativa sería comprobar el funcionamiento fraccionario Suma en cada cálculo para ver si es mayor o igual que count. Cuando eso sucede, haz lo mismo que hacemos con la suma restante. Excelente Jomit Vaghela 6-Mar-07 21:00 Me gustó lo que dijiste que los pequeños trabajos rápidamente se convierten en grandes puestos de trabajo. Pensar en la optimización mientras que la codificación es una buena práctica. Gran esfuerzo y explicación, gracias Mike DiRenzo 5-Mar-07 16:26 Esta es la primera vez que he respondido a uno de sus artículos. Sin embargo, soy un lector muy ávido. Mientras que en la universidad, tuve que calcular medias móviles ponderadas y simples también. Heck, incluso tuve que crear algunos de mis propios algoritmos de media móvil en una aplicación de ERP personalizado hace un tiempo basado en algunas de las mismas fórmulas que aprendí en las operaciones 101. Pero esta aplicación, utilizando Generics, supera con creces cualquier cosa en términos de optimización, Sencillez y frescura a la derecha. Muchas gracias por esto. Uno de tus muchos fans, En silencio y silencio, la verdad queda clara. Ewma gobgob 5-Mar-07 5:30 Si su intento para calcular una media móvil simple, usted tiene que mantener una colección, que es bastante compleja para una tarea tan simple. ¿Cómo sobre el uso de un ewma Sus 2 líneas de código, mucho más simple. Alfa exp (-elapsedTimeSinceLastValue) ewma alfa ewma (1-alfa) newValue Re: ewma Marc Clifton 5-Mar-07 5:47 ¿Qué tal si usas un ewma? Para los lectores que no saben lo que es un ewma, es un exponente Weighted media móvil. La gente es notoriamente imposible. --DavidCrow No hay excusa para no comentar su código. - John Simmons / programador proscrito Las personas que dicen que refactorizarán su código más tarde para que sea bueno no entienden la refactorización, ni el arte y el arte de la programación. - Josh Smith Re: ewma pwasser 5-Mar-07 13:21 Una estimación del promedio móvil si el tamaño bin para el promedio móvil es n puede obtenerse mediante: NewAverage (((n-1) OldAverage) newValue) / n Esto funciona una vez que el contenedor está lleno (número de muestra n). El contenedor parcialmente lleno a menudo se trata utilizando un valor de semilla para el promedio móvil inicial (OldAverage) y luego utilizando este cálculo. Esto supone una distribución normal de los valores, etc. Usted ha estado ocupado Colin Angus Mackay 4-Mar-07 12:37 Publicando dos artículos esta noche. Gran trabajo No sé cómo lo haces. Ive consiguió cerca de 4 o 5 artículos mitad terminado y yo apenas nunca parece encontrar el tiempo para terminarlos. Bien. Tal vez si me quedaba fuera de la sala Id manejarlo. Re: Youve sido ocupado Marc Clifton 4-Mar-07 14:25 Colin Angus Mackay escribió: Publicar dos artículos esta noche. Gran trabajo Gracias realmente estaba escribiendo el artículo sobre el promedio de ejecución y se dio cuenta de que la lista circular sería realmente un artículo auténtico muy bueno. Además, son artículos ligeros. Puedo ponerlos en marcha muy rápido. Su apenas difícil de pensar de la materia útil pero simple. Resulta que necesitaba estas dos clases de todos modos. La gente es notoriamente imposible. --DavidCrow No hay excusa para no comentar su código. - John Simmons / programador proscrito Las personas que dicen que refactorizarán su código más tarde para que sea bueno no entienden la refactorización, ni el arte y el arte de la programación. - Josh Smith Re: Youve sido ocupado JeffPClark 8-Mar-07 1:07 De lo que he leído de Marc, que probablemente tiene un programa que puede examinar un pedazo de código y explicar los detalles intrincados, a continuación, publicar directamente a Code Project . Jeff Clark Architecto de sistemas JP Clark, INC. Columbus, Ohio Última actualización: 16-Nov-16 22:07 Noticias generales Sugerencia Pregunta Bug Respuesta Joke Praise Rant Admin Utilice CtrlLeft / Right para cambiar Mensajes, CtrlUp / Down para cambiar de subprocesos, CtrlShiftLeft / Derecha para cambiar de página.

Comments

Popular Posts