我刚刚开始使用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()生成图。一个示例图如下。
问题:
(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())
答案 0 :(得分:0)
几个问题。对于未来的建议,每个问题都有一个帖子,这样更适合SO的格式。但是现在:
垂直红线表示采集功能建议在其上运行该功能的最后一点。钟形曲线是整个采集功能图的一部分(注意,红线延伸到整个y = 0
线)-它只是绘制采集功能图,因此您可以直观地了解最有可能建议的位置下一点。
您需要自己对采集功能进行优化。或者,您可以使用BO.suggest_next_locations
。结帐教程笔记本,其中有一个例子。
我建议您仔细阅读plot_acquisition
的源代码,这很清楚使用了哪些数据以及如何访问它们。
我认为这些情节具有非常自我描述的标题。左侧的图显示了两次连续调用目标函数之间的距离。随着时间的流逝,您会期望它会缩小,因为优化会找到最佳选择。右侧的图显示了到目前为止找到的y
的最佳值。随着时间的流逝,您会希望它会变平。