python - 多变量高斯过程回归: adaptation of kernels

标签 python scikit-learn kernel regression gaussian

好吧,我知道这个问题已经被问了很多次,但我似乎找不到任何解释性的、好的答案。 我的问题本身很简单:当使用多变量输入 X 执行高斯过程回归时,如何指定哪个内核保存哪个变量?

一个例子可能会更清楚地说明这一点。看下面的代码:

import matplotlib as mpl
mpl.use('TkAgg')
from matplotlib import pyplot as plt
import numpy as np
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF
from sklearn.gaussian_process.kernels import ExpSineSquared, WhiteKernel, ConstantKernel

np.random.seed(0)

X = np.array([[0, 1, 2], [1, 3, 4], [2, 5, 1], [3, 7, 5], [4, 9, 7], [5, 0, 8], [6, 1, 2], [7, 3, 4], [8, 5, 1],
              [9, 7, 5], [10, 9, 7], [11, 0, 8], [12, 1, 2], [13, 3, 4], [14, 5, 1], [15, 7, 5],
              [16, 9, 7], [17, 9, 8]])

y = np.random.uniform(200, 300, len(X))

gp_kernel = 1**2*RBF(length_scale=[0, 0.01, 0]) * ExpSineSquared(0.02, 6, periodicity_bounds='fixed') + WhiteKernel()

gpr = GaussianProcessRegressor(kernel=gp_kernel, n_restarts_optimizer=2, normalize_y=True)
gpr.fit(X, y)

X1 = np.vstack((X, np.array([18, 3, 5])))
y_pred, sigma = gpr.predict(X1, return_std=True)

print(y_pred)
plt.plot(range(len(X)), y)
plt.plot(range(len(X1)), y_pred)
plt.show()

如果你看一下 X,你就会发现它在第二维中明显是周期性的。我想指定这一点,所以我的第一次尝试是这样的 ExpSineSquared([0, 0.2, 0], 6, periodicity_bounds='fixed') ,其中我复制了我找到​​的此类问题的大多数答案的方法,并为内核不包含的变量设置了 0。但遗憾的是 ExpSineSquared 不允许数组作为 length_scale 的输入参数。

因此,我尝试将其与允许这样做的东西(例如 RBF)相乘,并查看结果。这确实给了我一些预测,但是如果我们改变 gp_kernel = 1**2*RBF(length_scale=[0, 0.01, 0]) * ExpSineSquared(0.02, 6, periodicity_bounds='fixed') + WhiteKernel()gp_kernel = 1**2*RBF(length_scale=[0.01, 0, 0]) * ExpSineSquared(0.02, 6, periodicity_bounds='fixed') + WhiteKernel() , 结果保持完全相同,这不可能是正确的(第一个维度远非周期性),因此您会期望一些更糟糕或至少不同的结果。

简而言之:如果您有多个变量输入,并且构造了保存某些(但不是全部)变量的内核,那么如何指定哪个内核保存哪个变量?

最佳答案

我发现 George 包在这种情况下非常有帮助。首先,您可以使用更多更多各向异性内核,因此这是一个很大的优势。其次,您可以指定它们作用的维度。例如,ExpSquaredKernel(length_scale=1, ndim=4,axes=1) 是一个 RBF 内核,作用于 的第二个维度(请参阅axes 参数)。数据由 4 个维度组成。

关于python - 多变量高斯过程回归: adaptation of kernels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54551303/

相关文章:

python - 为什么sklearn RandomForest模型保存后占用大量磁盘空间?

linux - QEMU源码中如何添加新设备?

linux - 将编译标志附加到 Linux 内核构建

python - 在 O(lg n) 中查找 Python 列表的唯一数字对中的单个数字

python - 系统R命令和shell输出不同

python - 是否可以在 OneHotEncoder 中为某些列指定 handle_unknown = 'ignore' 并为其他列指定 'error'?

c - 系统调用和中断的实现有何不同?

Python:如何遍历行并根据前一行计算值

python - 有效地将函数应用于神经元输出然后求和,而不是将函数应用于求和

python - scikit learn 中的交叉验证和管道