SciPy中的并行优化
我有一个简单的功能
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可以轻松做到这一点吗?还是其他任何第三方工具?
-
根据我的原始答案和随后的讨论,这是另一种尝试。
据我所知,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)