关于算法:如何检测时间序列数据中的重大变化/趋势?

How to detect significant change / trend in a time series data?

所以我有一个25个样本的数组,我想能够注意到它是从25个样本时间间隔中减少n还是增加的趋势(基本上25个样本数组是我的缓冲区,每说1毫秒就填充一次)。

请注意,这是我正在寻找的一般趋势,而不是单个导数(就像我使用有限差分或其他数值微分技术获得的那样)。

基本上,我希望我的数据会很嘈杂,所以即使在进行过滤等操作之后,也可能会出现起伏。但这是我正在寻找的增加或减少行为的总趋势。

我想集成每毫秒的增加/减少行为来触发一些事件,这些事件更多的是用户界面事件(闪烁一个LED),因此只要我能检测到总体趋势,它就不必非常延迟处理。

事先谢谢!


正如已经指出的,你不是在寻找导数。你真的在为一个时间序列寻找一个"显著变化"的检测算法。

您当然需要一个平滑滤波器(移动平均滤波器也很好——请参阅Bjorn的这部分答案)。

但是除了平滑过滤器之外,您还需要一个决策标准或阈值选择器,在这个标准或阈值选择器之外,您将决定过滤后的更改是否重要。

如果您的时间序列的基础统计数据是稳定的(平稳时间序列),那么您可以使用固定的统计阈值,从平均值的标准偏差的意义上说。例如,如果您想要一个相当强的"警报"阈值,您可以选择2个标准偏差(仅在返回值的5%最强时才考虑警报)。

如果根本问题中没有任何东西表明时间序列是稳定的,例如,如果序列中可能有趋势,或者生成时间序列的底层进程在监视它的同时会经历基本的变化,那么您需要使用动态的或自适应的阈值,从信噪比的意义上来说(mu/sigma)。。然后,您可以选择检测通过信噪比测试的所有"有意义"元素。


我觉得你根本不想要这个导数。听起来你想要一个低通滤波器。低通滤波器只需去除快速变化的数据,并将较长、较慢的变化趋势留在原地。最直观的低通滤波器是移动平均滤波器,在这里取最后n个输入的平均值,其中n是根据噪声与所寻找趋势的大小来确定的。从音频数据到图像处理再到失业数据,这一点被广泛应用(四周移动平均失业率数据被广泛引用)。

如果您认为有必要,可以使用递归技术开发更高效/选择性的过滤器。您可以使用本教程创建低通滤波器。它是为音频而写的,但它可以处理大多数数据。它向您展示了如何编写钟形滤波器,但是低通滤波器更容易编写。

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


如果你知道信号统计数据,你可以使用维纳滤波器,并将其用作N步超前预测器。你的趋势决定可以很容易地基于维纳滤波器的预测。如果信号不是广义平稳的,并且你认为预测不能线性进行(非线性/非平稳过程),那么你可以使用像LMS滤波器那样的自适应维纳滤波器。