scipy.optimize.curve_fit() 无法拟合指数函数
scipy.optimize.curve_fit() failed to fit a exponential function
我正在尝试使用 scipy.optimize.curve_fit()
(示例数据和代码如下)来拟合指数函数。但它总是显示这样的 RuntimeError
:RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 5000.
我不确定我哪里出错了。
import numpy as np
from scipy.optimize import curve_fit
x = np.arange(-1, 1, .01)
param1 = [-1, 2, 10, 100]
fit_func = lambda x, a, b, c, d: a * np.exp(b * x + c) + d
y = fit_func(x, *param1)
popt, _ = curve_fit(fit_func, x, y, maxfev=5000)
这几乎可以肯定是由于对参数的初始猜测。
您不会将初始猜测值传递给 curve_fit
,这意味着它默认为每个参数的值 1
。不幸的是,对于您的情况,这是一个 可怕的 猜测。感兴趣的函数是指数函数,其中一个 属性 是导数也是指数函数。所以所有的导数(first-order、second-order等)不仅是错误的,而且符号也是错误的。这意味着优化器将很难取得进展。
您可以通过向优化器提供 一点 的帮助来解决这个问题。由于您知道所有数据都是负数,因此您可以将 -1
作为 first 参数(函数的比例或幅度)的初始猜测。仅此一项就足以让优化器得出合理的猜测。
p0 = (-1, 1, 1, 1)
popt, _ = curve_fit(x, y, p0=p0, maxfev=5000)
fig, ax = plt.subplots()
ax.plot(x, y, label="Data", color="k")
ax.plot(x, fit_func(x, *popt), color="r", linewidth=3.0, linestyle=":", label="Fitted")
fig.tight_layout()
你应该看到这样的东西:
我正在尝试使用 scipy.optimize.curve_fit()
(示例数据和代码如下)来拟合指数函数。但它总是显示这样的 RuntimeError
:RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 5000.
我不确定我哪里出错了。
import numpy as np
from scipy.optimize import curve_fit
x = np.arange(-1, 1, .01)
param1 = [-1, 2, 10, 100]
fit_func = lambda x, a, b, c, d: a * np.exp(b * x + c) + d
y = fit_func(x, *param1)
popt, _ = curve_fit(fit_func, x, y, maxfev=5000)
这几乎可以肯定是由于对参数的初始猜测。
您不会将初始猜测值传递给 curve_fit
,这意味着它默认为每个参数的值 1
。不幸的是,对于您的情况,这是一个 可怕的 猜测。感兴趣的函数是指数函数,其中一个 属性 是导数也是指数函数。所以所有的导数(first-order、second-order等)不仅是错误的,而且符号也是错误的。这意味着优化器将很难取得进展。
您可以通过向优化器提供 一点 的帮助来解决这个问题。由于您知道所有数据都是负数,因此您可以将 -1
作为 first 参数(函数的比例或幅度)的初始猜测。仅此一项就足以让优化器得出合理的猜测。
p0 = (-1, 1, 1, 1)
popt, _ = curve_fit(x, y, p0=p0, maxfev=5000)
fig, ax = plt.subplots()
ax.plot(x, y, label="Data", color="k")
ax.plot(x, fit_func(x, *popt), color="r", linewidth=3.0, linestyle=":", label="Fitted")
fig.tight_layout()
你应该看到这样的东西: