Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 并行多维优化_Python_Numpy_Mathematical Optimization - Fatal编程技术网

Python 并行多维优化

Python 并行多维优化,python,numpy,mathematical-optimization,Python,Numpy,Mathematical Optimization,我正在构建一个脚本,生成输入数据[参数],供另一个程序计算。我想优化结果数据。之前我一直在使用numpy powell优化。psuedo代码看起来像这样 def value(param): run_program(param) #Parse output return value scipy.optimize.fmin_powell(value,param) 这很有效;然而,它的运行速度非常慢,因为程序的每个迭代可能需要几天的时间。我想做的是粗粒度并行化。因此

我正在构建一个脚本,生成输入数据[参数],供另一个程序计算。我想优化结果数据。之前我一直在使用numpy powell优化。psuedo代码看起来像这样

def value(param):
     run_program(param)
     #Parse output
     return value

scipy.optimize.fmin_powell(value,param) 
这很有效;然而,它的运行速度非常慢,因为程序的每个迭代可能需要几天的时间。我想做的是粗粒度并行化。因此,它不是一次运行一个迭代,而是一次运行(参数数量)*2。例如:

Initial guess: param=[1,2,3,4,5]

#Modify guess by plus minus another matrix that is changeable at each iteration
jump=[1,1,1,1,1]
#Modify each variable plus/minus jump.
for num,a in enumerate(param):
    new_param1=param[:]
    new_param1[num]=new_param1[num]+jump[num]
    run_program(new_param1)
    new_param2=param[:]
    new_param2[num]=new_param2[num]-jump[num]
    run_program(new_param2)

#Wait until all programs are complete -> Parse Output
Output=[[value,param],...]
#Create new guess
#Repeat
变量的数量可以从3到12不等,因此类似这样的事情可能会将代码从一年缩短到一周。所有变量都是相互依赖的,我只是从最初的猜测中寻找局部极小值。我已经开始使用hessian矩阵实现;然而,这相当复杂。有没有什么方法可以做到这一点,有没有更简单的方法,或者有什么建议可以开始

因此,主要问题如下: 是否有一种算法,它接受一个起始猜测,生成多个猜测,然后使用这些多个猜测创建一个新的猜测,并重复,直到找到阈值。只有解析导数可用。什么是一个很好的方法,是否已经有了这样的东西,是否还有其他的选择

谢谢你抽出时间

作为一个小的更新,我通过计算每个维度的三个点的简单抛物线,然后使用最小值作为下一个猜测来完成这项工作。这似乎工作得不错,但不是最优的。我仍在寻找其他选择

目前最好的实现是并行化鲍威尔方法的内环


谢谢大家的评论。不幸的是,对于这个特殊的问题似乎没有一个简明的答案。如果我着手实现一些可以做到这一点的东西,我会把它粘贴到这里;但是,由于项目不是特别重要,或者结果的需求紧迫,我可能会满足于让它占用一段时间的节点。

我认为您想要做的是使用python内置的线程功能。 如果您的工作函数有或多或少相同的运行时,无论参数是什么,它都将是有效的


在一个池中创建8个线程,运行函数的8个实例,获得8个结果,运行优化算法以使用8个结果更改参数,重复。。。。利润?

如果我没有弄错您的要求,那么您正在尝试将函数一次最小化一个参数

您可以通过创建一组包含单个参数的函数来获得它,其中对于每个函数,您冻结除一个参数之外的所有参数

然后进行循环优化每个变量并更新部分解

在能量分布不太复杂(参数之间的依赖性不太强)的情况下,该方法可以通过大量的参数函数来加速

给定函数

energy(*args) -> value
创建猜测和函数:

guess = [1,1,1,1]
funcs = [ lambda x,i=i: energy( guess[:i]+[x]+guess[i+1:] ) for i in range(len(guess)) ]
然后你把它们放在一个优化周期中

while convergence_condition:
    for func in funcs:
        optimize fot func
        update the guess
    check for convergence

这是简化最小化任务的一种非常简单但有效的方法。我真的记不起这个方法是如何调用的,但仔细看看维基百科中关于最小化的条目就可以了。

目标函数的导数可用吗?如果是,您可以使用(旧的、缓慢但可靠的)或。如果没有,您可以使用有限差分近似导数,并且仍然使用这些方法。我认为,一般来说,如果对导数使用有限差分近似,你最好使用共轭梯度,而不是牛顿法


更现代的方法是随机方法,不需要导数。对于性能良好的问题,与共轭梯度的有限差分近似法相比,在相同的收敛速度下,SPSA需要对目标函数进行的计算要少得多。

有两种方法可以估计梯度,一种是易于并行的,另一种不是:

  • 围绕单个点,例如(f(x+h方向i)-f(x))/h; 这是很容易并行到Ndim
  • “行走”坡度:从x0向e0方向行走至x1, 然后从e1方向的x1到x2。。。; 这是顺序的
使用梯度的极小值是高度发展的、强大的、二次收敛的(在足够光滑的函数上)。 用户提供的梯度函数 当然可以是并行梯度估计器。
一些极小化者使用“行走”梯度,其中包括鲍威尔的方法, 见第页。509.
所以我很困惑:如何并行化它的内部循环

我建议西皮 使用并行梯度估计器,可能使用中心差异,而不是单边差异。
(Fwiw,
比较两个10-d函数上的一些scipy无导数优化器;ymmv。)

我在大学时也遇到了同样的问题,我们有一个fortran算法来计算基于一组变量的发动机效率。当时我们使用modeFRONTIER,如果我没记错的话,没有一种算法能够产生多重猜测

通常的方法是有一个DOE,其中有一些算法来生成最适合您的问题的DOE。之后,我们将并行运行单个DOE条目,一个算法将“观察”显示当前最佳设计的优化开发


旁注:如果您没有群集并且需要更多的计算能力,HTCondor可能会帮助您。

您可以在两个部分执行并行操作:1)并行单个迭代的计算或2)并行开始N初始猜测

在2)上,您需要一个作业控制器来控制N个初始猜测发现线程

请在您的程序中添加一个额外的输出:“下限”,表示当前输入参数的中心值的输出值不会低于此下限

Th