SciPy中的并行优化

发布于 2021-01-29 15:22:34

我有一个简单的功能

def square(x, a=1):
    return [x**2 + a, 2*x]

我想将其最小化x,以获得几个参数a。从本质上讲,我目前有一些循环可以执行以下操作:

In [89]: from scipy import optimize

In [90]: res = optimize.minimize(square, 25, method='BFGS', jac=True)

In [91]: [res.x, res.fun]
Out[91]: [array([ 0.]), 1.0]

In [92]: l = lambda x: square(x, 2)

In [93]: res = optimize.minimize(l, 25, method='BFGS', jac=True)

In [94]: [res.x, res.fun]
Out[94]: [array([ 0.]), 2.0]

现在,该功能已经向量化

In [98]: square(array([2,3]))
Out[98]: [array([ 5, 10]), array([4, 6])]

In [99]: square(array([2,3]), array([2,3]))
Out[99]: [array([ 6, 12]), array([4, 6])]

这意味着并行运行所有优化可能比循环运行要快得多。使用SciPy可以轻松做到这一点吗?还是其他任何第三方工具?

关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    根据我的原始答案和随后的讨论,这是另一种尝试。

    据我所知,scipy.optimize模块适用于具有标量或矢量输入以及标量输出或“成本”的函数。

    由于您将每个方程式视为独立于其他方程式,所以我最好的主意是使用多处理模块并行进行工作。如果您要最小化的功能与问题中的功能一样简单,那么我认为这是不值得的。

    如果功能更复杂,并且您希望将工作划分,请尝试以下操作:

    import numpy as np
    from scipy import optimize
    from multiprocessing import Pool
    
    def square(x, a=1):
        return [np.sum(x**2 + a), 2*x]
    
    def minimize(args):
        f,x,a = args
        res = optimize.minimize(f, x, method = 'BFGS', jac = True, args = [a])
        return res.x
    
    # your a values
    a = np.arange(1,11)
    
    # initial guess for all the x values
    x = np.empty(len(a))
    x[:] = 25
    
    args = [(square,a[i],x[i]) for i in range(10)]
    p = Pool(4)
    print p.map(minimize,args)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看