【问题标题】:Rapid change detection algorithm快速变化检测算法
【发布时间】:2017-12-27 13:33:55
【问题描述】:

我正在记录一个房间的温度值,并将它们保存到数据库中。我想在温度突然升高时收到警报。我不能设置固定值,因为冬天可以接受 18°C,夏天可以接受 25°C。但是,如果它在 30 分钟内从 20°C 跳到 25°C 并保持这样的状态 5 分钟(以消除错误读数),我想被告知。

我目前的想法是获取最近 30 分钟 (A) 的读数和最近 5 分钟 (B) 的读数,计算 A 和 B 的中值并检查它们之间的差异是否小于我想要的阈值。

这是解决这个问题的正确方法还是有更好的算法?我搜索了一个特定的,但其中大多数似乎过于复杂。

谢谢!

【问题讨论】:

  • 梯度为 ΔTemp / ΔTime 应该会给您所需的测量值。
  • 在 30 分钟内从 20° 跃升到 25° 似乎相当缓慢,并且可能只是因为太阳从窗户射进来。
  • 了解 CUSUM 方法。
  • 这取决于您对“突然”的定义和其他因素。你提到的方法可以工作。另一种方法是通过对差异进行运行样本来估计温度随时间的梯度。然后你可以在这个的绝对值上设置一些阈值。如果您担心读数错误,可以采用梯度的滚动平均值。

标签: algorithm math time-series


【解决方案1】:

检测时间序列中的变化是一个经过充分研究的主题,关于这个主题已经写了数百篇甚至数千篇论文。正如您所见,许多方法都非常先进,但被证明对许多用例都非常有用。无论您选择哪种方法,您都应该根据真实的模拟数据对其进行评估,并针对您的用例优化其参数。

根据您的需要,让我建议一个非常简单的方法,在许多情况下证明足够好,并且与您考虑的非常相似。

基本上,您有两个顾虑:

  • 检测采样噪声信号中的单调变化
  • 忽略错误读数

首先,请注意,中位数不常用于检测趋势。对于系列 (1,2,3,30,35,3,2,1),5 个连续项的中位数为 (3, 3, 3, 3)。使用平均值更为常见。

一个常见的技巧是在平均之前抛出极值(例如,对于每 7 个值,只平均中间的 5 个)。如果预计会有很多错误读数 - 尝试以更快的速度进行测量,并抛出更多的极端值(例如,对于每 13 个值,中间 9 个值的平均值)。

此外,您应该丢弃不可行的值并用最后测量的值替换它们(不可行意味着超出范围或非物理变化率)。

您将短期指标与长期指标进行比较的想法是个好主意,而且确实很常用(例如在计量经济学中)。

引自“金融计量模型 - 对该领域的一些贡献 [Nicolau, 2007]:

买入和卖出信号由价格的两条移动平均线生成 水平:长期平均和短期平均。一个典型的 移动平均线交易规则规定买入(卖出)时 短期移动平均线与长期移动平均线交叉 从下(上)(即当原始时间序列上升时) (下降)相对较快)。

【讨论】:

    【解决方案2】:

    当您说“突然上升”时,从数学上讲,您是在谈论温度信号导数的幅度。

    有一种很好的算法可以同时平滑信号并计算其导数,称为 Savitzky–Golay 滤波器。它在 Wikipedia 上通过示例进行了解释,或者您可以使用 Matlab 来帮助您生成所需的卷积系数。一旦你有了系数,计算就非常简单了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      相关资源
      最近更新 更多