获得平均值和擦除数字有很大差异[关闭]

Posted

技术标签:

【中文标题】获得平均值和擦除数字有很大差异[关闭]【英文标题】:Getting mean and erasing numbers with to much difference [closed] 【发布时间】:2013-08-14 13:23:11 【问题描述】:

所以,假设我有一个列表,其中包括: 2231, 2240, 2236, 2238, 7

现在这些数字来自一个传感器,一个高度传感器,所以有些数字可能是错误的,比如7

如果我想得到一个合理的平均值,我会过滤掉7,作为算法我会怎么做?请在 Python、C++ 甚至 Frink 中展示可理解的代码(我打算使用它。)

我想过使用标准差,但我不知道如何实现它。 对不起,我找不到任何我尝试过的代码,我在它不起作用后将其删除。

【问题讨论】:

哦,是的,很抱歉。我试过将每个数字减半并将其乘以 2,然后用它做一些疯狂的事情,但它不适用于低数字。我想为每个十万个数字制作 if,但这似乎不切实际。我在纸上做了一些滑雪,它们看起来不错,但不起作用。 我想到的第一个想法是设置一个容差值,比如 1000。然后删除小于mean-tolerance 或大于mean+tolerance 的数字 是的,正如 Fallen 所说,容差是个好主意,我们正在做某种相同的项目,我们有 5% 的容差率,所以如果下一个值不接近,它将被视为错误,但是您可以使用此公差百分比来找到最适合您的方法 关键规则是如何在数学上确定应排除的点。可能是与局部平均值的距离阈值。有了这个规则,您可以将它作为谓词提供给 std::remove_if。可以使用最小二乘法来确定趋势。 你也可以考虑使用中位数,因为它不受这些极端值的影响 【参考方案1】:

使用标准偏差:

#!/usr/local/bin/python2.7
import math

lista = [2231, 2240, 2236, 2238, 7]

newlist = []
mean = 0
newmean = 0
variance = 0

for i in lista:
    mean += i
mean = mean/float(len(lista))

for i in lista:
    variance += (i*i)
variance = variance/float(len(lista))
variance = math.sqrt(variance)

minval = variance - mean
maxval = variance + mean

for i in lista:
    if i >= minval and i <= maxval:
        newlist.append(i)
print newlist

for i in newlist:
    newmean += i
newmean = newmean/float(len(newlist))
print newmean

如果您想手动输入“minval”和“maxval”,可以跳过大部分代码。

【讨论】:

【参考方案2】:

我假设您可以在两个读数之间定义 ACCEPTABLE_DIFFERENCE。如果您的值可以根据读数从最小值/最大值跳出,那么任何平均值都不会真正帮助您。

以下是说明这一点的python示例代码:

#!/usr/local/bin/python2.7

ACCEPTABLE_DIFF = 100

arr = [2231, 2240, 2236, 2238, 7]

for index in range(1,len(arr)):
  if (abs(arr[index] - arr[index-1]) > ACCEPTABLE_DIFF):
    del arr[index]


print arr

另一种方法是使用差异百分比:

#!/usr/local/bin/python2.7

ACCEPTABLE_DIFF_PERC = 5

arr = [2231, 2240, 2236, 2238, 7]

for index in range(1,len(arr)):
  if (abs(arr[index] - arr[index-1]) > (arr[index-1]*ACCEPTABLE_DIFF_PERC/100)):
    del arr[index]


print arr

【讨论】:

是的,这很好,但是如果 arr 是 [21231, 22240, 22236, 22304, 7],那么 ACCEPTABLE_DIFF 应该类似于 1000 您的观点有效。然而,此差异特定于您的使用领域和您使用的传感器。可以说是最大值的 10%。计算运行中的值太耗费资源,并且没有提供额外的功能。它甚至会稳定在某个平均值上,当读数发生变化时,算法会丢弃有效值!

以上是关于获得平均值和擦除数字有很大差异[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何获得蜂巢中时间戳的平均差异

如何在 HTML5 中动画和擦除弧线

sap系统每月有几个物料的实际与标准价格差异很大,看了下实际价格取的MM03里的移动平均价,怎么解决

各种存储介质的差异

使用 jQuery 创建、读取和擦除 cookie [重复]

矢量排序和擦除不起作用