python实现梯度距离平方反比法GIDS

news2024/10/7 20:27:51
1 梯度距离平方反比法

梯度距离平方反比法(gradient plus inverse distance squared (GIDS))由Nalder和Wein于1988年提出,是一种考虑了气象要素随经纬度和海拔高度变化的反距离权重法,其空间插值计算公式如下:

在这里插入图片描述

式中:

  • z z z 表示代插点的估算值
  • z i z_i zi 为第 i i i 个样本点的实测值
  • d i d_i di 为第 i i i 个样本点与待插点之间的距离
  • n n n 为参与计算的实测样本点个数
  • x 、 y 、 e x、y、e xye 分别为待插点的经度、纬度和海拔高度
  • x i 、 y i 、 e i x_i、y_i、e_i xiyiei 分别为第 i i i 个样本点的经度、纬度和海拔高度
  • C x , C y , C e C_x,C_y,C_e Cx,Cy,Ce 分别为站点气象要素值与经度、纬度和海拔高度的偏回归系数,其值直接决定各样本点的插值权重,通过建立样本点的气象要素值与其经纬度和海拔高度的多元线性回归模型,利用最小二乘估计法对这3个系数进行求解,回归模型如下:

在这里插入图片描述

式中:

  • z i ^ \hat{z_i} zi^ 表示第 i i i 个样本点的气象要素估计值
  • C 0 C_0 C0 为回归常数
2 基于经验气温垂直递减率的梯度距离平方反比法

由上可知,样本点气象要素值与经纬度和海拔高度的关系直接决定空间插值的效果。

对气温进行空间插值时,当样本点海拔与待插值点之间的海拔相差较小时,可以得到准确度较高的插值结果; 但当研究区位于地形起伏剧烈区域时,待插值点与样本点的海拔高度差异较大,此时得到的偏回归系数 C x , C y , C e C_x,C_y,C_e Cx,Cy,Ce 不能准确描述待插值点气温与经纬和海拔高度的关系,所得插值误差就会较大,无法满足应用需求。

基于经验气温垂直递减率的改进梯度距离平方反比法 GIDS-EAR,考虑到海拔高度对气温的影响规律与经纬度不同,将海拔与经纬度的影响分开考虑:

  • 首先根据气温垂直递减率经验值确定气温与海拔高度的偏回归系数 C e C_e Ce
  • 并对样本点气温值 z i z_i zi 进行修正得到 z m i z_{mi} zmi,消除由于海拔的差异对气温值的影响
  • 再将 z m i z_{mi} zmi 代入多元线性回归模型,作为模型最小二乘求解的样本点气温的初值,解算得到气温与经纬度的偏回归系数 C x , C y C_x,C_y Cx,Cy
  • 再依据 GIDS 插值公式计算待插值点的温度值

GIDS-EAR 方法详细步骤如下:

  1. C e C_e Ce 的确定: 考虑到海拔高度对气温的影响相较于经纬度更具有规律性,气温与海拔高度的偏回归系数与样本站点区域的气温垂直递减率接近,不同于 GIDS 法的线性回归求解,本文以气温垂直递减率的经验值 T g T_g Tg 作为各样本点气温值与海拔的偏回归系数 C e C_e Ce,即 C e = T g C_e=T_g Ce=Tg;

  2. C x 、 C y C_x、C_y CxCy 的求解: 由于第一步中已经考虑海拔高度对待插点气温的影响,故建立只考虑经纬度的多元线性回归模型,相应地,各样本点的气温值也应进行修正以消除海拔的影响, 如下:

在这里插入图片描述

式中: z ^ m i \hat{z}_{mi} z^mi 为修正后第 i i i 个样本点的气温估值。样本点气温修正值 z m i z_{mi} zmi 的计算方法为:
在这里插入图片描述

  1. 将上述所得 C x , C y , C e C_x,C_y,C_e Cx,Cy,Ce 代入式 (1) 中,求得基于经验气温垂直递减率的 GIDS 插值结果。
3 python实现

这是按自己理解复现的代码,感觉不是很对,效果不是很好,仅供参考。


from sklearn.cross_decomposition import PLSRegression

"""类函数"""
class GIDS:
    def __init__(self, x, y, elev, z, Tg=None):
        self.x, self.y, self.elev, self.z = x, y, elev, z
        self.Tg= Tg
        if Tg is None:
            feature = np.c_[x, y, elev]
        else:
            feature = np.c_[x, y]
        self.pls = PLSRegression(n_components=2)
        self.pls.fit(feature, z)

            
    def fit(self, x_new, y_new, elev_new):
        if self.Tg is None:
            feature_new = np.c_[self.x-x_new, self.y-y_new, self.elev-elev_new]
            z_new = self.pls.predict(feature_new)
        else:
            feature_new = np.c_[self.x-x_new, self.y-y_new]
            z_new = self.pls.predict(feature_new)+self.Tg*(self.elev-elev_new)

        di = (self.x-x_new)**2+(self.y-y_new)**2
        z = np.sum((self.z+z_new)/di)/np.sum(1/di)
        return z 


"""demo"""
import numpy as np
import matplotlib.pyplot as plt

# create sample points with structured scores
X1 = 10 * np.random.rand(1000, 2) -5
elev = np.random.randint(1, 100, 1000)

def func(x, y, z):
    return np.sin(x**2 + y**2+ z**2) / (x**2 + y**2 + z**2)

z1 = func(X1[:,0], X1[:,1], elev)

# 'train'
gids = GIDS(X1[:,0], X1[:,1], elev, z1)


# 'test'
spacing = np.linspace(-5., 5., 100)
X2 = np.meshgrid(spacing, spacing)
grid_shape = X2[0].shape
X2 = np.reshape(X2, (2, -1)).T
elev2 = np.random.randint(1, 100, X2.size//2)
z2 = []
for x2,y2, elev in zip(X2[:,0],X2[:,1], elev2):
    z2.append(gids.fit(x2, y2, elev))
z2 = np.array(z2)

# plot
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, sharex=True, sharey=True, figsize=(10,3))
ax1.contourf(spacing, spacing, func(*np.meshgrid(spacing, spacing), elev2.reshape(100,100)))
ax1.set_title('Ground truth')
ax2.scatter(X1[:,0], X1[:,1], c=z1, linewidths=0)
ax2.set_title('Samples')
ax3.contourf(spacing, spacing, z2.reshape(grid_shape))
ax3.set_title('Reconstruction')
plt.show()

在这里插入图片描述

参考:一种适用于气温空间插值的改进梯度距离平方反比法*.李框宇等.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】数组中出现次数超过一半的数字

代码&#xff1a; class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param numbers int整型vector * return int整型*/int MoreThanHalfNum_Solution(vector<int>& numbers) {int …

基于ssm+vue员工工资管理系统

基于ssmvue员工工资管理系统 摘要 随着信息技术的不断发展&#xff0c;各行各业对于高效管理和利用数据的需求也日益增长。员工工资管理系统作为企业管理中的一个重要组成部分&#xff0c;对于实现工资信息的精确计算、及时发放和有效管理具有重要意义。本文基于SSM&#xff08…

程序员导航站

探路者 hello.alluniverse.vip 开发者导航 - Pro Developer网站导航 探路者是一款极简导航工具&#xff0c;致力于收录的每个站点都有其独特的作用。同时支持自定义导航&#xff0c;让用户快速实现个性化的导航站点。 特性概述 免费ChatGPT 装机必备 开发工具 Git精选项目 …

Unity 代码控制Text文本换行

Unity 要通过代码控制Text文本换行&#xff0c;实现方法比较简单&#xff0c;无论是传统的Text&#xff0c;还是TMP文本&#xff0c;都是通过在字符串需要换行的地方加上换行符【\n】。 不过在Text属性栏中要确保设置自动换行模式&#xff1a; 如传统的设置如图&#xff1a; …

【AI视野·今日CV 计算机视觉论文速览 第278期】Mon, 30 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Mon, 30 Oct 2023 Totally 50 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Image Clustering Conditioned on Text Criteria Authors Sehyun Kwon, Jaeseung Park, Minkyu Kim, Jaewoong Cho, Ernest…

Linux - 文件系统

前言 文件系统 我们先来看两个例子&#xff1a; 这个程序输出&#xff1a; 此时的输出也满足的我们预期。 我们也可以把 程序执行结果&#xff0c;输出重定向到 一个文件当中: 当我们在代码的结尾处&#xff0c;创建了子进程&#xff0c;那么输出应该还是和上述是一样的&…

【打卡】牛客网:

自己写的&#xff1a; 虽然题目要求了排序&#xff0c;但是我没排序也可以通过。 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param num int整型vector * return int整型vector<vec…

Java8Stream快速使用

将List集合存入流中 List<String> list new ArrayList<>();list.add("张一");list.add("张二");list.add("张三");list.add("李四");list.add("赵五");list.add("张六");list.add("王八"…

腾讯云新客户优惠服务器88元/年,540元/3年,另有5年优惠服务器

在选择云服务器时&#xff0c;首先需要考虑的是性能与配置是否与自己的需求相匹配。对于小型网站或者个人博客&#xff0c;轻量应用服务器是一个不错的选择。腾讯云双十一活动中&#xff0c;2核2G轻量应用服务器的活动优惠价为88元/年&#xff0c;2核4G轻量应用服务器的活动优惠…

运行游戏“找不到XINPUTI_3.dll无法继续执行代码,总共有五种解决方案

xinput1_3.dll是Windows操作系统中的一款动态链接库&#xff08;DLL&#xff09;文件&#xff0c;主要作用是为DirectX输入提供支持。DirectX是微软推出的一套多媒体应用程序开发接口&#xff0c;广泛应用于游戏、多媒体制作等领域。xinput1_3.dll文件包含了许多与输入设备相关…

java学习part04

1.进制 计算机底层都是二进制&#xff0c;输出统一十进制 2.算符 3.逻辑算符 4.位运算符 38-变量与运算符-位运算符的使用_哔哩哔哩_bilibili 5.条件运算符

【C++面向对象】14. 命名空间

文章目录 【 1. 命名空间的定义 】【 2. using 指令 】2.1 using 指定命名空间的全部2.2 using 指定命名空间的部分 【 3. 不连续的命名空间 】【 4. 嵌套的命名空间 】 问题的背景&#xff1a;假设这样一种情况&#xff0c;当一个班上有两个名叫 Zara 的学生时&#xff0c;为了…

YOLO改进系列之注意力机制(CoTAttention模型介绍)

简介 CoTAttention网络是一种用于多模态场景下的视觉问答&#xff08;Visual Question Answering&#xff0c;VQA&#xff09;任务的神经网络模型。它是在经典的注意力机制&#xff08;Attention Mechanism&#xff09;上进行了改进&#xff0c;能够自适应地对不同的视觉和语言…

黑客常用信息收集工具-02

信息收集是突破网络系统的第一步。黑客在进入目标主机之前,通常会使用一些专门的黑客工具对目标主机进行扫描,从扫描结果中分析这些计算机的弱点,从而确定进入目标主机的方法和手段。 接上文&#xff1a;黑客常用信息收集工具-01 tcpdump&#xff0c;tcpdump 可以抓所有层的数…

2013年11月10日 Go生态洞察:Go语言四周年回顾

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【源码系列】情侣游戏小程序系统开发飞行棋扫雷大冒险

系统介绍 情侣游戏小程序系统&#xff0c;为情侣们提供了一种全新的互动方式。通过专属的游戏体验、创新的游戏玩法、丰富的道具与场景、个性化定制以及实时互动与社交等功能&#xff0c;该系统让爱情在棋盘上飞舞&#xff0c;为情侣们带来了更多的乐趣和益处。随着技术的不断…

这款开源神器,让聚类算法从此变得简单易用

Scikit-Learn 以其提供的多个经过验证的聚类算法而著称。尽管如此&#xff0c;其中大多数都是参数化的&#xff0c;并需要设置集群的数量&#xff0c;这是聚类中最大的挑战之一。 通常&#xff0c;使用迭代方法来决定数据的最佳聚类数量&#xff0c;这意味着你需要多次进行聚类…

代码随想录算法训练营Day 53 || 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

1143.最长公共子序列 力扣题目链接 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删除任何…

SpringBoot 事务与AOP

目录 事务Spring事务管理 TransactionalSpring事务进阶-rollbackFor与propagation属性 AOP(面向切面编程)AOP入门案例实现-Aspect & AOP核心概念AOP进阶通知类型 Around、Before、After和PointCut抽取切入点表达式通知顺序 Order切入点表达式 execution(……)与annotation(…

redis运维(七)基础通用命令

一 基础通用命令 备注&#xff1a; 与具体数据类型无关Tab键 自动补全补充&#xff1a; redis 命令是不区分大小写 通用不到 10 个提升逼格的 redis 命令 后续&#xff1a; slowlog、rename-command、monitor、set ① help command 需求&#xff1a; 显示有关redis命令的…