簡體   English   中英

scipy.optimize.curve_fit() 未能擬合指數函數

[英]scipy.optimize.curve_fit() failed to fit a exponential function

我試圖通過使用scipy.optimize.curve_fit() (示例數據和代碼如下)來擬合指數函數。 但它總是顯示這樣的RuntimeErrorRuntimeError: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM