在 Boost.Accumulator 中,您可以向累加器添加样本,然后从中提取统计量。例如:

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

该库有许多更复杂的统计量,例如 skewnesskurtosisp_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(先进先出)方式工作。我想要做的是在滑动时间窗口内以在线(增量)方式计算我的数据的统计信息。

累加器必须在内部保留所有值。

我可以自己做,但我总是喜欢先检查现有的库,并且可能有我不知道的算法,可以在数据传入或传出时巧妙地计算数量。

最佳答案

既然您提到了“滑动时间窗口”,那么一种选择是使用滚动平均值(还有滚动总和和滚动计数),即最后 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

关于具有删除旧样本能力的 C++ 累加器库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12593119/

10-12 21:38