如何解决两分量高斯拟合无法正常工作
我正在尝试使用以下代码进行两分量高斯拟合:
def double_gaussian(velo_peak,a1,mu1,sigma1,a2,mu2,sigma2):
res_two = a1 * np.exp(-(velo_peak - mu1)**2/(2 * sigma1**2)) \
+ a2 * np.exp(-(velo_peak - mu2)**2/(2 * sigma2**2))
return res_two
#Guess parameters:
guess = [5,115.2,0.7,4,115.7,0.7]
popt,pcov = curve_fit(double_gaussian,velo_peak,spec_peak,guess)
plt.plot(velo_peak*1e-9,double_gaussian(velo_peak,*popt),'r-',label='fit')
我用两个分量定义了方程,然后输入了猜测值并尝试绘制,但出现以下错误:
warnings.warn('Covariance of the parameters could not be estimated',
因此,我得到了一条适合的直线。
我会说我觉得代码合乎逻辑,但当然,有一些问题。提供任何帮助将不胜感激。
解决方法
问题似乎出在最初的猜测上:
import matplotlib.pyplot as plt # type: ignore
import numpy as np # type: ignore
from scipy.optimize import curve_fit # type: ignore
def double_gaussian(velo_peak,a1,mu1,sigma1,a2,mu2,sigma2):
g1 = a1 * np.exp(-((velo_peak - mu1) ** 2) / (2 * sigma1 ** 2))
g2 = a2 * np.exp(-((velo_peak - mu2) ** 2) / (2 * sigma2 ** 2))
return g1 + g2
xdata = np.linspace(100,120,1000)
y = double_gaussian(xdata,5,115.2,0.7,4,105.7,0.7)
np.random.seed(1729)
y_noise = 0.2 * np.random.normal(size=xdata.size)
ydata = y + y_noise
plt.plot(xdata,ydata,"b-",label="data")
# Guess parameters:
# guess = [5,0.7] # ok (duh)
# guess = [1,100,1,1] # fails 10k
# guess = [5,115,105,1] # ok
# guess = [5,5] # warn
# guess = [5,2,2] # ok
# guess = [1,3,3] # ok
# guess = [1,110,3] # only one found
# guess = [1,3] # only one found
guess = [1,118,102,3] # ok
popt,pcov = curve_fit(double_gaussian,xdata,guess,maxfev=10000)
plt.plot(xdata,double_gaussian(xdata,*popt),"r-",label="fit")
plt.show()
无法访问数据就很难提供帮助。您可能想尝试某种方法来找到峰值位置,并将其用作 mu1/2
值,它会有所帮助。或者在起始参数空间上进行某种网格搜索,评估模型和数据之间的误差。
编辑:
我尝试增加优化器调用 maxfev=100_000_000
的迭代次数,并得到以下结果:
# guess = [1,1] # bad 100kk
# guess = [1,1] # ok 100kk
# guess = [1,111,109,1] # bad 100kk
guess = [1,112,108,1] # ok 100kk
同样,起始 mu
值似乎非常重要。
干杯!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。