2012-06-22 47 views
1

我有一段适合实验数据理论预测的代码,我想运行一个LMA(Levenberg-Marquardt算法)来适应实验的理论。然而,这些计算并不是微不足道的,每个模型在单个处理器上花费大约10-30分钟的时间进行计算,然而这个问题是令人尴尬的并行处理,并且代码目前被设置为将不同的组件(单个迭代)提交给集群计算机(这个计算仍需要1-2分钟)。Python:Levenberg Marquardt算法并行化

现在这个提交脚本在python中的可调用函数中设置 - 因此为了设置它与scipy LMA(scipy.optimise.leastsq)它是相对平凡 - 但我想像scipy LMA会传递每个单独计算(用于测量梯度)并等待返回,而我更喜欢LMA一次发送整套计算,然后等待返回。蟒蛇提交脚本看起来有点像:

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可以用于这条路)。

高斯 - 牛顿算法应该也可以工作,因为起点应该接近最小值。限制拟合的能力(即为拟合参数设置最大值和最小值)会很好,但并非必要。

回答

2

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

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

+0

当然,使用并行化的雅可比行列式假定您可以获得模型的分析导数,但事实可能并非如此。否则,你要么必须在你的雅可比行代码中做有限差分(这可能对选择的步长非常敏感),要么必须重新调整求解器。这里有几个纯粹的Python lma解决方案(例如:http://code.google.com/p/agpy/source/browse/trunk/mpfit/mpfit.py?r=399),这可能是一个好地方开始。 – user488551

+0

不,我不认为你可以得到一个分析衍生物。如果你不能提供一个,那么你最好自己实现一个有限差分近似,因为你可以并行化它。正如我所说的,如果你不提供'J',leastsq将连续调用'f'来做它自己的近似。 – pwuertz

+0

我基本上实现了一个有限差分近似来提供雅可比矩阵(它仍然存在一些小问题,但这基本上是由于我首先对雅可比行为缺乏理解!)。不幸的是,获得分析衍生物将是不可能的。 –