基于面向对象的空间自相关指数,即插即用!Moran‘s I,局部莫兰指数,Geary‘s C指数,附完整可行使用案例

Geary’s C

Geary’s C(也称为Geary’s coefficient)是一种用于衡量空间自相关性的统计指标,它可以用来评估地理数据中的空间聚集或离散程度。Geary’s指数的计算公式如下:
G = ( n − 1 ) ∗ ( Σ Σ w i j ∗ ( x i − x j ) 2 ) / ( 2 ∗ Σ Σ w i j ∗ ( x i − x ˉ ) 2 ) G = (n - 1) * (ΣΣwij * (xi - xj)²) / (2 * ΣΣwij * (xi - x̄)²) G=(n1)(ΣΣwij(xixj)2)/(2ΣΣwij(xixˉ)2)
其中,G 是Geary’s C指数,n 是样本数量,wij 是地理邻接权重,xi 是第i个样本的值,xj 是第j个样本的值,x̄ 是所有样本的平均值。

Geary’s C指数的取值范围是0到2之间。当G接近于1时,表示数据呈现随机分布;当G接近于0时,表示数据呈现正相关的空间聚集;当G接近于2时,表示数据呈现负相关的空间离散。

需要注意的是,Geary’s C指数的计算需要考虑地理邻接权重,这是用来表示地理空间上的相邻关系的权重矩阵。具体的权重计算方法可以根据具体的研究问题和数据特点进行选择和定义。


全局莫兰指数

莫兰指数(Moran’s I)是一种用于测量空间自相关性的统计指标,它可以用来评估地理数据中的空间聚集或离散程度。莫兰指数的计算公式如下:
I = ( n / W ) ∗ Σ Σ w i j ∗ ( x i − x ˉ ) ∗ ( x j − x ˉ ) / Σ Σ w i j ∗ ( x i − x ˉ ) 2 I = (n / W) * ΣΣwij * (xi - x̄) * (xj - x̄) / ΣΣwij * (xi - x̄)² I=(n/W)ΣΣwij(xixˉ)(xjxˉ)/ΣΣwij(xixˉ)2
其中,I 是莫兰指数,n 是样本数量,W 是地理邻接权重的总和,wij 是地理邻接权重,xi 是第i个样本的值,xj 是第j个样本的值,x̄ 是所有样本的平均值。

莫兰指数的取值范围是-1到1之间。当I接近于1时,表示数据呈现正相关的空间聚集;当I接近于-1时,表示数据呈现负相关的空间聚集;当I接近于0时,表示数据呈现随机分布。

需要注意的是,莫兰指数的计算同样需要考虑地理邻接权重,这是用来表示地理空间上的相邻关系的权重矩阵。具体的权重计算方法可以根据具体的研究问题和数据特点进行选择和定义。


局部莫兰指数

局部莫兰指数(Local Moran’s I)是一种用于衡量空间自相关性的统计指标,它可以帮助我们了解地理空间上的局部聚集模式。与全局莫兰指数不同,局部莫兰指数可以针对每个地理单元(如点、区域等)计算其自身的聚集程度。
I i = Z i S 2 ∑ i ≠ j n w i j Z j I_i=\frac{Z_i}{S^2}\sum_{i\neq j}^n w_{ij}Z_j Ii=S2Zii=jnwijZj
其中, Z i = y i − y ˉ Z_i=y_i-\bar{y} Zi=yiyˉ w i j w_{ij} wij表示权重, S 2 = 1 n ∑ ( y i − y ˉ ) 2 S^2=\frac{1}{n}\sum(y_i-\bar y)^2 S2=n1(yiyˉ)2

局部莫兰指数的取值范围在-1到1之间,具有以下含义:

  • 正值表示该地理单元与其邻近地理单元之间存在正的空间自相关性,即该地理单元与其邻近地理单元的值相似程度较高,可能形成聚集模式。
  • 负值表示该地理单元与其邻近地理单元之间存在负的空间自相关性,即该地理单元与其邻近地理单元的值相似程度较低,可能形成分散模式。
  • 零值表示该地理单元与其邻近地理单元之间不存在明显的空间自相关性,即该地理单元的值与其邻近地理单元的值无关。

局部莫兰指数可以用来识别空间上的局部聚集模式,帮助我们理解地理空间上的异质性和空间分布特征。它在空间分析、地理信息系统等领域具有广泛的应用。

Z i Zi Zi ∑ i ≠ j n w i j Z j \sum_{i\neq j}^n w_{ij}Z_j i=jnwijZj I i I_i Ii含义
>0>0>0第i个地区经济发展水平高,周边地区发展水平高
<0<0>0第i个地区经济发展水平低,周边地区发展水平低
<0>0<0第i个地区经济发展水平低,周边地区发展水平高
>0<0<0第i个地区经济发展水平高,周边地区发展水平低

计算上述空间自相关指数的时候,往往需要用到卷积核,用于定义空间权重。

在这里插入图片描述

Rook卷积核(1);BiShop卷积核(2);Queen卷积核(3)

完整实现代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

class SpatialAutocorrelation:

    def __init__(self,data,val=1,conv=0):
        '''

        :param data: ndArray
        '''
        self.val=val

        # 定义卷积核
        # dirs[0]:Queen dirs[1]:Rook dirs[2]:Bishop
        self.dirs=[[[1, 0], [-1, 0], [0, 1], [0, -1], [1, 1], [1, -1], [-1, 1], [-1, -1]],
              [[1, 0], [0, 1], [-1, 0], [0, -1]],
              [[1, 1], [1, -1], [-1, 1], [-1, -1]]]

        # 配置数据
        self.ResetData(data)
        # 配置权重矩阵
        self.ResetConv(conv)

    def ResetData(self,data):
        self.data = data
        self.n, self.m = data.shape
        self.mean = self.data.mean()

    def ResetConv(self,conv):
        # 需要为每个数据定义一个权重矩阵
        self.weight=[[] for _ in range(self.n*self.m)] # 开辟权重矩阵
        self.Weight_Sum=0 # 总权重
        for i in range(self.n):
            for j in range(self.m):
                loc=i*self.m+j # 定位一维数组位置
                for dx,dy in self.dirs[conv]:
                    x,y=i+dx,j+dy
                    if 0<=x<self.n and 0<=y<self.m:
                        self.weight[loc].append([self.data[x][y],self.val]) # wight[loc]存放的是loc点对应周边点的值以及权重
                        self.Weight_Sum+=1

    def getMoranIndex(self):
        up_,down_=0,0
        for i in range(self.n):
            for j in range(self.m):
                loc=i*self.m+j
                for d,v in self.weight[loc]:
                    up_+=v*(d-self.mean)*(self.data[i][j]-self.mean)
                down_+=(self.data[i][j]-self.mean)**2
        return (self.n*self.m)/(self.Weight_Sum)*(up_/down_)

    def getGearyC(self):
        up_,down_=0,0
        for i in range(self.n):
            for j in range(self.m):
                loc=i*self.m+j
                for d,v in self.weight[loc]:
                    up_+=v*(self.data[i][j]-d)**2
                down_+=(self.data[i][j]-self.mean)**2
        return (self.m*self.n-1)/(self.Weight_Sum*2)*(up_/down_)

    def getLocalMoranI(self):
        # 输出结果如果想要转为图像,需要做区间转换
        newD=np.zeros_like(self.data)
        s=((self.data-self.mean)**2).sum()/(self.n*self.m)
        for i in range(self.n):
            for j in range(self.m):
                loc=i*self.m+j
                z=0
                for d,v in self.weight[loc]:
                    z+=(d-self.mean)*v
                newD[i][j]=z*(self.data[i][j]-self.mean)/s
        return newD

    def localM2Img(self,D):
        D=(D-D.min())/(D.max()-D.min())*255
        return D.astype(np.uint8)

    def getLocalMoranI_and_plot(self):
        newD=self.getLocalMoranI()
        D=self.localM2Img(newD)
        plt.figure(figsize=(16,8))
        plt.imshow(D,cmap='gray')
        plt.show()
        return newD




if __name__ == '__main__':
    data=pd.read_excel(r"TabsRes/data.xlsx",index_col=0)

    # 随机图像的结果
    sa=SpatialAutocorrelation(data.values,conv=2) # Rook Conv
    print("全局莫兰指数: ",sa.getMoranIndex())
    print("局部莫兰指数: ",sa.getLocalMoranI_and_plot())
    print("Geary'S C指数: ",sa.getGearyC())

    # 更换数据
    sa.ResetData(pd.read_excel(r'TabsRes/hamster.xlsx',index_col=0).values)
    print("全局莫兰指数: ",sa.getMoranIndex())
    print("局部莫兰指数: ",sa.getLocalMoranI_and_plot())
    print("Geary'S C指数: ",sa.getGearyC())

    # 更换卷积核
    sa.ResetConv(0)
    print("全局莫兰指数: ",sa.getMoranIndex())
    print("局部莫兰指数: ",sa.getLocalMoranI_and_plot())
    print("Geary'S C指数: ",sa.getGearyC())

第一个数据是随机噪声,其局部墨兰指数图如下:

在这里插入图片描述

程序输出的结果为:

全局莫兰指数:  -0.00025654962271123334
Geary'S C指数:  1.000255597302246

可以看到,全局基本上不存在空间自相关性。

而第二张图片是一只仓鼠,原始图像为:

在这里插入图片描述

得到的结果为:
在这里插入图片描述

全局莫兰指数:  0.9954479543319323
Geary'S C指数:  0.00441478062600421

可以看到,图片存在很强的空间自相关性,这也是一些图像处理算法能够实现的原因。
附:关于如何将图片转为Excel?

import cv2 as cv
path=r"TabsRes\data_MorRanI.xlsx"
if not os.path.exists(path):
    img = cv.imread(r"ImgRes\Screenshot_1.png", 0)
    d=pd.DataFrame(img)
    d.to_excel(path)

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

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

相关文章

云计算企业私有云平台建设方案PPT

导读&#xff1a;原文《云计算企业私有云平台建设方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 喜欢文章&#xff0c;您可以点赞评论转发本文&#xff0c;…

华为云Stack的学习(二)

三、华为云Stack产品组件 FunsionSphere CPS 提供云平台的基础管理和业务资源&#xff08;包括计算资源和存储资源&#xff09;。采用物理服务器方式部署在管理节点。可以做集群的配置&#xff0c;扩容和运维管理。 Service OM 提供云服务的运维能力&#xff0c;采用虚拟化方…

PMAC与Modbus主站进行Modbus Tcp通讯

PMAC与Modbus主站进行Modbus Tcp通讯 创建modbus通讯参数 在项目的PMAC Script Language\Global Includes下创建一个名为00_Modbus_Para.pmh的pmh文件。 Modbus[0].Config.ServerPort 0 Modbus[0].Config.ConnectTimeOut 6000 Modbus[0].Config.SendRecvTimeOut 0 Modbu…

阿里云通义千问开源第二波!大规模视觉语言模型Qwen-VL上线魔搭社区

通义千问开源第二波&#xff01;8月25日消息&#xff0c;阿里云推出大规模视觉语言模型Qwen-VL&#xff0c;一步到位、直接开源。Qwen-VL以通义千问70亿参数模型Qwen-7B为基座语言模型研发&#xff0c;支持图文输入&#xff0c;具备多模态信息理解能力。在主流的多模态任务评测…

第七周第七天学习总结 | MySQL入门及练习学习第二天

实操练习&#xff1a; 1.创建一个名为 cesh的数据库 2.在这个数据库内 创建一个名为 xinxi 的表要求该表可以包含&#xff1a;编号&#xff0c;姓名&#xff0c;备注的信息 3.为 ceshi 表 添加数据 4.为xinxi 表的数据设置中文别名 5.查询 在 xinxi 表中编号 为2 的全部…

UNIX网络编程卷一 学习笔记 第二十八章 原始套接字

原始套接字提供普通的TCP和UDP套接字不具备的以下3个能力&#xff1a; 1.有了原始套接字&#xff0c;进程可以读写ICMPv4、IGMPv4、ICMPv6等分组。例如&#xff0c;ping程序就使用原始套接字发送ICMP回射请求并接收ICMP回射应答。多播路由守护程序mrouted也使用原始套接字发送和…

Apache Celeborn 让 Spark 和 Flink 更快更稳更弹性

摘要&#xff1a;本文整理自阿里云/数据湖 Spark 引擎负责人周克勇&#xff08;一锤&#xff09;在 Streaming Lakehouse Meetup 的分享。内容主要分为五个部分&#xff1a; Apache Celeborn 的背景Apache Celeborn——快Apache Celeborn——稳Apache Celeborn——弹Evaluation…

MySQL binlog的几种日志录入格式以及区别

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

【java安全】JNDI注入概述

文章目录 【java安全】JNDI注入概述什么是JNDI&#xff1f;JDNI的结构InitialContext - 上下文Reference - 引用 JNDI注入JNDI & RMI利用版本&#xff1a;JNDI注入使用Reference 【java安全】JNDI注入概述 什么是JNDI&#xff1f; JNDI(Java Naming and Directory Interf…

SpringBoot初级开发--加入Log4j进行日志管理打印(6)

日志记录在整个java工程开发中占着很重要的比重&#xff0c;因为很多问题的排查需要通过日志分析才能确认。在SpringBoot中我用得最多的就是log4j这个日志框架。接下来我们具体配置log4j. log4j定义了8个级别的log&#xff08;除去OFF和ALL&#xff0c;可以说分为6个级别&#…

CentOS 7 Nacos 设置开机自动重启

一、说明 Nacos如果是手动启动的话&#xff0c;在服务器宕机或者重启后&#xff0c;没有自动运行&#xff0c;影响很多业务系统&#xff0c;需要每次手动执行命令 startup.sh -m standalone&#xff0c;才能启动 Nacos 服务&#xff0c;不能像docker服务一样&#xff0c;使用 …

Redis 执行 RDB 快照期间,主进程可以正常处理命令吗?

执行了 save 命令&#xff0c;会在主进程生成 RDB 文件&#xff0c;由于和执行操作命令在同一个线程&#xff0c;所以如果写入 RDB 文件的时间太长&#xff0c;会阻塞主进程。 执行 bgsave 过程中&#xff0c;由于是交给子进程来构建 RDB 文件&#xff0c;主进程还是可以继续工…

将Spring boot 项目部署到tomcat服务艰难

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z X Y Z

Linux操作系统--shell编程(正则表达式)

1..正则表达式概述 正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中,grep,sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配。 2.常规的匹配操作 3.…

基于SpringBoot的员工(人事)管理系统

基于SpringBoot的员工&#xff08;人事&#xff09;管理系统 一、系统介绍二、功能展示三.其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;基于SPringBoot的员工管理系统 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&#xff1a;BootS…

微服务dubbo和nexus

微服务是一种软件开发架构风格&#xff0c;它将一个应用程序拆分成一组小型、独立的服务&#xff0c;每个服务都可以独立部署、管理和扩展。每个服务都可以通过轻量级的通信机制&#xff08;通常是 HTTP/REST 或消息队列&#xff09;相互通信。微服务架构追求高内聚、低耦合&am…

Flutter可执行屏幕动画的AnimateView

1.让动画使用起来就像使用widget。 2.可自定义动画。 3.内置平移动画。 演示&#xff1a; 代码: import dart:math; import package:flutter/cupertino.dart;class AnimateView extends StatefulWidget {///子Widgetfinal Widget child;///动画自定义final IAnimate? anim…

【JS真好玩】自动打字机效果

目录 一、前言二、布局分析三、总体样式四、中间部分五、底部5.1 div5.2 label5.3 input 六、JS让它动起来6.1定时器6.2 字符串处理6.2.1 slice6.2.2 splice6.3.3 split 七、总结 一、前言 大家好&#xff0c;今天实现一个自动打字机效果&#xff0c;旨在实现一些网上很小的de…

Java 大厂面试 —— 常见集合篇 List HashMap 红黑树

23Java面试专题 八股文面试全套真题&#xff08;含大厂高频面试真题&#xff09;多线程_软工菜鸡的博客-CSDN博客 常见集合篇-01-集合面试题-课程介绍 02-算法复杂度分析 2 List相关面试题 2.1 数组 2.1.1 数组概述 数组&#xff08;Array&#xff09;是一种用连续的内存空…

【算法专题突破】双指针 - 盛最多水的容器(4)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;Leetcode&#xff09; 这道题目也不难理解&#xff0c; 两边的柱子的盛水量是根据短的那边的柱子决定的&#xff0c; 而盛水量…