在 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(先进先出)方式工作。我想要做的是在滑动时间窗口内以在线(增量)方式计算我的数据的统计信息。累加器必须在内部保留所有值。
我可以自己做,但我总是喜欢先检查现有的库,并且可能有我不知道的算法,可以在数据传入或传出时巧妙地计算数量。
最佳答案
既然您提到了“滑动时间窗口”,那么一种选择是使用滚动平均值(还有滚动总和和滚动计数),即最后 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/