使用内部支持的优化器优化 scikit-learn 中 GPR 的 RBF 内核的内核参数

2024-01-07

平方指数或RBF核的基本方程如下:

这里 l 是长度尺度,sigma 是方差参数。长度比例控制两个点的相似程度,因为它只是放大 x 和 x' 之间的距离。方差参数控制函数的平滑程度。

我想用我的训练数据集优化/训练这些参数(l 和 sigma)。我的训练数据集采用以下形式:

X:二维笛卡尔坐标作为输入数据

y:Wi-Fi 设备在二维坐标点处的无线电信号强度 (RSS) 作为观测输出

根据sklearn http://scikit-learn.org/stable/modules/generated/sklearn.gaussian_process.GaussianProcessRegressor.html#sklearn.gaussian_process.GaussianProcessRegressor.get_params,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”). The optimizer可以是内部支持的优化器之一,用于优化内核参数(由字符串指定),也可以是作为可调用传递的外部定义的优化器。此外,scikit-learn 中唯一可用的内部优化器是fmin_l_bfgs_b。然而,我了解到scipy 包 https://docs.scipy.org/doc/scipy/reference/optimize.html有更多的优化器。因为我想用信赖域反射算法 https://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.least_squares.html#scipy.optimize.least_squares为了优化超参数,我尝试实现如下算法:

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函数this https://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.least_squares.html#scipy.optimize.least_squares示例(示例位于页面底部)。我在控制台中收到以下错误。

我的使用方法是scipy 包优化内核参数正确吗?如何打印参数的优化值?参数“fun”是什么scipy.optimize.least_squares https://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.least_squares.html#scipy.optimize.least_squares就我而言?

谢谢你!


这里存在三个主要问题:

  1. 正在优化的目标函数是 Rosenbrock 函数,它是用于优化目的的测试函数。它需要是一个基于内核参数进行优化的成本函数,在 GaussianProcessRegressor 内部,这是对数边际似然,可以作为参数传递给优化器。
  2. 对数边际似然优化器内部需要最大化。参见第 1.7.1 节here. http://scikit-learn.org/stable/modules/gaussian_process.html#gaussian-processScipy 最小二乘最小化目标函数,因此您可能需要最小化目标函数的逆函数。
  3. 传递到 GaussianProcessRegressor 的优化器的格式,需要以“optimizer”参数下指定的格式传递在文档中。 http://scikit-learn.org/stable/modules/generated/sklearn.gaussian_process.GaussianProcessRegressor.html#sklearn.gaussian_process.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 优化器返回一个结果对象,以 Rosenbrock 测试函数的最小化为例:

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_ 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用内部支持的优化器优化 scikit-learn 中 GPR 的 RBF 内核的内核参数 的相关文章

随机推荐