首页 文章

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

提问于
浏览
8

我正在使用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 )时,我在控制台中打印了以下输出:

enter image description here

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

谢谢!

2 回答

  • 5

    好吧,你无意中碰上了冰山......

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

    继续前奏,你的 sigma 的形状确实如预期的那样根据 predict 方法的scikit-learn docs(即你的情况下没有编码错误):

    返回: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时返回 .

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

    澄清了这些细节之后,让我们继续讨论这个问题的本质 .


    问题的核心在于实践和相关教程中很少提及(甚至暗示)的事情:具有多个输出的高斯过程回归是 highly non-trivial ,仍然是一个活跃的研究领域 . 可以说,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) . 考虑到输出以某种方式相关,单独建模可能会导致有 Value 信息的丢失 . 因此,越来越多的工程应用正在开始关于使用多输出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建模,即 runlmcpapercodedocumentation) .

  • 2

    首先,如果使用的参数是“sigma”,那指的是标准差,而不是方差(召回,方差只是标准偏差的平方) .

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

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

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

    如果要计算点的SET的方差,可以通过单独求和每个点的方差,将其除以点数,然后减去均方来实现 . 该数字的正根将产生该组的标准偏差 .

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

相关问题