函数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
可能会被称为几万次,因此会导致放缓或泄漏?
我已经看了,但SciPy的似乎并不具有平行的非线性优化。如果我错了,我会把它当作答案来代替。 – Hooked
你能不能创建'multiprocessing.Pool'一次,然后把它作为一个额外的参数'F'和'fprime'?这样,您可以避免在每次迭代中构建/销毁池所涉及的开销。 –