Gnuplot高斯拟合算法失效问题求助
问题分析与解决方案
你的拟合问题核心在于参数尺度不匹配和b与x0的强相关性,导致Levenberg-Marquardt算法无法有效调整参数。以下是具体原因和解决方法:
核心问题
- 参数尺度失衡:x0的数值量级为1e9,而sigma为1e4、b为1e5,这种巨大的尺度差异会让x0的导数变得极小,算法难以感知其变化对拟合结果的影响。
- 参数强相关:拟合日志中b与x0的相关系数为1.000,意味着调整x0的微小变化可以通过b的补偿来维持卡方值不变,算法无法区分二者的独立影响,因此不会更新参数。
解决方案
1. 固定已知的x0值
你的数据完全对称于x0=2442000000,直接固定该参数,仅拟合b和sigma即可消除相关性问题:
# 定义高斯函数 g(x) = b/(sigma*sqrt(2.*pi))*exp(-(x-x0)**2./(2.*sigma**2)) # 初始化参数(x0固定) b = 700000 sigma = 12000 x0 = 2442000000 # 仅拟合b和sigma fit g(x) "MyData.csv" via b,sigma # 绘制结果 plot "MyData.csv", g(x)
此方法会将b调整至约752000,使拟合曲线的峰值与数据的25完全匹配。
2. 缩放x变量
将x值中心化,减小数值量级,改善参数的数值稳定性:
# 将x平移至以0为中心 t(x) = x - 2442000000 # 使用缩放后的x定义高斯函数 g(x) = b/(sigma*sqrt(2.*pi))*exp(-(t(x))**2./(2.*sigma**2)) # 初始化参数 b = 700000 sigma = 12000 # 拟合参数 fit g(x) "MyData.csv" via b,sigma # 绘制结果 plot "MyData.csv", g(x)
若未知x0,可将其加入拟合参数(t(x)=x-x0,via b,sigma,x0),缩放仍能有效改善算法的收敛性。
3. 重新参数化高斯函数
改用峰值振幅A替代积分参数b,参数尺度更贴合数据特征,便于算法拟合:
# 用峰值振幅A定义高斯函数 g(x) = A * exp(-(x-x0)**2./(2.*sigma**2)) # 初始化参数 A = 23 # 接近数据峰值25 sigma = 12000 x0 = 2442000000 # 拟合所有参数 fit g(x) "MyData.csv" via A,sigma,x0 # 若需要,计算原参数b b = A * sigma * sqrt(2.*pi) print "计算得到的b值: ", b # 绘制结果 plot "MyData.csv", g(x)
此方法会快速收敛到A=25,完美匹配数据峰值。
内容的提问来源于stack exchange,提问作者Thern
相关产品推荐
相关产品推荐

