具有多个变量的高斯过程回归:内核的适应
Posted
技术标签:
【中文标题】具有多个变量的高斯过程回归:内核的适应【英文标题】:Gaussian Process Regression with multiple variables: adaptation of kernels 【发布时间】:2019-06-30 06:27:33 【问题描述】:好的,所以我知道这个问题已经被问了很多,但我似乎找不到任何解释性的好答案。 我的问题本身很简单:当使用多变量输入 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)ExpSineSquared
旨在模拟 y 是周期性的,而不是 x i> 是周期性的。 2) y数据完全独立于x;做回归没有多大意义。
@kazemakase,关于评论 1:好的,这有点用。但是,如果我们在 y 数据中看到 2 个周期仅适用于部分数据(例如:工作日和周末是周期性的,但您不应将 2 个周期与一个周期内核进行比较)。对于评论 2:我知道,但它的唯一目的是说明我的观点。 :)
如果你有两个周期,我认为两个周期内核的总和是合适的。如果周期超过不同的特征,则需要各向异性内核,ExpSineSquared
目前不支持。我不知道将各向同性周期内核与各向异性 RBF 相乘是否会产生您需要的各向异性周期内核。
@kazemakase,我已经试过了,但我对结果不满意。是否不存在一些 Kronecker/Dirac delta 内核,当比较 2 个相同的“天”(如果我们查看周末/工作日关系)时变成一个,如果比较不同的“天”,它变成 0?我知道有类似点积内核的东西,但我无法让它工作......
【参考方案1】:
我发现 George 包在这种情况下非常有用。首先,您可以使用很多个更多的各向异性内核,这是一个很大的优势。其次,您可以指定它们作用于哪个维度。例如,ExpSquaredKernel(length_scale=1, ndim=4, axes=1)
是一个 RBF 内核,它作用于 的第二维(参见轴参数)。由4个维度组成的数据。
【讨论】:
以上是关于具有多个变量的高斯过程回归:内核的适应的主要内容,如果未能解决你的问题,请参考以下文章