リアルタイム時系列データにおけるピーク信号検出 質問する

リアルタイム時系列データにおけるピーク信号検出 質問する

以下のデータを分析しています。

データのプロット

生データ(スペースで区切る):

1 1 1.1 1 0.9 1 1 1.1 1 0.9 1 1.1 1 1 0.9 1 1 1.1 1 1 1 1 1.1 0.9 1 1.1 1 1 0.9 1 1.1 1 1 1.1 1 0.8 0.9 1 1.2 0.9 1 1 1.1 1.2 1 1.5 1 3 2 5 3 2 1 1 1 0.9 1 1 3 2.6 4 3 3.2 2 1 1 0.8 4 4 2 2.5 1 1 1

3 つの大きな「グローバル」ピークといくつかの小さな「ローカル」ピークがあることがはっきりとわかります。このデータは次のように説明できます。

  1. 一般的な平均で基本的なノイズがある
  2. ノイズの分布は、指数分布族
  3. ノイズ(ピーク)から大きく外れたデータポイントがある
  4. データはリアルタイムで観測されます(期間ごとに新しいデータポイントが観測されます)

一般的なノイズを無視しながら、ピークをリアルタイムで識別するにはどうすればよいでしょうか?

ベストアンサー1

堅牢なピーク検出アルゴリズム(Zスコアを使用)

私は、このような種類のデータセットに非常によく機能するアルゴリズムを考案しました。それは、分散: 新しいデータポイントが移動平均から指定されたx標準偏差数だけ離れている場合、アルゴリズムはシグナルを発します。このアルゴリズムは、移動平均と偏差を別々に構築するため、以前のシグナルが将来のシグナルのシグナルしきい値を損なわないため、非常に堅牢です。したがって、アルゴリズムの感度は以前のシグナルに対して堅牢です。

アルゴリズムには 3 つの入力が必要です。

  1. ラグ。履歴データの平均と標準偏差を計算する移動ウィンドウのラグ。ウィンドウが長いほど、より多くの履歴データが考慮されます。ウィンドウが短いほど適応性が高くなり、アルゴリズムは新しい情報にすばやく適応します。たとえば、ラグが 5 の場合、最後の 5 つの観測値を使用してデータが平滑化されます。
  2. しきい値Zスコアアルゴリズムが信号を出すしきい値です。簡単に言うと、新しいデータポイントと移動平均の間の距離が、データの移動標準偏差に掛けたしきい値よりも大きい場合、アルゴリズムは信号を提供します。たとえば、しきい値が 3.5 の場合、データポイントが移動平均から 3.5 標準偏差離れている場合に信号が出されます。
  3. 影響度。移動平均と移動標準偏差の計算における新しい信号の影響度(0~1)。たとえば、影響度パラメータが0.5の場合、新しい信号は通常のデータポイントの影響度の半分になります。同様に、影響度が0の場合、新しいしきい値の再計算で信号が完全に無視されます。したがって、影響度が0の場合、最も堅牢なオプションです(ただし、定常性); 影響オプションを 1 に設定すると、最も堅牢性が低くなります。したがって、非定常データの場合、影響オプションは 0 から 1 の間に設定する必要があります。

動作は次のように行われます。

擬似コード

# Let y be a vector of timeseries data of at least length lag+2
# Let mean() be a function that calculates the mean
# Let std() be a function that calculates the standard deviaton
# Let absolute() be the absolute value function

# Settings (these are examples: choose what is best for your data!)
set lag to 5;          # average and std. are based on past 5 observations
set threshold to 3.5;  # signal when data point is 3.5 std. away from average
set influence to 0.5;  # between 0 (no influence) and 1 (full influence)

# Initialize variables
set signals to vector 0,...,0 of length of y;   # Initialize signal results
set filteredY to y(1),...,y(lag)                # Initialize filtered series
set avgFilter to null;                          # Initialize average filter
set stdFilter to null;                          # Initialize std. filter
set avgFilter(lag) to mean(y(1),...,y(lag));    # Initialize first value average
set stdFilter(lag) to std(y(1),...,y(lag));     # Initialize first value std.

for i=lag+1,...,t do
  if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then
    if y(i) > avgFilter(i-1) then
      set signals(i) to +1;                     # Positive signal
    else
      set signals(i) to -1;                     # Negative signal
    end
    set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1);
  else
    set signals(i) to 0;                        # No signal
    set filteredY(i) to y(i);
  end
  set avgFilter(i) to mean(filteredY(i-lag+1),...,filteredY(i));
  set stdFilter(i) to std(filteredY(i-lag+1),...,filteredY(i));
end

データに適したパラメータを選択するための経験則を以下に示します。


デモ

堅牢な閾値アルゴリズムのデモンストレーション

このデモのMatlabコードは以下にあります。ここデモを使用するには、デモを実行し、上部のチャートをクリックして自分で時系列を作成するだけです。アルゴリズムは、lag一定数の観測値を描画した後に動作を開始します。


結果

元の質問の場合、このアルゴリズムは次の設定を使用すると次の出力を生成しますlag = 30, threshold = 5, influence = 0

閾値アルゴリズムの例


さまざまなプログラミング言語での実装:


アルゴリズムを設定するための経験則

ラグ。ラグパラメータは、データがどの程度平滑化されるか、また、データの長期平均の変化に対してアルゴリズムがどの程度適応するかを決定します。ラグが大きいほど、定常データが多ければ多いほど、より多くのラグを含める必要があります (これにより、アルゴリズムの堅牢性が向上します)。データに時間とともに変化する傾向が含まれている場合は、アルゴリズムをこれらの傾向にどれだけ早く適応させたいかを考慮する必要があります。つまり、lag10 に設定すると、しきい値が長期平均の体系的な変化に合わせて調整されるまでに 10 期間 (データ ポイント) かかります。したがって、lagデータの傾向動作とアルゴリズムをどの程度適応させたいかに基づいてパラメーターを選択してください。

影響。このパラメータは、アルゴリズムの検出しきい値に対する信号の影響を決定します。0 に設定すると、信号はしきい値に影響を与えず、過去の信号に影響されない平均と標準偏差で計算されたしきい値に基づいて将来の信号が検出されます。0.5 に設定すると、信号は通常のデータ ポイントの半分の影響を持ちます。これについて考える別の方法は、影響を 0 に設定すると、暗黙的に定常性を想定するということです (つまり、信号がいくつあっても、時系列は長期的に同じ平均に戻ると常に予想されます)。そうでない場合は、信号がデータの時間変動傾向に体系的に影響できる程度に応じて、影響パラメータを 0 から 1 の間に設定します。たとえば、信号がデータの時間変動傾向につながる場合、構造破壊時系列の長期平均の場合、影響パラメータを高く(1 に近く)設定して、しきい値が構造的変化に迅速に反応できるようにする必要があります。

しきい値。しきい値パラメータは、移動平均からの標準偏差の数であり、それを超えるとアルゴリズムは新しいデータポイントをシグナルとして分類します。たとえば、新しいデータポイントが移動平均より 4.0 標準偏差上にあり、しきい値パラメータが 3.5 に設定されている場合、アルゴリズムはデータポイントをシグナルとして識別します。このパラメータは、予想されるシグナルの数に基づいて設定する必要があります。たとえば、データが正規分布している場合、しきい値 (または: z スコア) が 3.5 の場合、シグナル確率は 0.00047 (このテーブル) は、2128 データポイントごとに 1 回 (1/0.00047) の信号が期待されることを意味します。したがって、しきい値はアルゴリズムの感度に直接影響し、それによってアルゴリズムが信号を送信する頻度も決定します。独自のデータを調べて、必要なときにアルゴリズムが信号を送信する適切なしきい値を選択します (目的に適したしきい値を見つけるには、ここで試行錯誤が必要になる場合があります)。


警告: 上記のコードは、実行されるたびに常にすべてのデータポイントをループします。このコードを実装するときは、信号の計算を別の関数 (ループなし) に分割するようにしてください。その後、新しいデータポイントが到着したら、 を 1 回更新しますfilteredYavgFilter新しいstdFilterデータポイントがあるたびにすべてのデータの信号を再計算しないでください (上記の例のように)。これは、リアルタイム アプリケーションでは非常に非効率的で遅くなります。

アルゴリズムを変更するその他の方法(潜在的な改善のため)は次のとおりです。

  1. 平均値の代わりに中央値を使用する
  2. 使う堅牢な規模の尺度標準偏差の代わりに中央絶対偏差(MAD)など
  3. 信号マージンを使用して、信号が頻繁に切り替わらないようにします。
  4. 影響パラメータの動作方法を変更する
  5. 上昇信号と下降信号を別々に処理する(非対称処理)
  6. influence平均と標準偏差の別々のパラメータを作成します(このSwiftの翻訳のように

この StackOverflow の回答に対する (既知の) 学術的引用:

この回答のアルゴリズムを使用した他の作品

この回答からのアルゴリズムの他の応用

他のピーク検出アルゴリズムへのリンク


このアルゴリズムを参照する方法:

Brakel, JPG van (2014)。「Z スコアを使用した堅牢なピーク検出アルゴリズム」。Stack Overflow。入手可能:https://stackoverflow.com/questions/22583391/peak-signal-detection-in-realtime-timeseries-data/22640362#22640362(バージョン: 2020-11-08)。

Bibtex @misc{brakel2014、author = {Brakel、JPG van}、title = {z スコアを使用した堅牢なピーク検出アルゴリズム}、url = {https://stackoverflow.com/questions/22583391/peak-signal-detection-in-realtime-timeseries-data/22640362#22640362}、language = {en}、year = {2014}、urldate = {2022-04-12}、journal = {Stack Overflow}、howpublished = {https://stackoverflow.com/questions/22583391/peak-signal-detection-in-realtime-timeseries-data/22640362#22640362}}


この関数をどこかで使用する場合は、上記の参照を使用して私をクレジットしてください。アルゴリズムについて質問がある場合は、以下のコメントに投稿するか、私に連絡してください。リンクトイン


おすすめ記事