python中非线性数值优化的cma-es协方差矩阵自适应进化策略
cma的Python项目详细描述
一种困难(非凸, 病态、多模态、粗糙、噪声)优化问题 连续搜索空间,用python实现。
典型的应用领域是有约束或无约束的 目标函数具有:
- 搜索5到(几个)100之间的空间维度,
- 没有可用的渐变,
- 至少,比方说,100倍的维函数计算需要 得到满意的解决方案,
- 不可分离、病态或崎岖/多模式景观。
CMA-ES是相当可靠的,但是预算很小(功能较少 比,比如说,100倍的维度)或者非常小的维度 有更好(即更快)的方法可用。
pycma模块提供了 类cma.CMAEvolutionStrategy中的cma-es算法 cma.purecma.CMAES。
安装
有几种安装方法:
在终端命令行中键入:
python -m pip install cma
只键入pip而不是python -m pip就足够了。或者, 或者:
easy_install cma
软件包将自动下载和安装。到 {STR 1 } $升级< /强>现有的安装,“^ TT6}$”必须被替换 在这两种情况下都是“-U cma”。如果你从没听说过pip,see here。
下载并解压缩cma-...tar.gz文件,然后键入:
pip install -e cma
或:
python setup.py install
在cma-...文件夹中(在windows下 “setup.py install”)。
在windows下还可以下载ms-windows安装程序。
安装可能需要根权限。在这种情况下,尝试 pip的--user选项或以sudo开头。
来自tar存档的文件夹cma也可以在没有 任何安装(只要import需要找到它)。
用法示例
在python外壳中:
>>> import cma >>> help(cma) <output omitted> >>> es = cma.CMAEvolutionStrategy(8 * [0], 0.5) (5_w,10)-aCMA-ES (mu_w=3.2,w_1=45%) in dimension 8 (seed=468976, Tue May 6 19:14:06 2014) >>> help(es) # the same as help(cma.CMAEvolutionStrategy) <output omitted> >>> es.optimize(cma.ff.rosen) Iterat #Fevals function value axis ratio sigma minstd maxstd min:sec 1 10 1.042661803766204e+02 1.0e+00 4.50e-01 4e-01 5e-01 0:0.0 2 20 7.322331708590002e+01 1.2e+00 3.89e-01 4e-01 4e-01 0:0.0 3 30 6.048150359372417e+01 1.2e+00 3.47e-01 3e-01 3e-01 0:0.0 100 1000 3.165939452385367e+00 1.1e+01 7.08e-02 2e-02 7e-02 0:0.2 200 2000 4.157333035296804e-01 1.9e+01 8.10e-02 9e-03 5e-02 0:0.4 300 3000 2.413696640005903e-04 4.3e+01 9.57e-03 3e-04 7e-03 0:0.5 400 4000 1.271582136805314e-11 7.6e+01 9.70e-06 8e-08 3e-06 0:0.7 439 4390 1.062554035878040e-14 9.4e+01 5.31e-07 3e-09 8e-08 0:0.8 >>> es.result_pretty() # pretty print result termination on tolfun=1e-11 final/bestever f-value = 3.729752e-15 3.729752e-15 mean solution: [ 1. 1. 1. 1. 0.99999999 0.99999998 0.99999995 0.99999991] std deviation: [ 2.84303359e-09 2.74700402e-09 3.28154576e-09 5.92961588e-09 1.07700123e-08 2.12590385e-08 4.09374304e-08 8.16649754e-08]
用初始解all优化8维rosenbrock函数 零和首字母sigma = 0.5。
几乎同样的效果可以通过以下方式实现,而不是“精心设计”:
>>> import cma >>> xopt, es = cma.fmin2(cma.ff.rosen, 8 * [0], 0.5) <output omitted>
更详细地展示ask-and-tell接口:
>>> import cma >>> es = cma.CMAEvolutionStrategy(12 * [0], 0.5) >>> while not es.stop(): ... solutions = es.ask() ... es.tell(solutions, [cma.ff.rosen(x) for x in solutions]) ... es.logger.add() # write data to disc to be plotted ... es.disp() <output omitted> >>> es.result_pretty() <output omitted> >>> cma.plot() # shortcut for es.logger.plot()
CMAOptions类管理CMAEvolutionStrategy的选项, 例如,详细选项如下:
>>> import cma >>> cma.s.pprint(cma.CMAOptions('erb')) {'verb_log': '1 #v verbosity: write data to files every verb_log iteration, writing can be time critical on fast to evaluate functions' 'verbose': '1 #v verbosity e.v. of initial/final message, -1 is very quiet, not yet implemented' 'verb_plot': '0 #v in fmin(): plot() is called every verb_plot iteration' 'verb_disp': '100 #v verbosity: display console output every verb_disp iteration' 'verb_filenameprefix': 'outcmaes # output filenames prefix' 'verb_append': '0 # initial evaluation counter, if append, do not overwrite output files' 'verb_time': 'True #v output timings on console'}
选项的传递方式如下:
>>> import cma >>> es = cma.CMAEvolutionStrategy(8 * [0], 0.5, {'verb_disp': 1}) # display each iteration
文件
阅读完整的软件包文档:
另请参见
依赖关系
- 必需:numpy–数字、字符串、记录和对象的数组处理
- 可选(强烈建议):matplotlib–python绘图包(包括pylab)
使用pip install numpy等进行安装。对于依赖性较小的cma-es的python实现,请参见here。
许可证:BSD