计算一组数字的均值而忽略异常值

时间:2011-06-01 11:26:20

标签: c++ math

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

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

{ 90, 91, 92, 95, 2, 3, 99, 92, 92, 91, 300, 91, 92, 99, 400 }

上面的集合很清楚大多数数字位于9099之间,但是我有一些异常值,如{ 300, 400, 2, 3 }。我需要计算这些数字的平均值而忽略异常值。我确实记得在统计课上读过类似的内容,但我不记得它是什么或如何处理解决方案。

非常感谢任何帮助..

由于

4 个答案:

答案 0 :(得分:4)

你能做的是:

  1. 估算数据中异常值的百分比:约为提供数据集的25%(4/15),
  2. 计算足够的分位数:数据集的8分位数,以排除异常值,
  3. 估算第一个和最后一个分位数之间的平均值。
  4. PS:构成数据集25%的异常值很多!

    PPS:对于第二步,我们假设异常值是“对称分布的”。请参见下图,我们使用4分位数和Q1和Q3的四分位数范围(IQR)的1.5倍:enter image description here

答案 1 :(得分:2)

首先,您需要确定标准偏差和全套的平均值。异常值是那些与(全集)均值大于3个标准差的值。

答案 2 :(得分:2)

一种效果很好的简单方法是取中位数而不是平均值。中位数对异常值的影响要大得多。

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

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

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

答案 3 :(得分:1)

我对此非常小心。你可能在做自己,你的结论很不利。

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

然而,你可能会因此而丢掉重要的东西。正态分布不是神圣的;现实生活中的异常值远比正态分布所暗示的要多得多。阅读Taleb的"Black Swan"以了解我的意思。

在您这样做之前,请务必完全理解您要排除的内容。我认为留下所有数据点,疣和所有数据会好得多,并为它们提供一个好的书面解释。

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