我有一个比较奇怪的问题。我目前正在处理时间序列数据,数据集中有几个峰值。这些数据是通过中子密度记录仪收集的,它描述了传感器在一段时间内持续记录的事件。数据中的峰值对应于机器在钻孔中下降时的一些有趣的区间。因此,这些峰值很重要。然而,重要的不仅仅是峰值,而是整个区间(或者至少如我所描述的;请参见我附件中的图表)。现在我的问题是,是否有信号处理方法(最好是用Python)可以让我将这个信号划分成不同的区间,每个区间对应于局部最小值/最大值?
我的初步方法是使用Kleinberg 2002年描述的突发检测算法,但我没有成功,所以我想听听其他人的意见。
这是原始数据:
这是我想做的:
回答:
由于原始数据不可用,我生成了一些测试数据。方法如下。如果数据是一组带跳跃的平台,通过检查移动窗口的标准偏差,将在跳跃处产生峰值。通过阈值隔离峰值。通过查看应用移动平均后的数据来估计跳跃。这为拟合提供了一个良好的起点。作为拟合函数,我再次使用我最喜欢的tanh
函数。
结果如下所示:
这将生成以下图表:
一些较小的跳跃没有被检测到,但这应该是预期的。此外,整个过程不是很快。由于阈值,随着x
的增大,初始猜测会变得更差,跳跃越多,情况越糟。最后,一系列小的跳跃没有被检测到,以至于数据中的结果斜率被拟合为一个大的平台,具有明显的大误差。可以引入额外的检查来解决这个问题,并添加跳跃位置以进行相应的拟合。
还要注意,窗口大小的选择决定了两个跳跃被检测为独立跳跃的最小距离。