我必须对一组大数据(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")
多处理可以用来加速整个过程,但它仍然相当慢。 有没有办法以“矢量化”的方式使用曲线拟合?在
Curve fit扩展了
scipy.optimize.leastsq
的功能,它本身就是底层MINPACKlmdif
和lmder
fortran例程的包装器。看起来多线程是不可能的,看看这个link,它说仍然有一个开放的ticket来开发它,但它看起来似乎无法完成。。。您可能需要使用不同的库或用较低级别的代码编写包装器/函数。并行Levenberg-Marquardt算法的实现有papers。在
也许还有另一种解决方案,使用较少的数据,或者作为粗略估计,您可以将数据随机分成多个部分,在单独的线程(使用多处理器)上曲线拟合每个部分,最后取系数的平均值。在
加快速度的一种方法是在曲线拟合中加入一些先验知识。在
如果您知道参数的预期范围,并且不需要高达第100个有效数字的精度,则可以大大加快计算速度。在
下面是一个示例,其中您将适合
param1
和param2
:注意额外的键参数}。你可以读到关于它们的here.
bounds
、ftol
和{相关问题 更多 >
编程相关推荐