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=(n−1)∗(ΣΣwij∗(xi−xj)2)/(2∗ΣΣwij∗(xi−xˉ)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∗(xi−xˉ)∗(xj−xˉ)/ΣΣwij∗(xi−xˉ)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=j∑nwijZj
其中,
Z
i
=
y
i
−
y
ˉ
Z_i=y_i-\bar{y}
Zi=yi−yˉ,
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∑(yi−yˉ)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个地区经济发展水平高,周边地区发展水平低 |
计算上述空间自相关指数的时候,往往需要用到卷积核,用于定义空间权重。
完整实现代码
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)