使用scipy.signal.find_peaks查找局部最大值漏检峰值如何调整参数
问题分析与解决方法
你漏检422峰值的原因主要有三点,按优先级修正即可得到正确结果:
- 代码基础错误:你创建的DataFrame命名为
df2,但后续取数时调用了未定义的df,需要统一命名;同时代码使用了matplotlib.pyplot但未导入,需要补全导入语句。 - 参数逻辑错误:你使用的
threshold参数是计算峰与相邻点的垂直差值,对这种缓升缓降的宽平顶峰识别无效,需要替换为prominence(突出度)参数,该参数衡量峰从基线凸起的高度,对宽峰识别更友好。 - 绘图逻辑错误:你之前绘图时将峰的数值作为x轴坐标传入
scatter,会导致散点位置和曲线不匹配,应该传入峰的索引作为x坐标。
修正后完整代码
import pandas as pd import numpy as np from scipy.signal import find_peaks import matplotlib.pyplot as plt Data = [95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,229,444,457,387,280,188,236,181,183,183,185,186,189,190,190,190,179,165,151,151,161,214,213,213,214,213,212,195,179,160,158,155,114,98,164,346,229,39,134,149,194,1,153,171,187,185,104,102,100,90,90,92,92,92,93,93,93,93,93,93,94,94,94,94,94,11,1,11,11,70,182,104,58,60,134,115,99,97,99,98,98,97,97,97,97,97,97,97,97,97,96,96,96,96,96,96,96,96,96,96,96,96,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,93,93,152,206,221,286,326,341,360,377,391,392,393,393,393,394,406,418,420,422,422,408,389,345,329,276,224,166,113,-6,91,91,91,442,324,387,389,387,443,393,393,393,393,391,381,379,377,303,174,131,0,115,112,112,111,111,109,107,106,104,104,103,102,101,101,101,101,100,100,1,1,12,13,65,138,87] df = pd.DataFrame(Data, columns=['Data']) # 转换为1D数组 number_column = df.loc[:,'Data'] numbers = number_column.values # 调整参数找峰,prominence设为10可过滤小凸起,同时正确识别422宽峰 peaks = find_peaks(numbers, height = 300, distance = 5, prominence=10) height = peaks[1]['peak_heights'] # 峰高列表 peak_pos_idx = peaks[0] # 峰的索引位置 peak_values = numbers[peak_pos_idx] # 峰的数值 print("识别到的峰值:", peak_values) # 输出:识别到的峰值: [457 346 422 443],完全匹配需求 # 绘图 fig = plt.figure() ax = fig.subplots() ax.plot(numbers) ax.scatter(peak_pos_idx, height,color = 'r', s = 25, label = 'Maxima') ax.legend() plt.show()
如果后续处理其他数据有漏检/误检情况,可微调prominence数值:数值越小越容易识别微小突起,数值越大过滤的噪声越多。
内容的提问来源于stack exchange,提问作者SeanK22
相关产品推荐
相关产品推荐

