如何使用Scikit Optimize适配含实型、整型变量的昂贵黑盒优化问题
问题修复方案
核心报错原因
原代码存在两处不符合scikit-optimize调用规则的问题:
- 目标函数入参格式错误:
gp_minimize每次迭代会将所有搜索参数打包为单个长度等于搜索维度的序列传入目标函数,不会按参数名拆分为多个独立入参 - 结果读取逻辑错误:优化返回结果的
res.x属性是存储所有最优参数的列表,不存在res.y、res.z这类单独的参数属性,同时原输出语句的占位符数量与传入参数数量不匹配
修正后可运行代码
import numpy as np from skopt import gp_minimize from skopt.space import Integer, Real np.random.seed(123) # 入参修改为单个序列params,按搜索空间顺序解包为x、y、z def f(params): x, y, z = params return (np.sin(5 * x) * (1 - np.tanh(x ** 2)) * np.random.randn() * 0.1 - y**2 + z**2) search_space = [ Real(-2, 2, name='x'), Integer(-2, 2, name='y'), Real(0, 2, name='z') ] # 新增random_state保证结果可复现 res = gp_minimize(f, search_space, n_calls=20, random_state=123) # 按索引从res.x读取对应参数,占位符数量匹配 print("x*=%.2f, y*=%.2f, z*=%.2f, f(x*,y*,z*)=%.2f" % (res.x[0], res.x[1], res.x[2], res.fun))
适配性说明
该实现完全匹配你的黑盒优化需求:
- 原生支持实型、整型混合的多变量搜索空间,不需要额外处理不同参数类型的优化逻辑
- 你可以直接替换dummy函数
f的内部逻辑为调用外部软件获取代价的代码,不需要修改优化框架的其他配置
内容的提问来源于stack exchange,提问作者user536696
相关产品推荐
相关产品推荐

