我使用scipy.optimize.leastsq
与模拟相结合。 leastsq
调用用户定义的目标函数,并传递一个输入矢量到它。 进而,目标函数将返回一个错误矢量。 leastsq
优化以这样的方式使得误差向量的平方和被最小化输入矢量。
在我的情况下,目标函数在每次被调用时运行全仿真模拟。 所采用的模拟器是单线程,需要几分钟的时间每次运行。 因此,我想一次运行模拟器的多个实例。 然而,调用串行执行的目标函数。
我怎样才能得到leastsq
能同时执行多个调用目标函数?
我使用scipy.optimize.leastsq
与模拟相结合。 leastsq
调用用户定义的目标函数,并传递一个输入矢量到它。 进而,目标函数将返回一个错误矢量。 leastsq
优化以这样的方式使得误差向量的平方和被最小化输入矢量。
在我的情况下,目标函数在每次被调用时运行全仿真模拟。 所采用的模拟器是单线程,需要几分钟的时间每次运行。 因此,我想一次运行模拟器的多个实例。 然而,调用串行执行的目标函数。
我怎样才能得到leastsq
能同时执行多个调用目标函数?
有一个很好的契机,加快leastsq
通过提供自己的函数来计算的衍生工具(在Dfun
参数),为您提供有几个参数。 如果没有提供该功能, leastsq
在每个参数的迭代的每个时间,这是耗时的计算衍生物。 这似乎把大部分时间都在装修。
您可以使用自己的Dfun
函数计算的衍生品使用的每个参数multiprocessing.Pool
做的工作。 这些衍生物可以独立地计算出,并应而轻易地并行化。
下面是一个粗略的例子,说明如何做到这一点:
import numpy as np
import multiprocessing
import scipy.optimize
def calcmod(params):
"""Return the model."""
return func(params)
def delta(params):
"""Difference between model and data."""
return calcmod(params) - y
pool = multiprocessing.Pool(4)
def Dfun(params):
"""Calculate derivatives for each parameter using pool."""
zeropred = calcmod(params)
derivparams = []
delta = 1e-4
for i in range(len(params)):
copy = np.array(params)
copy[i] += delta
derivparams.append(copy)
results = pool.map(calcmod, derivparams)
derivs = [ (r - zeropred)/delta for r in results ]
return derivs
retn = scipy.optimize.leastsq(leastfuncall, inputparams, gtol=0.01,
Dfun=Dfun, col_deriv=1)
通过所使用的算法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
。 纸,推测并行文伯格 - 马夸特搜索步骤,剩下的建议然而,更难以实现,需要在LM算法的改变。
我不知道的Python(或其他语言)实现针对并行计算优化算法库,尽管可能会有一些。 如果你成功地执行/找到其中之一,请做广告这对SciPy的用户邮件列表---里面肯定是其中的一个兴趣!
这是否帮助? http://docs.python.org/library/multiprocessing.html
我总是发现池是最简单的用Python来多进程。
你用scipy.least_squares ,它是一个更好的选择,当我用它来优化功能,它使用所有可用线程。 因此正是你问什么
NumPy的/ SciPy的职能通常是对多线程进行了优化。 你看看你的CPU利用率,以确认正在使用的只有一个核心,而仿真正在运行? 否则,你什么都没有运行多个实例来获得。
如果是,事实上,单线程的,那么你最好的选择是采用了multiprocessing
模块。 它运行Python解释器的几个实例,所以你可以对SciPy的几个同时呼叫。