Monday 27 November 2017

Código Java Promedio Móvil Exponencial


¿Qué es AvgOldValue ahora (no, no está definido en su código) Por favor, no aplique ediciones de corrección de quothot desordenadas al código publicado que sólo introducen más errores. Publique el código real que está utilizando. Don39t crear alguna versión especial que derivó para publicar aquí. Danos lo real. De esta manera, tienes una verdadera crítica. Ndash I39ll añadir comentarios mañana 31 de agosto a las 23:08 Sus nombres de variable son todos sub-par. Por qué las abreviaturas innecesarias (por ejemplo, Avg) Por qué los prefijos impares (f. e. lValue) Aquí está mi sugerencia simple y última cuando se trata de nombres: Nombre las cosas después de lo que están haciendo o lo que contienen. Y mi regla final: Nunca se le permite usar una letra de nombres de variables, con la única excepción de ser dimensiones. Ese es un excelente ejemplo de un comentario inútil. En general, no veo por qué su clase es estática. Parece que se utilizará como una clase de instancia, pero usted no quiere pasar la referencia, simplemente ha creado un singleton aquí. Considere la posibilidad de crear una clase de instancia y luego pasar la referencia / instancia a los hilos que comparten esa instancia. Tengo esencialmente una matriz de valores como este: La matriz anterior es demasiado simplificada, estoy coleccionando 1 valor por milisegundo en mi código real y necesito Procesar la salida en un algoritmo que escribí para encontrar el pico más cercano antes de un punto en el tiempo. Mi lógica falla porque en mi ejemplo anterior, 0.36 es el pico real, pero mi algoritmo miraría hacia atrás y vería el último número 0.25 como el pico, pues hay una disminución a 0.24 antes de él. El objetivo es tomar estos valores y aplicarles un algoritmo que los suavice un poco para que tenga valores más lineales. (Es decir: la identificación como mis resultados para ser curvy, no jaggedy) se me ha dicho que aplique un filtro de media móvil exponencial a mis valores. ¿Cómo puedo hacer esto? Es realmente difícil para mí para leer las ecuaciones matemáticas, trato mucho mejor con el código. ¿Cómo procesar los valores en mi matriz, aplicando un cálculo de promedio móvil exponencial para igualarlos? Preguntado Feb 8 12 at 20:27 Para calcular una media móvil exponencial. Usted necesita mantener un poco de estado alrededor y usted necesita un parámetro de ajuste. Esto requiere una pequeña clase (asumiendo que está usando Java 5 o posterior): Instantiate con el parámetro de decadencia que desea (puede tomar la afinación debe estar entre 0 y 1) y luego use average () para filtrar. Al leer una página sobre alguna recurrencia matemática, todo lo que realmente necesita saber al convertirlo en código es que a los matemáticos les gusta escribir índices en matrices y secuencias con subíndices. Sin embargo, la EMA es bastante simple, ya que sólo es necesario recordar un valor antiguo que no requiere arrays de estado complicado. Respondió 8 Feb a las 20:42 TKKocheran: Bastante. No es bueno cuando las cosas pueden ser simples (si comienza con una nueva secuencia, obtenga un nuevo averager). Observe que los primeros términos de la secuencia promediada saltarán alrededor de un bit debido a efectos de límite, pero obtendrá aquellos con otras medias móviles también. Sin embargo, una buena ventaja es que usted puede envolver la lógica del promedio móvil en el averager y experimentar sin molestar el resto de su programa demasiado. Ndash Donal Fellows Feb 9 12 en 0:06 Estoy teniendo un rato difícil entender sus preguntas, pero intentaré contestar de todos modos. 1) Si su algoritmo encontró 0.25 en lugar de 0.36, entonces es incorrecto. Está mal porque asume un aumento o una disminución monotónica (que siempre sube o baja siempre). A menos que usted promedio TODOS sus datos, sus puntos de datos --- como usted los presenta --- son no lineales. Si realmente desea encontrar el valor máximo entre dos puntos en el tiempo, corte su matriz de tmin a tmax y busque el máximo de ese subarray. 2) Ahora, el concepto de promedios móviles es muy simple: imagina que tengo la siguiente lista: 1.4, 1.5, 1.4, 1.5, 1.5. Puedo suavizarlo tomando el promedio de dos números: 1.45, 1.45, 1.45, 1.5. Observe que el primer número es el promedio de 1,5 y 1,4 (segundo y primeros números), la segunda (nueva lista) es el promedio de 1,4 y 1,5 (tercera y segunda lista antigua) la tercera (nueva lista) el promedio de 1,5 y 1,4 (Cuarto y tercero), y así sucesivamente. Podría haberlo hecho el período tres o cuatro, o n. Observe cómo los datos son mucho más suaves. Una buena manera de ver los promedios móviles en el trabajo es ir a Google Finance, seleccionar una acción (probar Tesla Motors bastante volátil (TSLA)) y hacer clic en technicals en la parte inferior de la tabla. Seleccione Promedio móvil con un período determinado y Promedio móvil exponencial para comparar sus diferencias. La media móvil exponencial es sólo otra elaboración de esto, pero los pesos de los datos más antiguos menos de los nuevos datos de esta es una manera de sesgar el alisamiento hacia la parte posterior. Por favor, lea la entrada de Wikipedia. Por lo tanto, esto es más un comentario que una respuesta, pero el pequeño cuadro de comentarios era sólo a pequeño. Buena suerte. Si usted está teniendo apuro con la matemáticas, usted podría ir con una media móvil simple en vez de exponencial. Así que la salida que obtendrías serían los últimos x términos divididos por x. Pseudocódigo no comprobado: Tenga en cuenta que tendrá que manejar las partes inicial y final de los datos, ya que claramente no puede medirse los últimos 5 términos cuando está en su segundo punto de datos. Además, hay maneras más eficientes de calcular este promedio móvil (suma suma - más reciente más reciente), pero esto es para obtener el concepto de lo que está sucediendo a través de. Respondió 8 de febrero a las 20: 41 Método de media móvil Java Si está buscando una EMA que esté optimizada para la transmisión de datos, obtenida de un archivo o servicio de cotización, la siguiente clase de ejemplo lo hará bien, en lugar de utilizar cálculos de fuerza bruta . Este enfoque es particularmente útil si está procesando datos en tiempo real. Los EMAs, un caso especial de promedios móviles ponderados, tienen el beneficio de que la ponderación relativa para cada período sucesivo disminuye con un factor constante f2 / (N1), donde N es el número de periodos sobre los cuales se aplica la EMA. En la siguiente clase de ejemplo se implementa esta naturaleza iterativa de EMA y se minimizan los requerimientos de computación sobre los valores de brute - Métodos de fuerza o métodos de post-procesamiento. Private int numPeriods 0 privado int totalPeriodos 0 privado double runningEMA 0.0 privado doble factor 0.0 público EMA (int numPeriods) this. numPeriods numPeriods factor 2.0 / (numPeriods 1.0) / Restablecer los cálculos para generar EMA para el período dado. / Public void reset (int numPeriods) / Devuelve EMA para el periodo define durante el constructor. Si los períodos procesados ​​son menores que el rango EMA, se devuelve cero. / Public double calcular (doble precio) runningEMA factorprice (1 factor) runningEMA if (totalPeriods lt numPeriods) Desde donde se obtienen los datos de precios y lo que se hace con los resultados de EMA depende de usted. Por ejemplo, si tiene los datos de precio en una matriz y desea calcular una EMA en otra matriz, el siguiente fragmento funcionará: dos precios. (50) // 50 periodo EMA para (int idx0 iltprices. length idx) emaidx ema (pricesidx) Buena suerte, y los mejores deseos para su proyecto .

No comments:

Post a Comment