これまでに受信したカウントと合計データを保存せずに移動累積平均を計算する方法を見つけようとしています。
私は 2 つのアルゴリズムを思いつきましたが、どちらもカウントを保存する必要があります。
- 新しい平均 = ((古いカウント * 古いデータ) + 次のデータ) / 次のカウント
- 新しい平均 = 古い平均 + (次のデータ - 古い平均) / 次のカウント
これらの方法の問題点は、カウントがどんどん大きくなり、結果として得られる平均の精度が失われることです。
最初の方法では、明らかに 1 離れている古いカウントと次のカウントを使用します。これにより、カウントを削除する方法があるのではないかと考えましたが、残念ながらまだ見つけていません。ただし、少し先に進み、2 番目の方法になりましたが、カウントはまだ存在します。
それは可能なのか、それとも私は不可能なものを探しているだけなのか?
ベストアンサー1
次のように簡単に実行できます:
double approxRollingAverage (double avg, double new_sample) {
avg -= avg / N;
avg += new_sample / N;
return avg;
}
N
は平均化したいサンプルの数です。この近似値は指数移動平均と同等であることに注意してください。参照:C++ でローリング平均 / 移動平均を計算する