【问题标题】:How do I identify an n-sigma event in a sample?如何识别样本中的 n-sigma 事件?
【发布时间】: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&lt;2&gt;(acc))
  • @DavidHeffernan 我不应该提到性能的事情,这真的是一个短暂的想法。我通读了boost::accumulator 文档,它提到了缓存来自先前请求的值,所以我认为重用这些数据会很好(我查看了median 实现的boost 代码,它使用mean如果您之前已经请求过平均值,那么可能中位数计算的一部分是“免费的”)。
  • @Nikerboker 如何使用它来识别 n-sigma 事件?

标签: c++ algorithm boost


【解决方案1】:

如果您的数据呈正态分布,则计算样本均值和样本方差。这定义了您的拟合分布。然后计算该分布的分位数。例如,这个问题从 Boost 的角度涵盖了该主题:Quantile functions in boost (C++)

当然,如果您的数据不是正态分布的,而且您显然没有理由相信它是正态分布的,那么您提出的任何计算都将毫无意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多