Python 自动在曲线拟合(或图形反褶积)中找到最佳峰值数

Python 自动在曲线拟合(或图形反褶积)中找到最佳峰值数,python,graph,deconvolution,Python,Graph,Deconvolution,我试图用一种能够捕捉原始图形的大部分特征的方式来反褶积图形。当我使用以下代码时,有两个主要问题: def Gaussian(x, mean, sd): Gaussian = [] for i in range(x.size): norm += [1.0/(sd*np.sqrt(2*np.pi))*np.exp(-(x[i] - mean)**2/(2*sd**2))] return np.array(norm) x_value = np.arange(100) fun

我试图用一种能够捕捉原始图形的大部分特征的方式来反褶积图形。当我使用以下代码时,有两个主要问题:


def Gaussian(x, mean, sd):
  Gaussian = []
  for i in range(x.size):
    norm += [1.0/(sd*np.sqrt(2*np.pi))*np.exp(-(x[i] - mean)**2/(2*sd**2))]
  return np.array(norm)


x_value = np.arange(100)
fun = lambda x: np.exp(-(0.1*x-6)**2+4) + np.exp(-(0.1*x-4.75)**2+2)

y_value1 = fun(x_value) + np.random.normal(0,1,len(x_value))*3

m, dm, sd1, sd2, h1, h2 = [60, 10, 1, 1, 5, 2]
p = [m, dm, sd1, sd2, h1, h2] # Initial guesses for leastsq
y_init = norm(x_value, m, sd1)*h1 + norm(x_value, m + dm, sd2)*h2 # For final comparison plot

def res(p, y, x):
  m, dm, sd1, sd2, h1, h2 = k
  m1 = m
  m2 = m1 + dm
  y_fit = Gaussian(x, m1, sd1) * h1 + Gaussian(x, m2, sd2) * h2
  err = y - y_fit
  return err

ls = least_squares(res, p, args = (y_value1, x_value))


第一个主要问题是它给出了不止一个解决方案。 下面显示的真实数据实际上非常可靠。很明显,它会有两个卷积图。然而,在我们有更一般的数据形状的情况下,结果开始非常不同。我不认为反褶积图可以解释原始图的固有特性

第二个问题是,我必须手动设置峰值的数量。我想要的是自动但最佳地确定峰值的东西。你们知道做这件事的函数吗

还是我完全错过了一些重要的事情?我找不到解决这些问题的答案

============================================================================= 编辑:我从这里导入了PeakDat 对于上面所示的图形,它工作得很好。然而,另一个问题出现了,它没有检测到曲线的拐点,如下图所示:


我正在尝试修改PeakSet中的代码,以检测这样的点。请帮忙

你可能想看看@RickM。我更新了它。您推荐的Scipy工具帮助我找到了本地最大值和本地最小值。但是,这些不会检测到平台点或拐点。有趣的是,我认为您必须指定要查找多个峰值