GPyOpt итеративно находит максимальное значение целевой функции; найти предлагаемое следующее местоположение - PullRequest
0 голосов
/ 06 ноября 2018

Я только начал использовать 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 () для создания графика. Пример сюжета приведен ниже. 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())

1 Ответ

0 голосов
/ 12 декабря 2018

Довольно много вопросов. Совет на будущее, он гораздо лучше подходит для формата SO, чтобы иметь пост на вопрос. Но сейчас:

  1. Вертикальная красная линия обозначает последнюю точку, в которой функция сбора данных предложила запустить функцию. Колоколообразная кривая является частью всего графика функции сбора данных (обратите внимание, что красная линия продолжается до всей линии y = 0) - она ​​просто отображает функцию сбора данных, чтобы вы могли визуально понять, где она, скорее всего, предложит следующую точка.

  2. Вам необходимо выполнить оптимизацию функции сбора данных самостоятельно. В качестве альтернативы вы можете использовать BO.suggest_next_locations. Оформить заказ учебного блокнота, есть пример последнего.

  3. Я рекомендую просмотреть исходный код plot_acquisition, очень ясно, какие данные используются и как к ним обращаются.

  4. Я думаю, что эти сюжеты имеют очень информативные названия. График слева показывает расстояние между двумя последовательными вызовами целевой функции. Со временем вы можете ожидать, что оно сократится, поскольку оптимизация найдет оптимальное решение. График справа показывает лучшее значение y, найденное до сих пор. Со временем вы ожидаете, что оно сгладится.

...