【发布时间】:2015-05-01 00:08:29
【问题描述】:
这个问题与数学问题有关,但我在这里问它的原因是因为我想要一个使用 boost 的解决方案。如果您认为这更适合 SE 数学,请告诉我。
我有一个来自一组任意算法的错误值样本;
std::vector<double> errors {/* some values */};
假设errors 中的值呈正态分布,我需要一个算法来告诉我浮点值低于,其中任何数字至少构成n-sigma 事件。使用68–95–99.7 rule,如果n 为2,那么我想知道低于该数字的数字,数据集中存在的数字最多为5%。
double getSigmaEventValue(const std::vector<double>& container, int n);
现在,我怀疑这个问题已经在 boost accumulator library 中为我解决了,但我缺乏数学知识来准确地找出我在寻找什么。
我知道我可以使用boost::accumulators::variance 获得方差,但我不知道我可以使用任何魔法将方差转换为 n-sigma 值,因此这可能不是最好的方法。我对使用 boost 很感兴趣,因为我已经在这个数据集上执行了一组时间关键的统计数据(中值、平均值、方差、最小值和最大值),所以很可能至少有一些为此所需的计算已经被缓存了.
【问题讨论】:
-
如果您希望它会为您缓存内容,我认为您还没有完全掌握该库的功能。这些统计数据的琐碎计算不太可能成为您的性能瓶颈。获取数据肯定会花费更多。最后,在没有很好地理解统计数据的情况下编写代码是一个糟糕的举动。慢一点。退后。充分了解你在做什么。如果你这样做,你会更快到达那里。
-
我想,你需要标准差:
sigma = sqrt(accumulators::moment<2>(acc)) -
@DavidHeffernan 我不应该提到性能的事情,这真的是一个短暂的想法。我通读了
boost::accumulator文档,它提到了缓存来自先前请求的值,所以我认为重用这些数据会很好(我查看了median实现的boost 代码,它使用mean如果您之前已经请求过平均值,那么可能中位数计算的一部分是“免费的”)。 -
@Nikerboker 如何使用它来识别 n-sigma 事件?