校正运行平均值中的异常值

机器算法验证 异常值 移动平均线 厨师距离
2022-01-30 16:01:59

我们有一个从一些传感器读取数据的守护进程,它计算的内容(除了简单地报告状态)是传感器从一个值变为另一个值所需的平均时间。它保持 64 个数据点的运行平均值,并假设运行时间相当恒定。

不幸的是,如下图所示,输入数据并不是最原始的:

(每条线代表一组不同的数据;x 轴除了模糊的历史时间轴之外并没有真正的意义)。

我处理这个问题的明显解决方案是创建数据的直方图,然后选择模式。但是,我想知道是否还有其他方法可以产生更好的性能或更适合运行平均值的操作。一些快速的 Wikipedia 搜索表明检测异常值的算法也可能是合适的。简单是加分项,因为守护程序是用 C 编写的。

编辑:我搜索了维基百科并想出了这些不同的技术:

  • Chauvenet 的标准:使用平均值和标准差,计算特定数据点发生的概率,然后如果概率实际上是坏的小于 50%,则将其排除。虽然这似乎非常适合动态校正运行平均值,但我不太相信它的功效:似乎对于大型数据集,它不想丢弃数据点。

  • Grubbs 检验:另一种使用均值与标准差的差值的方法,当“没有异常值”的假设被拒绝时有一些表达

  • 库克距离:衡量数据点对最小二乘回归的影响;如果超过 1,我们的应用程序可能会拒绝它

  • 截断均值:丢弃低端和高端,然后取均值作为正常值

任何人都有任何具体经验并且可以评论这些统计技术吗?

另外,关于物理情况的一些评论:我们正在测量机械洗衣机完成之前的平均时间,因此它的运行时间应该是相当恒定的。我不确定它是否实际上具有正态分布。

编辑 2:另一个有趣的问题:当守护进程正在引导时,例如,没有任何以前的数据要分析,它应该如何处理传入的数据?根本不做任何异常值修剪?

编辑3:还有一件事......如果硬件确实发生了变化使得运行时确实变得不同,是否值得让算法足够健壮以至于它不会丢弃这些新的运行时,我应该只记得刷新发生这种情况时的缓存?

4个回答

如果您拥有的示例图是典型的,那么您列出的任何标准都将起作用。大多数这些统计方法都是为了在“这真的是一个错误吗?”的模糊级别上找到错误的边缘。但是您的问题看起来非常简单..您的错误不仅仅是与标准的几个标准偏差,它们是 20+。这对你来说是个好消息。

所以,使用最简单的启发式。始终接受前 5 个点左右,以防止启动峰值破坏您的计算。保持平均值和标准差。如果您的数据点超出标准 5 个标准差,则丢弃它并重复前一个数据点作为填充物。

如果您事先知道您的典型数据行为,您甚至可能不需要计算平均值和标准差,您可以硬连线绝对“拒绝”限制。这实际上更好,因为初始错误不会炸毁您的检测器。

什么构成异常值的定义必须扩展到数据本身。执行此操作的经典方法是计算每个数据点的 z 分数,并从平均值中剔除任何大于 3 z 分数的值。z 分数可以通过取数据点与平均值之间的差异并除以标准偏差来找到。

另一种解决方案是使用调和平均值。

您的案例与中讨论的示例非常相似

http://economistatlarge.com/finance/applied-finance/differences-arithmetic-geometric-harmonic-means