我有一些代码适合实验数据的理论预测,我想运行 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)。
高斯-牛顿算法也应该起作用,因为起点应该在最小值附近。约束拟合的能力(即为拟合参数设置最大值和最小值)会很好,但不是必需的。