san*_*edi 13 python regression machine-learning scikit-learn
我正在使用scikit学习高斯过程回归(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)
Run Code Online (Sandbox Code Playgroud)
需要预测平均值和方差/标准偏差的测试点(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
Run Code Online (Sandbox Code Playgroud)
现在,在运行GPR(GausianProcessRegressor)拟合之后(这里,ConstantKernel和RBF的乘积用作内核GaussianProcessRegressor),可以通过遵循代码行来预测均值和方差/标准差:
y_pred_test, sigma = gp.predict(x_test, return_std =True)
Run Code Online (Sandbox Code Playgroud)
在打印预测的mean(y_pred_test)和variance(sigma)时,我在控制台中打印了以下输出:
在预测值(平均值)中,打印内部数组内有三个对象的"嵌套数组".可以假设内部阵列是每个2-D测试点位置处的每个数据源的预测平均值.但是,打印的方差只包含一个包含16个对象的数组(可能包含16个测试位置点).我知道方差提供了估计不确定性的指示.因此,我期待每个测试点的每个数据源的预测方差.我的期望是错的吗?如何在每个测试点获得每个数据源的预测方差?这是由于错误的代码?
谢谢!
des*_*aut 12
好吧,你无意中碰上了冰山......
作为前奏,让我们明确指出方差和标准差的概念仅适用于标量变量; 对于矢量变量(比如你自己的3d输出),方差的概念不再有意义,而是使用协方差矩阵(Wikipedia,Wolfram).
继续对前奏,你的形状sigma确实如根据scikit学习预期文档的predict方法(即没有编码你的情况的错误):
退货:
y_mean:array,shape =(n_samples,[n_output_dims])
查询指向的预测分布的平均值
y_std:array,shape =(n_samples,),optional
查询点处预测分布的标准偏差.仅在return_std为True时返回.
y_cov:array,shape =(n_samples,n_samples),可选
联合预测分布的协方差一个查询点.仅在return_cov为True时返回.
结合我之前关于协方差矩阵的评论,第一个选择是predict用参数来尝试函数return_cov=True(因为要求向量变量的方差是没有意义的); 但同样,这将导致16x16矩阵,而不是3x3矩阵(3个输出变量的协方差矩阵的预期形状)......
澄清了这些细节之后,让我们继续讨论这个问题的本质.
问题的核心在于实践和相关教程中很少提及(甚至暗示)的事情:具有多个输出的高斯过程回归非常重要,仍然是一个活跃的研究领域.可以说,scikit-learn无法真正处理这个案例,尽管事实上它表面上似乎没有发出至少一些相关的警告.
让我们在最近的科学文献中寻找对这种主张的一些佐证:
具有多个响应变量的高斯过程回归(2015) - 引用(强调我的):
大多数GPR实现仅模拟单个响应变量,因为相关多响应变量的协方差函数的制定很困难,这不仅描述了数据点之间的相关性,而且描述了响应之间的相关性.在本文中,我们提出了多响应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)所示,用于替代建模.
MOGP的研究历史悠久,在地质统计学界被称为多元Kriging或Co-Kriging; [...] MOGP处理输出以某种方式相关的基本假设的问题.因此,MOGP中的关键问题是利用输出相关性,使得输出可以利用彼此的信息,以便与单独建模相比提供更准确的预测.
基于物理的多输出高斯过程协方差模型(2013) - 引用:
具有多个输出的过程的高斯过程分析受限于这样的事实:与标量(单输出)情况相比,存在更少的良好类别的协方差函数.[...]
为多个输出找到"好的"协方差模型的难度可能具有重要的实际后果.协方差矩阵的不正确结构会显着降低不确定性量化过程的效率,以及克里金推理的预测效率[16].因此,我们认为,协方差模型可能在共同克里金法中发挥更为深远的作用[7,17].当从数据推断出协方差结构时,这个论点适用,通常就是这种情况.
因此,正如我所说,我的理解是,sckit-learn并不能真正处理这种情况,尽管事实上文档中没有提到或暗示过这样的事情(在以下问题上打开相关问题可能会很有趣)项目页面).这似乎也是这个相关SO线程中的结论,以及关于GPML(Matlab)工具箱的CrossValidated线程中的结论.
话虽如此,除了回复单独建模每个输出的选择(不是无效的选择,只要你记住你可能从你的3-D输出元素之间的相关性丢弃有用的信息),至少有一个Python工具箱似乎能够为多输出GP建模,即runlmc(纸张,代码,文档).