进行配准的时候发现有些研究说CMAES优化方法算是state of the art的方法,找了一下相关的CMAES实现。在python中可以直接使用cma库,通过pip isntall cma
就可以进行安装。由于CMAES是通过协方差优化,优化变量至少是2D的。example中都是使用cma.ff
中的目标函数,如果是自定义的目标函数需要参照以下写,目标函数带一个参数x0
, 注意需要是list对象:
import cma
import numpy as np
def obj_func(x0):
"""
z(x,y) = 10* sin(sqrt(x^2+y^2))/ sqrt(x^2+y^2)
:param x0:
:return:
"""
l = np.linalg.norm(x0) # sqrt(x^2+y^2)
f = -10 * np.sin(l) / l
return f
然后在optimize
中传入这个目标函数即可。在cma.CMAEvolutionStrategy([1,2], 0.5)
注意输入初始化的参数,数据大小与木目标函数的输入一致。
def test_cma():
es = cma.CMAEvolutionStrategy([1,2], 0.5)
es.optimize(obj_func)
es.logger.plot()
print(es.result_pretty())
if __name__ == '__main__':
test_cma()
最终输出:
CMAEvolutionStrategyResult(xbest=array([2.37504437e-08, 1.24986992e-08]), fbest=-10.0, evals_best=469, evaluations=510, iterations=85, xfavorite=array([ 1.35373800e-08, -1.54743957e-08]), stds=array([1.81745542e-08, 2.55343095e-08]), stop={'tolfun': 1e-11})
表示在[2.37504437e-08, 1.24986992e-08]
位置取到最小值fbest=-10.0
.