python scipy差分进化优化失败,工人不是1
我正在尝试使用的python scipy差分进化优化失败,工人不是1,python,python-3.x,parallel-processing,scipy,differential-evolution,Python,Python 3.x,Parallel Processing,Scipy,Differential Evolution,我正在尝试使用的workers参数 当我把它设为1时,我的脚本运行没有问题。 如果我放置了不同的内容,它将失败,并进行以下回溯: 回溯(最近一次呼叫最后一次): 文件“/home/ubuntu/.local/lib/python3.6/site-packages/scipy/_-lib/_-util.py”,第419行,在调用中__ 返回self.\u mapfunc(func,iterable) 文件“/usr/lib/python3.6/multiprocessing/pool.py”,第2
workers
参数
当我把它设为1时,我的脚本运行没有问题。
如果我放置了不同的内容,它将失败,并进行以下回溯:
回溯(最近一次呼叫最后一次):
文件“/home/ubuntu/.local/lib/python3.6/site-packages/scipy/_-lib/_-util.py”,第419行,在调用中__
返回self.\u mapfunc(func,iterable)
文件“/usr/lib/python3.6/multiprocessing/pool.py”,第266行,在地图中
返回self.\u map\u async(func、iterable、mapstar、chunksize).get()
get中第644行的文件“/usr/lib/python3.6/multiprocessing/pool.py”
提升自我价值
文件“/usr/lib/python3.6/multiprocessing/pool.py”,第424行,在任务处理中
放置(任务)
文件“/usr/lib/python3.6/multiprocessing/connection.py”,第206行,在send中
self.\u发送\u字节(\u ForkingPickler.dumps(obj))
文件“/usr/lib/python3.6/multiprocessing/reduce.py”,第51行,转储
cls(buf,协议).dump(obj)
TypeError:无法序列化'\u io.TextIOWrapper'对象
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/home/ubuntu/.local/lib/python3.6/site packages/scipy/optimize/_differentialevolution.py”,第878行,在_compute_population_energies中
参数_pop[0:nfevs]))
文件“/home/ubuntu/.local/lib/python3.6/site-packages/scipy/_-lib/_-util.py”,第422行,在调用中__
raise TypeError(“类似映射的可调用对象必须为”
TypeError:map-like callable的格式必须为f(func,iterable)
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“main_parallel.py”,第323行,在
优化器(args.asset_类、udl、tenor、args.criteria、params_decage、params、coach_服务器、args.num_workers)
文件“main_parallel.py”,第269行,在优化器中
maxiter=5,workers=num_workers,突变=(0.5,1.5),重组=0.8)
文件“/home/ubuntu/.local/lib/python3.6/site packages/scipy/optimize/_differentialevolution.py”,第306行,在differential_evolution中
ret=solver.solve()
文件“/home/ubuntu/.local/lib/python3.6/site packages/scipy/optimize/_differentialevolution.py”,第745行,在solve中
自总体[自可行])
文件“/home/ubuntu/.local/lib/python3.6/site packages/scipy/optimize/\u differential evolution.py”,第883行,在计算人口能量中
raise RUNTIMERROR(“类似映射的可调用对象必须为”
RuntimeError:map-like callable的格式必须为f(func,iterable),返回一个与“iterable”长度相同的数字序列
请有人解释一下如何使用这个参数(具体的目标函数?其他约束条件?)
另外,使用多核的简单python差分进化优化示例也值得赞赏。关于worker使用的关键部分是警告,当worker!=1时,它
[…]要求func
可酸洗
出现的错误中有几个提示表明func
不可pickle,即
self.\u映射函数(func,iterable)
...
self.\u发送\u字节(\u ForkingPickler.dumps(obj))
...
TypeError:无法序列化'\u io.TextIOWrapper'对象
显然,有人试图对func
进行酸洗,但失败的原因可能是func
不可酸洗。文档中的另一个签名表明,workers
似乎试图被解释为类似于映射的或可调用的。可以预见,这也会失败,因为workers
是实际上是一个int
文档中包含一个whereworkers!=1
,它工作正常
来自scipy.optimize import differential_evolution的,rosen
边界=[(0,2)、(0,2)、(0,2)、(0,2)、(0,2)、(0,2)]
结果=差异进化(rosen,bounds,Updated='deferred',
工人=-1)
result.x,result.fun
如果您将scipy.optimize.differential_evolution
中使用的func
重构为可通过序列化,您应该能够成功地使用workers!=1
。谢谢您的帮助。您如何知道罪魁祸首是args.asset_类?它只是一个字符串,所以我假设它的处理是内置的。@Chapo Tha这是一个错误,我误读了错误语句。我需要看看你如何调用scipy.optimize.differential\u evolution
,告诉你酸洗result\u diff\u evo=differential\u evolution需要重构什么(func=optimizer\u函数,bounds=bounds,args=(init\u参数名称,df,条件,参数衰减[udl][tenor][“第一个日期”]、参数衰变[udl][tenor][busdays]、参数衰变[udl][tenor][coeff”]、参数衰变[udl][tenor][spot_start”]、参数衰变[udl][tenor][iv_start”]、参数[“verbose”]、文件夹、测试参数、、初始值=pop_denorm、最大值=5、工人数=num_工人、突变=(0.5、1.5),重组=0.8,打印=True)
为实际值line@Chapo您的问题的解决方案是重构optimizer\u函数
,通过pickling将其序列化所有参数都相当简单,除了tested\u参数
,它是通过tested\u params=open(f“tested\u params.csv”,“w”)获得的
。这可能是问题所在吗?