用python拟合两个高斯函数
我正在分析一些数据。理论上,应该有两个高斯分布,或多或少地重叠。我发现,如果不拟合两个高斯函数,而是拟合它们的分布函数,那么拟合数据效果最好。事实上,这种拟合似乎效果很好,但如果我回到数据的密度表示,它看起来有点像有线的。随附的照片说明了他们自己。知道哪里出了问题吗 这是我的密码:`用python拟合两个高斯函数,python,curve-fitting,data-fitting,Python,Curve Fitting,Data Fitting,我正在分析一些数据。理论上,应该有两个高斯分布,或多或少地重叠。我发现,如果不拟合两个高斯函数,而是拟合它们的分布函数,那么拟合数据效果最好。事实上,这种拟合似乎效果很好,但如果我回到数据的密度表示,它看起来有点像有线的。随附的照片说明了他们自己。知道哪里出了问题吗 这是我的密码:` import numpy as np import scipy import scipy.special import matplotlib.pyplot as plt from scipy.optimize i
import numpy as np
import scipy
import scipy.special
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.optimize import leastsq
from scipy.special import erf
def fitfunction(params,Bins):
amp_ratio, sigma1, sigma2, mu, Delta = params
return amp_ratio * 0.5 * (1 + erf((Bins -mu)/np.sqrt(2*sigma1**2))) + (1-amp_ratio)* 0.5 * (1 + erf((Bins - (mu + Delta))/np.sqrt(2*sigma2**2)))
def errorfunction(params, Reale_werte, Bins):
amp_ratio, sigma1, sigma2, mu, Delta = params
if(amp_ratio > 0) and (amp_ratio < 1):
return (Reale_werte - fitfunction(params, Bins))
else:
return (Reale_werte - fitfunction(params, Bins))*100
def Gaussians(params, Bins):
amp_ratio, sigma1, sigma2, mu, Delta = params
return amp_ratio/np.sqrt(2*np.pi*sigma1*sigma1) * np.exp(-((Bins-mu)**2) / np.sqrt(2*np.pi*sigma1*sigma1)) + (1-amp_ratio)/np.sqrt(2*np.pi*sigma2*sigma2) * np.exp(-((Bins-(mu + Delta))**2) / np.sqrt(2*np.pi*sigma2*sigma2))
def Gaussian1(params, Bins):
amp_ratio, sigma1, sigma2, mu, Delta = params
return amp_ratio/np.sqrt(2*np.pi*sigma1*sigma1) * np.exp(-((Bins-mu)**2) / np.sqrt(2*np.pi*sigma1*sigma1))
def Gaussian2(params, Bins):
amp_ratio, sigma1, sigma2, mu, Delta = params
return (1-amp_ratio)/np.sqrt(2*np.pi*sigma2*sigma2) * np.exp(-((Bins-(mu + Delta))**2) / np.sqrt(2*np.pi*sigma2*sigma2))
params = 0.25,1,10,1,5
params_init = 0.75, 0.8, 2.5, 1.2, 4
Bins = np.linspace(-4,18,1024)
data = Gaussians(params, Bins)
summe = np.zeros_like(Bins)
for i in range(Bins.shape[0]-1):
summe[i+1] = summe[i] + data[i]
summe = summe/summe[Bins.shape[0]-1]
params_result = leastsq(errorfunction, params_init, args=(summe, Bins))
plt.plot(Bins,fitfunction(params_result[0], Bins))
plt.plot(Bins, summe, 'x')
plt.savefig("Distribution.png")
plt.show()
print params_result[0]
plt.plot(Bins,Gaussians(params_result[0], Bins))
plt.plot(Bins, data, 'x')
plt.savefig("Gaussian.png")
plt.show()`
将numpy导入为np
进口西皮
进口特殊商品
将matplotlib.pyplot作为plt导入
从scipy.optimize导入曲线\u拟合
从scipy.optimize import leastsq
从scipy.special导入erf
def FIT功能(参数、箱):
放大器比,sigma1,sigma2,μ,δ=参数
返回放大比*0.5*(1+erf((Bins-mu)/np.sqrt(2*sigma1**2))+(1-AMPU比率)*0.5*(1+erf((Bins-(mu+Delta))/np.sqrt(2*sigma2**2)))
def ERROR功能(参数、实数、箱子):
放大器比,sigma1,sigma2,μ,δ=参数
如果(amp_比率>0)和(amp_比率<1):
返回(Reale_werte-fitfunction(参数、箱子))
其他:
返回(Reale_werte-fitfunction(参数、箱子))*100
def高斯(参数、箱):
放大器比,sigma1,sigma2,μ,δ=参数
返回amp_比率/np.sqrt(2*np.pi*sigma1*sigma1)*np.exp(-(bin-mu)**2)/np.sqrt(2*np.pi*sigma1*sigma1))+(1-amp_比率)/np.sqrt(2*np.pi*sigma2*sigma2)*np exp(-(bin-(mu+Delta))**2)/np.sqrt(2*np.pi*sigma2))
def Gaussian1(参数、箱):
放大器比,sigma1,sigma2,μ,δ=参数
返回放大比/np.sqrt(2*np.pi*sigma1*sigma1)*np.exp(-(bin mu)**2)/np.sqrt(2*np.pi*sigma1*sigma1))
def Gaussian2(参数、箱):
放大器比,sigma1,sigma2,μ,δ=参数
返回值(1-amp_比率)/np.sqrt(2*np.pi*sigma2*sigma2)*np.exp(-(料仓-(μ+δ))**2)/np.sqrt(2*np.pi*sigma2*sigma2))
参数=0.25,1,10,1,5
参数_init=0.75,0.8,2.5,1.2,4
Bins=np.linspace(-4,181024)
数据=高斯(参数、箱)
summe=np.类零(箱)
对于范围内的i(料仓形状[0]-1):
总和[i+1]=总和[i]+数据[i]
summe=summe/summe[bin.shape[0]-1]
params_result=leastsq(errorfunction,params_init,args=(summe,bin))
plt.plot(箱子,fit函数(参数结果[0],箱子))
plt.绘图(箱、汇总、x)
plt.savefig(“Distribution.png”)
plt.show()
打印参数结果[0]
plt.绘图(箱,高斯(参数结果[0],箱))
plt.绘图(箱子、数据、“x”)
plt.savefig(“Gaussian.png”)
plt.show()`
我想知道是否适用于您的情况:
from scipy.stats import kde
import matplotlib.pyplot as plt
density = kde.gaussian_kde(x) # your data
xgrid = np.linspace(x.min(), x.max(), 1024)
plt.plot(xgrid, density(xgrid))
plt.show()
对不起,我不明白这是怎么回事?它使用多个正态分布(高斯函数)来估计概率密度函数。如果你的数据是两个高斯的重叠,希望你能在估计中观察到两个峰值。