高斯函数拟合散点图参数偏差问题求助
高斯拟合参数与预期不符的问题解决
问题重现
拟合带基线的高斯模型时,得到的参数(振幅-17、均值2.6、标准差-2.5、基线110)与数据散点图的预期值相差甚远,使用的原始代码如下:
from scipy.optimize import curve_fit import numpy as np def gaussian_model(x, a, b, c, d): # 带常数基线的高斯模型 return a*np.exp(-(x-b)**2/(2*c**2))+d x = np.linspace(0, 20, 100) mu, cov = curve_fit(gaussian_model, xdata, ydata) fit_A = mu[0] fit_B = mu[1] fit_C = mu[2] fit_D = mu[3] fit_y = gaussian_model(xdata, fit_A, fit_B, fit_C, fit_D) print(mu) plt.plot(x, fit_y) plt.scatter(xdata, ydata) plt.show()
问题原因
curve_fit 默认会以全1数组作为初始参数猜测值,但如果你的数据分布和全1初始值差距较大,优化算法很容易陷入局部最优解,导致拟合结果完全偏离真实情况。比如你的散点图呈现正高斯峰特征,但初始猜测的振幅为1,算法可能找到负振幅的局部最优解,就出现了不符合预期的参数。
解决方法:添加初始参数猜测值
给 curve_fit 传入 p0 参数,提供接近数据真实特征的初始猜测,就能引导算法找到正确的全局最优解。
修改后的代码示例
from scipy.optimize import curve_fit import numpy as np import matplotlib.pyplot as plt # 补充原代码遗漏的绘图库导入 def gaussian_model(x, a, b, c, d): return a*np.exp(-(x-b)**2/(2*c**2))+d x = np.linspace(0, 20, 100) # 根据散点图手动估计初始参数:[振幅, 均值, 标准差, 基线] # 示例值可根据你的实际散点特征调整 initial_guess = [50, 10, 2, 60] mu, cov = curve_fit(gaussian_model, xdata, ydata, p0=initial_guess) fit_A, fit_B, fit_C, fit_D = mu fit_y = gaussian_model(x, fit_A, fit_B, fit_C, fit_D) # 用x数组绘制更平滑的拟合曲线 print("拟合参数:", mu) plt.plot(x, fit_y, label="拟合曲线") plt.scatter(xdata, ydata, label="原始数据") plt.legend() plt.show()
新手实用建议
- 每次使用
curve_fit前,先可视化原始数据,手动估计初始参数,这是提升拟合成功率的关键 - 检查代码依赖项,比如原代码未导入
matplotlib.pyplot,运行会直接报错 - 可以先绘制初始猜测对应的曲线,验证和原始数据的贴合度后再执行拟合
内容的提问来源于stack exchange,提问作者midnightgenus
相关产品推荐
相关产品推荐

