如何加速python曲线拟合二维数组?

2024-05-21 12:40:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须对一组大数据(5000000)使用曲线拟合numpy函数。 基本上我已经创建了一个二维数组。第一个尺寸是要执行的配件数量,第二个尺寸是用于配件的点数。在

t = np.array([0 1 2 3 4])

for d in np.ndindex(data.shape[0]):
  try:
    popt, pcov = curve_fit(func, t, np.squeeze(data[d,:]), p0=[1000,100])
  except RuntimeError:
    print("Error - curve_fit failed")

多处理可以用来加速整个过程,但它仍然相当慢。 有没有办法以“矢量化”的方式使用曲线拟合?在


Tags: 数据函数numpyfordata数量尺寸np
2条回答

Curve fit扩展了scipy.optimize.leastsq的功能,它本身就是底层MINPACK lmdiflmderfortran例程的包装器。看起来多线程是不可能的,看看这个link,它说

The underlying Fortran 77 routines (MINPACK lmder.f and lmdif.f) are not reentrant, so the GIL cannot be released. (Thus no chance of parallel processing with threads.)

仍然有一个开放的ticket来开发它,但它看起来似乎无法完成。。。您可能需要使用不同的库或用较低级别的代码编写包装器/函数。并行Levenberg-Marquardt算法的实现有papers。在

也许还有另一种解决方案,使用较少的数据,或者作为粗略估计,您可以将数据随机分成多个部分,在单独的线程(使用多处理器)上曲线拟合每个部分,最后取系数的平均值。在

加快速度的一种方法是在曲线拟合中加入一些先验知识。在

如果您知道参数的预期范围,并且不需要高达第100个有效数字的精度,则可以大大加快计算速度。在

下面是一个示例,其中您将适合param1param2

t = np.array([0 1 2 3 4])
def func(t, param1, param2):
  return param1*t + param2*np.exp(t)

for d in np.ndindex(data.shape[0]):
  try:
    popt, pcov = curve_fit(func, t, np.squeeze(data[d,:]), p0=[1000,100], 
                           bounds=([min_param1, min_param2],[max_param1, max_param2]),
                           ftol=0.5, xtol=0.5)
  except RuntimeError:
    print("Error - curve_fit failed")

注意额外的键参数boundsftol和{}。你可以读到关于它们的here.

相关问题 更多 >