多线程调用scipy.optimize.leastsq的目标函数(Multithreaded cal

2019-06-24 05:21发布

我使用scipy.optimize.leastsq与模拟相结合。 leastsq调用用户定义的目标函数,并传递一个输入矢量到它。 进而,目标函数将返回一个错误矢量。 leastsq优化以这样的方式使得误差向量的平方和被最小化输入矢量。

在我的情况下,目标函数在每次被调用时运行全仿真模拟。 所采用的模拟器是单线程,需要几分钟的时间每次运行。 因此,我想一次运行模拟器的多个实例。 然而,调用串行执行的目标函数。

我怎样才能得到leastsq能同时执行多个调用目标函数?

Answer 1:

有一个很好的契机,加快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)


Answer 2:

通过所使用的算法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的用户邮件列表---里面肯定是其中的一个兴趣!



Answer 3:

这是否帮助? http://docs.python.org/library/multiprocessing.html

我总是发现池是最简单的用Python来多进程。



Answer 4:

你用scipy.least_squares ,它是一个更好的选择,当我用它来优化功能,它使用所有可用线程。 因此正是你问什么



Answer 5:

NumPy的/ SciPy的职能通常是对多线程进行了优化。 你看看你的CPU利用率,以确认正在使用的只有一个核心,而仿真正在运行? 否则,你什么都没有运行多个实例来获得。

如果是,事实上,单线程的,那么你最好的选择是采用了multiprocessing模块。 它运行Python解释器的几个实例,所以你可以对SciPy的几个同时呼叫。



文章来源: Multithreaded calls to the objective function of scipy.optimize.leastsq