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

使用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-3
  • b:峰值对应的x值,即34
  • c:高斯分布的标准差,可根据数据跨度估算,比如(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:50:34