Python: Levenberg Marquardt算法并行化

2024-04-28 14:01:24 发布

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

我有一段代码可以将理论预测与实验数据相吻合,我想运行一个LMA(Levenberg-Marquardt算法)来让理论与实验相吻合。然而,计算是非常重要的,每个模型在一个处理器上计算大约需要10-30分钟,但是这个问题是令人尴尬的可并行的,并且代码目前被设置为将不同的组件(一次提交)提交到一个集群计算机(这个计算仍然需要大约1-2分钟)。在

现在,这个提交脚本是在python中的一个可调用函数中设置的,所以可以用scipylma来设置它(scipy.optimise.leastsq公司)这是相对简单的-然而,我想,scipy LMA将串行地通过每个单独的计算(用于测量梯度),并等待返回,而我更希望LMA发送一次完成整套计算,然后等待返回。python提交脚本看起来有点像:

def submission_script(number_iterations,number_parameters,value_parameters):
      fitness_parameter = [0]*number_iterations
      <fun stuff>
      return (fitness_parameter) 

其中“value_parameters”是一个嵌套的维度列表[number_iterations][number_parameters],其中包含要为每个模型计算的变量,“number_parameters”是要拟合的参数数,“number_iterations”是要计算的模型数(因此,每个步骤都要测量梯度,LMA计算2*number个参数模型),而“fitness_parameter”是必须最小化的值(具有维度[迭代])。在

现在,很明显,我可以写我自己的LMA,但这只是一个小小的改头换面——我想知道是否有什么东西可以满足我的需求(或者说,凌乱的LMA可以用这种方式使用)。在

Gauss-Newton算法应该也可以工作,因为起点应该在最小值附近。约束拟合的能力(即为拟合参数设置最大值和最小值)会很好,但不是必需的。在


Tags: 代码模型脚本算法numberparametervaluescipy
2条回答

在scipy.optimize.leatsq函数使您有机会提供一个函数J,用于计算给定参数向量的雅可比矩阵。您可以实现一个多处理解决方案来计算这个矩阵,而不是scipy.optimize.leatsq通过串行调用函数f来近似它。在

不幸的是,scipy中的LMA实现对f和{}使用了单独的函数。如果使用相同的参数vector调用,您可能需要缓存在f中计算的信息,以便在J中重用它。或者,您可以实现一个使用单个fJ调用的自己的LMA版本。在

发现这基本上是一个重复的问题-它已经被问了一个答案在下面的链接。在

Multithreaded calls to the objective function of scipy.optimize.leastsq

相关问题 更多 >