Гиперпараметры ядра; инициализация и установка границ

#process #gaussian #gpflow

#процесс #гауссовский #gpflow

Вопрос:

Я думаю, что многим другим людям, таким как я, может быть интересно, как они могут использовать GPFlow для своих особых задач. Ключ в том, как настраивается GPFlow, и хороший пример был бы очень полезен.

В моем случае я прочитал и попробовал множество комментариев в разделе поднятые проблемы без какого-либо реального успеха. Настройка параметров модели ядра не является простой (создание со значениями по умолчанию, а затем выполнение этого с помощью метода delete object). Метод преобразования является расплывчатым.

Было бы действительно полезно, если бы вы могли добавить показывающий пример. как можно инициализировать и установить границы анизотропной модели ядра (значения и границы масштабов длины, отклонения, …) и специально добавить ошибку наблюдений (в виде альфа-параметра, подобного массиву)

Комментарии:

1. Не могли бы вы пояснить, что вы подразумеваете под «настройкой параметров модели ядра непросто» (вы можете сделать, например, kern = gpflow.kernels.Matern52(input_dim=1, lengthscales=0.3) и позже kern.lengthscales = 5.0 )? Что вы подразумеваете под «методом удаления объекта»? Что вы подразумеваете под «методом преобразования»? Что вы подразумеваете под «добавлением ошибки наблюдений» — различный шум для разных точек данных?

2. сравнивать со sklearn непросто. GP: ошибка kern = rbf(length_scale=[a,b,c], length_scale_bounds=([a1,a2],[b1,b2],[c1,c2]) или ConstantKernel(sill, tuple(sill_bound) наблюдений; Значение, добавленное к диагонали матрицы ядра во время подгонки. Большие значения соответствуют повышенному уровню шума в наблюдениях.

Ответ №1:

Если вы просто хотите установить значение, то вы можете сделать

 model = gpflow.models.GPR(np.zeros((1, 1)),
                          np.zeros((1, 1)),
                          gpflow.kernels.RBF(1, lengthscales=0.2))
  

Альтернативно

 model = gpflow.models.GPR(np.zeros((1, 1)),
                          np.zeros((1, 1)),
                          gpflow.kernels.RBF(1))
model.kern.lengthscales = 0.2
  

Если вы хотите изменить преобразование, вам либо нужно создать подкласс ядра, либо вы также можете сделать

 with gpflow.defer_build():
     model = gpflow.models.GPR(np.zeros((1, 1)),
                               np.zeros((1, 1)),
                               gpflow.kernels.RBF(1))
     transform = gpflow.transforms.Logistic(0.1, 1.))
     model.kern.lengthscales = gpflow.params.Parameter(0.3, transform=transform)
model.compile()
  

Вам нужно defer_build остановить компиляцию графика до того, как вы измените преобразование. Используя описанный выше подход, компиляция графика тензорного потока откладывается (до явного model.compile() ), поэтому он строится с использованием предполагаемого ограничивающего преобразования.

Использование параметра массива для определения вероятности отклонения выходит за рамки gpflow. Как бы то ни было (и поскольку об этом спрашивали ранее), эта конкретная модель особенно проблематична, поскольку неясно, как определяются контрольные точки.

Ответ №2:

Настройка параметров ядра может быть выполнена с помощью .assign() функции или путем прямого назначения. Смотрите записную книжку https://github.com/GPflow/GPflow/blob/develop/doc/source/notebooks/understanding/tf_graphs_and_sessions.ipynb. Вам не нужно удалять параметр, чтобы присвоить ему новое значение.

Если вы хотите, чтобы в каждой точке данных был шум, вам нужно будет реализовать собственное пользовательское правдоподобие, что вы можете сделать, взяв Gaussian правдоподобие в likelihoods.py качестве примера.

Если под «границами» вы подразумеваете ограничение диапазона оптимизации для параметра, вы можете использовать Logistic преобразование. Если вы хотите передать пользовательское преобразование для параметра, вы можете передать сконструированный Parameter объект в конструкторы с помощью пользовательского преобразования. В качестве альтернативы вы можете назначить модели только что созданную Parameter с новым преобразованием.

Ответ №3:

Вот дополнительная информация о том, как получить доступ к параметрам GPFlow и изменить их: документация по просмотру, получению и настройке параметров.

Дополнительный бит для @user1018464 ответ о замене преобразования в существующем параметре: изменение преобразования немного сложно, вы не можете изменить преобразование, как только модель была скомпилирована в TensorFlow.

Например.

 likelihood = gpflow.likelihoods.Gaussian()
likelihood.variance.transform = gpflow.transforms.Logistic(1., 10.)
----
GPflowError: Parameter "Gaussian/variance" has already been compiled.
  

Вместо этого вам нужно сбросить объект GPFlow:

 likelihood = gpflow.likelihoods.Gaussian()  # All tensors compiled

likelihood.clear()
likelihood.variance.transform = gpflow.transforms.Logistic(2, 5)
likelihood.variance = 2.5
likelihood.compile()