python 普通克里金(Kriging)法的实现

 更新时间:2019年12月19日 10:50:23   作者:山人青冥  
这篇文章主要介绍了python 普通克里金(Kriging)法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

克里金法时一种用于空间插值的地学统计方法。

克里金法用半变异测定空间要素,要素即自相关要素。

半变异公式为:

在这里插入图片描述

其中γ(h) 是已知点 xixj 的半变异,***h***表示这两个点之间的距离,z是属性值。

假设不存在漂移,普通克里金法重点考虑空间相关因素,并用拟合的半变异直接进行插值。

估算某测量点z值的通用方程为:

在这里插入图片描述

式中,z0是待估计值,zx是已知点x的值,Wx是每个已知点关联的权重,s是用于估计的已知点数目。
权重可以由一组矩阵方程得到。

在这里插入图片描述

在这里插入图片描述

此程序对半变异进行拟合时采用的时最简单的正比例函数拟合

数据为csv格式

保存格式如下:

第一行为第一个点以此类推

最后一行是待求点坐标,其中z为未知值,暂且假设为0

在这里插入图片描述

代码如下:

import numpy as np
from math import*
from numpy.linalg import *
h_data=np.loadtxt(open('高程点数据.csv'),delimiter=",",skiprows=0)
print('原始数据如下(x,y,z):\n未知点高程初值设为0\n',h_data)
def dis(p1,p2):
 a=pow((pow((p1[0]-p2[0]),2)+pow((p1[1]-p2[1]),2)),0.5)
 return a
def rh(z1,z2):
 r=1/2*pow((z1[2]-z2[2]),2)
 return r
def proportional(x,y):
 xx,xy=0,0
 for i in range(len(x)):
  xx+=pow(x[i],2)
  xy+=x[i]*y[i]
 k=xy/xx
 return k
r=[];pp=[];p=[];
for i in range(len(h_data)):
 pp.append(h_data[i])
for i in range(len(pp)):
 for j in range(len(pp)):
  p.append(dis(pp[i],pp[j]))
  r.append(rh(pp[i],pp[j]))
r=np.array(r).reshape(len(h_data),len(h_data))
r=np.delete(r,len(h_data)-1,axis =0)
r=np.delete(r,len(h_data)-1,axis =1)

h=np.array(p).reshape(len(h_data),len(h_data))
h=np.delete(h,len(h_data)-1,axis =0)
oh=h[:,len(h_data)-1]
h=np.delete(h,len(h_data)-1,axis =1)

hh=np.triu(h,0)
rr=np.triu(r,0)
r0=[];h0=[];
for i in range(len(h_data)-1):
 for j in range(len(h_data)-1):
  if hh[i][j] !=0:
   a=h[i][j]
   h0.append(a)
  if rr[i][j] !=0:
   a=rr[i][j]
   r0.append(a)
k=proportional(h0,r0)
hnew=h*k
a2=np.ones((1,len(h_data)-1))
a1=np.ones((len(h_data)-1,1))
a1=np.r_[a1,[[0]]]
hnew=np.r_[hnew,a2]
hnew=np.c_[hnew,a1]
print('半方差联立矩阵:\n',hnew)
oh=np.array(k*oh)
oh=np.r_[oh,[1]]
w=np.dot(inv(hnew),oh)
print('权阵运算结果:\n',w)
z0,s2=0,0
for i in range(len(h_data)-1):
 z0=w[i]*h_data[i][2]+z0
 s2=w[i]*oh[i]+s2
s2=s2+w[len(h_data)-1]
print('未知点高程值为:\n',z0)
print('半变异值为:\n',pow(s2,0.5))
input()

运算结果

在这里插入图片描述

python初学,为了完成作业写了个小程序来帮助计算,因为初学知识有限,有很多地方写的很复杂,可以优化的地方很多。 还望读者谅解,欢迎斧正谢谢!

参考文献:
【1】(美)张康聪 著;陈健飞等译. 地理信息系统导论(第三版). 北京:清华大学出版社, 2009.04.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python日期时间模块arrow的具体使用

    Python日期时间模块arrow的具体使用

    Python中有很多时间和日期处理的库,有time、datetime等,本文主要介绍了一下arrow,arrow是一个专门处理时间和日期的轻量级Python库,感兴趣的可以了解一下
    2021-09-09
  • Scrapy抓取京东商品、豆瓣电影及代码分享

    Scrapy抓取京东商品、豆瓣电影及代码分享

    Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
    2017-11-11
  • Numpy np.array()函数使用方法指南

    Numpy np.array()函数使用方法指南

    numpy是一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于大型、多维数据上执行数值计算,下面这篇文章主要给大家介绍了关于Numpy np.array()函数使用方法指南的相关资料,需要的朋友可以参考下
    2022-12-12
  • Python中的字符串查找操作方法总结

    Python中的字符串查找操作方法总结

    这里我们来整理一下Python中的字符串查找操作方法总结,除了基本的find()方法外,还会讲解到朴素匹配算法和KMP算法的使用:
    2016-06-06
  • windows及linux环境下永久修改pip镜像源的方法

    windows及linux环境下永久修改pip镜像源的方法

    不知道有没有人跟我一样,在刚接触Linux时被系统更新源问题搞得晕头转向,不同的Linux更新源配置也是不一样的,另外由于默认安装时的源大都是外国的更新源,速度相对国内会慢很多,接下来本文主要介绍在windows和linux两种系统环境中更新系统源的方法。
    2016-11-11
  • Python 树表查找(二叉排序树、平衡二叉树)

    Python 树表查找(二叉排序树、平衡二叉树)

    本文并不会深入讲解树数据结构的基本的概念,仅是站在使用的角度说清楚动态查询。阅读此文之前,请预备一些树的基础知识。
    2023-01-01
  • python之while循环、无限循环用法及说明

    python之while循环、无限循环用法及说明

    这篇文章主要介绍了python之while循环、无限循环用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • PyAutoGUI图形用户界面自动化的超详细教程

    PyAutoGUI图形用户界面自动化的超详细教程

    PyautoGUI是一个纯Python的自动化工具,能实现用程序自动控制鼠标和键盘操作,下面这篇文章主要给大家介绍了关于PyAutoGUI图形用户界面自动化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Python3用tkinter和PIL实现看图工具

    Python3用tkinter和PIL实现看图工具

    这篇文章给大家分享了Python3用tkinter和PIL实现看图工具的详细实例代码,有兴趣的朋友参考学习下。
    2018-06-06
  • Python面向对象程序设计之类的定义与继承简单示例

    Python面向对象程序设计之类的定义与继承简单示例

    这篇文章主要介绍了Python面向对象程序设计之类的定义与继承,结合完整实例形式分析了Python面向对象程序设计中类的定义、调用、继承及相关操作注意事项,需要的朋友可以参考下
    2019-03-03

最新评论