Я только начал использовать GPy и GPyOpt. Я стремлюсь разработать итерационный процесс, чтобы найти положение х, где у - максимум. Фиктивный x-массив охватывает от 0 до 100 с шагом 0,5. Фиктивный y-массив является функцией x-массива. Истинная функция это y = -x ** 2 + 50 * x + 5, поэтому ymax это когда x = 25.0.
Я начал с случайного присвоения 5-ти точек массиву x (с соответствующими 5-ю значениями) и запустил байесовскую оптимизацию, чтобы рекомендовать следующую позицию для выборки. Я могу использовать удобный 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())