[algorithm - Peak signal detection in realtime timeseries data - Stack Overflow](https://stackoverflow.com/questions/22583391/peak-signal-detection-in-realtime-timeseries-data/)
> Brakel, J.P.G. van (2014). "Robust peak detection algorithm using z-scores". Stack Overflow. Available at: https://stackoverflow.com/questions/22583391/peak-signal-detection-in-realtime-timeseries-data/22640362#22640362 (version: 2020-11-08).
## 問題設定
- ピークの幅は事前に決定できない
- ピークの高さが他の値と大きく乖離している
- アルゴリズムはリアルタイムで更新される(つまり、新しいデータポイントごとに更新される)。
## アルゴリズム
私は、このようなタイプのデータセットに非常に有効なアルゴリズムを思いつきました。このアルゴリズムは分散の原理に基づいています。新しいデータポイントが移動平均から与えられた標準偏差の数だけ離れている場合、アルゴリズムはシグナルを出します([[Z-score]]とも呼ばれます)。
このアルゴリズムは、シグナルが閾値を超えないように、移動平均と偏差を別々に構築するため、非常に堅牢です。そのため、過去のシグナルの量に関わらず、将来のシグナルはほぼ同じ精度で識別されます。アルゴリズムには3つの入力があります:lag = 移動窓のラグ、threshold = アルゴリズムがシグナルを発するZスコア、influence = 平均値と標準偏差に対する新しいシグナルの影響力(0と1の間)です。例えば、ラグが5の場合、データを平滑化するために最後の5つの観測値を使用します。しきい値が3.5の場合、データポイントが移動平均から3.5標準偏差離れている場合に信号を送ります。また、影響力が0.5の場合、通常のデータポイントが持つ影響力の半分をシグナルに与えます。同様に、影響力が0の場合は、新しいしきい値を再計算する際にシグナルを完全に無視します。したがって、影響力0は最もロバストなオプションであり(ただし、定常性を前提としている)、影響力オプションを1にすると最もロバストではない。非定常データの場合、影響力オプションは0と1の間に設定する必要があります。