【发布时间】:2014-07-08 15:37:29
【问题描述】:
我的直方图清楚地显示了两个峰值。但是,当用双高斯曲线拟合它时,它只显示一个峰值。遵循stackoverflow中显示的几乎所有答案。但未能得到正确的结果。我的老师以前在 Fortran 中做过,他得到了两个峰值。
我在一次试验中使用了 python 的scipy.optimize 的leastsq。我也应该提供我的数据吗?
这是我的代码。
binss = (max(x) - min(x))/0.05 #0.05 is my bin width
n, bins, patches = plt.hist(x, binss, color = 'grey') #gives the histogram
x_a = []
for item in range(len(bins)-1):
b = (bins[item]+bins[item+1])/2
x_a.append(b)
x_avg = np.array(x_a)
y_real = n
def gauss(x, A, mu, sigma):
gaus = []
for item in range(len(x)):
gaus.append(A*e**(-(x[item]-mu)**2./(2.*sigma**2)))
return np.array(gaus)
A1, A2, m1, m2, sd1, sd2 = [25, 30, 0.3, 0.6, -0.9, -0.9]
#Initial guesses for leastsq
p = [A1, A2, m1, m2, sd1, sd2]
y_init = gauss(x_avg, A1, m1, sd1) + gauss(x_avg, A2, m2, sd2) #initially guessed y
def residual(p, x, y):
A1, A2, m1, m2, sd1, sd2 = p
y_fit = gauss(x, A1, m1, sd1) + gauss(x, A2, m2, sd2)
err = y - y_fit
return err
sf = leastsq(residual, p, args = (x_avg , y_real))
y_fitted1 = gauss(x_avg, sf[0][0], sf[0][2], sf[0][4])
y_fitted2 = gauss(x_avg, sf[0][1], sf[0][3], sf[0][5])
y_fitted = y_fitted1 + y_fitted2
plt.plot(x_avg, y_init, 'b', label='Starting Guess')
plt.plot(x_avg, y_fitted, color = 'red', label = 'Fitted Data')
plt.plot(x_avg, y_fitted1, color= 'black', label = 'Fitted1 Data')
plt.plot(x_avg, y_fitted2, color = 'green', label = 'Fitted2 Data')
即使我得到的数字也不平滑。 x_avg 中只有 54 分,请帮忙。甚至不能在这里发布数字。
在 MATLAB 上绘图时,得到了正确的结果。原因: MATLAB 使用 Trust Region 算法而不是 Levenberg-Marquardt 算法 这不适合绑定约束。
只有当它显示为 3 的总和时才会出现正确的结果 单个高斯,而不是 2。
我如何决定使用哪种算法以及何时使用?
【问题讨论】:
标签: python python-2.7 curve-fitting gaussian