我想使用Scipy的curve_fit
(或更合適的東西,如果可用)擬合具有矢量輸出的函數。例如,考慮以下功能:在Scipy中使用curve_fit擬合矢量函數
import numpy as np
def fmodel(x, a, b):
return np.vstack([a*np.sin(b*x), a*x**2 - b*x, a*np.exp(b/x)])
每個組件都是不同的功能,但它們共享我希望適合的參數。理想情況下,我會做這樣的事情:
x = np.linspace(1, 20, 50)
a = 0.1
b = 0.5
y = fmodel(x, a, b)
y_noisy = y + 0.2 * np.random.normal(size=y.shape)
from scipy.optimize import curve_fit
popt, pcov = curve_fit(f=fmodel, xdata=x, ydata=y_noisy, p0=[0.3, 0.1])
但curve_fit
不帶矢量輸出功能的工作,和一個錯誤Result from function call is not a proper array of floats.
被拋出。我所做的是將這樣的輸出展平:
def fmodel_flat(x, a, b):
return fmodel(x[0:len(x)/3], a, b).flatten()
popt, pcov = curve_fit(f=fmodel_flat, xdata=np.tile(x, 3),
ydata=y_noisy.flatten(), p0=[0.3, 0.1])
這個工作。如果不是一個矢量函數,我實際上也適用於具有不同輸入的幾個函數,但它們共享模型參數,我可以連接輸入和輸出。
有沒有更合適的方法來適應向量函數與Scipy或可能一些額外的模塊?對我來說主要考慮的是效率 - 實際的功能要複雜得多,而且擬合可能需要一些時間,所以如果這種使用curve_fit
被破壞並導致運行時間過長,我想知道我應該做些什麼。
你可能會對[lmfit]感興趣(https://lmfit.github.io/lmfit-py/)。他們還建議多維數據的「平坦」方法。 – chthonicdaemon