网上一直没找到特别详细易懂的解析,所以现在自己整理一个。

其他的都简单,主要是理解prominence的用法,因为它最好用。

scipy.signal.find_peaks 函数中的 `prominence` 参数用于设置峰值的突出度阈值。

突出度衡量的是峰在信号周围基线上的突出程度,即峰与其最低等高线之间的垂直距离。只有突出度大于或等于所设阈值的峰值才会被检测出。以下是其用法及与其他参数的区别:

用法

  * **单个数值** :指定所有峰值的突出度都必须大于或等于该值。例如,`find_peaks(x, prominence=1)` 会筛选出突出度大于或等于 1 的所有峰值。
  * **元组** :若设置为 `(min_prom, max_prom)`,则只考虑突出度在 `min_prom` 和 `max_prom` 之间的峰值。例如,`find_peaks(x, prominence=(1, 3))` 只会筛选出突出度在 1 到 3 之间的峰值。

与其他参数的区别

height

`height` 参数关注的是峰值的绝对高度,通过设置峰值的最小高度或高度范围来筛选峰值。而 `prominence` 则侧重于峰值与其周围区域的相对高度差异,更能反映峰值的显著性和独特性。例如,在一个信号中可能存在多个高度相近但突出度不同的峰值,`height` 可能无法有效区分它们的显著性,但 `prominence` 可以。


threshold

`threshold` 设置的是峰值与两侧相邻点之间的高度差阈值,强调的是峰值与紧邻其周围的点的相对高度关系。而 `prominence` 则是从整体上衡量峰值在一个更广泛的区域内的突出程度,考虑的是峰值与其两侧较低点之间的最大垂直距离。

示例

假设我们有如下信号数据:

```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks

x = np.linspace(0, 10, 1000)
y = np.sin(x) + 0.5 * np.sin(3 * x) + np.random.normal(0, 0.2, 1000)
```

* **使用 `prominence`** :`peaks_prom, _ = find_peaks(y, prominence=0.5)` ,这将筛选出突出度大于或等于 0.5 的峰值。
* **同时使用 `height` 和 `prominence`** :`peaks_hp, _ = find_peaks(y, height=0.5, prominence=0.5)`,此时尚未同时满足高度大于或等于 0.5 且突出度大于或等于 0.5 的峰值。

绘制结果:

```python
plt.figure(figsize=(10,6))
plt.plot(x, y, label='Signal')
plt.plot(x[peaks_prom], y[peaks_prom], "x", label='prominence=0.5')
plt.plot(x[peaks_hp], y[peaks_hp], "o", label='height=0.5 & prominence=0.5')
plt.legend()
plt.show()
```

在图中,可以看到使用 `prominence` 筛选的峰值比仅使用 `height` 筛选的峰值更突出,更能反映信号中的主要特征点。当同时使用 `height` 和 `prominence` 时,筛选出的峰值需同时满足两者的条件,因此数量可能更少,但可能是信号中更为显著的峰值。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐