python的多高斯拟合(估计参数)

时间:2018-12-25 11:45:06

标签: python gaussian

这是我的data

我正在尝试使用scipy和曲线拟合来拟合我的数据,这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
import pandas as pd

df=pd.read_csv("dene2.dat", sep=" ")

x=df.x
y=df.y

n = len(x)                       
mean = sum(x * y) / sum(y)
sigma = np.sqrt(sum(y * (x - mean)**2) / sum(y))   

def gaus(x,a,x0,sigma):
    return a*exp(-(x-x0)**2/(2*sigma**2))

popt,pcov = curve_fit(gaus,x,y,p0=[1,mean,sigma])

plt.plot(x,y,'b+:',label='data')
plt.plot(x,gaus(x,*popt),'ro:',label='fit')
plt.legend()
plt.title('Fig. 3 - Fit for Time Constant')
plt.xlabel('Time (s)')
plt.ylabel('Intensity (Counts)')

plt.show()

拟合高斯图也不如预期;你能帮我吗?

1 个答案:

答案 0 :(得分:0)

您可以使用两个高斯的叠加来获得更好的拟合度。

def gaus(x,a,x0,sigma, b, x1, sigma1):
    return a*exp(-(x-x0)**2/(2*sigma**2)) + b*exp(-(x-x1)**2/(2*sigma1**2))

popt,pcov = curve_fit(gaus,x,y,p0=[1.6, 380, 10, 1.5, 690, 10])

1.6, 380, 10, 1.5, 690, 10是数据中第一个和第二个清晰峰的高度,均值和宽度的近似初始猜测。

您可以尝试使用三个高斯来获得更好的拟合度。 Here是一篇类似的帖子。

enter image description here