で使用されるアルゴリズムleastsq
、Levenberg-Marquardt は、次の点を決定する前に、現在の点での目的関数の値を知る必要があります。つまり、このようなシリアル アルゴリズムを並列化する簡単な方法はありません。
ただし、場合によっては目的関数を並列化できます。これは、次の形式の場合に実行できます。
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
ここでは、たとえば multiprocessing モジュールを使用して、ループ全体で明らかに並列化できます。このようなもの:(未テスト)
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
複数のデータセットを適合させる必要がある場合、並列化の別の機会が発生します --- これは (恥ずかしいほど) 並列の問題であり、異なるデータセットを並列に適合させることができます。
これで解決しない場合は、文献で LM アルゴリズムの並列化に関する議論を調べることができます。例: http://dl.acm.org/citation.cfm?id=1542338 この論文で提案されている主な最適化は、ヤコビアンの数値計算の並列化のようです。これを行うには、独自の並列化されたヤコビ関数を に提供しますleastsq
。ただし、Levenberg-Marquardt 探索ステップを投機的に並列化するこの論文の残りの提案は、実装がより難しく、LM アルゴリズムの変更が必要です。
並列計算を対象とした最適化アルゴリズムを実装している Python (または他の言語) ライブラリについては知りませんが、いくつかあるかもしれません。それらの 1 つを実装/見つけることができた場合は、Scipy ユーザーのメーリング リストでこれを宣伝してください --- これらの 1 つに確かに関心があります!