2

我有一些代码适合实验数据的理论预测,我想运行 LMA(Levenberg-Marquardt 算法)来适合实验的理论。然而,计算并不简单,每个模型在单个处理器上计算大约需要 10-30 分钟,但是问题是令人尴尬的可并行化,并且代码当前设置为将不同的组件(单个迭代)提交给集群计算机(此计算仍需要约 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) 

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

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

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

4

2 回答 2

3

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

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

于 2012-06-24T19:46:53.677 回答
0

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

对 scipy.optimize.leastsq 目标函数的多线程调用

于 2012-06-24T18:51:21.690 回答