web-dev-qa-db-ja.com

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

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

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

ここでSn は新しい平均、αはアルファ、Yはサンプル、Sはn-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 値はtから2でした、これは、[0,2,2,4,4]で計算する間隔tの計算と同じになりますが、これは実行されません。それとも、それはまったく意味がありますか?

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

49
Curt J. Sampson

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

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

Yn =αX+(1-α)Yn-1 →Yn = Yn-1 +α(X-Yn-1

どのコードに:

 Y += alpha * (X-Y);

次に、ここでのαの値は1-eに「等しい」です。-Δt/τ ここで、Δtはサンプル間の時間、τはローパスフィルターの時定数です。 Δt/τが1に比べて小さく、α= 1-eの場合にうまく機能するため、引用符で「等しい」と言います。-Δt/τ ≈Δt/τ。 (ただし、小さすぎないでください。量子化の問題が発生します。エキゾチックな手法を使用しない限り、通常、状態変数Sに追加のNビットの解像度が必要です。ここでN = -log2(α)。 )Δ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=(X-Y)/τ

ΔY=(X-Y)(Δt/τ)=α(X-Y)

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

47
Jason S

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

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

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

6
Bent Tranberg

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

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

Tでサンプルを見逃したらどうなるか考えました1 代わりにサンプルYを使用する必要があります2 tで撮影2?さて、方程式を拡張して、Yがあった場合に何が起こったかを確認することから始めることができます1

  • S2 =αY2 +(1-α)S1、ここでS1 =αY1 +(1-α)S

置換:

  • S2 =αY2 +(1-α)(αY1 +(1-α)S
  • S2 =αY2 +(1-α)αY1 +(1-α)(1-α)S
  • S2 =αY2 +(1-α)αY1 +(1-α)2S

Sを代用できるので、このようにシリーズが無限に伸びているように見えることに気づきました。n 右側に無期限に:

  • S2 =αY2 +(1-α)αY1 +(1-α)2(αY +(1-α)S-1
  • S2 =αY2 +(1-α)αY1 +(1-α)2αY +(1-α)3S-1
  • 等.

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

  • S2 =(1-α)αY2 +(1-α)αY1 +(1-α)2αY +(1-α)3S-1

うーん:それは指数シリーズです。 Quelle驚き!指数移動平均の方程式から出てくることを想像してみてください!

とにかく、私はこのxを持っています + x1 + x2 + x3 + ...物事は進んでおり、eの匂いがするか、自然対数がこの辺りを蹴っているのは確かですが、時間がなくなる前に次にどこに向かっていたのか思い出せません。

2
Curt J. Sampson

(1-αに等しいわずかに異なるαを使用することによって質問からのもの)、Sの既存の平均に新しい値Yを追加するための基本式 このように見えます:

S(Y、S)=

(1-α)Y +αS =

Y-αY+αS =

Y +α(S-Y)

ここで、時間間隔tの長さを追加し、αだけがそのtに依存すると仮定すると、その式は次のようになります。

S(Y、t、S)= Y +αt(S-Y)

ここで、t = tと仮定します1 + t2。時間間隔tにYの2つの値を加算して平均を作成する場合1 およびt2、結果の平均は次のようになります。

S(Y、t2、S(Y、t1、S))=

Y +αt2(S(Y、t1、S)-Y)=

Y +αt2((Y +αt1(S-Y))-Y)=

Y +αt2αt1(S-Y)

この平均が、t間隔全体が一度に追加された場合と同じである場合、次のようになります。tt1αt2。この要件を満たすαの定義は次のとおりです。

αバツ := Aバツ (定数Aの場合)

理由:

αt = At = At1 + t2 = At1 At2t1αt2

これにより、次の平均化関数が生成されます。

S(Y、t、S)= Y + At(S-Y)

私はこれを実際にテストしていませんが、私が行った仮定があなたのシナリオに適合する場合、これはサンプリング間隔の変動を非常にうまく処理できる平均化関数のように見えます。

1
sth

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

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

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

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

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

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

1
balpha

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

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

n =ヴァルn +合計n-1*乗数n

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

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

1
yairchu

alpha値はそのままにして、不足しているデータを入力します。

サンプリングできないときに何が起こるかわからないため、これらのサンプルに0を入力するか、前の値を安定させてEMAに使用することができます。または、新しいサンプルを取得したら、後方補間を行い、不足している値を入力して、EMAを再計算します。

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

0
freespace

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

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

最初の一歩。

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

第二段階。

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

この平滑化近似は何を見逃しますか?

  • 上記の例では、すでに7つのサンプルが欠落しています。
  • これは、ステップ1で次のように概算されました。 平らにされた 現在の値をさらに7回再適用
  • 近似係数を定義すると ベータ それは一緒に適用されます アルファ (単なるアルファではなくアルファ*ベータとして)、7つの欠落したサンプルが前のサンプル値と現在のサンプル値の間でスムーズに変化していると想定します。
0
nik