我正在训练高斯过程(用scikit-learn
进行编码,请参见下文)。
我想通过初步了解我的信号,来了解如何对可能最适合我的任务的内核做出有根据的猜测。 GP应该学习的映射是在坐标x,y,z,d
(具有d = sqrt(x**2 +y**2 +z**2)
)和标量之间。不同坐标x,y,z,d
的标量一起形成一个时间序列。
在下面,我正在绘制我的训练集,即我的时间序列。在每个绘图中,x
轴分别代表坐标x,y,z,d
中的一个,按升序排列并标准化。在每个图中,时间序列的组成部分都按此顺序排序。换句话说,在每个图中,我分别显示了信号根据x,y,z,d
坐标的增加而排序。
我想了解:
1)我的数据的最佳顺序是什么:作为x
,y
,z
或d
的函数?
2)按照1)对我的数据进行排序后,在高斯过程中使用的最佳内核是什么?特别是,对于初始超参数及其范围,合理的优先选择是什么?
代码:
(作为说明性示例,这里我使用Matern 3/2内核,并按照d
坐标的增加值对数据进行排序)
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import (RBF, Matern, RationalQuadratic, ExpSineSquared, DotProduct, ConstantKernel)
# Instantiate a Gaussian Process model
kernel = (time_series_ordered_with_increasing_d[:].std()**2.) * Matern(nu=1.5, length_scale=10.*np.ones(x_y_z_d_ordered_with_increasing_d.shape[1]), length_scale_bounds=(0.001, 20.0))
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10, alpha=time_series_ordered_with_increasing_d[:].std()/100.)
gp.fit(x_y_z_d_ordered_with_increasing_d, time_series_ordered_with_increasing_d[:])
print gp.kernel_
y_pred, sigma = gp.predict(x_y_z_d_ordered_with_increasing_d, return_std=True)