如何在2D数组上加速python曲线拟合?
我必须在一大组数据(5000 000)上使用曲线拟合numpy函数。 基本上我已经创建了一个2D数组。第一个尺寸是要执行的配件数量,第二个尺寸是用于配件的点数如何在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:
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
的功能,它本身就是底层MINPACKlmdif
和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的多处理
内置模块。我应该帮你