Оптимизируйте параметры ядра RBF-ядра для GPR в scikit-learn, используя оптимизаторы с внутренней поддержкой - PullRequest
0 голосов
/ 10 мая 2018

Основное уравнение квадратной экспоненты или ядра RBF выглядит следующим образом:

enter image description here

Здесь l - масштаб длины, а sigma - параметр дисперсии. Шкала длины контролирует, как две точки кажутся похожими, поскольку она просто увеличивает расстояние между x и x '. Параметр дисперсии определяет степень гладкости функции.

Я хочу оптимизировать / обучить эти параметры (l и sigma) с помощью моих наборов обучающих данных. Мои наборы тренировочных данных имеют следующую форму:

X : двумерная декартова координата в качестве входных данных

y : мощность радиосигнала (RSS) устройства Wi-Fi в точках двумерных координат как наблюдаемый выходной сигнал

Согласно sklearn класс GaussianProcessRegressor определяется как:

class sklearn.gaussian_process.GaussianProcessRegressor(kernel=None, alpha=1e-10, optimizer=’fmin_l_bfgs_b’, n_restarts_optimizer=0, normalize_y=False, copy_X_train=True, random_state=None)

Здесь optimizer является строкой или может вызываться с алгоритмом L-BFGS-B в качестве алгоритма оптимизации по умолчанию (“fmin_l_bfgs_b”). optimizer может быть либо одним из внутренне поддерживаемых оптимизаторов для оптимизации параметров ядра, заданных строкой, либо внешне определенным оптимизатором, передаваемым как вызываемый. Кроме того, единственный доступный внутренний оптимизатор в scikit-learn - это fmin_l_bfgs_b. Тем не менее, я узнал, что scipy package имеет гораздо больше оптимизаторов. Поскольку я хотел использовать алгоритм отражения области доверия для оптимизации гиперпараметров, я попытался реализовать алгоритм следующим образом:

def fun_rosenbrock(Xvariable):
    return np.array([10*(Xvariable[1]-Xvariable[0]**2),(1-Xvariable[0])])
Xvariable = [1.0,1.0]
kernel = C(1.0, (1e-5, 1e5)) * RBF(1, (1e-1, 1e3))
trust_region_method = least_squares(fun_rosenbrock,[10,20,30,40,50],bounds=[0,100], method ='trf')

gp = GaussianProcessRegressor(kernel=kernel, optimizer = trust_region_method, alpha =1.2, n_restarts_optimizer=10)
gp.fit(X, y)

Так как я не мог понять, что на самом деле является параметром 'fun' в моем случае, я прибег к использованию функции rosenbrock из этого примера (пример находится внизу страницы). Я получаю следующую ошибку в консоли.

enter image description here

Правильно ли мой подход с использованием scipy пакета для оптимизации параметров ядра? Как я могу напечатать оптимизированное значение параметров? Что такое параметр 'fun' в scipy.optimize.least_squares в моем случае?

Спасибо!

1 Ответ

0 голосов
/ 14 мая 2018

Здесь есть три основные проблемы:

  1. Целевой функцией, которая оптимизируется, является функция Розенброка, которая является тестовой функцией для целей оптимизации. Это должна быть функция стоимости, которая должна быть оптимизирована на основе параметров ядра, внутренне для GaussianProcessRegressor это логарифмическая вероятность и может быть передана оптимизатору в качестве параметра.
  2. Внутренний оптимизатор логарифмического правдоподобия должен быть максимально увеличен. См. Раздел 1.7.1 здесь. Скрипучий метод наименьших квадратов минимизирует целевую функцию, поэтому вам, вероятно, потребуется минимизировать обратное значение целевой функции.
  3. Форматирование оптимизатора, которое передается в GaussianProcessRegressor, необходимо передать в формате, указанном в параметре «оптимизатора» в документации.

В качестве частично рабочего примера, игнорирование определения ядра для выделения оптимизатора:

import numpy as np
from scipy.optimize import minimize,least_squares
from sklearn.gaussian_process import GaussianProcessRegressor

def trust_region_optimizer(obj_func, initial_theta, bounds):
    trust_region_method = least_squares(1/obj_func,initial_theta,bounds,method='trf')
    return (trust_region_method.x,trust_region_method.fun)

X=np.random.random((10,4))
y=np.random.random((10,1))
gp = GaussianProcessRegressor(optimizer = trust_region_optimizer, alpha =1.2, n_restarts_optimizer=10)
gp.fit(X, y)

Оптимизаторы scipy возвращают объект результатов, используя в качестве примера минимизацию тестовой функции Розенброка:

from scipy.optimize import least_squares,rosen
res=least_squares(rosen,np.array([0,0]),method='trf')

Как показано выше, к оптимизированным значениям можно получить доступ с помощью:

res.x

и результирующее значение минимизируемой функции:

res.fun

что представляет собой параметр 'fun'. Однако теперь, когда оптимизатор работает внутри, вам нужно получить доступ к полученному значению функции из scikit-learn:

gp.log_marginal_likelihood_value_ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...