Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在2D数组上加速python曲线拟合?_Python_Performance_Numpy_Curve Fitting - Fatal编程技术网

如何在2D数组上加速python曲线拟合?

如何在2D数组上加速python曲线拟合?,python,performance,numpy,curve-fitting,Python,Performance,Numpy,Curve Fitting,我必须在一大组数据(5000 000)上使用曲线拟合numpy函数。 基本上我已经创建了一个2D数组。第一个尺寸是要执行的配件数量,第二个尺寸是用于配件的点数 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:

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

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")
多处理可以用来加速整个过程,但它仍然相当慢。
有没有办法以“矢量化”的方式使用曲线拟合?

曲线拟合扩展了
scipy.optimize.leastsq
的功能,它本身就是底层MINPACK
lmdif
lmder
fortran例程的包装器。看起来多线程是不可能的,看看这个,上面说

底层Fortran 77例程(MINPACK lmder.f和lmdif.f)不是 可重入,因此无法释放GIL。(因此,没有机会与之平行 使用线程进行处理。)

还有一个开放的发展这个,但它似乎无法完成。。。您可能需要使用不同的库,或者在较低级别的代码中编写包装器/函数。关于并行Levenberg-Marquardt算法的实现,目前有很多研究


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

加速的一种方法是在曲线拟合中添加一些先验知识

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

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

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")

注意额外的关键参数
bounds
ftol
xtol
。根据我的经验,如果可能的话,你应该提供曲线拟合的雅可比矩阵。它可以避免反复调用
func
来计算雅可比矩阵,从而节省时间。这将大大提高您的速度,特别是当您处理大量可优化的参数时。

谢谢您的回答。我目前正试图通过不做所有的计算来节省时间……看起来你链接的票证被5月5日合并的PR关闭了。有可能使用Python的
多处理
内置模块。我应该帮你