54

指数移動平均を計算したい連続値があります。通常、私はこれに標準の式を使用します。

  • S n =αY+(1-α)Sn -1

ここで、S nは新しい平均、αはアルファ、Yはサンプル、Sn-1は以前の平均です。

残念ながら、さまざまな問題のため、一貫したサンプル時間がありません。せいぜい1ミリ秒に1回など、サンプリングできることはわかっているかもしれませんが、制御できない要因により、一度に数ミリ秒はサンプルを取得できない場合があります。ただし、より一般的なケースとしては、0、1、および2ミリ秒でサンプリングする代わりに、少し早くまたは遅くサンプリングするという単純なケースがあります。0、0.9、2.1ミリ秒でサンプリングします。遅延に関係なく、サンプリング周波数はナイキスト限界をはるかに超えると予想しているため、エイリアシングについて心配する必要はありません。

最後のサンプルからの時間の長さに基づいてアルファを適切に変化させることにより、多かれ少なかれ合理的な方法でこれに対処できると思います。

これが機能するという私の推論の一部は、EMAが前のデータポイントと現在のデータポイントの間で「線形に補間」することです。次のサンプルリストのEMAを間隔tで計算することを検討する場合:[0,1,2,3,4]。入力が[0,2,4]になる間隔2tを使用すると、同じ結果が得られるはずですよね?EMAが、t2でt0以降の値が2であると想定した場合、それは[ 0,2,2,4,4 ]で計算される間隔tの計算と同じになりますが、これは実行されません。それとも、それはまったく意味がありますか?

誰かがアルファを適切に変える方法を教えてもらえますか?「あなたの作品を見せてください。」つまり、あなたの方法が本当に正しいことをしていることを証明する数学を見せてください。

4

8 に答える 8

55

この回答は、ローパス フィルター (「指数移動平均」は実際には単極ローパス フィルターにすぎません) についての私の理解に基づいていますが、探しているものについての漠然とした理解に基づいています。私はあなたが望むものは次のとおりだと思います:

まず、式を少し単純化できます (複雑に見えますが、コードでは簡単です)。出力に「Y」、入力に「X」を使用します (出力に S、入力に Y の代わりに)。

Y n = αX + (1-α)Y n-1 → Y n = Y n-1 + α(X - Y n-1 )

どのコードに:

 Y += alpha * (X-Y);

第 2 に、ここでの α の値は 1-e -Δt/τに「等しい」です。ここで、Δt はサンプル間の時間、τ はローパス フィルターの時定数です。これは、Δt/τ が 1 に比べて小さく、α = 1-e -Δt/τ ≈ Δt/τの場合にうまく機能するため、引用符で「等しい」と言います。(しかし、小さすぎないでください: 量子化の問題に遭遇します。また、いくつかの特殊な手法に頼らない限り、通常、状態変数 S に余分な N ビットの分解能が必要になります。ここで、N = -log 2 (α) です。) Δt/τ の値を超えると、α が 1 に近くなり、基本的に入力を出力に割り当てるだけになるまで、フィルタリング効果が消え始めます。

これは、さまざまなΔtの値で適切に機能するはずです(アルファが小さい限り、Δtの変化はそれほど重要ではありません。そうでない場合、かなり奇妙なナイキストの問題/エイリアシングなどに遭遇します)。プロセッサで作業している場合乗算が除算より安価である場合、または固定小数点の問題が重要な場合は、事前に ω = 1/τ を計算し、α の式を近似することを検討してください。

公式の導き方を知りたいなら

α = 1-e -Δt/τ

次に、その微分方程式のソースを検討します。

Y + τ dY/dt = X

X が単位ステップ関数の場合、解は Y = 1 - e -t/τになります。Δt の値が小さい場合、導関数は ΔY/Δt で近似できます。

Y + τ ΔY/Δt = X

ΔY/Δt = (XY)/τ

ΔY = (XY)(Δt/τ) = α(XY)

α = 1-e -Δt/τの「外挿」は、動作を単位ステップ関数の場合と一致させようとすることから生じます。

于 2009-06-22T15:21:44.417 に答える
8

こちらをご覧ください: http://www.eckner.com/research.html

2 番目のリンクを参照してください:「不均等な間隔の時系列のアルゴリズム: 移動平均とその他のローリング演算子」

このドキュメントには、必要なプログラミング アルゴリズムが正確に記述されていると思います。

于 2013-08-08T08:22:33.873 に答える
2

これは完全な答えではありませんが、その始まりかもしれません。1時間ほどのプレイでこれを手に入れた限りです。私が探しているものの例として、そしておそらく問題に取り組んでいる他の人へのインスピレーションとして投稿しています。

S 0から始めます。これは、前の平均 S -1とt 0で取得したサンプル Y 0から得られた平均です。(t 1 - t 0 ) はサンプル間隔であり、α はそのサンプル間隔と平均化する期間に適した値に設定されます。

t 1でサンプルを取得できず、代わりに t 2で取得したサンプル Y 2を処理する必要がある場合はどうなるかを考えました。では、方程式を展開して、Y 1があった場合に何が起こるかを確認することから始めることができます。

  • S 2 = αY 2 + (1-α)S 1、ここで S 1 = αY 1 + (1-α)S 0

代用:

  • S 2 = αY 2 + (1-α)(αY 1 + (1-α)S 0 )
  • S 2 = αY 2 + (1-α)αY 1 + (1-α)(1-α)S 0
  • S 2 = αY 2 + (1-α)αY 1 + (1-α) 2 S 0

右辺の S nを無期限に置き換えることができるため、級数がこのように無限に拡張しているように見えることに気付きました。

  • S 2 = αY 2 + (1-α)αY 1 + (1-α) 2 (αY 0 + (1-α)S -1 )
  • S 2 = αY 2 + (1-α)αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1

わかりましたので、実際には多項式ではありません (愚かな私) が、最初の項に 1 を掛けると、次のパターンが表示されます。

  • S 2 = (1-α) 0 αY 2 + (1-α)αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1

うーん、指数級数ですね。クェル・サプライズ!指数移動平均の方程式から出てくることを想像してみてください!

とにかく、私はこの x 0 + x 1 + x 2 + x 3 + ... を持っています。私は匂いがするeか、ここで自然対数が蹴られていると確信していますが、どこにいたか思い出せません。時間切れになる前に次へ。

于 2009-06-21T14:21:53.727 に答える
1

この質問に対する回答、またはそのような回答の正しさの証明は、測定するデータに大きく依存します。

サンプルがt0 = 0ms、t 1 = 0.9ms、t 2 = 2.1msで取得されたが、αの選択は1 ms間隔に基づいているため、ローカルで調整されたαnが必要な場合、選択の正しさは、t=1msおよびt=2msでのサンプル値を知ることを意味します。

これは、次の質問につながります。データを適切に補間して、中間の値が何であったかを正しく推測できるでしょうか。または、平均自体を補間することもできますか?

これらのどちらも不可能な場合、私が見る限り、中間値Y(t)の論理的な選択は、最近計算された平均です。つまり、Y(t) ≈Snであり、 nはtのように最大です。n <t。

この選択は単純な結果をもたらします。時差が何であっても、αはそのままにしておきます。

一方、値を内挿することが可能な場合は、平均可能な一定間隔のサンプルが得られます。最後に、平均自体を補間することさえ可能であるならば、それは質問を無意味にするでしょう。

于 2009-06-21T15:08:33.400 に答える
1

連続関数で指数関数的減衰平均を作成したいとします。ただし、その関数のすべての値を持っているわけではなく、いくつかのサンプルしかありません。この式は、連続平均での重みを使用して、サンプルの加重平均を作成します。

乗数n =アルファ時間n-時間n -1

Sum n = Val n + Sumn -1 *乗数n

カウントn =1+カウントn-1 *乗数n

平均n =合計n /カウントn

于 2009-06-21T15:53:28.203 に答える
0

値はそのままにalphaして、欠落しているデータを埋めます。

サンプリングできない時間に何が起こるかわからないため、これらのサンプルを 0 で埋めるか、以前の値を安定して保持し、それらの値を EMA に使用できます。または、新しいサンプルを取得したら、後方補間を行い、欠損値を埋めて、EMA を再計算します。

私が得ようとしているのは、x[n]穴のある入力があるということです。データが欠落しているという事実を回避する方法はありません。x[n]したがって、ゼロ次ホールドを使用するか、ゼロに設定するか、との間のある種の補間を使用できますx[n+M]。ここMで、 は欠落サンプルの数、n はギャップの開始です。の前に値を使用する可能性さえありますn

于 2009-06-21T13:35:06.177 に答える
0

これは、私の todo リストの未解決の問題に似ています。私は 1 つのスキームをある程度解決しましたが、この提案を裏付ける数学的作業はまだ行っていません。

更新と要約: 平滑化係数 (アルファ) を補正係数 (ここではベータと呼びます) から独立させたいと考えています。ここですでに受け入れられているジェイソンの優れた回答は、私にとってはうまくいきます。

最初の一歩。

  • 最後のサンプルが取得されてからの時間も測定できる場合 (一定のサンプリング時間の丸められた倍数で、最後のサンプルから 7.8 ミリ秒は 8 単位になります)、それを使用して平滑化を複数回適用できます。この場合、数式を 8 回適用します。現在の値に偏った平滑化を効果的に行いました。

第二段階。

  • より良いスムージングを得るには、前のケースで数式を 8 回適用しながらアルファを微調整する必要があります。

この平滑化近似では何が見落とされるでしょうか?

  • 上記の例では、すでに 7 つのサンプルが欠落しています。
  • これは、現在の値をさらに 7 回平坦化して再適用することで、ステップ 1 で概算されました。
  • alphaとともに適用される近似係数betaを定義すると(単なる alpha ではなく alpha*beta として)、失われた 7 つのサンプルが以前のサンプル値と現在のサンプル値の間で滑らかに変化していると想定されます。
于 2009-06-21T13:35:40.950 に答える