【问题标题】:Parameters estimation for curve fitting with Python lmfit使用 Python lmfit 进行曲线拟合的参数估计
【发布时间】:2018-05-24 22:24:39
【问题描述】:

我正在使用 Python lmfit 对 2005-2016 年的月平均数据进行最小二乘拟合。我构造了如下函数: equation 原代码如下:

# t is in fractional years, e.g. 2017+122./365.
def fun(t, a, b, c, A1, A2, A3, A4, B1, B2, B3, B4):
    An=[A1,A2,A3,A4]
    Bn=[B1,B2,B3,B4]
    sum=np.sum([An[i] * np.sin(2 * np.pi * (i + 1) * t+Bn[i]) for i in range(len(An))])
    return a+b*t+c*t*t+sum

mod = Model(fun)
pars = mod.make_params(a=-10, b=0.003, c=0.01, A1=-1., A2=1., A3=1., A4=1., B1=-1., B2=1., B3=1., B4=1.)

result = mod.fit(y, pars, t=t)
print(result.fit_report())

plt.plot(t, y, 'bo')
plt.plot(t, result.best_fit, 'r-')
plt.show()

fitted line and the original data dots 傅里叶项似乎不起作用。因此,我很好奇如何对A1、A2、A3...等函数参数给出合适的初始估计?

【问题讨论】:

  • 注意:使用sum 作为变量名不是一个好主意。
  • 此外,您应该提供最小的工作示例,即至少一个完整的工作代码,包括您所有的imports。一个最小的数据集也很好。
  • 除此之外,a 可以通过mean 查到。 Bs 可能最好设置为零。 A1 类似于 0.5 * ( max() - min() )。其他A 归零。 (假设您的所有数据看起来都与您在链接中显示的相似),b 和 c 也归零。
  • 您可以尝试使用 scipy 模块 scipy.optimize.differal_evolution 来确定初始参数,我有一个使用这个 scipy 模块将 fouble Lorentzian 峰方程拟合到碳纳米管的拉曼光谱 @ 987654324@
  • 感谢 mikuszefski 和 James 提供的帮助。我在傅立叶项的总和形状上犯了错误。请参阅 M Newville 的回答。并在lh3.googleusercontent.com/-qE0-_ojL5N4/Wi85OooEJPI/AAAAAAAAGq8/… 处查看拟合图

标签: python python-3.x curve-fitting least-squares lmfit


【解决方案1】:

np.sum 不会做你想做的事。它会将您的表达式求和为单个标量值,而不是与t 长度相同的数组。然后,该标量值会将您的参数 A1, ... B4 折叠为单个值,并且拟合将无法确定这些值。

我认为您想创建一个形状为 (4, len(t)) 的二维数组,然后仅对第一个维度求和,留下一个 len(t) 数组,即 4 个傅立叶分量的总和。

尝试更换你的

sum=np.sum([An[i]*np.sin(2*np.pi*(i+1)*t+Bn[i]) for i in range(len(An))])

与

sum=np.array([An[i]*np.sin(2*np.pi*(i+1)*t+Bn[i]) for i in range(len(An))]).sum(axis=0)

【讨论】:

猜你喜欢
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2021-08-09
  • 2021-10-01
  • 2021-07-13
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多