2013-07-03 20 views
3

函数scipy.optimize.fmin_bfgs允许用户输入目标函数和渐变。因为我有一个8芯机我的桌面上,我想我可以并行求解器运行scipy.optimize.fmin的天真并行化

from scipy import optimize 
import itertools 
import numpy as np 

def single_grad_point((idx,px)): 
    p = px.copy() 
    epsilon = 10**(-6.0) 
    p[idx] += epsilon 
    d1 = err_func(p) 
    p[idx] -= 2*epsilon 
    d2 = err_func(p) 
    return (d1-d2)/(2*epsilon) 

def err_func_gradient(p): 
    P = multiprocessing.Pool() 
    input_args = zip(*(xrange(len(p)), itertools.cycle((p,)))) 
    sol = P.imap(single_grad_point, input_args) 
    return np.array(list(sol)) 

optimize.fmin_bfgs(err_func, p0, fprime=err_func_gradient) 

概括地说,我使用的多计算梯度的每个方向。如果目标功能err_func很贵,这似乎可以大大加快速度。然而,我的问题是关于所有multiprocessing.Pools的使用和销毁。由于err_func_gradient可能会被称为几万次,因此会导致放缓或泄漏

+0

我已经看了,但SciPy的似乎并不具有平行的非线性优化。如果我错了,我会把它当作答案来代替。 – Hooked

+0

你能不能创建'multiprocessing.Pool'一次,然后把它作为一个额外的参数'F'和'fprime'?这样,您可以避免在每次迭代中构建/销毁池所涉及的开销。 –

回答

5

您可以使用mystic,它提供了几个scipy.optimize算法的并行版本,包括fmin和朋友。

试图做一个天真的通话让每个并行计算单纯的通常是要你慢下来,除非你有一些非常非常昂贵的目标函数来计算。但是,如果您调用fmin的多个实例,则实际上可以以最陡下降的速度获得pseduo-GLOBAL优化。下面的例子表明,已经在几个酒吧被使用的算法(见下文): https://github.com/uqfoundation/mystic/blob/master/examples/buckshot_example06.py

或者类似地,看这里的例子:使用的multiprocessing叉子:https://github.com/uqfoundation/pathos/blob/master/examples2/optimize_cheby_powell_mpmap.py

parallelpython叉子(分布式并行计算): https://github.com/uqfoundation/pathos/blob/master/examples2/optimize_cheby_powell_ppmap.py

或使用的mpi4py扩展: https://github.com/uqfoundation/pathos/blob/master/examples2/optimize_cheby_powell_mpimap.py

获取mystic(解算器框架)和pathos(并行计算架构)位置: https://github.com/uqfoundation

酒吧引用(均略显过时): http://conference.scipy.org/proceedings/scipy2011/mckerns.html http://trac.mystic.cacr.caltech.edu/project/mystic/wiki/Publications

但是,如果你想做的事fmin的更天真的版本,最好的方法是只初始化并加载一次pool。这就是pathos已经为您提供的内容,但是如果您想自己编写代码,只需将pool的实例保存为单例。 https://github.com/uqfoundation/pathos/blob/master/pathos/multiprocessing.py

+0

我找不到关于并行版本上'mystic'任何参考:http://pydoc.net/Python/mystic/0.2a1/mystic.scipy_optimize/。只是使用'scipy_optimize.fmin'并不会立即导致求解器中的多个进程。 – FooBar

+0

github存储库中存在几个示例,具体来说就是这个:https://github.com/uqfoundation/mystic/blob/master/examples/buckshot_example06.py请注意,所有需要的是使用'solver.SetMapper'。或者如果您使用的是基于总体的求解器,那么可以并行化每一代 - 但后者通常只在目标非常昂贵时才能正常工作。 –

+0

这些都不适合我,可能是因为我没有正确安装mystic。我不想破坏这个答案,但也许你可以看看这里:http://stackoverflow.com/questions/37455709/mystic-version-lacks-many-features-from-the-git-repository – FooBar

-3

对于初学者来说,可以calc下的梯度作为

(F(X)-f(X + EPS))/ EPS

然后,计算的F(X)一次所有偏微分。这应该可以为您节省一半的工作量