代码之家  ›  专栏  ›  技术社区  ›  santobedi

使用内部支持的优化器优化scikit learn中用于探地雷达的RBF核的核参数

  •  2
  • santobedi  · 技术社区  · 6 年前

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

    enter image description here

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

    我想用我的训练数据集优化/训练这些参数(l和sigma)。我的培训数据集如下所示:

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

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

    根据 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” ).The 优化器 可以是内部支持的优化内核参数的优化器之一(由字符串指定),也可以是作为可调用的传递的外部定义的优化器。此外,scikit learn中唯一可用的内部优化器是 fmin_l_bfgs_b .然而,我知道 scipy package 有更多的优化器。因为我想用 trust-region-reflective algorithm 为了优化超参数,我尝试实现如下算法:

    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 示例(示例位于页面底部)。我在控制台中遇到以下错误。

    enter image description here

    是我的使用方法 scipy软件包 优化内核参数正确吗?如何打印参数的优化值?中的参数“fun”是什么 scipy.optimize.least_squares 就我而言?

    非常感谢。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Dan Reia    6 年前

    这里有三个主要问题:

    1. 正在优化的目标函数是rosenbrock函数,它是用于优化目的的测试函数。它需要是一个基于核参数进行优化的代价函数,对于GaussianProcessRegressor内部,这是对数边际似然,可以作为参数传递给优化器。
    2. 内部需要最大化对数边际似然优化器。见第1.7.1节 here. Scipy最小二乘法最小化目标函数,因此您可能需要最小化目标函数的逆函数。
    3. 正在传递到GaussianProcessRegressor的优化器的格式,需要以“optimizer”参数下指定的格式传递 in the docs.

    作为一个部分工作的示例,忽略内核定义以强调优化器:

    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_