Home  >  Article  >  Backend Development  >  How to Effectively Utilize the find_peaks Function for Accurate Peak Identification in Python/SciPy?

How to Effectively Utilize the find_peaks Function for Accurate Peak Identification in Python/SciPy?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-22 19:26:34160browse

How to Effectively Utilize the find_peaks Function for Accurate Peak Identification in Python/SciPy?

Peak-Finding Algorithm for Python/SciPy

Problem Statement

The task of identifying peaks arises in various applications, ranging from finding peaks in Fourier transforms (FFTs) to extracting peaks from 2D arrays. A common challenge is to distinguish true peaks from noise-induced fluctuations.

Existing Peak-Finding Functions in Python/SciPy

Instead of implementing a peak-finding algorithm from scratch, consider utilizing the scipy.signal.find_peaks function. This function provides options to filter and identify peaks based on specific criteria.

Understanding the find_peaks Parameters

To harness the power of find_peaks effectively, it's crucial to understand its parameters:

  • width: Minimum width of a peak.
  • threshold: Minimum difference between peak and its neighbors.
  • distance: Minimum distance between consecutive peaks.
  • prominence: Minimum height necessary to descend from a peak to reach higher terrain.

Emphasis on Prominence

Of all the parameters, prominence stands out as the most effective in distinguishing true peaks from noise. Its definition involves the minimum vertical descent required to reach a higher peak.

Example Application: Frequency-Varying Sinusoid

To illustrate its utility, consider a frequency-varying sinusoid contaminated with noise. The ideal solution would identify the peaks accurately without succumbing to spurious noise peaks.

Code Demonstration

The following code demonstrates how to use the find_peaks function with various parameter combinations:

<code class="python">import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks

# Generate signal
x = np.sin(2*np.pi*(2**np.linspace(2,10,1000))*np.arange(1000)/48000) + np.random.normal(0, 1, 1000) * 0.15

# Find peaks using different parameters
peaks, _ = find_peaks(x, distance=20)
peaks2, _ = find_peaks(x, prominence=1)
peaks3, _ = find_peaks(x, width=20)
peaks4, _ = find_peaks(x, threshold=0.4)

# Plot results
plt.subplot(2, 2, 1)
plt.plot(peaks, x[peaks], "xr"); plt.plot(x); plt.legend(['distance'])
plt.subplot(2, 2, 2)
plt.plot(peaks2, x[peaks2], "ob"); plt.plot(x); plt.legend(['prominence'])
plt.subplot(2, 2, 3)
plt.plot(peaks3, x[peaks3], "vg"); plt.plot(x); plt.legend(['width'])
plt.subplot(2, 2, 4)
plt.plot(peaks4, x[peaks4], "xk"); plt.plot(x); plt.legend(['threshold'])
plt.show()</code>

As observed from the results, using prominence (the blue line in the second subplot) effectively isolates the true peaks, while distance, width, and threshold offer subpar performance in the presence of noise.

The above is the detailed content of How to Effectively Utilize the find_peaks Function for Accurate Peak Identification in Python/SciPy?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn