scikit-learn 中的多输出高斯过程回归

Posted

技术标签:

【中文标题】scikit-learn 中的多输出高斯过程回归【英文标题】:Multiple-output Gaussian Process regression in scikit-learn 【发布时间】:2018-10-15 13:25:43 【问题描述】:

我正在使用scikit learn 进行高斯过程回归 (GPR) 操作来预测数据。我的训练数据如下:

x_train = np.array([[0,0],[2,2],[3,3]]) #2-D cartesian coordinate points

y_train = np.array([[200,250, 155],[321,345,210],[417,445,851]]) #observed output from three different datasources at respective input data points (x_train)

需要预测均值和方差/标准差的测试点(2-D)是:

xvalues = np.array([0,1,2,3])
yvalues = np.array([0,1,2,3])

x,y = np.meshgrid(xvalues,yvalues) #Total 16 locations (2-D)
positions = np.vstack([x.ravel(), y.ravel()]) 
x_test = (np.array(positions)).T

现在,在运行 GPR (GausianProcessRegressor) 拟合后(这里,ConstantKernel 和 RBF 的乘积用作GaussianProcessRegressor 中的内核),可以通过以下代码行预测均值和方差/标准差:

y_pred_test, sigma = gp.predict(x_test, return_std =True)

在打印预测均值 (y_pred_test) 和方差 (sigma) 时,我会在控制台中打印以下输出:

在预测值(均值)中,打印内部数组内包含三个对象的“嵌套数组”。可以假设内部数组是每个数据源在每个二维测试点位置的预测平均值。但是,打印的方差仅包含一个包含 16 个对象的数组(可能是 16 个测试位置点)。我知道方差提供了估计不确定性的指示。因此,我期待每个测试点的每个数据源的预测方差。我的期望错了吗?如何在每个测试点获得每个数据源的预测方差?是不是代码错误?

【问题讨论】:

第二个返回的不是方差而是标准差。 @VivekKumar 确实是 SD,但是,我们如何为每个数据源获取 SD? 对不起,我不知道。您可以尝试在 scikit-learn 邮件列表中询问。 【参考方案1】:

嗯,你确实无意中撞到了一座冰山……

作为前奏,让我们明确说明方差和标准差的概念仅适用于标量变量;对于向量变量(比如你自己的 3d 输出),方差的概念不再有意义,而是使用协方差矩阵(Wikipedia,Wolfram)。

继续前奏,根据predict 方法上的 scikit-learn docs,您的sigma 的形状确实与预期的一样(即您的predict 方法中没有编码 错误案例):

返回

y_mean : 数组,形状 = (n_samples, [n_output_dims])

查询点的预测分布平均值

y_std:数组,形状 = (n_samples,),可选

查询点预测分布的标准差。仅在 return_std 为 True 时返回。

y_cov:数组,形状 = (n_samples, n_samples),可选

联合预测分布的协方差查询点。仅在 return_cov 为 True 时返回。

结合我之前关于协方差矩阵的评论,第一个选择是尝试使用 predict 函数与参数 return_cov=True 代替(因为要求向量变量的 variance 是无意义的);但同样,这将导致 16x16 矩阵,而不是 3x3 矩阵(3 个输出变量的协方差矩阵的预期形状)...

澄清了这些细节,让我们进入问题的本质。


您的问题的核心是在实践和相关教程中很少提及(甚至暗示)的事情:具有多个输出的高斯过程回归非常重要并且仍然是一个活跃的领域研究。可以说,scikit-learn 并不能真正处理这种情况,尽管它表面上看起来是这样做的,但至少没有发出一些相关的警告。

让我们在最近的科学文献中寻找对这种说法的一些佐证:

Gaussian process regression with multiple response variables (2015) - 引用(强调我的):

大多数 GPR 实现仅对单个响应变量建模,因为 协方差函数的公式化困难 相关的多个响应变量,它不仅描述了 数据点之间的相关性,以及数据点之间的相关性 回应。在论文中,我们提出了一个直接的公式 多响应 GPR 的协方差函数,基于 [...]

尽管 GPR 被广泛用于各种建模任务,但仍有 GPR 方法仍然存在一些突出的问题。的 本文特别感兴趣的是需要对多个模型进行建模 响应变量。 传统上,一个响应变量被视为 高斯过程,多个响应独立建模 而不考虑它们的相关性。 这种务实和 在许多应用中都采用了直接的方法(例如 [7, 26, 27]),尽管它并不理想。多响应建模的关键 高斯过程是协方差函数的公式,它 不仅描述了数据点之间的相关性,而且 反应之间的相关性。

Remarks on multi-output Gaussian process regression (2018) - 引用(强调原文):

典型的 GP 通常设计用于单输出场景,其中 输出是一个标量。但是,多输出问题 出现在各个领域,[...]。假设我们尝试逼近 T 个输出 f(t, 1 ≤t ≤T ,一个直观的想法是使用单输出 GP (SOGP) 来分别使用相关的训练数据 D(t) = X (t), y(t) ,见图 1(a)。考虑到输出在某种程度上是相关的,单独建模它们可能会导致有价值信息的丢失。因此,越来越多的工程应用正在启动关于使用多输出 GP (MOGP) 进行代理建模,其概念如图 1(b) 所示。

MOGP的研究历史悠久,被誉为多元 地统计学界的克里金法或联合克里金法; [...] MOGP 处理基于输出以某种方式相关的基本假设的问题。因此,MOGP 中的一个关键问题是利用输出相关性,以便输出可以利用彼此的信息,以便与单独建模相比提供更准确的预测。

Physics-Based Covariance Models for Gaussian Processes with Multiple Outputs (2013) - 引用:

具有多个输出的过程的高斯过程分析是 受限于这样一个事实,即好的协方差类别要少得多 与标量(单输出)情况相比,存在函数。 [...]

为多个变量找到“好的”协方差模型的难度 产出可以产生重要的实际后果。一个不正确的 协方差矩阵的结构可以显着降低 不确定性量化过程的效率,以及 克里金推理的预测效率[16]。因此,我们认为, 协方差模型可能在联合克里金法中发挥更深远的作用 [7, 17]。当协方差结构为 从数据中推断出来的,通常是这种情况。


因此,正如我所说,我的理解是 sckit-learn 并不能真正处理这种情况,尽管文档中没有提到或暗示类似的事情(打开一个项目页面上的相关问题)。这似乎也是this relevant SO thread 以及this CrossValidated thread 关于GPML (Matlab) 工具箱的结论。

话虽如此,除了选择简单地分别对每个输出建模(这不是一个无效的选择,只要您记住,您可能会从 3-D 输出之间的相关性中丢弃有用的信息元素),至少有一个 Python 工具箱似乎能够对多输出 GP 建模,即 runlmc(paper、code、documentation)。

【讨论】:

非常感谢您的努力。由于在训练点观察到的输出(来自 3 个 Wi-Fi 设备的无线电信号强度)彼此不相关,您是否建议单独回归?我的意思是,如果我使用 scikit-learn 对一维观察数据(来自单个 Wi-Fi 设备的信号强度)进行回归,结果(Wi-Fi 设备的预测均值和标准差)是否成立?虽然我需要为许多 Wi-Fi 设备反复回归,但我想这样做(由于截止日期,可能需要时间来解释其他软件)。 @santobedi 如引用的参考文献中所述,独立回归始终是一种有效的一阶方法。现在,如果您的输出确实彼此不相关(我不熟悉 WiFi 信号传播细节),那么独立处理它们会更有意义 @desertnaut - 可以更进一步说,当它们在统计上独立时,通过一些多输出 GP 对输出进行建模没有没有好处?或者由于模型导致的非统计相关性是否包含使用独立 GP 会遗漏的信息? @BenFarmer 第一条语句听起来是正确的;不知道你所说的非统计相关性是什么意思【参考方案2】:

首先,如果使用的参数是“sigma”,那是指标准差,而不是方差(回想一下,方差只是标准差的平方)。

使用方差更容易概念化,因为方差定义为从数据点到集合均值的欧几里得距离。

在您的情况下,您有一组 2D 点。如果您将这些视为 2D 平面上的点,那么方差就是每个点到平均值的距离。标准差将是方差的正根。

在这种情况下,您有 16 个测试点和 16 个标准差值。这很有意义,因为每个测试点与集合的平均值都有自己定义的距离。

如果您想计算 SET 点的方差,可以通过将每个点的方差单独求和,除以点数,然后减去均方来实现。这个数字的正根将产生集合的标准差。

ASIDE:这也意味着如果你通过插入、删除或替换来改变集合,每个点的标准差都会改变。这是因为将重新计算平均值以适应新数据。这种迭代过程是 k-means 聚类背后的基本力量。

【讨论】:

数据源是发射无线电信号的接入点(例如Wi-Fi),因此观察到的数据是无线电信号强度(RSS)。共有三个 Wi-Fi 点(数据源)。我能够从所有测试点(测试台内的网格)的三个 Wi-Fi 点预测 RSS。例如,在任何网格点,y_pred_test 给出每个 Wi-Fi 点的预测 RSS。在同一个测试点,我也想预测每个 Wi-Fi 点(如 RSS)的标准偏差。你认为总结方差可以得出这个结果吗? 您的答案隐含假设集合的 mean 本身就是一个数字,这显然不是这里的情况:因为输出是 3-d,所以mean 本身是一个 3-d 数组,如 OP 中所清楚展示的。与 k-means 情况的类比也是无效的,因为它又是关于 scalar(欧几里得距离,它是单个数字)的方差。 @desertnaut 没有什么能阻止均值成为 3 级向量。欧几里得距离不仅仅是二维运算。它可以推广到N维空间。 k 均值也是如此。您可以使用 N 维输入向量执行 k-means 聚类。 没有说(当然!)欧几里得距离是二维运算;我说的是,独立于空间维数(1-d,2-d,... Nd),欧几里得距离本身是一个标量,因此它的方差也是a的方差标量而不是向量一... @santobedi 以便澄清您的问题:您的输入空间是 2D,而您的输出空间是 3D?使用该求和公式所需的隐含假设是,您正在查看的数据是一个正态分布的随机过程(我不确定 WiFi 信号是否如此)。如果答案是否定的,那么我质疑您为什么首先将其建模为高斯过程。

以上是关于scikit-learn 中的多输出高斯过程回归的主要内容,如果未能解决你的问题,请参考以下文章

如何为 scikit-learn 的高斯过程回归指定先验?

使用scikit-learn的高斯过程回归时如何使用点的经纬度?

高斯过程 scikit-learn - 异常

使用python在高斯过程回归中训练数据集的数据增强

scikit learn中的多目标岭回归如何工作?

如何使用 scikit-learn 进行高斯/多项式回归?