Поэтому я прочитал документацию о curve_fit
здесь . Он содержит следующий пример:
import numpy as np
import scipy.optimize as so
def func(x, a,b,c ):
return a * np.exp(-b * x) + c
a,b,c = 2.5, 1.3, 0.5
nx = 500
noiseAlpha = 0.5
#
xdata = np.linspace(0, 4, nx)
y = func(xdata, a,b,c)
ydata = y + noiseAlpha * np.random.normal(size=len(xdata))
Если я сейчас вызову curve_fit
, он аппроксимирует производные, поскольку я ничего не предоставлял. Рассчитаем время:
%%timeit
popt, pcov = so.curve_fit(func, xdata, ydata )
1000 loops, best of 3: 787 µs per loop
Фактически curve_fit
вызывает leastsq
(doc здесь), который принимает аргумент Dfun
для вычисления якобиана. Итак, я сделал это:
def myDfun( abc, xdata, ydata, f ) :
a,b,c = abc
ebx = np.exp(-b * xdata)
res = np.vstack( ( ebx, a * -xdata * ebx, np.ones(len(xdata)) ) ).T
return res
И я снова засекал:
%%timeit
popt, pcov = so.curve_fit(func, xdata, ydata, Dfun=myDfun )
1000 loops, best of 3: 858 µs per loop
Эм-м-м? Использование якобиана медленнее, чем его приближение? Я сделал что-то неправильно?