Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scikit学习中的多输出高斯过程回归_Python_Machine Learning_Scikit Learn_Regression_Gaussian Process - Fatal编程技术网

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

Python scikit学习中的多输出高斯过程回归,python,machine-learning,scikit-learn,regression,gaussian-process,Python,Machine Learning,Scikit Learn,Regression,Gaussian Process,我使用高斯过程回归(GPR)操作来预测数据。我的培训数据如下: x_train=np.数组([0,0],[2,2],[3,3]])#二维笛卡尔坐标点 y#u列=np.数组([200250155]、[321345210]、[417445851])#在各自的输入数据点(x#u列)观察到三个不同数据源的输出 需要预测均值和方差/标准偏差的测试点(2-D)为: xvalues=np.array([0,1,2,3]) yvalues=np.数组([0,1,2,3]) x、 y=np.网格(x值,y值)#

我使用高斯过程回归(GPR)操作来预测数据。我的培训数据如下:

x_train=np.数组([0,0],[2,2],[3,3]])#二维笛卡尔坐标点
y#u列=np.数组([200250155]、[321345210]、[417445851])#在各自的输入数据点(x#u列)观察到三个不同数据源的输出
需要预测均值和方差/标准偏差的测试点(2-D)为:

xvalues=np.array([0,1,2,3])
yvalues=np.数组([0,1,2,3])
x、 y=np.网格(x值,y值)#总共16个位置(2-D)
位置=np.vstack([x.ravel(),y.ravel()]))
x_检验=(np.数组(位置)).T
现在,在运行GPR(
GausianProcessRegressor
)拟合(此处,ConstantKernel和RBF的乘积用作
GaussianProcessRegressor
中的核)后,可以通过以下代码行预测均值和方差/标准差:

y_pred_test,sigma=gp.predict(x_test,return_std=True)
在打印预测平均值(
y\u pred\u test
)和方差(
sigma
)时,我在控制台中得到以下输出:


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

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

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

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

在本例中,您有16个测试点和16个标准偏差值。这是非常有意义的,因为每个测试点都有自己定义的与集合平均值的距离

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


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

好吧,你不经意间撞上了冰山

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

继续前奏,根据scikit学习的
predict
方法,您的
sigma
形状确实与预期一致(即,您的情况下没有编码错误):

返回

y_平均值:数组,形状=(n_样本,[n_输出大小])

查询点的预测分布均值

y_std:数组,形状=(n_样本),可选

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

y_-cov:数组,形状=(n_个样本,n_个样本),可选

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

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

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


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

让我们在最近的科学文献中寻找这种说法的一些佐证:

(2015)-引用(重点矿山):

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

尽管各种建模任务对探地雷达的利用率很高,但是 探地雷达方法仍然存在一些悬而未决的问题。属于 本文特别感兴趣的是需要对多个 响应变量传统上,一个响应变量i