【算法】克里金(Kriging)插值原理及Python应用

### 文章目录

  • [@[toc]](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [前言](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [一、克里金插值原理](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [1.1 概述](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [1.2 基本公式](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [1.2 权重 w i w_i wi的确定](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [1.3 拟合函数的确定](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [二、Python建模与可视化](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [2.1 Demo](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [2.1.1 随机生成已知格网点](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [2.1.2 拟合](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [2.1.3 评估内符合精度](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [2.1.3 内插未知格网点](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [2.1.4 画图](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [2.2 结果图](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)
  • [参考文献](#文章目录 @[toc] 前言 一、克里金插值原理 1.1 概述 1.2 基本公式 1.2 权重 w i w_i wi的确定 1.3 拟合函数的确定 二、Python建模与可视化 2.1 Demo 2.1.1 随机生成已知格网点 2.1.2 拟合 2.1.3 评估内符合精度 2.1.3 内插未知格网点 2.1.4 画图 2.2 结果图 参考文献)

前言

最近学习了一下克里金插值的原理并做了一点简单尝试,在此文记录!
本文详细介绍克里金(Kriging)插值的原理和python实现。首先介绍克里金插值的原理及理解,再详细介绍基于pykrige库实现的克里金插值Demo,并使用随机生成的数据进行了测试。


一、克里金插值原理

1.1 概述

克里金插值是根据空间相关关系通过一系列已知点的属性预测相近的未知点的属性的插值方法。有两点假设。
假设1 :一点的属性值与其周围点的属性值有关,并且可以由其周围点的属性值推导出。
假设2 :两点属性值差异性(不相关性)与二者间距离在一定距离范围内成正相关(核心思想)。

1.2 基本公式

已知条件

  • 已知点坐标及属性值
  • 已知待求点坐标
  • 已知点-待求点距离矩阵
  • 已知点间距离矩阵

根据假设1,空间内某未知值点估计值 z 0 ′ z_0^{\prime} z0′是部分已知点值的加权和

z 0 ′ = ∑ i = 1 n z i w i z_0^{\prime}=\sum_{i=1}^n z_i w_i z0′=∑i=1nziwi

其中n是可以决定该点属性值的点数量(一般取该点周边一定数量的已知点),
z i z_i zi代表第i个已知点的属性值, w i w_i wi代表第i个已知点的权重。

1.2 权重 w i w_i wi的确定

次级假设1

为得到尽可能准确的结果, w i w_i wi应使得点处估计值 z 0 ′ z_0^{\prime} z0′与真实值 z 0 z_0 z0之差最小。

E ( z 0 ′ − z 0 ) = 0 E\left(z_0^{\prime}-z_0\right)=0 E(z0′−z0)=0

同时我们希望估计值 z 0 ′ z_0^{\prime} z0′与真实值 z 0 z_0 z0之差的方差尽可能小,即

min ⁡ ( Var ⁡ ( z 0 ′ − z 0 ) ) \min \left(\boldsymbol{\operatorname {Var}}\left(z_0^{\prime}-z_0\right)\right) min(Var(z0′−z0))

次级假设2

空间是平稳的,空间任意一点处的值z=z(x,y)由区域平均值c和随

机偏差R(x,y)组成,其中偏差的方差均为常数。

E ( z ) = c E(z)= c E(z)=c
V a r [ R ( x , y ) ] = σ 2 Var[R(x,y)] = σ^2 Var[R(x,y)]=σ2

权重计算公式:

[ w 1 ⋮ w n λ ] = [ γ 11 ⋯ γ 1 n ⋮ ⋱ ⋮ γ n 1 ⋯ γ n n 1 1 0 ] − 1 [ γ 01 ⋮ γ 0 n 1 ] \left[\begin{array}{c}w_1 \\ \vdots \\ w_n \\ \lambda\end{array}\right]=\left[\begin{array}{ccc}\gamma_{11} & \cdots & \gamma_{1 n} \\ \vdots & \ddots & \vdots \\ \gamma_{n 1} & \cdots & \gamma_{n n} \\ 1 & 1 & 0\end{array}\right]^{-1}\left[\begin{array}{c}\gamma_{01} \\ \vdots \\ \gamma_{0n} \\ 1\end{array}\right] w1⋮wnλ = γ11⋮γn11⋯⋱⋯1γ1n⋮γnn0 −1 γ01⋮γ0n1

其中,i和j代表不同的领域点,0代表待求点。 γ i j \gamma_{i j} γij为半方差,可由 γ i j = ( z i − z j ) 2 2 \gamma_{i j}=\frac{\left(z_{\mathrm{i}}-z_{\mathrm{j}}\right)^2}{2} γij=2(zi−zj)2计算。所以上式矩阵的系数已知,但右侧的向量未知,可通过拟合函数 γ = f ( d ) \gamma = f(d) γ=f(d)计算。

1.3 拟合函数的确定

克里金插值常用的拟合函数有:

式中,h就是距离d,C0和C1是带确定的系数,a为假设2存在空间相关性的有限距离。
为了排除偶然性,确定拟合函数的系数时一般先分组计算距离和半方差平均值,而不是输入原始的距离-半方差对计算。

二、Python建模与可视化

2.1 Demo

2.1.1 随机生成已知格网点

python 复制代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math
from mpl_toolkits.basemap import Basemap

# 定义边界
lonLeft = 100
lonRight = 139
latDown = 20
latUp = 60
python 复制代码
# 随机生成数据,即已知格网点
np.random.seed(42)
num_points = 50
lons = np.random.uniform(lonLeft, lonRight, num_points)
lats = np.random.uniform(latDown, latUp, num_points)
data = np.sin(lons) + np.cos(lats) + np.random.normal(0, 0.1, num_points)

2.1.2 拟合

variogram_model即拟合函数,可选参数有linear, power, gaussian, spherical, exponential, hole-effect.

python 复制代码
from pykrige.ok import OrdinaryKriging
import matplotlib
from mpl_toolkits.basemap import Basemap

OK = OrdinaryKriging(lons, lats, data, variogram_model = 'gaussian', nlags=12)

2.1.3 评估内符合精度

python 复制代码
## 评估拟合精度
dataPrd, ss1 = OK.execute('points', lons, lats)
compressed_array = dataPrd.compressed()
result_list_from_compressed = compressed_array.tolist()
squared_diffs = [(result_list_from_compressed[iLoop] - data[iLoop]) ** 2 for iLoop in range(len(data))]

# 求和
sum_squared_diffs = sum(squared_diffs)
 
# 取平均
mean_squared_diffs = sum_squared_diffs / len(data)
 
# 开方
rmse = math.sqrt(mean_squared_diffs)
print(rmse)
1.83099255103024e-15

2.1.3 内插未知格网点

python 复制代码
# 生成未知格网点
grid_lon = np.linspace(100,139,400)
grid_lat = np.linspace(20,60,400)
python 复制代码
## 内插未知点
z1, ss1 = OK.execute('grid', grid_lon, grid_lat)

2.1.4 画图

python 复制代码
#转换成网格
xgrid, ygrid = np.meshgrid(grid_lon, grid_lat)
#将插值网格数据整理
df_grid =pd.DataFrame(dict(long=xgrid.flatten(),lat=ygrid.flatten()))
#添加插值结果
df_grid["Krig_gaussian"] = z1.flatten()


fig,ax = plt.subplots(figsize=(6,4.5),dpi=130,facecolor="white")
map_base = Basemap(lonLeft,latDown, lonRight, latUp,
                  projection="cyl",lon_0 = 119,lat_0 = 33,ax = ax)
# lat = np.arange(30,36,1)
# lon = np.arange(116,122,1)
map_base.drawparallels(np.arange(30,36,1), labels=[1,0,0,0],fontsize=12,zorder=0) #画纬度线
map_base.drawmeridians(np.arange(116,122,1), labels=[0,0,0,1],fontsize=12,zorder=0) #画经度线
# map_base.readshapefile( name = "Js", default_encoding="ISO-8859-1",
#                        drawbounds=True)
cp=map_base.pcolormesh(xgrid, ygrid, data=z1.data,cmap='Spectral_r')  
colorbar = map_base.colorbar(cp,size='3%',pad="5%",label="Kriging_inter")
#设置colorbar
colorbar.outline.set_edgecolor('none')
 
for spine in ['top','left','right','bottom']:
    ax.spines[spine].set_visible(None) #隐去轴脊
 
ax.text(.5,1.1,"Map Charts in Python Exercise 02:Map Kriging Grid line",transform = ax.transAxes,ha='center', 
        va='center',fontweight="bold",fontsize=14)
ax.text(.5,1.03, "processed map charts with Basemap",
        transform = ax.transAxes,ha='center', va='center',fontsize = 10,color='black')
ax.text(.83,-.06,'\nVisualization by DataCharm',transform = ax.transAxes,
        ha='center', va='center',fontsize = 8,color='black')

2.2 结果图

50个已知点:

100个已知点:

参考文献

【GIS算法】克里金插值原理详解

https://www.bilibili.com/video/BV1bT4y1C7z6

空间绘图 | Python-pykrige包-克里金(Kriging)插值计算及可视化绘制tps://blog.csdn.net/qq_40483688/article/details/135821334

python克里金插值建模

https://blog.51cto.com/u_16175499/12763524

相关推荐
HsuHeinrich14 分钟前
流程图(四)利用python绘制漏斗图
python·数据可视化
码农丁丁2 小时前
[python3]Excel解析库-xlwt
python·excel·xlwt
reasonsummer2 小时前
【办公类-47-02】20250103 课题资料快速打印(单个docx转PDF,多个pdf合并一个PDF 打印)
python·pdf
wjm0410063 小时前
贪心算法概述
算法·贪心算法
我搞slam3 小时前
全覆盖路径规划算法之BCD源码实现(The Boustrophedon Cellular Decomposition)
c++·算法·图搜索算法
Rossy Yan3 小时前
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
开发语言·数据结构·c++·算法·查找·头歌实践教学平台·合集
io_T_T4 小时前
python SQLAlchemy ORM——从零开始学习 01 安装库
python
香菜的开发日记4 小时前
快速学习 pytest 基础知识
自动化测试·python·pytest
背太阳的牧羊人4 小时前
grouped.get_group((‘B‘, ‘A‘))选择分组
python·pandas
埃菲尔铁塔_CV算法5 小时前
BOOST 在计算机视觉方面的应用及具体代码分析(二)
c++·人工智能·算法·机器学习·计算机视觉