如何将CMA-ES优化应用于Python中任意用户定义的目标函数?

如何将CMA-ES优化应用于Python中任意用户定义的目标函数?,python,numpy,matplotlib,functional-programming,nonlinear-optimization,Python,Numpy,Matplotlib,Functional Programming,Nonlinear Optimization,我是Python新手。这些天我在努力学习新的优化算法和python Python中的CMA-ES优化算法源代码可在以下位置找到: 我已经安装了所有必要的Python包(numpy、matplotlib、winpython等)。运行源代码提供的测试功能也很容易,例如 >>> import cma >>> res = cma.fmin(cma.fcts.rosen, 4*[-1],1, ftarget=1e-6,

我是Python新手。这些天我在努力学习新的优化算法和python

Python中的CMA-ES优化算法源代码可在以下位置找到:

我已经安装了所有必要的Python包(numpy、matplotlib、winpython等)。运行源代码提供的测试功能也很容易,例如

            >>> import cma
            >>> res = cma.fmin(cma.fcts.rosen, 4*[-1],1, ftarget=1e-6, restarts=3, verb_time=0, verb_disp=500, seed=3)
所需的定制目标函数来自数据的非线性最小二乘拟合:

数据集:23x3

x        y      z
----------------------
1100.21 57.66   1.8
1157.88 57.79   1.7
1272.85 58.03   1.67
1330.34 58.22   1.67
1389.   57.69   1.7
1590.   57.01   1.67
1820.   55.42   1.6
2049.   59.35   1.5
2308.   58.32   1.56
2596.   57.28   1.6
2711.   57.13   1.368
2826.   55.61   1.33
2883.   54.79   1.315
2940.   53.78   1.325
3001.   54.41   1.3
3117.   55.93   1.2495
3291.   57.15   1.28
3377.   58.05   1.25
3522.   58.41   1.31
3725.   57.61   1.31
3899.   53.55   1.195
4015.   51.22   1.178
4188.   50.89   1.185
非线性模型:a(1)-a(5)为参数:

 z = a(1)*y^a(2)*x^a(3)+a(4)*x^a(5)
你可以试试

data = """
1100.21 57.66   1.8
1157.88 57.79   1.7
1272.85 58.03   1.67
1330.34 58.22   1.67
1389.   57.69   1.7
1590.   57.01   1.67
1820.   55.42   1.6
2049.   59.35   1.5
2308.   58.32   1.56
2596.   57.28   1.6
2711.   57.13   1.368
2826.   55.61   1.33
2883.   54.79   1.315
2940.   53.78   1.325
3001.   54.41   1.3
3117.   55.93   1.2495
3291.   57.15   1.28
3377.   58.05   1.25
3522.   58.41   1.31
3725.   57.61   1.31
3899.   53.55   1.195
4015.   51.22   1.178
4188.   50.89   1.185"""
data = np.array([line.split() for line in data.strip().split('\n')], dtype='f8')
x, y, z = data[:, 0], data[:, 1], data[:, 2]

def obj(a):
    z_hat = a[0]*y**a[1]*x**a[2]+a[3]*x**a[4]
    return ((z-z_hat)**2).sum()

import scipy.optimize as opt
print opt.minimize(obj, np.ones(5))

或修改以使用解算器。但是,该函数非常可怕,有很多参数。

那么问题出在哪里?你试过你想要的目标函数了吗?它有用吗?为什么不呢?我不知道如何在python中创建目标函数并在其上应用CMA算法你写了你想要数据的最小二乘拟合:
def obj(a):return((z-z_hat(a))**2.sum()
其中
z_hat=a(1)*y^a(2)*x^a(3)+a(4)*x^a(5)
我甚至不知道如何处理这样一个23x3数组,我以前通过八度音阶,C++很容易操作它,所以我不需要先将
数据
声明为
double
数组,而使用矩形括号“[[],[],…]”?非常感谢你。这些基础知识对我理解Python语法非常有用。你基本上是按行分割字符串,按空格分割每行。得到一个列表,然后将其转换为二维数组。你把x,y,z作为数组的列,然后定义你的目标函数。非常聪明。在从字符串转换为双数组语句之前,似乎遗漏了一条语句
import numpy as np
。正确。我忘了抄那个。