C++ 在忽略异常值的情况下计算一组数字的平均值

C++ 在忽略异常值的情况下计算一组数字的平均值,c++,math,C++,Math,首先,这是一个数学问题,而不是编码问题,所以请耐心等待。 我试图找出一个算法来计算一组数字的平均值。然而,我需要忽略任何与大多数结果不接近的数字。下面是我正在尝试做的一个例子: 假设我有一组类似于以下的数字: { 90, 91, 92, 95, 2, 3, 99, 92, 92, 91, 300, 91, 92, 99, 400 } 显然,对于上面的集合,大多数数字位于90和99之间,但是我有一些异常值,如{300,400,2,3}。我需要计算这些数字的平均值,同时忽略异常值。我确实记得在统计

首先,这是一个数学问题,而不是编码问题,所以请耐心等待。 我试图找出一个算法来计算一组数字的平均值。然而,我需要忽略任何与大多数结果不接近的数字。下面是我正在尝试做的一个例子:

假设我有一组类似于以下的数字:

{ 90, 91, 92, 95, 2, 3, 99, 92, 92, 91, 300, 91, 92, 99, 400 }
显然,对于上面的集合,大多数数字位于
90
99
之间,但是我有一些异常值,如
{300,400,2,3}
。我需要计算这些数字的平均值,同时忽略异常值。我确实记得在统计课上读到过类似的东西,但我不记得是什么,也不记得如何解决这个问题

如蒙帮助,我将不胜感激


谢谢

首先您需要确定全套的标准偏差和平均值。离群值是指与(整套)平均值的标准偏差大于3的值。

一个简单有效的方法是取中值而不是平均值。中位数对异常值更为稳健

您还可以最小化Geman-McClure函数:

x^ = argmin sum( G(xi - x')), where G(x) = x^2/(x^2+sigma^2)

如果你绘制G函数,你会发现它是饱和的,这是一个很好的方法来柔和地排除异常值。

我会非常小心的。你可能会对自己和你的结论造成极大的伤害

您的程序应该如何识别异常值?正态分布表示99.9%的值在平均值的+/-三个标准偏差范围内,因此您可以计算未过滤数据的这两个值,排除超出假设范围的值,然后重新计算

然而,这样做可能会丢掉一些重要的东西。正态分布并不神圣;离群值在现实生活中比正态分布所显示的更为常见。读塔勒布的书,看看我的意思

在你这样做之前,确保你完全理解你要排除的东西。我认为最好留下所有的数据点、缺点和所有东西,并为它们提出一个好的书面解释

另一种方法是使用中位数等替代指标,它对异常值的敏感度比平均值低。但是,计算起来比较困难。

您可以做的是:

  • 估计数据中异常值的百分比:约占所提供数据集的25%(4/15)
  • 计算适当的分位数:为数据集计算8个分位数,以便排除异常值
  • 估计第一个和最后一个分位数之间的平均值
  • PS:构成数据集25%的离群值太多了


    PPS:对于第二步,我们假设异常值“对称分布”。请参见下图,其中我们使用了4个分位数和1.5倍的四分位间距(IQR),从Q1到Q3:

    我编辑了您的问题,讨论的是“异常值”而不是“奇数”,这可能会被解释为完全不同的东西!是的,谢谢,我在为我自己寻找合适的词。我喜欢这里这个词的用法,它通常用于处理异常值,你可以计算中值而不是平均值。可能的重复:这种方法的问题是异常值会使标准差的估计产生偏差。对于对异常值更为稳健的方法,请参见我的答案。这是一个修剪平均值,但正如static_rtti所指出的,使用标准偏差而非固定限值与非正态分布无关。该方法仅适用于大数据集和关于数据分布正态性的强假设。对于大多数问题,这是不够的。@mah:异常值的问题完全取决于应用程序。如果您有一个有故障的传感器(例如),异常值是无效的,应该丢弃。为什么不试着回答OP的问题,而不是猜测他真正需要做什么?请不要怀疑,我是在评论你之前的评论。我想我们同意:)你的回答听起来可以接受(我不是说可以),但很明显,你说的是统计术语。据我所知,我认为“红蛇”不是统计学家。也许你应该解释一下这些术语(Geman McClure function等)的含义以及如何实现它们。你会对我们有好处的。Thanks@afaolek谢谢,我正要问同样的问题,尽管我在谷歌上搜索ArgMin,看看如何计算它。从计算(扭曲的)平均值或中值到最小化高维函数,无论多么平滑,都有一个非常巨大的步骤。如果您可以编辑您的答案,为这个优化问题提供一个封闭形式的解决方案(或一个简单的算法),那么它将非常有用。否则,这个问题就太复杂了。我给出了公式,你还想要什么?如果你告诉我你不懂什么,我可以试着解释更多。@Alexandre C:什么高维函数?最小化函数只有一个参数,假设数据是一维的(OP问题就是这样)。我不是假装这是解决每个问题的最佳方案,只是举个例子说明可以做什么。这正是我想要的,我完全忘记了IQR thx a lotOh,这里给出的集合只是一个例子,不是真实的例子。我认为值得一提的是IQR代表什么。