Hi,
I’m trying to implement an exponential moving average (EMA) on Nx/Explorer.
The formula for EMA(x) is:
EMA(x1) = x1
EMA(xn) = α * xn + (1 - α) * EMA(xn-1)
I think I need somehow previous value of EMA in rolling series . I can’t figure out how to do it.
Thanks in advance for a hint .
Consider a rearrangement of the equations above:
EMA(x_1) = x_1
(a-1)*EMA(x_(n-1)) + EMA(x_n) = a * x_n
This is a system of linear equations for all the values of EMA(x_n)
:
A * EMA = b
where:
EMA = column vector of EMA values
b = column vector of [x_1, a * x_2, a * x_3, ... , a * x_N]
A = square NxN matrix
1 0 0 0 ...
(a-1) 1 0 0 ...
0 (a-1) 1 0 ...
...more rows...
... 0 0 (a-1) 1
The straightforward approach from here would be to use Nx.LinAlg.solve/2
.
For large data sets, the matrix A
will be unwieldy and mostly zero - there are specialized algorithms for solving “banded” equations like this with less storage.
Hi,
I think I need something similar to Enum.reduce or Enum.map_reduce , for example DataFrame.map_reduce or Series.reduce .
Series.cum_sum needs to store the accumulator to perform somehow the computation .
Is it possible to implement those functionality inside Explorer lib to keep accumulator ?