2012-06-22 110 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

我基本上實現了一個有限差分近似來提供雅可比矩陣(它仍然存在一些小問題,但這基本上是由於我首先對雅可比行爲缺乏理解!)。不幸的是,獲得分析衍生物將是不可能的。 –