我正在使用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
)时,我会在控制台中打印以下输出:
在预测值(平均值)中,'嵌套数组'打印内部数组内的三个对象。可以假设内部阵列是每个2-D测试点位置处的每个数据源的预测平均值。但是,打印的方差只包含一个包含16个对象的数组(可能包含16个测试位置点)。我知道方差提供了估计不确定性的指示。因此,我期待每个测试点的每个数据源的预测方差。我的期望是错的吗?如何在每个测试点获得每个数据源的预测方差?这是由于错误的代码?
谢谢!
答案 0 :(得分:10)
嗯,你无意中碰到了冰山......
作为前奏,让我们清楚地说明方差和概念的概念。标准偏差仅为标量变量定义;对于矢量变量(比如你自己的3d输出),方差的概念不再有意义,而是使用协方差矩阵(Wikipedia,Wolfram)。< / p>
继续前奏,根据sigma
方法中的scikit-learn docs,predict
的形状确实符合预期(即没有编码< / em>你的错误):
退货:
y_mean :array,shape =(n_samples,[n_output_dims])
查询点的预测分布的平均值
y_std :数组,形状=(n_samples,),可选
查询点处预测分布的标准差。仅在return_std为True时返回。
y_cov :数组,形状=(n_samples,n_samples),可选
联合预测分布的协方差查询点。仅在return_cov为True时返回。
结合我之前关于协方差矩阵的评论,第一个选择是尝试使用参数predict
的{{1}}函数(因为要求方差矢量变量毫无意义);但同样,这将导致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)工具箱的结论。
话虽如此,除了回复单独建模每个输出的选择(不是无效的选择,只要你记住你可能会从你的三维输出之间的相关性丢失有用的信息元素),至少有一个Python工具箱似乎能够建模多输出GP,即 runlmc (paper,code,documentation)。
答案 1 :(得分:2)
首先,如果使用的参数是&#34; sigma&#34;,那是指标准偏差,而不是方差(召回,方差只是标准偏差的平方)。
使用方差概念化更容易,因为方差被定义为从数据点到集合均值的欧几里德距离。
在您的情况下,您有一组2D点。如果您将这些视为2D平面上的点,那么方差就是从每个点到平均值的距离。标准偏差不是方差的正根。
在这种情况下,您有16个测试点和16个标准差值。这是完全合理的,因为每个测试点都有自己与集合平均值的定义距离。
如果要计算点的SET的方差,可以通过将每个点的方差相加,将其除以点数,然后减去均方来实现。该数字的正根将产生该组的标准偏差。
ASIDE:这也意味着如果您通过插入,删除或替换更改集合,则每个点的标准偏差将会改变。这是因为将重新计算平均值以适应新数据。这个迭代过程是k-means聚类背后的基本力量。