如何检测时间序列数据中的显著变化/趋势?

30

我有一个包含25个样本的数组,我想要能够注意到这25个样本时间间隔内是否在递减或递增(基本上,25个样本数组是我的缓冲区,每1毫秒填充一次)。

请注意,我寻找的是普遍趋势,而不是单个导数(如使用有限差分或其他数值微分技术所获得的导数)。

基本上,我期望我的数据是嘈杂的,因此即使进行过滤等操作后仍可能有起伏。但是我要寻找的是递增或递减行为的一般趋势。

我想要将每毫秒的递增/递减行为集成起来以触发一些用户界面事件(例如闪烁LED),因此它不必非常延迟处理,只要我能检测到一般趋势就可以了。

感谢您提前的帮助!

3个回答

37

正如已经指出的,您不是在寻找导数。实际上,您正在寻找用于时间序列的“显着变化”检测算法。

您肯定需要一个平滑滤波器(移动平均滤波器很好 - 有关此部分,请参见Bjorn的回答)。

但是除了平滑滤波器外,您还需要一个决策标准或阈值选择器,超过此阈值,您将决定是否认为过滤后的更改是显着的。

如果您的时间序列的基本统计信息是稳定的(平稳时间序列),则可以使用固定的统计阈值,即与平均值相差的标准偏差。例如,如果您想要一个相当强的“警报”阈值(只在最强的5%的回报上发出警报),则可以选择2个标准偏差。

如果没有任何东西表明您的时间序列是稳定的,也就是说,序列中可能存在趋势,或者在监视时生成时间序列的基本进程可能经历基本性的变化,那么您将需要使用动态或自适应阈值,即信噪比(mu / sigma)。然后,您可能选择检测所有通过信噪比测试的“有意义”的元素。


1
请参考 https://dev59.com/C2Eh5IYBdhLWcg3wTB1c?noredirect=1&lq=1 中的自适应阈值算法。 - Jean-Paul

15

听起来您并不需要求导数,而是需要一个低通滤波器。低通滤波器只是去除快速变化的数据,并保留较长、缓慢变化的趋势。最直观的低通滤波器是移动平均滤波器,其中您取最后 n 个输入的平均值,n 的大小取决于您要查找的噪声和趋势的大小。这在从音频数据到图像处理再到失业数据(四周移动平均失业率数据广为引用)的各种领域中被广泛使用。

如果您认为有必要,可以使用递归技术开发更有效/选择性的滤波器。您可以使用本教程创建低通滤波器。它是为音频编写的,但几乎可以用于任何数据。它将向您展示如何编写钟形滤波器,但低通滤波器更简单。

http://blog.bjornroche.com/2012/08/basic-audio-eqs.html


2

如果您已知信号统计数据并将其用作n步预测器,则可以使用维纳滤波器。然后,您可以基于维纳滤波器的预测轻松地做出趋势决策。如果信号不是宽平稳的,并且您认为无法进行线性预测(非线性/非平稳过程),则可以使用自适应维纳滤波器,例如LMS滤波器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接