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

文章目录

    • @[toc]
  • 前言
  • 一、克里金插值原理
  • 二、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(z0z0)=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(z0z0))

次级假设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] w1wnλ = γ11γn111γ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(zizj)2计算。所以上式矩阵的系数已知,但右侧的向量未知,可通过拟合函数 γ = f ( d ) \gamma = f(d) γ=f(d)计算。

1.3 拟合函数的确定

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

二、Python建模与可视化

2.1 Demo

2.1.1 随机生成已知格网点

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

# 随机生成数据,即已知格网点
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.

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 评估内符合精度

## 评估拟合精度
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 内插未知格网点

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

2.1.4 画图


#转换成网格
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948553.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QML自定义滑动条Slider的样式

代码展示 import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.1Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Slider {id: controlvalue: 0.5background: Rectangle {x: control.leftPaddingy: control.topPadding …

Android Studio学习笔记

01-课程前面的话 02-Android 发展历程 03-Android 开发机器配置要求 04-Android Studio与SDK下载安装 05-创建工程与创建模拟器 在 Android Studio 中显示 “Device Manager” 有以下几种方法: 通过菜单选项 打开 Android Studio,确保已经打开了一个…

Qt天气预报系统设计界面布局第四部分右边

Qt天气预报系统 1、第四部分右边的第一部分1.1添加控件 2、第四部分右边的第二部分2.1添加控件 3、第四部分右边的第三部分3.1添加控件3.2修改控件名字 1、第四部分右边的第一部分 1.1添加控件 拖入一个widget,改名为widget04r作为第四部分的右边 往widget04r再拖…

Spring boot + Hibernate + MySQL实现用户管理示例

安装MySQL Windows 11 Mysql 安装及常用命令_windows11 mysql-CSDN博客 整体目录 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLS…

Spring Boot 整合 Keycloak

1、概览 本文将带你了解如何设置 Keycloak 服务器&#xff0c;以及如何使用 Spring Security OAuth2.0 将Spring Boot应用连接到 Keycloak 服务器。 2、Keycloak 是什么&#xff1f; Keycloak是针对现代应用和服务的开源身份和访问管理解决方案。 Keycloak 提供了诸如单点登…

【Rust自学】10.2. 泛型

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 题外话&#xff1a;泛型的概念非常非常非常重要&#xff01;&#xff01;&#xff01;整个第10章全都是Rust的重难点&#xff01;&#xf…

51单片机——共阴数码管实验

数码管中有8位数字&#xff0c;从右往左分别为LED1、LED2、...、LED8&#xff0c;如下图所示 如何实现点亮单个数字&#xff0c;用下图中的ABC来实现 P2.2管脚控制A&#xff0c;P2.3管脚控制B&#xff0c;P2.4管脚控制C //定义数码管位选管脚 sbit LSAP2^2; sbit LSBP2^3; s…

SwiftUI 撸码常见错误 2 例漫谈

概述 在 SwiftUI 日常撸码过程中&#xff0c;头发尚且还算茂盛的小码农们经常会犯这样那样的错误。虽然犯这些错的原因都很简单&#xff0c;但有时想要快速准确的定位它们却并不容易。 况且这些错误还可能在模拟器和 Xcode 预览&#xff08;Preview&#xff09;表现的行为不甚…

米哈游可切换角色背景动态壁纸

米哈游可切换角色背景动态壁纸 0. 视频 B站演示: 米哈游可切换角色背景动态壁纸-wallpaper 1. 基本信息 作者: 啊是特嗷桃系列: 复刻系列 (衍生 wallpaper壁纸引擎 用)网站: 网页版在线预览 (没有搞大小适配, 建议横屏看; 这个不能切角色, 只能在wallpaper中切)仓库: GitHub…

OWASP ZAP之API 请求基础知识

ZAP API 提供对 ZAP 大部分核心功能的访问,例如主动扫描器和蜘蛛。ZAP API 在守护进程模式和桌面模式下默认启用。如果您使用 ZAP 桌面,则可以通过访问以下屏幕来配置 API: Tools -> Options -> API。 ZAP 需要 API 密钥才能通过 REST API 执行特定操作。必须在所有 …

Elasticsearch: 高级搜索

这里写目录标题 一、match_all匹配所有文档1、介绍&#xff1a; 二、精确匹配1、term单字段精确匹配查询2、terms多字段精确匹配3、range范围查询4、exists是否存在查询5、ids根据一组id查询6、prefix前缀匹配7、wildcard通配符匹配8、fuzzy支持编辑距离的模糊查询9、regexp正则…

齿轮缺陷检测数据集VOC+YOLO格式485张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;485 标注数量(xml文件个数)&#xff1a;485 标注数量(txt文件个数)&#xff1a;485 标注…

ArkTs之NAPI学习

1.Node-api组成架构 为了应对日常开发经的网络通信、串口访问、多媒体解码、传感器数据收集等模块&#xff0c;这些模块大多数是使用c接口实现的&#xff0c;arkts侧如果想使用这些能力&#xff0c;就需要使用node-api这样一套接口去桥接c代码。Node-api整体的架构图如下&…

MySQL(五)MySQL图形化工具-Navicat

1. MySQL图形化工具-Navicat Navicat是一套快速、可靠的数据库管理工具&#xff0c;Navicat是以直觉化的图形用户界面而建的&#xff0c;可以兼容多种数据库&#xff0c;支持多种操作系统。   Navicat for MySQL是一款强大的 MySQL 数据库管理和开发工具&#xff0c;它为专业…

【OceanBase】通过 OceanBase 的向量检索技术构建图搜图应用

文章目录 一、向量检索概述1.1 关键概念① 非结构化数据② 向量③ 向量嵌入(Embedding)④ 向量相似性检索 1.2 应用场景 二、向量检索核心功能三、图搜图架构四、操作步骤4.1 使用 Docker 部署 OceanBase 数据库4.2 测试OceanBase数据库连通性4.3 开启数据库向量检索功能4.4 克…

微信流量主挑战:用户破16!新增文档转换(新纪元3)

朋友们&#xff0c;报告好消息&#xff01;我的小程序用户数量已经涨到16个了&#xff01;没错&#xff0c;真没拉朋友圈亲戚好友来撑场子&#xff0c;全靠实力&#xff08;和一点点运气&#xff09;吸引了16位陌生小伙伴光临&#xff01;这波进步&#xff0c;连我自己都感动了…

Python:交互式物质三态知识讲解小工具

学着物理写着Python 以下是一个使用Python的Tkinter库实现的简单示例程序&#xff0c;通过图形界面展示并讲解固态、液态、气态的一些特点&#xff0c;代码中有详细的注释来帮助你理解各部分功能&#xff1a; 完整代码 import tkinter as tk from tkinter import ttk import …

ESP32-S3遇见OpenAI:OpenAI官方发布ESP32嵌入式实时RTC SDK

目录 OpenAI RTC SDK简介应用场景详解智能家居控制系统个人健康助手教育玩具 技术亮点解析低功耗设计快速响应高精度RTC安全性保障开发者指南 最近&#xff0c;OpenAI官方发布了一款针对ESP32-S3的嵌入式实时RTC&#xff08;实时时钟&#xff09;SDK&#xff0c;这标志着ESP32-…

Windows 11 关闭 VBS(基于虚拟化的安全性)

注&#xff1a;本文为 “Windows 11 关闭 VBS” 相关方法文章合辑。 重传部分 csdn 转储异常图片&#xff0c;未整理去重。 Win11 关闭 VBS 的几种方法 适用机型&#xff1a;台式 / ThinkCentre / 笔记本 / ThinkPad 分析 Virtualization-based Security (VBS) 基于虚拟化的…

小程序租赁系统的优势与应用探索

内容概要 小程序租赁系统&#xff0c;听起来很高大上&#xff0c;但实际上它比你想象的要实用得多&#xff01;设想一下&#xff0c;几乎所有的租赁需求都能通过手机轻松解决。这种系统的便捷性体现在让用户随时随地都能发起租赁请求&#xff0c;而不再受制于传统繁琐的手续。…