¿Cuál es un algoritmo rápido en línea para calcular la EWMA (media móvil ponderada exponencialmente) de una variable de entrada observada a intervalos irregulares?
Conozco la fórmula para cuando se toman muestras a intervalos regulares:
Calcular el alfa a partir de la vida media:
$$ \alpha = 1 - e^{\frac{\ln{.5}}{H}} $$
Calcular el EWMA de x:
$$ E = \alpha\cdot x + (1-\alpha)\cdot E_{-1} $$
¿Cuál es el algoritmo para hacer lo mismo cuando el intervalo de muestreo es irregular?
Editar:
He encontrado un algoritmo en línea, que pretende lograr un EWMA irregular.
double operator()(double x)
{
if (isnan(prev_ewma_)) // we don't decay the first sample
{
prev_ewma_ = x;
prev_time_ = Time::now();
return x;
}
double time_decay = Time::now() - prev_time_;
double alpha = 1 - std::exp(-time_decay / halflife_);
double ewma = alpha * x + (1 - alpha) * prev_ewma_;
prev_ewma_ = ewma;
prev_time_ = now;
return ewma;
}
¿Es correcto este algoritmo?
0 votos
Tenga en cuenta que lo que es $\alpha$ en este código es $1-\alpha$ en su puesto (y viceversa). Aparte de eso me parece que está bien.
0 votos
@noob2 Creo que es porque
alpha
en el código se calcula comoexp(...)
mientras que en la fórmula es1 - exp(...)
0 votos
Además de este código, también hay que decidir qué hacer cuando se necesita el valor de EWMA entre las observaciones. Por ejemplo, usted observó un par de valores hace mucho tiempo y ahora necesita un valor EWMA actualizado. Los descompones a cero o no.
0 votos
@LazyCat buen punto - no había pensado en eso
0 votos
@noob2 He actualizado el código para reflejar tu comentario