質問

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

  • 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 がそれを想定していたとしたら、t 時点で2 t 以降、値は 2 でした0, 、これは [0,2,2,4,4] を計算する間隔 t の計算と同じですが、それは実行されていません。それともそれはまったく意味がありますか?

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

役に立ちましたか?

解決

この回答は、ローパスフィルターに関する十分な理解(<!> quot;指数移動平均<!> quot;は実際には単極ローパスフィルターです)に基づいていますが、見ているものに対するぼんやりとした理解にとって。以下があなたが望むものだと思います:

最初に、方程式を少し単純化することができます(より複雑に見えますが、コードでは簡単です)。 <!> quot; Y <!> quot;を使用します。出力および<!> quot; X <!> quot;入力用(出力用のSおよび入力用のYの代わりに)。

Y n = <!>#945; X +(1-<!>#945;)Y n-1 <!>#8594; Y n = Y n-1 + <!>#945;(X-Y n-1

次のコード:

 Y += alpha * (X-Y);

第二に、<!>#945の値。ここに<!> quot; equal <!> quot; to 1-e -<!>#916; t / <!>#964; ここで<!>#916; tはサンプル間の時間、<!>#964;ローパスフィルターの時定数です。 <!> quot; equal <!> quot;と言います。これは<!>#916; t / <!>#964; 1に比べて小さく、<!>#945; = 1-e -<!>#916; t / <!>#964; <!>#8776; <!>#916; t / <!>#964 ;. (ただし、小さすぎません:量子化の問題に遭遇します。いくつかのエキゾチックな手法に頼らない限り、通常、状態変数SにNビットの追加の解像度が必要です(N = -log 2 (<!>#945;)。)<!>#916; t / <!>#964;の値が大きい場合<!>#945に到達するまで、フィルタリング効果は消え始めます。は1に近く、基本的には入力を出力に割り当てるだけです。

これは<!>#916; tのさまざまな値で適切に機能するはずです(アルファが小さい限り、<!>#916; tのバリエーションはそれほど重要ではありません。さもないと、かなり奇妙なナイキスト問題が発生します。 /エイリアシング/など)、および乗算が除算よりも安価なプロセッサで作業している場合、または固定小数点の問題が重要な場合は、<!>#969;を事前計算します。 = 1 / <!>#964 ;、および<!>#945;の式を近似しようとすることを検討してください。

式の導出方法を本当に知りたい場合

<!>#945; = 1-e -<!>#916; t / <!>#964;

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

Y + <!>#964; dY / dt = X

Xが単位ステップ関数の場合、解Y = 1-e -t / <!>#964; を持ちます。 <!>#916; tの小さい値の場合、導関数は<!>#916; Y / <!>#916; tで近似でき、次のようになります

Y + <!>#964; <!>#916; Y / <!>#916; t = X

<!>#916; Y / <!>#916; t =(X-Y)/ <!>#964;

<!>#916; Y =(X-Y)(<!>#916; t / <!>#964;)= <!>#945;(X-Y)

および<!> quot;外挿<!> quot; <!>#945; = 1-e -<!>#916; t / <!>#964; は、単位ステップ関数の場合と動作を一致させようとすることから生じます。

他のヒント

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

2番目のリンクを見てください:<!> quot; <!> quot;不等間隔の時系列のアルゴリズム:移動平均およびその他のローリング演算子<!> quot;

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

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

S 0 で開始します。これは、前の平均S -1 とtで取得したサンプルY 0 の結果の平均です 0 。 (t 1 -t 0 )は私のサンプル間隔で、<!>#945;そのサンプル間隔と平均したい期間に適したものに設定されます。

t 1 でサンプルを見逃し、代わりにt 2 2 で間に合わせる必要がある場合、どうなるかを考えました>?方程式を展開して、Y 1 があった場合に何が起こるかを確認することから始めましょう。

  • S 2 = <!>#945; Y 2 +(1-<!>#945;)S 1 、ここでS 1 = <!>#945; Y 1 +(1-<!>#945;)S 0

置換:

  • S 2 = <!>#945; Y 2 +(1-<!>#945;)(<!>#945; Y 1 +(1-<!>#945;)S 0
  • S 2 = <!>#945; Y 2 +(1-<!>#945;)<!>#945; Y 1 +(1-<!>#945;)(1-<!>#945;)S 0
  • S 2 = <!>#945; Y 2 +(1-<!>#945;)<!>#945; Y 1 +(1-<!>#945;) 2 S 0

右側のS n を無期限に置き換えることができるため、このようにシリーズが無限に拡張されるように見えることに気付きます:

  • S 2 = <!>#945; Y 2 +(1-<!>#945;)<!>#945; Y 1 +(1-<!>#945;) 2 (<!>#945; Y 0 +(1-<!>#945;) S -1
  • S 2 = <!>#945; Y 2 +(1-<!>#945;)<!>#945; Y 1 +(1-<!>#945;) 2 <!>#945; Y 0 +(1-<!>#945;)< sup> 3 S -1
  • など

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

  • S 2 =(1-<!>#945;) 0 <!>#945; Y 2 +(1- <!>#945;)<!>#945; Y 1 +(1-<!>#945;) 2 <!>#945; Y 0 +(1-<!>#945;) 3 S -1

Hm:指数級数です。 Quelleサプライズ!指数移動平均の方程式から出てくることを想像してください!

とにかく、これはx 0 + x 1 + x 2 + x 3 +です。 ..順調に進んでおり、この辺りでeまたは自然対数の匂いがしていると確信していますが、時間がなくなる前に次にどこに向かっていたか思い出せません。

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

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

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

これらのどちらも可能でない場合、私が見る限り、中間値Y(t)の論理的な選択は最近計算された平均、つまりY(t)です。 <!>#8776; S n ここで、nは、t n <!> lt; tとなるように最大です。

この選択には、単純な結果があります。<!>#945のままにしてください。時間差が何であれ、単独で。

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

わずかに異なる<!>#945;を使用してそれは(1-<!>#945; 質問からのもの)、S 0 の既存の平均に新しい値Yを追加する基本式に等しい次のようになります。

  

S(Y、S 0 )=

     

(1-<!>#945;)Y + <!>#945; S 0 =

     

Y-<!>#945; Y + <!>#945; S 0 =

     

Y + <!>#945;(S 0 -Y)

ここで時間間隔tの長さを追加し、単に<!>#945;そのtに依存し、その式は次のようになります。

  

S(Y、t、S 0 )= Y + <!>#945; t (S 0 -Y)

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

  

S(Y、t 2 、S(Y、t 1 、S 0 ))=

     

Y + <!>#945; t 2 (S(Y、t 1 、S 0 )-Y)=

     

Y + <!>#945; t 2 ((Y + <!>#945; t 1 (S 0 -Y))-Y)=

     

Y + <!>#945; t 2 <!>#945; t 1 ( S 0 -Y)

この平均がt間隔全体が一度に追加される場合と同じである場合、<!>#945; t = <!>#945; t 1 <!>#945; t 2 。 <!>#945;の定義この要件を満たすのは次のとおりです。

  

<!>#945; x := A x <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp;(for定数A)

理由:

  

<!>#945; t = A t =   A t 1 + t 2 =   A t 1 A t 2 =   <!>#945; t 1 <!>#945; t 2

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

  

S(Y、t、S 0 )= Y + A t (S 0 -Y)

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

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

Multiplier n = Alpha Time n -Time n-1

Sum n = Val n + Sum n-1 * Multiplier n

Count n = 1 + Count n-1 * Multiplier n

Avg n = Sum n / Count n

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

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

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

の前の値を使用している可能性もあります。

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

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

最初の一歩。

  • 最後のサンプルが取得されてからの時間 (定数サンプリング時間の四捨五入された倍数で計算します。つまり、最後のサンプルから 7.8 ミリ秒は 8 単位になります) も測定できる場合は、それを使用して平滑化を複数回適用することができます。この場合、式を 8 回適用します。事実上、現在の値に偏った平滑化が行われました。

第二段階。

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

この平滑化近似では何が欠けるのでしょうか?

  • 上の例ではすでに 7 つのサンプルが欠落しています
  • これはステップ 1 で次のように近似されました。 平らになった 現在の値をさらに 7 回再適用します
  • 近似係数を定義すると ベータ と一緒に適用されます アルファ (単なるアルファではなくアルファ*ベータとして)、7 つの欠落サンプルが以前のサンプル値と現在のサンプル値の間で滑らかに変化していたと仮定します。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top