关于skopt.gp_minimize处理含未知方差噪声数据集返回最小值的疑问
skopt.gp_minimize 噪声数据集下的最优值返回逻辑
默认返回结果
默认情况下,gp_minimize返回的是所有已评估过的数据样本中目标值最小的那个对应的x值,而非代理函数(高斯过程模型)的最小值。
这是因为贝叶斯优化的核心是通过代理函数引导采样,但最终目标是找到能得到真实最小目标值的点——噪声场景下,代理函数的最小值是模型拟合后的平滑估计,而样本点的目标值是真实评估的结果,因此默认返回已评估样本里的最优解。
如何指定返回代理函数的最小值
可以手动基于优化后的高斯过程模型来寻找代理函数的最小值,步骤如下:
- 从优化结果的搜索空间中生成大量候选点;
- 用训练好的代理模型(
res.models[-1])预测这些候选点的均值(代理函数的输出); - 找到预测均值最小的候选点,即为代理函数的最小值对应的x。
示例代码:
from skopt import gp_minimize from skopt.space import Real import numpy as np # 带噪声的目标函数 def noisy_objective(x): return x[0] ** 2 + np.random.normal(0, 0.1) # 执行贝叶斯优化 result = gp_minimize(noisy_objective, [Real(-2, 2)], n_calls=20) # 默认返回的是已评估样本中的最优x print("默认样本最优x:", result.x) print("样本对应目标值:", result.fun) # 获取代理函数的最小值 # 生成搜索空间内的大量候选点 candidate_points = result.space.rvs(n_samples=10000) # 预测代理函数的均值 predicted_means = result.models[-1].predict(candidate_points) # 找到均值最小的点 proxy_best_idx = np.argmin(predicted_means) proxy_best_x = candidate_points[proxy_best_idx] proxy_best_mean = predicted_means[proxy_best_idx] print("代理函数最优x:", proxy_best_x) print("代理函数预测均值:", proxy_best_mean)
需要注意的是,代理函数的最小值是模型对潜在最优解的估计,并没有经过真实目标函数的评估,因此实际使用时需要根据需求选择:如果需要真实评估过的最优结果,用默认返回;如果需要模型拟合后的平滑最优估计,用上述方法手动计算。
内容的提问来源于stack exchange,提问作者Jakob Sejten
相关产品推荐
相关产品推荐

