Levenberg-Marquardt leastsq
で使用されるアルゴリズムは、次の点を決定する前に現在の点で目的関数の値を知る必要があります。つまり、このようなシリアルアルゴリズムを並列化する簡単な方法はありません。
ただし、目的関数を並列化することもできます。ここで
def objective_f(params):
r = np.zeros([200], float)
for j in range(200):
r[j] = run_simulation(j, params)
return
def run_simulation(j, params):
r1 = ... compute j-th entry of the result ...
return r1
は、あなたがはっきりマルチプロセッシングモジュールを使用して、たとえば、j
上でループ全体で並列化することができます:それは形式だ場合、これは、行うことができます。このような何か:(未テスト)
def objective_f(params):
r = np.zeros([200], float)
def parameters():
for j in range(200):
yield j, params
pool = multiprocessing.Pool()
r[:] = pool.map(run_simulation, parameters())
return r
並列化のための別の機会を使用すると、複数のデータセットにフィットするようにしている場合---これは(embarassingly)パラレル問題であり、異なるデータセットを並列に装着することができる起こります。
これは役に立ちませんが、文献でLMアルゴリズムの並列化について議論することができます。例:http://dl.acm.org/citation.cfm?id=1542338この論文で提案されている主な最適化は、ヤコビ行列の数値計算の並列化のようです。 leastsq
に独自の並列ヤコビアン関数を供給することで、これを行うことができます。しかし、Levenberg-Marquardt探索ステップを推論的に並列化する論文の残りの提案は、実装するのがより難しく、LMアルゴリズムの変更が必要です。
私は、並列計算の対象となる最適化アルゴリズムを実装しているPython(または他の言語)ライブラリは認識していませんが、いくつかあるかもしれません。あなたがそれらの1つを実装/発見することができれば、これをScipy usersメーリングリストに広告してください---これらのうちの1つに確かに興味があります!