检测xy图中尖峰的算法

2 投票
2 回答
4984 浏览
提问于 2025-04-17 23:47

想象一下一个实时的 x, y 图表,其中 x 代表数量,y 代表时间,时间间隔是1分钟。每分钟都会有一个新的数值加入到图表中。所以我想要检测图表中是否出现了突增的情况。

突增有两种类型:

  1. 突然的突增
  2. 逐渐的突增

有没有什么方法可以检测到它们呢?

2 个回答

2

你可以用 numpy.diff 来计算 y 关于 x 的一阶导数。首先,获取一组干净的信号,然后通过计算导数的上限(也就是干净信号的最大偏差)来确定阈值,这可以用简单的 max(array) 来实现。

接着,你可以对实时信号进行同样的检查,看看它的导数情况。

另外,你也可以根据信号的角度来设定阈值,但这需要有足够多的数据样本。你可以用 tan(signal) 来计算这个角度。

不同的阈值会给你带来不同类型的峰值。

在之前的建议基础上,你还可以通过 numpy.std(array) 来计算标准差,然后检查均值上下的值。这样做的话,结合导数来看效果会更好。

在金融分析中,有一种方法叫做布林带。你可以通过这个链接了解更多信息: http://sentdex.com/sentiment-analysisbig-data-and-python-tutorials-algorithmic-trading/how-to-chart-stocks-and-forex-doing-your-own-financial-charting/calculate-bollinger-bands-python-graph-matplotlib/

布林带基本上是时间序列在一段时间内的移动平均值。使用它们可以得到比仅仅用标准差更好的阈值。

4

因为尖峰的变化发生在很短的距离内(x2 - x1)。你可以对一组y值在短范围内的x进行一个标准差的计算。如果这个标准差的值比较大,那就可以认为是一个尖峰。

举个例子,对于9个连续的y值:

4,4,5,10,26,10,5,4,4的标准差是7.19

4,4,5,10,100,10,5,4,4的标准差是31.51

你可以先分析y值中最高的几个数和它们周围的数。

撰写回答