Основное уравнение квадратной экспоненты или ядра RBF выглядит следующим образом:
Здесь 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 из этого примера (пример находится внизу страницы). Я получаю следующую ошибку в консоли.
Правильно ли мой подход с использованием scipy пакета для оптимизации параметров ядра? Как я могу напечатать оптимизированное значение параметров? Что такое параметр 'fun' в scipy.optimize.least_squares в моем случае?
Спасибо!