如何在Python中使用Kriging插入工作站数据?

时间:2017-07-18 19:10:21

标签: python kriging spatial-interpolation

浏览网页我发现在Python中使用Kriging的一些工具是pyKrigingGaussian Process Regression。但是,我无法让它们中的任何一个起作用。第一个对我不起作用(甚至不能导入它):

import pyKriging

  File "~/python3.6/site-packages/pyKriging/krige.py", line 142
    except Exception, err: 
                    ^
  SyntaxError: invalid syntax

第二个我不懂如何使用它。我找不到一个简单的工作示例(例如,这个 rroowwllaanndd answer很棒,但遗憾的是数据不再可供下载)

所以我的问题是,如何使用Kriging插入我的数据?我有几个站点数据保存在numpy数组中,如下所示:

2000      1         1         5.0
2000      1         2         3.4
2000      1         3         0.2

列为年 - 月 - 日 - 降水。我有几个这样的数据数组(st1,st2,st3),另一个数组包含每个站的ID和每个站所在的坐标(stid,因此站1位于经度15.6865,北纬62.6420,和等等。)

import numpy as np
st1 = np.array([[2000,1,1,5.0],[2000,1,2,3.4],[2000,1,3,0.2]])
st2 = np.array([[2000,1,1,8.2],[2000,1,2,2.5],[2000,1,3,0.0]])
st3 = np.array([[2000,1,1,np.nan],[2000,1,2,4.5],[2000,1,3,1.2]])

stid = np.array([[1,15.6865,62.6420],[2,15.7325,62.1254],[3,16.1035,61.1449]])

我需要的是每天一个数组(或一个3D数组),其中包含每天在这样的网格中使用Kriging插值的所有工作站的数据:

y = np.arange(61,63,0.125)
x = np.arange(14,17,0.125)
X,Y = np.meshgrid(x,y)

感谢任何帮助。

2 个答案:

答案 0 :(得分:11)

很高兴知道找到有趣的文档,包等,克里金经常被称为"高斯过程回归"。

在python中,一个有很多例子的好实现是众所周知的机器学习包scikit-learn之一。它基于众所周知的DACE matlab实现。

有关高斯过程回归实现的文档可在此page及其中的链接中找到。您可以在本页底部找到5个教程:enter link description here。可以找到可用内核列表here

使用您提供的数据,您只需执行以下操作即可将简单模型与您选择的内核相匹配:

import sklearn
gp = sklearn.gaussian_process.GaussianProcessRegressor(kernel=your_chosen_kernel)
gp.fit(X, y)  

答案 1 :(得分:0)

使用OpenTURNSKrigingAlgorithm估计条件高斯过程的超参数。您需要的元模型的目的是将(经度,纬度)2D点作为输入,并将给定日期的降水作为输出。

第一步是准备数据。在以下脚本中,我创建包含经度/纬度对的coordinates_train变量和包含降水的precipitation_train变量。我使用了2000/1/2日期的降水,因为第3站的2000/1/1的数据丢失了。

import openturns as ot
# Input points
coordinates_train = ot.Sample([[15.68,62.64],[15.73,62.12],[16.10,61.14]])
# Output points
precipitation_train = ot.Sample([[3.4],[2.5],[4.5]]) # At 2000/1/2

然后我们就可以训练克里格。为此,我使用恒定的基础(模型的趋势)和指数协方差模型。鉴于降水量在站点位置上必须非常规则,因此这应该是适当的。

# Fit
inputDimension = 2
basis = ot.ConstantBasisFactory(inputDimension).build()
covarianceModel = ot.SquaredExponential([1.]*inputDimension, [1.0])
algo = ot.KrigingAlgorithm(coordinates_train, precipitation_train, covarianceModel, basis)
algo.run()
result = algo.getResult()
krigingMetamodel = result.getMetaModel()

然后,我们可以使用元模型来预测未记录降水地点的降水。由于krigingMetamodel是一个函数,因此我只使用“()”运算符。

# Predict
coordinates = [15.70,62.53] # A new latitude/longitude pair
precipitation = krigingMetamodel(coordinates)

然后precipitation是一维点,其中包含给定位置的降水。这是预测的降水量。

>>> print(precipitation)
[3.46667]

通过输入(经度,纬度,时间)作为输入,您也可能会获得更通用的克里金法。在这种情况下,您要做的就是向输入训练样本中添加一个新维度,其中包含关联的时间,格式设置为实数值。