Гиперпараметры ядра; инициализация и установка границ
Я думаю, что многим людям, подобным мне, может быть интересно, как они могут использовать GPFlow для своих особых задач. Ключ в том, как настраивается GPFlow, и хороший пример был бы очень полезен.
В моем случае я прочитал и перепробовал множество комментариев по поднятым вопросам без какого-либо реального успеха. Задать параметры модели ядра непросто (создать со значениями по умолчанию, а затем сделать это с помощью метода удаления объекта). Метод преобразования нечеткий.
Было бы очень полезно, если бы вы могли добавить пример, показывающий. как можно инициализировать и установить границы анизотропной модели ядра (значения масштабов длины и границы, дисперсии,...) и специально добавить ошибку наблюдений (как альфа-параметр в виде массива)
3 ответа
Если вы просто хотите установить значение, то вы можете сделать
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. Для чего это стоит (и потому что об этом спрашивали раньше), эта конкретная модель особенно проблематична, так как неясно, как определяются контрольные точки.
Здесь больше информации о том, как получить доступ и изменить параметры 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()
Настройка параметров ядра может быть выполнена с помощью .assign()
функция или через прямое назначение. См. Записную книжку https://github.com/GPflow/GPflow/blob/develop/doc/source/notebooks/understanding/tf_graphs_and_sessions.ipynb. Вам не нужно удалять параметр, чтобы присвоить ему новое значение.
Если вы хотите иметь шум для каждой точки данных, вам нужно реализовать собственную настраиваемую вероятность, которую вы можете сделать, приняв Gaussian
вероятность в likelihoods.py
В качестве примера.
Если под "границами" вы подразумеваете ограничение диапазона оптимизации для параметра, вы можете использовать Logistic
преобразования. Если вы хотите передать пользовательское преобразование для параметра, вы можете передать построенное Parameter
Объект в конструкторы с пользовательским преобразованием. В качестве альтернативы вы можете назначить недавно созданный Parameter
с новым преобразованием в модель.