web-dev-qa-db-ja.com

Pythonでクリギングを使用して測点データを補間するにはどうすればよいですか?

ウェブの閲覧Pythonでクリギングを使用するためのいくつかのツールは pyKriging および Gaussian Process Regression ですが、私はできませんでした。 tいずれかを機能させるには、最初のものは機能しません(インポートすることもできません)。

import pyKriging

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

二つ目は使い方がわかりません。簡単な動作例を見つけることができませんでした(これは rroowwllaannddの回答 たとえば素晴らしいですが、残念ながらデータはダウンロードできなくなりました)

だから私の質問は、クリギングを使用して自分のデータをどのように補間できるでしょうか?私はいくつかの測点データを次のような数々の配列に保存しています:

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]])

私が必要なのは、1日あたりの配列(または3D配列)です。これには、クリギングで補間されたすべての測点のデータが、次のようなグリッドで毎日含まれています。

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

どんな助けでもありがたいです。

8
lanadaquenada

クリギングは「ガウスプロセス回帰」と呼ばれることが多い興味深いドキュメント、パッケージなどを見つけるために知っておくと便利です。

Pythonでは、多くの例を含む優れた実装が、有名な機械学習パッケージ scikit-learn の1つです。これは、よく知られているDACE matlab実装に基づいています。

Gaussian Process Regressionの実装に関するドキュメントは、この page とそのリンクにあります。このページの下部に5つのチュートリアルがあります ここにリンクの説明を入力してください 。利用可能なカーネルのリストは here にあります。

提供したデータを使用して、単純なモデルを選択したカーネルに適合させるには、次の手順を実行するだけです。

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

OpenTURNS の場合、KrigingAlgorithmは条件付きガウス過程のハイパーパラメーターを推定します。必要なメタモデルの目的は、(経度、緯度)2Dポイントを入力として、特定の日付の降水量を出力として取得することです。

最初のステップは、データを準備することです。次のスクリプトでは、経度/緯度のペアを含むcoordinates_train変数と、降水量を含むprecipitation_train変数を作成します。ステーション3の2000/1/1のデータが欠落しているため、日付2000/1/2の降水量を使用しました。

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は、指定された場所の降水量を含む1Dポイントです。これが予測降水量です。

>>> print(precipitation)
[3.46667]

入力として(経度、緯度、時間)を指定することで、より一般的なクリギングを取得することもできます。この場合、必要なことは、実際の値としてフォーマットされた、関連付けられた時間を含む新しい次元を入力トレーニングサンプルに追加することだけです。

2
Michael Baudin