我有一个数据集,我试图在该数据集上检测峰以及这些峰的左/右边界。

我已成功使用scipy find_peaks_cwt查找峰,但我不知道如何识别这些峰的左右边界。

在下图中,以编程方式绘制了峰的线和圆标记,但是手工绘制方形标记是我现在要以编程方式进行的操作。

python - 查找峰宽-LMLPHP

有关如何执行此操作的任何建议?我考虑过搜索拐点,但是由于数据中的噪音,该方法无法正常工作。

最佳答案

如果合适的是高斯拟合,则可以采用找到的峰数并拟合n个高斯分布(每个峰1个)加上背景噪声的常数变量(或者可以将另一个高斯拟合添加到曲线拟合中)

import numpy as np
from scipy.optimize import curve_fit
from scipy.signal import find_peaks_cwt
from math import *

peak_indices = find_peaks_cwt(data, *args)

#make a fitting function that takes x number of peak widths
def makeFunction(indices, data):
    def fitFunction(x, *args):
        #sum of gaussian functions with centers at peak_indices and heights at data[peak_indices] plus a constant for background noise (args[-1])
        return sum([data[indices[i]]*exp(-((x-indices[i])**2)/(2*args[i]**2)) for i in range(len(peak_indices))])+args[-1]                                                      #does my code golfing show? xD
    return fitFunction

f = makeFunction(peak_indices, data)

#you must provide the initial guess of "np.ones(len(peak_indices)+1)" for the parameters, because f(x, *args) will otherwise take a variable number of arguments.
popt, pcov = curve_fit(f, np.arange(len(data)), data, np.ones(len(peak_indices)+1))

#standard deviations (widths) of each gaussian peak and the average of the background noise
stdevs, background = popt[:-1], popt[-1]
#covariance of result variables
stdevcov, bgcov = pcov[:-1], pcov[-1]


这应该给您一个开始的地方,但是您可能必须调整优化功能才能使用您的数据(或者可能完全起作用,我没有测试)

08-24 20:45