7

Boost.Accumulator では、サンプルをアキュムレータに追加し、そこから統計量を抽出できます。例えば:

acc(1.)
acc(2.)
acc(3.)
cout << mean; // 2

skewnessライブラリには、 、kurtosis、など、より複雑な統計量が多数ありますp_square_cumulative_distribution

私がやりたいことは次のようなものです:

acc(1.)
acc(2.)
acc(3.)
std::cout << mean(acc); // 2
acc.pop() // withdraw the first value (1.)
std::cout << mean(acc); // 2.5

pop()FIFO (先入れ先出し) 方式で機能します。私がやろうとしているのは、スライディングタイムウィンドウ内でオンライン(増分)方式でデータの統計情報を計算することです。

アキュムレータは、すべての値を内部的に保持する必要があります。

私は自分で行うこともできますが、常に最初に既存のライブラリを確認するのが好きです。データが着信または発信するときに量をスマートに計算することに気付いていないアルゴリズムがあるかもしれません。

4

3 に答える 3

10

「スライディングタイムウィンドウ」について言及したので、1つのオプションは、最後のNサンプルの平均であるローリング平均(ローリング合計とローリングカウントもあります)を使用することです。必要に応じて、ウィンドウ サイズが異なる個別のアキュムレータを作成できます。

typedef accumulator_set<double,
                stats<tag::rolling_mean>
                > my_accumulator;

my_accumulator acc(tag::rolling_window::window_size = 3);
acc(1.);
acc(2.);
acc(3.);
std::cout << rolling_mean(acc);
// Reset accumulator and use different window size
acc = my_accumulator(tag::rolling_window::window_size = 2);
acc(2.);
acc(3.);
std::cout << rolling_mean(acc);

また、これらの実装を見ると、boost/circular_buffer.hpp.

于 2012-09-26T03:19:05.037 に答える
2

データをベクターではなく に保存したい場合があるstd::dequeため、挿入と削除の両方が一定の複雑さを持つ可能性があります。ベクトルを使用すると、代わりに必然的に線形になります。

それ以外は、コレクションにアルゴリズムを適用するのは非常に簡単なことです。しかし、不思議なことに、利用可能なアルゴリズムのかなり明白なセットのように見えるにもかかわらず、既に作成され、テストされたそのようなアルゴリズムのコレクションを私は知りません。

価値のあることとしては、データをコレクションからアキュムレータにフィードして、可能な統計を計算するアダプタを構築するのはかなり簡単です。いくつかのケースでは、結果を段階的に計算するためにアキュムレータがおそらく少し余分な作業を行う必要がありますが、気にするのに十分な効率を失うことはほとんどないと思います。

于 2012-09-26T02:48:54.020 に答える
1

おそらく、すべてのサンプルをベクトルに保持し、計算ごとにベクトルからそれらを累積する必要があります。このようなもの: https://stackoverflow.com/a/7616783/219136

于 2012-09-26T01:36:05.197 に答える