[英]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
。 不幸的是,在您的情況下,這是一個糟糕的猜測。 感興趣的函數是指數函數,其一個特性是導數也是指數函數。 所以所有的導數(一階、二階等)不僅是錯誤的,而且有錯誤的符號。 這意味着優化器將很難取得進展。
您可以通過給優化器只是一個幫助微幅下挫解決這個問題。 由於您知道所有數據都是負數,因此您可以將-1
作為第一個參數(函數的比例或幅度)的初始猜測值傳遞。 僅此一項就足以讓優化器得出合理的猜測。
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.