代码之家  ›  专栏  ›  技术社区  ›  santobedi

scikit学习中的多输出高斯过程回归

  •  20
  • santobedi  · 技术社区  · 7 年前

    我正在使用 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 )fit(此处,ConstantKernel和RBF的乘积用作 GaussianProcessRegressor ),均值和方差/标准差可通过以下代码行进行预测:

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

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

    enter image description here

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

    2 回复  |  直到 4 年前
        1
  •  30
  •   Community CDub    5 年前

    嗯,你真的无意中撞上了冰山。。。

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

    继续前奏,你的 sigma 根据scikit learn,这确实是意料之中的 docs predict 方法(即没有 编码 案例中的错误):

    退货 :

    y\u平均值 :数组,形状=(n\u个样本,[n\u个输出\u个dims])

    预测分布平均值a查询点

    y\U标准 :数组,形状=(n\u个样本,),可选

    查询点处预测分布的标准偏差。仅当return\u std为True时返回。

    y\U cov公司 :数组,形状=(n\u个样本,n\u个样本),可选

    联合预测分布的协方差a查询点。仅当return\u cov为True时返回。

    预测 带参数的函数 return_cov=True 相反(因为要求 方差 向量变量的值是无意义的);但同样,这将导致16x16矩阵,而不是3x3矩阵(3个输出变量的协方差矩阵的预期形状)。。。

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


    问题的核心在于实践和相关教程中很少提及(甚至暗示)的东西:具有多个输出的高斯过程回归是 非常不平凡 仍然是一个活跃的研究领域。可以说,scikit learn无法真正处理该案件,尽管它表面上似乎会这样做,但至少不会发出一些相关警告。

    让我们在 最近的 科学文献:

    Gaussian process regression with multiple response variables

    大多数GPR实现只对单个响应变量建模 由于 协方差函数公式化的难点 相关的多个响应变量,它不仅描述 数据点之间的相关性,还有 答复。在本文中,我们提出了一个直接公式 多响应探地雷达的协方差函数,基于[…]

    尽管各种建模任务对探地雷达的利用率很高,但 探地雷达方法仍存在一些悬而未决的问题。属于 响应变量。 传统上,一个响应变量被视为 高斯过程,多个响应独立建模 这种务实 在许多应用中采用了直接的方法(例如[7,26, 27]),但这并不理想。多响应建模的关键 高斯过程是协方差函数的表达式 不仅描述数据点之间的相关性,还描述 回答之间的相关性。

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

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

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

    enter image description here

    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工具箱似乎能够建模多个输出GPs,即 runlmc公司 ( paper ,则, code ,则, documentation

        2
  •  2
  •   jmkmay    7 年前

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

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

    在本例中,您有一组二维点。如果您将这些视为二维平面上的点,那么方差就是每个点到平均值的距离。标准差将是方差的正根。

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

    如果要计算点集的方差,可以将每个点的方差分别求和,除以点数,然后减去均方。该数字的正根将产生集合的标准偏差。

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