gpt4 book ai didi

python - 给定雅可比行列式时,Scipy 的 curve_fit/leastsq 会变慢吗?

转载 作者:行者123 更新时间:2023-11-28 18:42:38 25 4
gpt4 key购买 nike

所以我想阅读有关curve_fit 的文档 here .它包含以下示例:

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 here) ,它接受用于计算雅可比矩阵的 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

呃?使用 Jacobian 比近似它慢?我做错了什么吗?

最佳答案

不是真正的答案,但我的感觉是这取决于问题的大小。对于小规模 (n=500),花在评估 jacobian(使用提供的 jac)上的额外时间可能最终不会得到返回。

n=500,有刺戳:

100 loops, best of 3: 1.50 ms per loop

没有:

100 loops, best of 3: 1.57 ms per loop

n=5000,有刺戳:

100 loops, best of 3: 5.07 ms per loop

没有:

100 loops, best of 3: 6.46 ms per loop

n=50000,有刺戳:

100 loops, best of 3: 49.1 ms per loop

没有:

100 loops, best of 3: 59.2 ms per loop

您可能还需要考虑重写 jacobian 函数,例如摆脱昂贵的 .T() 可以带来约 15% 的加速:

def myDfun2( abc, xdata, ydata, f ) :
a,b,c = abc
ebx = np.exp(-b * xdata)
res = np.hstack( ( ebx.reshape(-1,1), (a * -xdata * ebx).reshape(-1,1), np.ones((len(xdata),1)) ) )
return res

关于python - 给定雅可比行列式时,Scipy 的 curve_fit/leastsq 会变慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24391242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com