使用Python的curve_fit()无法复现高斯函数曲线拟合求助
问题原因与解决方案
你的问题出在**curve_fit默认初始参数与数据集严重偏离**,同时y值数量级差异过大(1e-10 vs 1e-3),导致优化器陷入局部最优解,无法收敛到正确的高斯分布参数。
具体分析
curve_fit默认会将所有参数的初始猜测设为1,但你的数据集峰值明显在x=34附近,初始参数b=1离真实值太远;同时y值的数量级差达到7个数量级,优化过程中极小的y值会干扰梯度计算,让算法难以找到正确的优化方向。
修复后的代码
给curve_fit传入合理的初始参数p0,参数可以根据你的数据直观估算:
a:峰值的y值,约为1e-3b:峰值对应的x值,即34c:高斯分布的标准差,可根据数据跨度估算,比如(56-12)/2 = 22
修改后的代码如下:
import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt x_data = [12, 34, 56] y_data = [1e-10, 1e-3, 1e-10] def func(xdata, a, b, c): return a*np.exp(-(xdata - b)**2/(2*c**2)) # 传入初始参数猜测 popt,_ = curve_fit(func, x_data, y_data, p0=[1e-3, 34, 22]) x_fit = np.linspace(0,100, 100) y_fit = func(x_fit, *popt) plt.scatter(x_data, y_data) plt.plot(x_fit,y_fit) plt.show()
额外建议
如果后续遇到类似数量级差异大的数据,还可以尝试:
- 对y数据做对数转换,将高斯拟合转为二次函数拟合(注意处理零值/极小值)
- 使用
bounds参数限制参数的合理范围,避免优化器出现无意义的参数值
内容的提问来源于stack exchange,提问作者ArKa
相关产品推荐
相关产品推荐

