6

時系列データ ({x,y} ペアのリスト) があり、それを平滑化したい場合は、次のように指数移動平均を使用できます。

EMA[data_, alpha_:.1] := 
  Transpose @ {#1, ExponentialMovingAverage[#2, alpha]}& @@ Transpose@data

二重指数平滑法をどのように実装しますか?

DEMA[data_, alpha_, gamma_] := (* unstub me! *)

それ自体でアルファとガンマの適切な値を見つけ出すことができれば、それは非常に素晴らしいことです。


時系列にギャップがある場合、つまり、サンプルが時間の経過とともに均一に分散されていない場合の処理​​方法に関する関連する質問:

さまざまな時間でサンプリングされた指数移動平均

4

2 に答える 2

3

これが最速のコードかどうかはわかりませんが、次のコードで実行できるようです。

DEMA[data_, alpha_, gamma_] := 
 Module[{st = First[data], bt = data[[2]] - data[[1]], btnew, stnew},
  Reap[
    Sow[st];
    Do[
     stnew = alpha y + (1 - alpha) (st + bt);
     btnew = gamma (stnew - st) + (1 - gamma) bt;
     Sow[stnew];
     st = stnew;
     bt = btnew;
     , {y, Rest@data}]][[-1, 1]
   ]]

これは、参照したページからほぼ直接です。ソース コードで b の初期条件を変更できます。最初に bt をゼロに設定すると、単一指数平滑化が復元されます。

In[81]:= DEMA[{a, b, c, d}, alpha, gamma]

Out[81]= {a, (1 - alpha) b + alpha b, 
 alpha c + (1 - alpha) ((1 - alpha) b + 
     alpha b + (-a + b) (1 - gamma) + (-a + (1 - alpha) b + 
        alpha b) gamma), 
 alpha d + (1 - 
     alpha) (alpha c + (1 - 
        gamma) ((-a + b) (1 - gamma) + (-a + (1 - alpha) b + 
           alpha b) gamma) + (1 - alpha) ((1 - alpha) b + 
        alpha b + (-a + b) (1 - gamma) + (-a + (1 - alpha) b + 
           alpha b) gamma) + 
     gamma (-(1 - alpha) b - alpha b + 
        alpha c + (1 - alpha) ((1 - alpha) b + 
           alpha b + (-a + b) (1 - gamma) + (-a + (1 - alpha) b + 
              alpha b) gamma)))}
于 2011-04-04T04:09:18.353 に答える
1

これが私の定式化です:

DEMA[data_, alpha_, gamma_] :=
 FoldList[
   Module[{x, y},
     x = #[[1]] + #[[2]];
     y = #2 - alpha x;
     {y + x, #[[2]] + gamma * y}
     ] &,
   {data[[1]], data[[2]] - data[[1]]},
   alpha * Rest@data
 ][[All, 1]]
于 2011-04-04T08:19:37.047 に答える