我在一个房间记录温度值,将它们保存到数据库中。当温度突然升高时,我想得到警报。我不能设定固定值,因为冬天可接受18°C,夏季可接受25°C。但如果它在20°C到25°C之间跳跃,比方说,30分钟并保持这样5分钟(以消除错误的读数),我想得到通知。
我目前的想法是从最近30分钟(A)读取读数并从最后5分钟读取(B),计算A和B的中位数,并检查它们之间的差异是否小于我想要的阈值。
这是解决这个问题的正确方法吗?还是有更好的算法?我搜索了一个特定的,但大多数看起来过于复杂。
谢谢!
答案 0 :(得分:0)
检测时间序列中的变化是一个研究得很好的主题,关于这个主题已经写了数百篇甚至数千篇论文。正如您所见,许多方法都相当先进,但事实证明它对许多用例非常有用。无论您选择哪种方法,都应该根据模拟数据的实际情况对其进行评估,并针对您的用例优化其参数。
根据您的要求,让我建议一个非常简单的方法,在许多情况下证明是足够好的,并且与您考虑的非常相似。
基本上,您有两个问题:
首先,请注意中位数并不常用于检测趋势。对于系列(1,2,3,30,35,3,2,1),连续5个项的中位数是(3,3,3,3)。使用平均值更为常见。
一个常见的技巧是在平均之前抛出极值(例如,对于每7个值平均只有中间5)。如果预计会有很多错误的读数 - 尝试以更快的速度进行测量,并抛出更多极值(例如,对于每个13个值,中间值为9)。
此外,你应该丢掉不可行的值并用最后一个测量值替换它们(不可行的意思是超出范围,或非物理变化率)。
您将短期措施与长期措施进行比较的想法是一个好主意,实际上它通常被使用(例如在计量经济学中)。
引自“金融计量经济模型 - 对该领域的一些贡献[Nicolau,2007]:
买入和卖出信号是由价格的两个移动平均线产生的 级别:长期平均值和短期平均值。一个典型的 移动平均交易规则规定买入(卖出)时 短期移动平均线穿越长期移动平均线 从下面(上图)(即原始时间序列上升时) (下降)相对较快)。
答案 1 :(得分:0)
当你说"突然升起时,"在数学上,你在谈论温度信号的导数的大小。
有一种很好的算法可以同时平滑信号并计算其衍生物,称为Savitzky-Golay滤波器。它通过Wikipedia上的示例进行了解释,或者您可以使用Matlab帮助您生成所需的卷积系数。一旦得到系数,计算就非常简单。