Python:Levenberg Marquardt算法并行化

时间:2012-06-22 14:42:47

标签: python parallel-processing levenberg-marquardt

我有一些符合实验数据理论预测的代码,我想运行LMA(Levenberg-Marquardt算法)以使理论适合实验。然而,计算是非平凡的,每个模型在单个处理器上计算需要大约10-30分钟,但问题是令人尴尬的并行化,并且代码目前设置为将不同的组件(单个itteration)提交给a集群计算机(此计算仍需要约1-2分钟)。

现在这个提交脚本是在python中的一个可调用函数中设置的 - 所以使用scipy LMA(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) 

&#34; value_parameters&#34;是一个嵌套的维度列表[number_iterations] [number_parameters],其中包含要为每个模型计算的变量,&#34; number_parameters&#34;是要拟合的参数的数量,&#34; number_iterations&#34;是要计算的模型数(所以每一步,衡量梯度,LMA计算2 * number_parameters模型),&#34; fitness_parameter&#34;是必须最小化的值(并且具有维度[迭代])。

现在,显然,我可以编写自己的LMA,但这有点重新发明轮子 - 我想知道是否有任何东西可以满足我的需求(或者如果scipy LMA可以用于此方式)。

Gauss-Newton算法应该也可以工作,因为起点应该接近最小值。约束拟合的能力(即设定拟合参数的最大值和最小值)将是不错的,但是没有必要。

2 个答案:

答案 0 :(得分:3)

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

不幸的是,scipy中的LMA实现使用fJ的单独函数。您可能希望在f中缓存您计算的信息,以便在J中使用相同参数vecor调用它时重复使用它。或者,您可以实现使用单fJ次呼叫的自己的LMA版本。

答案 1 :(得分:0)

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

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