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

24

我正在使用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)

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

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)拟合之后(这里,在GaussianProcessRegressor中使用ConstantKernel和RBF的乘积作为内核),可以通过以下代码行预测平均值和方差/标准偏差:

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

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

enter image description here

在预测值 (均值) 中,内部数组中有三个对象的 '嵌套数组' 被打印出来。可以推断出,内部数组是每个数据源在每个二维测试点位置的预测均值。然而,打印出来的方差仅包含一个具有 16 个对象的数组(可能为 16 个测试位置点)。我知道方差提供了估计的不确定性的指示。因此,我期望每个数据源在每个测试点的预测方差。我的期望是错误的吗?我该如何获得每个数据源在每个测试点的预测方差?是由于代码错误吗?


返回的第二件事不是方差,而是标准差。 - Vivek Kumar
@VivekKumar 确实,这是SD,但我们如何获取每个数据源的SD? - santobedi
很抱歉,我不知道。你可以尝试在scikit-learn邮件列表上询问。 - Vivek Kumar
2个回答

36

好的,实际上你碰巧遇到了一个冰山...

首先要澄清的是,方差和标准差的概念仅适用于标量变量;对于向量变量(例如你自己的3d输出),方差的概念不再有意义,而使用协方差矩阵代替(维基百科, 沃尔夫拉姆)。

继续说,根据scikit-learn关于predict方法的文档,你的sigma的形状确实符合预期(也就是在你的情况下没有编程错误):

返回值

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

查询点的预测分布均值

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

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

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

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

结合我之前关于协方差矩阵的评论,第一选择是尝试使用带有参数return_cov=Truepredict函数(因为请求向量变量的方差是无意义的); 但是,这将导致一个16x16的矩阵,而不是3x3的矩阵(对于3个输出变量来说,期望的协方差矩阵形状)... 在澄清了这些细节之后,让我们继续探讨问题的实质。
在你的问题核心,有一些很少在实践和相关教程中提到(甚至暗示)的东西:具有多个输出的高斯过程回归是非常复杂的,仍然是一个活跃研究领域。可以说,尽管scikit-learn表面上似乎可以处理这种情况,但实际上无法真正处理该情况,而且至少需要发出一些相关警告。
让我们在最近的科学文献中查找一些支持这种说法的证明: 带有多个响应变量的高斯过程回归(2015年) - 引用(重点是我的):
大多数GPR实现仅对单个响应变量进行建模,这是因为对于相关的多个响应变量,协方差函数的制定具有困难性,该函数不仅描述了数据点之间的相关性,还描述了响应之间的相关性。在本文中,我们提出了一个直接制定协方差函数的方法,用于多响应GPR,基于的思想是[...]尽管GPR在各种建模任务中被广泛采用,但该方法仍存在一些未解决的问题。特别感兴趣的是需要对多个响应变量进行建模。传统上,将一个响应变量视为高斯过程,并独立地对多个响应进行建模,而不考虑它们之间的相关性。这种实用而直接的方法在许多应用程序(例如[7,26,27])中得到了采用,但并不理想。建模多响应高斯过程的关键在于制定协方差函数,该函数不仅描述数据点之间的相关性,还描述响应之间的相关性。关于多输出高斯过程回归的备注(2018)-引用(原文中的强调)。
典型的高斯过程(GP)通常设计用于单输出场景,其中输出是标量。然而,在各个领域中出现了多输出问题[...]。假设我们尝试近似T个输出{f(t)},1≤t≤T,一种直观的想法是使用单输出GP(SOGP)分别使用相关训练数据D(t)= {X(t),y(t)}来近似它们,参见图1(a)。考虑到输出在某种程度上是相关的,单独对其进行建模可能会导致有价值的信息丢失。因此,越来越多的工程应用正在采用多输出GP(MOGP)进行代理建模,这在概念上在图1(b)中描述。

多输出GP(MOGP)的研究历史悠久,在地统计社区中被称为多元Kriging或Co-Kriging; [...] MOGP处理具有以下基本假设的问题:输出在某种程度上是相关的。因此,MOGP的一个关键问题是利用输出相关性,以便输出可以相互利用信息,从而提供比单独建模更精确的预测。

enter image description here

物理学基础的协方差模型用于具有多个输出的高斯过程(2013)-引用: 多输出过程的高斯过程分析受限于协方差函数类别远少于标量(单输出)情况。寻找适用于多输出的“好”的协方差模型的困难可能会对实践产生重要影响。协方差矩阵结构不正确可能会显著降低不确定性量化过程的效率,以及克里金推断中的预测效率[16]。因此,我们认为,在共克里金[7, 17]中,协方差模型可能发挥更为深刻的作用。当协方差结构从数据中推断时,这个论点就适用了,这通常是情况。
因此,我的理解是,尽管文档中没有提到或暗示这一点(在项目页面上开启相关问题可能会很有趣),sckit-learn实际上无法处理这种情况。这个相关的SO主题以及这个关于GPML(Matlab)工具箱的CrossValidated主题也得出了这个结论。除了回归到仅单独模拟每个输出的选择之外(这不是一个无效的选择,只要您记住您可能会从您的3D输出元素之间的相关性中丢失有用的信息),至少有一个Python工具箱似乎能够建模多输出GP,即runlmc论文, 代码, 文档)。

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

2

首先,如果使用的参数是“sigma”,那么这指的是标准差,而不是方差(请记住,方差只是标准差的平方)。

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

在您的情况下,您有一组二维点。如果将它们视为二维平面上的点,则方差仅是每个点到平均值的距离。然后标准偏差将是方差的正平方根。

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

如果您想计算点集的方差,可以通过对每个点的方差求和,将其除以点数,然后减去平均值的平方来完成。这个数字的正平方根将产生集合的标准偏差。

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


你的回答隐含了一个假设,即集合的平均值本身是一个单一的数字,但在这里显然不是这种情况:由于输出是3D的,因此平均值本身就是一个3D数组,正如OP所清楚地展示的那样。与k-means案例的类比也是无效的,因为它再次涉及到标量(欧几里得距离,即单个数字)的方差。 - desertnaut
@desertnaut 没有什么阻止平均值成为一个级别3的向量。欧几里得距离不仅仅是二维操作。它可以推广到N维空间。对于k-means也是一样的,您可以使用N维输入向量执行k-means聚类。 - jmkmay
当然,我并没有说欧几里得距离是一个二维操作;我所说的是,无论空间维度是多少(1D、2D、...N-D),欧几里得距离本身都是一个标量,因此它的方差也是标量数量的方差,而不是向量数量的方差... - desertnaut
@santobedi 所以澄清一下你的问题:你的输入空间是二维的,而输出空间是三维的?利用那个求和公式所需要的隐含假设是你所观察的数据是一个正态分布的随机过程(我不确定 WiFi 信号是否符合这个假设)。如果答案是否定的,那么我就要质疑为什么你首先将其建模为高斯过程。 - jmkmay
@desertnaut 啊,抱歉我可能误解了。我将他的数据解释为第一个数组是预测输出数据,第二个数组是输出数据中每个点的标准差。根据他的一条评论,我不认为第一个数组是均值,它似乎与WiFi信号有关。 - jmkmay
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接