基于MATLAB的变异函数计算与经验半方差图绘制
ztj100 2025-01-03 20:49 20 浏览 0 评论
??在前期的头条文章《插值、变异函数、克里格、线性无偏最优…地学计算概念及公式推导》中,我们详细介绍了地学计算的几个基本概念,并对其数学推导公式加以了梳理。接下来,我将通过几篇新的头条文章,对地学计算相关的代码、操作加以实践与详细讲解。本文便是第一篇——基于MATLAB的空间数据变异函数计算与经验半方差图绘制。
??另一方面,由于上述文章所涉及的相关理论概念较为抽象,往往需要结合实践才可以更好理解,因此大家可以将上述文章与本篇及后期的其它地学计算文章一同来看,可以更好理解相关理论的含义。
??其中,由于本文所用的数据并不是我的,因此遗憾不能将数据一并展示给大家;但是依据本文的思想与对代码的详细解释,大家用自己的数据,可以将空间数据变异函数计算与经验半方差图绘制的全部过程与分析方法加以完整重现。
1 数据处理
1.1 数据读取
??本文中,我的初始数据为某区域658个土壤采样点的空间位置(X与Y,单位为米)、pH值、有机质含量与全氮含量。这些数据均存储于“data.xls”文件中;而后期操作多于MATLAB软件中进行。因此,首先需将源数据选择性地导入MATLAB软件中。
??利用MATLAB软件中xlsread函数可以实现这一功能。具体代码附于“1.3 正态分布检验及转换”处。
1.2 异常数据剔除
??得到的采样点数据由于采样记录、实验室测试等过程,可能具有一定误差,从而出现个别异常值。选用“平均值加标准差法”对这些异常数据加以筛选、剔除。
??分别利用“平均值加标准差法”中“2S”与“3S”方法加以处理,发现“2S”方法处理效果相对后者较好,故后续实验取“2S”方法处理结果继续进行。
??其中,“2S”方法是指将数值大于或小于其平均值±2倍标准差的部分视作异常值,“3S”方法则是指将数值大于或小于其平均值±3倍标准差的部分视作异常值。
??得到异常值后,将其从658个个采样点中剔除;剩余的采样点数据继续后续操作。
??本部分具体代码附于“1.3 正态分布检验及转换”处。
1.3 正态分布检验及转换
??计算变异函数需建立在初始数据符合正态分布的假设之上;而采样点数据并不一定符合正态分布。因此,我们需要对原始数据加以正态分布检验。
??一般地,正态分布检验可以通过数值检验与直方图、QQ图等图像加以直观判断。本文综合采取以上两种数值、图像检验方法,共同判断正态分布特性。
??针对数值检验方法,我在一开始准备选择采用Kolmogorov-Smirnov检验方法;但由于了解到,这一方法仅仅适用于标准正态检验,因此随后改用Lilliefors检验。
??Kolmogorov-Smirnov检验通过样本的经验分布函数与给定分布函数的比较,推断该样本是否来自给定分布函数的总体;当其用于正态性检验时只能做标准正态检验。
??Lilliefors检验则将上述Kolmogorov-Smirnov检验改进,其可用于一般的正态分布检验。
??QQ图(Quantile Quantile Plot)是一种散点图,其横坐标表示某一样本数据的分位数,纵坐标则表示另一样本数据的分位数;横坐标与纵坐标组成的散点图代表同一个累计概率所对应的分位数。因此,QQ图具有这样的特点:
??y=x
??针对这一直线,若散点图中各点均在直线附近分布,则说明两个样本为同等分布;因此,若将横坐标(纵坐标)表示为一个标准正态分布样本的分位数,则散点图中各点均在上述直线附近分布可以说明,纵坐标(横坐标)表示的样本符合或基本近似符合正态分布。本文采用将横坐标表示为正态分布的方式。
??此外,PP图(Probability Probability Plot)同样可以用于正态分布的检验。PP图横坐标表示某一样本数据的累积概率,纵坐标则表示另一样本数据的累积概率;其根据变量的累积概率对应于所指定的理论分布累积概率并绘制的散点图,用于直观地检测样本数据是否符合某一概率分布。和QQ图类似,如果被检验的数据符合所指定的分布,则其各点均在上述直线附近分布。若将横坐标(纵坐标)表示为一个标准正态分布样本的分位数,则散点图中各点均在直线附近分布可以说明,纵坐标(横坐标)表示的样本符合或基本近似符合正态分布。
??三种土壤属性,我选择首先以pH数值为例进行操作。通过上述数值检验、图像检验方法,检验得到剔除异常值后的原始pH数值数据并不符合正态分布这一结论。因此,尝试对原数据加以对数、开平方等转换处理;随后发现,原始pH值开平方数据的正态分布特征虽然依旧无法通过较为严格的Lilliefors检验,但其直方图、QQ图的图像检验结果较为接近正态分布,并较之前二者更加明显。故后续取开平方处理结果继续进行。
??值得一提的是,本文后半部分得到pH值开平方数据的实验变异函数及其散点图后,在对其余两种空间属性数据(即有机质含量与全氮含量)进行同样的操作时,发现全氮含量数据在经过“2S”方法剔除异常值后,其原始形式的数据是可以通过Lilliefors检验的,且其直方图、QQ图分布特点十分接近正态分布。
??我亦准备尝试对空间属性数据进行反正弦转换。但随后发现,已有三种属性数值的原始数据并不严格分布在-1至1的区间内,因此并未对其进行反正弦方式的转换。
??经过上述检验、转换处理过后的图像检验结果如下所示。
??以上部分代码如下:
1clc;clear;
2info=xlsread('data.xls');
3oPH=info(:,3);
4oOM=info(:,4);
5oTN=info(:,5);
6
7mPH=mean(oPH);
8sPH=std(oPH);
9num2=find(oPH>(mPH+2*sPH)|oPH<(mPH-2*sPH));
10num3=find(oPH>(mPH+3*sPH)|oPH<(mPH-3*sPH));
11PH=oPH;
12for i=1:length(num2)
13 n=num2(i,1);
14 PH(n,:)=[0];
15end
16PH(all(PH==0,2),:)=[];
17
18%KSTest(PH,0.05)
19H1=lillietest(PH);
20
21for i=1:length(PH)
22 lPH(i,:)=log(PH(i,:));
23end
24
25H2=lillietest(lPH);
26
27for i=1:length(PH)
28 sqPH(i,:)=(PH(i,:))^0.5;
29end
30
31H3=lillietest(sqPH);
32
33% for i=1:length(PH)
34% arcPH(i,:)=asin(PH(i,:));
35% end
36%
37% H4=lillietest(arcPH);
38
39subplot(2,3,1),histogram(PH),title("Distribution Histogram of pH");
40subplot(2,3,2),histogram(lPH),title("Distribution Histogram of Natural Logarithm of pH");
41subplot(2,3,3),histogram(sqPH),title("Distributio n Histogram of Square Root of pH");
42subplot(2,3,4),qqplot(PH),title("Quantile Quantile Plot of pH");
43subplot(2,3,5),qqplot(lPH),title("Quantile Quantile Plot of Natural Logarithm of pH");
44subplot(2,3,6),qqplot(sqPH),title("Quantile Quantile Plot of Square Root of pH");
2 距离量算
??接下来,需要对筛选出的采样点相互之间的距离加以量算。这是一个复杂的过程,需要借助循环语句。
??本部分具体代码如下。
1poX=info(:,1);
2poY=info(:,2);
3dis=zeros(length(PH),length(PH));
4for i=1:length(PH)
5 for j=i+1:length(PH)
6 dis(i,j)=sqrt((poX(i,1)-poX(j,1))^2+(poY(i,1)-poY(j,1))^2);
7 end
8end
3 距离分组
??计算得到全部采样点相互之间的距离后,我们需要依据一定的范围划定原则,对距离数值加以分组。
??距离分组首先需要确定步长。经过实验发现,若将步长选取过大会导致得到的散点图精度较低,而若步长选取过小则可能会使得每组点对总数量较少。因此,这里取步长为500米;其次确定最大滞后距,这里以全部采样点间最大距离的一半为其值。随后计算各组对应的滞后级别、各组上下界范围等。
??本部分具体代码附于本文“4 平均距离、半方差计算及其绘图”处。
4 平均距离、半方差计算及其绘图
??分别计算各个组内对应的点对个数、点对间距离总和以及点对间属性值差值总和等。随后,依据上述参数,最终求出点对间距离平均值以及点对间属性值差值平均值。
??依据各组对应点对间距离平均值为横轴,各组对应点对间属性值差值平均值为纵轴,绘制出经验半方差图。
??本部分及上述部分具体代码如下。
1madi=max(max(dis));
2midi=min(min(dis(dis>0)));
3radi=madi-midi;
4ste=500;
5clnu=floor((madi/2)/ste)+1;
6ponu=zeros(clnu,1);
7todi=ponu;
8todiav=todi;
9diff=ponu;
10diffav=diff;
11for k=1:clnu
12 midite=ste*(k-1);
13 madite=ste*k;
14 for i=1:length(sqPH)
15 for j=i+1:length(sqPH)
16 if dis(i,j)>midite && dis(i,j)<=madite
17 ponu(k,1)=ponu(k,1)+1;
18 todi(k,1)=todi(k,1)+dis(i,j); diff(k,1)=diff(k,1)+(sqPH(i)-sqPH(j))^2;
19 end
20 end
21 end
22 todiav(k,1)=todi(k,1)/ponu(k,1);
23 diffav(k,1)=diff(k,1)/ponu(k,1)/2;
24end
25plot(todiav(:,1),diffav(:,1)),title("Empirical Semivariogram of Square Root of pH");
26xlabel("Separation Distance (Metre)"),ylabel("Standardized Semivariance");
5 绘图结果
??通过上述过程,得到pH值开平方后的实验变异函数折线图及散点图。
??可以看到,pH值开平方后的实验变异函数较符合于有基台值的球状模型或指数模型。函数数值在距离为0至8000米区间内快速上升,在距离为8000米后数值上升放缓,变程为25000米左右;即其“先快速上升,再增速减缓,后趋于平稳”的图像整体趋势较为明显。但其数值整体表现较低——块金常数为0.004左右,而基台值仅为0.013左右。为验证数值正确性,同样对有机质、全氮进行上述全程操作。
??得到二者对应变异函数折线图与散点图。
??由以上三组、共计六幅的pH值开平方、有机质与全氮对应的实验变异函数折线图与散点图可知,不同数值对应实验变异函数数值的数量级亦会有所不同;但其整体“先快速上升,再增速减缓,后趋于平稳”的图像整体趋势是十分一致的。
??此外,如上文所提到的,针对三种空间属性数据(pH值、有机质含量与全氮含量)中最符合正态分布,亦是三种属性数据各三种(原始值、取对数与开平方)、共九种数据状态中唯一一个通过Lilliefors正态分布检验的数值——全氮含量经过异常值剔除后的原始值,将其正态分布的图像检验结果特展示如下。
至此,我们就完成了全部的操作、分析过程~
- 上一篇:OpenCV 边缘检测常见算法
- 下一篇:RSA 复杂题目 ?
相关推荐
- 如何将数据仓库迁移到阿里云 AnalyticDB for PostgreSQL
-
阿里云AnalyticDBforPostgreSQL(以下简称ADBPG,即原HybridDBforPostgreSQL)为基于PostgreSQL内核的MPP架构的实时数据仓库服务,可以...
- Python数据分析:探索性分析
-
写在前面如果你忘记了前面的文章,可以看看加深印象:Python数据处理...
- C++基础语法梳理:算法丨十大排序算法(二)
-
本期是C++基础语法分享的第十六节,今天给大家来梳理一下十大排序算法后五个!归并排序...
- C 语言的标准库有哪些
-
C语言的标准库并不是一个单一的实体,而是由一系列头文件(headerfiles)组成的集合。每个头文件声明了一组相关的函数、宏、类型和常量。程序员通过在代码中使用#include<...
- [深度学习] ncnn安装和调用基础教程
-
1介绍ncnn是腾讯开发的一个为手机端极致优化的高性能神经网络前向计算框架,无第三方依赖,跨平台,但是通常都需要protobuf和opencv。ncnn目前已在腾讯多款应用中使用,如QQ,Qzon...
- 用rust实现经典的冒泡排序和快速排序
-
1.假设待排序数组如下letmutarr=[5,3,8,4,2,7,1];...
- ncnn+PPYOLOv2首次结合!全网最详细代码解读来了
-
编辑:好困LRS【新智元导读】今天给大家安利一个宝藏仓库miemiedetection,该仓库集合了PPYOLO、PPYOLOv2、PPYOLOE三个算法pytorch实现三合一,其中的PPYOL...
- C++特性使用建议
-
1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...
- Qt4/5升级到Qt6吐血经验总结V202308
-
00:直观总结增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理。把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能。把一些Qt5中兼容Qt4的方法废...
- 到底什么是C++11新特性,请看下文
-
C++11是一个比较大的更新,引入了很多新特性,以下是对这些特性的详细解释,帮助您快速理解C++11的内容1.自动类型推导(auto和decltype)...
- 掌握C++11这些特性,代码简洁性、安全性和性能轻松跃升!
-
C++11(又称C++0x)是C++编程语言的一次重大更新,引入了许多新特性,显著提升了代码简洁性、安全性和性能。以下是主要特性的分类介绍及示例:一、核心语言特性1.自动类型推导(auto)编译器自...
- 经典算法——凸包算法
-
凸包算法(ConvexHull)一、概念与问题描述凸包是指在平面上给定一组点,找到包含这些点的最小面积或最小周长的凸多边形。这个多边形没有任何内凹部分,即从一个多边形内的任意一点画一条线到多边形边界...
- 一起学习c++11——c++11中的新增的容器
-
c++11新增的容器1:array当时的初衷是希望提供一个在栈上分配的,定长数组,而且可以使用stl中的模板算法。array的用法如下:#include<string>#includ...
- C++ 编程中的一些最佳实践
-
1.遵循代码简洁原则尽量避免冗余代码,通过模块化设计、清晰的命名和良好的结构,让代码更易于阅读和维护...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)