Кригинг в Python

Я использую pykrige для интерполяции-2d.

Несколько данных (x, y, z), которые представляют собой местоположение и высоту.

Но на обычном кригинге («сферическом») результат не очень хороший.

Как я могу настроить параметры, чтобы получить лучший результат.

Или любое предложение для алгоритма кригинга в питоне?

n = int(input("Enter the Slice number:"))
x = df_Points[n]['x']
y = df_Points[n]['y']
z = df_Points[n]['z']

gridx = np.arange(min(x) - 100, max(x) + 100, 10.0)
gridy = np.arange(min(y) - 100, max(y) + 100, 10.0)

# OrdinaryKriging
from pykrige.ok import OrdinaryKriging
# ordinary kriging with pykrige
OK = OrdinaryKriging(
    x,
    y,
    z,
    variogram_model='spherical')

z1, ss1 = OK.execute("grid", gridx, gridy)

person LinXiang    schedule 26.07.2020    source источник
comment
Нехорошо - прилагательное в сравнительной степени. Результат плохой по сравнению с чем? Дает ли, например, кригинг ArcGIS лучшие результаты? На странице проекта PyKrige есть множество примеров, так что попробуйте разные версии алгоритмов кригинга и посмотрите, что работает лучше.   -  person pavel    schedule 26.07.2020
comment
Вопрос был бы более полезным с заданным значением n вместо того, чтобы читать это от пользователя (тот факт, что это исходит от пользователя, не имеет значения). Я предлагаю также добавить набор заданных значений z, чтобы можно было дать согласованные ответы. Я предполагаю, что вы не импортировали панд в начале скрипта: добавление этого импорта позволило бы более легко воспроизвести скрипт.   -  person Michael Baudin    schedule 16.10.2020


Ответы (1)


Я не очень хорошо знаю пикриге. В библиотеке OpenTURNS оптимизация параметров выполняется автоматически.

В вашем случае у вас есть кадр данных Pandas df_Points, содержащий x, y и z. Если я правильно понимаю, вам нужна метамодель: (x,y) -> z

import openturns as ot

# your input / output data can be easily formatted as samples for openturns
inputdata = ot.Sample(df[['x','y']].values)
outputdata = ot.Sample(df[['z']].values)

Тогда можно попробовать сферический кригинг.

dimension = 2  # dimension of your input (x,y)
basis = ot.ConstantBasisFactory(dimension).build()
covarianceModel = ot.SphericalModel(dimension)
    
algo = ot.KrigingAlgorithm(inputdata, outputdata, covarianceModel, basis)
algo.run()
result = algo.getResult()
metamodel = result.getMetaModel()

метамодель — это то, что вам нужно. Вы можете выполнить его в определенной точке

metamodel([x0, y0])

или на всей вашей сетке.

person Jean A.    schedule 16.10.2020