Dan*_*iel 12 python numpy mathematical-optimization
我正在构建一个脚本,为另一个要计算的程序生成输入数据[参数].我想优化结果数据.以前我一直在使用numpy powell优化.伪代码看起来像这样.
def value(param):
run_program(param)
#Parse output
return value
scipy.optimize.fmin_powell(value,param)
Run Code Online (Sandbox Code Playgroud)
这很好用; 但是,它的速度非常慢,因为程序的每次迭代都需要几天才能运行.我想做的是粗粒并行化.因此,不是一次运行一次迭代,而是一次运行(参数数量)*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
Run Code Online (Sandbox Code Playgroud)
变量的数量可以在3到12之间,所以像这样的东西可能会加速代码从一年减少到一周.所有变量都相互依赖,我只是从初始猜测中寻找局部最小值.我已经开始使用粗体矩阵的实现; 然而,这是非常复杂的.有没有什么可以做到这一点,有更简单的方法,或任何建议开始?
因此,主要问题如下:是否有一个算法采取初始猜测,生成多个猜测,然后使用这些多个猜测创建一个新的猜测,并重复,直到找到一个阈值.只有分析衍生物可用.有什么好办法解决这个问题,是否已经建立了这样的东西,还有其他选择吗?
感谢您的时间.
作为一个小更新,我确实通过计算每个维度的三个点的简单抛物线,然后使用最小值作为下一个猜测.这似乎工作得体,但不是最佳的.我还在寻找其他选择.
目前最好的实现是并行化powell方法的内循环.
谢谢大家的意见.不幸的是,似乎根本没有对这个特定问题的简明答案.如果我开始实现这样做的东西,我会把它贴在这里; 然而,由于项目不是特别重要或者需要结果,我可能会满足于让它占用节点一段时间.
我认为你想要做的是使用Python内置的线程功能。如果您的工作函数具有或多或少相同的运行时间,无论参数如何,它都会非常高效。
在池中创建 8 个线程,运行函数的 8 个实例,获得 8 个结果,运行优化算法以更改具有 8 个结果的参数,重复...利润?