首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有删除旧样本能力的C++累加器库

具有删除旧样本能力的C++累加器库
EN

Stack Overflow用户
提问于 2012-09-26 08:51:38
回答 3查看 2.7K关注 0票数 7

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

代码语言:javascript
运行
复制
acc(1.)
acc(2.)
acc(3.)
cout << mean; // 2

该库有许多更复杂的统计量,如skewnesskurtosisp_square_cumulative_distribution

我想做的是这样的:

代码语言:javascript
运行
复制
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()将以先进先出的方式工作。我正在尝试做的是在滑动时间窗口内以在线(增量)的方式计算我的数据的统计数据。

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

我可以自己做,但我总是喜欢先检查现有的库,可能有一些算法我不知道,当数据传入或传出时,它会智能地计算数量。

EN

回答 3

Stack Overflow用户

发布于 2012-09-26 11:19:05

由于您提到了“滑动时间窗口”,一种选择是使用滚动平均值(还有滚动总和和滚动计数),这是最后N个样本的平均值。根据您的需要,您可以创建具有不同窗口大小的单独累加器。

代码语言:javascript
运行
复制
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

票数 10
EN

Stack Overflow用户

发布于 2012-09-26 10:48:54

您可能希望将数据存储在std::deque中,而不是向量中,因此插入和删除操作都可能具有恒定的复杂性。如果你使用一个向量,那么它必然是线性的。

除此之外,将算法应用于集合是一件非常简单的事情。然而,奇怪的是,我不知道已经编写和测试了这样的算法的集合,尽管看起来似乎有一套相当明显的算法可用。

无论如何,构建一个适配器来将数据从集合馈送到累加器以计算您可以使用的统计数据是相当简单的。在一些情况下,累加器可能不得不做一些额外的工作来增量地计算结果,但我猜很少会失去足够的效率来关心。

票数 2
EN

Stack Overflow用户

发布于 2012-09-26 09:36:05

您可能只需要将所有样本保存在一个向量中,然后在每次计算时从向量中累积它们。如下所示:https://stackoverflow.com/a/7616783/219136

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12593119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档