Я хочу установить функцию с векторным выходом, используя Scipy curve_fit
(или что-то более подходящее, если доступно). Например, рассмотрим следующую функцию:Установка векторной функции с curve_fit в Scipy
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