GPyOpt迭代地找到最大目标函数值;检索建议的下一个位置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPyOpt迭代地找到最大目标函数值;检索建议的下一个位置相关的知识,希望对你有一定的参考价值。

我刚开始使用GPy和GPyOpt。我的目标是设计一个迭代过程来找到x的位置,其中y是最大值。虚拟x阵列从0到100跨越0.5步。虚拟y阵列是x阵列的函数。真函数是y = -x ** 2 + 50 * x + 5,因此ymax是x = 25.0时。

我通过随机分配5个点到x阵列(相应的5个y值)开始它,并运行贝叶斯优化让它推荐下一个样本位置。我可以使用方便的myBopt.plot_acquistion()来生成一个图。示例图如下。 enter image description here enter image description here

问题:

(1)类高斯峰和垂直线是什么意思?他们建议什么?我假设高斯峰的中心是建议的下一个采样位置,这是正确的吗?

(2)如何检索高斯峰的中心位置?我试图从myBopt打印出一些东西,但是无法在任何地方找到它(如果我弄清楚如何获得这个数字,我可以将它附加到原始列表以启动另一个BO并找到下一个位置,直到收敛)。

(3)有没有办法检索用于绘制采集功能图的原始数据?这一定是在某个地方保存的。

(4)我也生成了收敛图(在采集图下),我真的无法理解它。有人可以向我解释一下吗?

谢谢。

import GPyOpt
import GPy
from numpy.random import seed
import numpy as np
import matplotlib.pyplot as plt
import random

N = 5
x_array = np.arange(0,100,0.5)
x_random = np.array(sorted(random.sample(x_array, N)))
y_random = (-x_random**2 + 50*x_random + 5) # y = -x**2 + 50*x  + 5

## x_feed and y_feed are the matrices that will be fed into Bayesian Optimization
x_feed = x_random[:, None] # (200, 1)
y_feed = y_random[:, None] # (200, 1)

##creat the objective function
class max_number(object):
    def __init__(self, x_feed, y_feed):
        self.x_feed = x_feed
        self.y_feed = y_feed

    def f(self, x):
        return np.dot(1.0*(x_feed == x).sum(axis = 1), y_feed)[:, None]


func = max_number(x_feed, y_feed)
domain = [{'name' : 'guess_number',
          'type' :  'bandit',
          'domain': x_feed}]

seed(123)
myBopt = GPyOpt.methods.BayesianOptimization(f = func.f,
                                             domain = domain,
                                             acquisition_type = 'EI',
                                             maximize = True,
                                             exact_feval = False,
                                             initial_design_numdata = 5,
                                             verbosity = True)

max_iter = 50
myBopt.run_optimization(max_iter)

myBopt.plot_acquisition()

print 'x random initial points {}'.format(x_random)
print 'y random initial points {}'.format(y_random)
print 'myBopt.X {}'.format(myBopt.X)
print 'myBopt.x_opt {}'.format(myBopt.x_opt)
print 'myBopt.Y {}'.format(myBopt.Y)
print 'myBopt.Y_best {}'.format(myBopt.Y_best)
print 'myBopt.Y_new {}'.format(myBopt.Y_new)
print 'myBopt.suggest_next_locations {}'.format(myBopt.suggest_next_locations())
答案

相当多的问题。对未来的建议,它更适合SO的格式,每个问题都有一个帖子。但现在:

  1. 垂直红线表示采集功能建议运行该功能的最后一点。钟形曲线是整个采集函数图的一部分(注意红线延伸到整个y = 0线) - 它只是绘制采集函数,因此您可以直观地了解最有可能建议下一点的位置。
  2. 您需要自己优化采集功能。或者你可以使用BO.suggest_next_locations。结账教程笔记本,有一个后者的例子。
  3. 我建议浏览plot_acquisition的源代码,很清楚使用什么数据以及如何访问它。
  4. 我认为这些情节具有非常自我描述的标题。左边的图表显示了对目标函数的两次连续调用之间的距离。随着时间的推移,您会发​​现它会缩小,因为优化会找到最佳效果。右边的图表显示了到目前为止发现的y的最佳值。随着时间的推移,你会期望它变得平坦。

以上是关于GPyOpt迭代地找到最大目标函数值;检索建议的下一个位置的主要内容,如果未能解决你的问题,请参考以下文章

递归或迭代地从 HashMap 中检索键值组合

通过存储过程检索 Oracle 序列的下一个值

『科学计算_理论』优化算法:梯度下降法&牛顿法

(叨逼叨)基于Flink实现粒子群算法

Python 3:检查迭代器的下一个值而不进行迭代

在python中找到二维矩阵(二维)中不同列表的最小值、最大值和平均值