具有多个变量的高斯过程回归:内核的适应

时间:2019-02-06 10:24:48

标签: 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(), 结果保持完全相同,这是不可能的(第一个维度接近周期性),因此您会期望结果更糟或至少有所不同。

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

1 个答案:

答案 0 :(得分:1)

我发现在这种情况下,George软件包非常有用。首先,还有一个 lot 个可以使用的各向异性内核,所以这是一个很大的优点。其次,您可以指定它们在哪个维度上起作用。例如,ExpSquaredKernel(length_scale=1, ndim=4, axes=1)是一个RBF内核,作用于的第二维(请参见axes参数)。数据包含4个维度。