lud*_*ics 11 python optimization scipy
我有一个简单的功能
def square(x, a=1):
return [x**2 + a, 2*x]
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)
现在,该功能已经过矢量化
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])]
Run Code Online (Sandbox Code Playgroud)
这意味着并行而不是循环运行所有优化可能要快得多.这是SciPy可以轻松实现的吗?或任何其他第三方工具?
Joh*_*ard 14
这是另一个尝试,基于我的原始答案和随后的讨论.
据我所知,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)
Run Code Online (Sandbox Code Playgroud)
我参加聚会有点晚了。但这对于想要通过并行计算减少最小化时间的人来说可能很有趣:
我们在 PyPI 上可用scipy.optimize.minimize(method='L-BFGS-B')的包optimparallel 中实现了并行版本。它可以通过并行评估目标函数和(近似)梯度来加速优化。下面是一个例子:
from optimparallel import minimize_parallel
def my_square(x, a=1):
return (x - a)**2
minimize_parallel(fun=my_square, x0=1, args=11)
Run Code Online (Sandbox Code Playgroud)
请注意,并行实现只会减少具有较长评估时间(例如,长于 0.1 秒)的目标函数的优化时间。以下是可能的并行缩放的说明:

| 归档时间: |
|
| 查看次数: |
10318 次 |
| 最近记录: |