一步一步的普通克里金例子?

机器算法验证 预言 空间的 权重 克里金法
2022-03-06 10:46:06

我已经按照在线教程学习了空间克里金法geoRgstat(以及automap)。我可以执行空间克里金法,并且了解其背后的主要概念。我知道如何构建半变异函数、如何拟合模型以及如何执行普通克里金法。

我不明白的是如何确定周围测量值的权重。我知道它们来自半变异函数,并且取决于与预测位置的距离以及测量点的空间排列。但是怎么做?

任何人都可以制作一个具有 3 个随机测量点和 1 个预测位置的普通克里金(非贝叶斯)模型吗?这会很有启发性。

1个回答

除了这个答案之外,对于gis.stackexchange.com上的类似问题,还有一些不错的附加答案

首先,我将在数学上用三点描述普通克里金法。假设我们有一个本质上静止的随机场。

普通克里金法

我们尝试使用已知值我们想要的预测形式为 其中是插值权重。我们假设一个恒定的平均值为了获得无偏的结果,我们固定然后我们得到以下问题: 使用拉格朗日乘子法,我们得到方程: Z(x0)Z=(Z(x1),Z(x2),Z(x3))

Z^(x0)=λTZ
λ=(λ1,λ2,λ3)μλ1+λ2+λ3=1
minE(Z(X0)λTZ)2s.t.λT1=1.
j=13λjγ(xixj)+m=γ(xix0),i=1,2,3,
j=13λj=1,
其中是拉格朗日乘数,是(半)变异函数。由此,我们可以观察到几件事:mγ

  • 权重不依赖于平均值μ
  • 权重根本不依赖于的值。仅在坐标上(在各向同性情况下仅在距离上)Z
  • 每个权重取决于所有其他点的位置。

仅从方程式很难看出权重的精确行为,但可以非常粗略地说:

  • 该点距离越远,其权重越低(相对于其他点“更远”)。x0
  • 然而,靠近其他点也会降低重量。
  • 结果很大程度上取决于变差函数的形状、范围,尤其是块金效应。上进行克里金法并查看结果如何随不同的变异函数设置而变化,这将是非常有启发性的。R

然而,我将专注于平面中点的位置。我编写了这个小 R 函数,它从中获取点并绘制克里金权重(对于具有零块金的指数协方差函数)。[0,1]2

library(geoR)

# Plots prediction weights for kriging in the window [0,1]x[0,1] with the prediction point (0.5,0.5)
drawWeights <- function(x,y){
 df <- data.frame(x=x,y=y, values = rep(1,length(x)))
  data <- as.geodata(df, coords.col = 1:2, data.col = 3)
  
  wls <- variofit(bin1,ini=c(1,0.5),fix.nugget=T)
  weights <- round(as.numeric(krweights(data$coords,c(0.5,0.5),krige.control(obj.mod=wls, type="ok"))),3)
  
  plot(data$coords, xlim=c(0,1),  ylim=c(0,1))
  segments(rep(0.5,length(x)), rep(0.5,length(x)),x, y, lty=3 )
  text((x+0.5)/2,(y+0.5)/2,labels=weights)
}

您可以使用 spatstat 的功能来玩它clickppp

library(spatstat)
points <- clickppp()
drawWeights(points$x,points$y)

这里有几个例子

和彼此等距的点x0

deg <- seq(0,2*pi,length.out=4)
deg <- head(deg,length(deg)-1)
x <- 0.5*as.numeric(lapply(deg, cos)) + 0.5
y <- 0.5*as.numeric(lapply(deg, sin)) + 0.5
drawWeights(x,y)

在此处输入图像描述

彼此靠近的点将共享权重

deg <- c(0,0.1,pi)
x <- 0.5*as.numeric(lapply(deg, cos)) + 0.5
y <- 0.5*as.numeric(lapply(deg, sin)) + 0.5
drawWeights(x,y)

在此处输入图像描述

附近点“窃取”权重

deg <- seq(0,2*pi,length.out=4)
deg <- head(deg,length(deg)-1)
x <- c(0.6,0.5*as.numeric(lapply(deg, cos)) + 0.5)
y <- c(0.6,0.5*as.numeric(lapply(deg, sin)) + 0.5)
drawWeights(x,y)

https://i.imgur.com/MeuPvFT.png

有可能得到负权重

在此处输入图像描述

希望这能让您对权重的工作方式有所了解。