You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

高斯函数拟合散点图参数偏差问题求助

高斯拟合参数与预期不符的问题解决

问题重现

拟合带基线的高斯模型时,得到的参数(振幅-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:01:01