Python 几何各向异性高斯过程分离器

Python 几何各向异性高斯过程分离器,python,scikit-learn,Python,Scikit Learn,是否可以为使用“几何各向异性”的GaussianProcessRegressor定义内核 我知道可以用一些现有的内核定义各向异性,但它似乎只允许各向异性与维度平行。考虑相关维度(例如空间x/y坐标)的情况,我希望各向异性能够考虑旋转两个长度尺度所定义的“椭圆”的角度(那些将变成主轴和短轴)。p> 对于我来说,这在Scikit Learn中的当前内核中是否已经是可能的,或者我是否应该通过对现有内核的子类化来创建自己的内核,这一点并不明显 考虑以下示例: import numpy as np fro

是否可以为使用“几何各向异性”的
GaussianProcessRegressor
定义内核

我知道可以用一些现有的内核定义各向异性,但它似乎只允许各向异性与维度平行。考虑相关维度(例如空间x/y坐标)的情况,我希望各向异性能够考虑旋转两个长度尺度所定义的“椭圆”的角度(那些将变成主轴和短轴)。p> 对于我来说,这在Scikit Learn中的当前内核中是否已经是可能的,或者我是否应该通过对现有内核的子类化来创建自己的内核,这一点并不明显

考虑以下示例:

import numpy as np
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import Matern, ConstantKernel

# training data
ygrid, xgrid = np.mgrid[-2:3:1, -2:3:1]
X_train = np.stack([ygrid.flat, xgrid.flat], axis=1)
y_train = np.eye(*ygrid.shape).ravel()

# define the kernel
c = ConstantKernel(constant_value=y_train.mean(), constant_value_bounds='fixed')
m = Matern(length_scale=[0.5, 0.5], nu=0.5)

kernel = c * m

# fit
gp = GaussianProcessRegressor(kernel=kernel)
gp.fit(X_train, y_train)
拟合后的内核参数为:

print(gp.kernel_.get_params())
{'k1': 0.447**2,
 'k2': Matern(length_scale=[0.444, 0.444], nu=0.5),
 'k1__constant_value': 0.2,
 'k1__constant_value_bounds': 'fixed',
 'k2__length_scale': array([0.4443361, 0.4443361]),
 'k2__length_scale_bounds': (1e-05, 100000.0),
 'k2__nu': 0.5}
详细预测:

ygrid, xgrid = np.mgrid[-3:4:0.05, -3:4:0.05]
X_predict = np.stack([ygrid.flat, xgrid.flat], axis=1)

y_predict = gp.predict(X_predict)
y_predict = y_predict.reshape(xgrid.shape)
左轴显示训练数据(25个样本),右轴显示更精细网格上的预测:

从拟合中可以明显看出,在这种情况下,各向异性没有添加任何内容,因为数据沿对角线相关,而来自
Matern
内核的各向异性没有捕捉到这一点。这张图片显示,如果我能在某个地方指定,那么沿着对角线的预测可能会更加平滑

对于我的用例,角度可以是任何角度(0-360度),我事先不知道,所以我无法变换输入坐标


对于现有内核是否有解决方法?或者我如何通过创建一个新内核(最好是基于Matren的内核)来添加这种行为

通常多维核是张量化的。我不确定sklearn的实现,但如果它是相同的,您将无法实现您想要的。你应该考虑先旋转你的数据。