Solución:
Para calcular una media móvil exponencial, necesita mantener algún estado y necesita un parámetro de ajuste. Esto requiere una pequeña clase (suponiendo que esté usando Java 5 o posterior):
class ExponentialMovingAverage {
private double alpha;
private Double oldValue;
public ExponentialMovingAverage(double alpha) {
this.alpha = alpha;
}
public double average(double value) {
if (oldValue == null) {
oldValue = value;
return value;
}
double newValue = oldValue + alpha * (value - oldValue);
oldValue = newValue;
return newValue;
}
}
Cree una instancia con el parámetro de decaimiento que desee (puede necesitar un ajuste; debe estar entre 0 y 1) y luego use average(…)
Filtrar.
Al leer una página sobre alguna recurrencia matemática, todo lo que realmente necesita saber al convertirla en código es que a los matemáticos les gusta escribir índices en matrices y secuencias con subíndices. (También tienen algunas otras notaciones, lo que no ayuda). Sin embargo, la EMA es bastante simple, ya que solo necesita recordar un valor anterior; no se requieren matrices de estado complicadas.
Me está costando entender sus preguntas, pero intentaré responder 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 disminución monótonos (es decir, “siempre subiendo” o “siempre bajando”). A menos que promedie TODOS sus datos, sus puntos de datos, tal como los presenta, no son lineales. Si realmente desea encontrar el valor máximo entre dos puntos en el tiempo, corte su matriz de t_min
para t_max
y encuentre el máximo de ese subarreglo.
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 primer número); la segunda (nueva lista) es el promedio de 1.4 y 1.5 (tercera y segunda lista antigua); el tercero (lista nueva) el promedio de 1.5 y 1.4 (cuarto y tercero), y así sucesivamente. Podría haberlo hecho “período tres” o “cuatro”, o “n”. Observe cómo los datos son mucho más fluidos. Una buena forma de “ver los promedios móviles en funcionamiento” es ir a Google Finance, seleccionar una acción (prueba Tesla Motors; bastante volátil (TSLA)) y hacer clic en “datos técnicos” en la parte inferior del gráfico. Seleccione “Media móvil” con un período determinado y “Media móvil exponencial” para comparar sus diferencias.
El promedio móvil exponencial es solo otra elaboración de esto, pero pondera los datos “más antiguos” menos que los datos “nuevos”; esta es una forma de “sesgar” el suavizado hacia atrás. Lea la entrada de Wikipedia.
Entonces, esto es más un comentario que una respuesta, pero el pequeño cuadro de comentarios era demasiado pequeño. Buena suerte.