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

1 投票
1 回答
1722 浏览
提问于 2025-04-17 23:56

我刚开始学习Python。这段时间我在尝试学习新的优化算法和Python。

你可以在这里找到CMA-ES优化算法的Python源代码:CMA-ES.py

我已经安装了所有必要的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)

我想要的自定义目标函数来自于对数据的非线性最小二乘拟合:

数据集:23行3列

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)

1 个回答

1

你可以试试这个

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))

或者改成用你自己的解法。不过,这个函数看起来有点复杂,还有很多参数需要设置。

撰写回答