一、空间相关性概述
空间相关性(Spatial Correlation)是指在空间领域中存在的变量之间的相互关系。也可以理解为,当一个位置的值改变时,其周围位置的值也会受到影响。
空间相关性可以帮助我们发现空间领域内的规律性和特殊性,是地理信息系统(GIS)分析中至关重要的部分。
常见的空间相关性模型包括 Moran’s I、Geary’s C、Local Moran’s I、G统计量等。
二、Moran’s I
Moran’s I是一种用于测量空间领域中的全局空间相关性的指标。它的值可以在-1到1之间取值,其中-1表示完全的负相关,1表示完全的正相关,0表示不存在相关性。
Moran’s I的计算方法如下:
def moran_i(data, w):
data = np.array(data)
w = np.array(w.todense())
dn = np.sum(w)
data_mean = np.mean(data)
numerator = 0
denominator = 0
for i in range(data.shape[0]):
for j in range(data.shape[0]):
numerator += w[i, j] * (data[i] - data_mean) * (data[j] - data_mean)
denominator += (data[i] - data_mean) ** 2
return data.shape[0] * numerator / (denominator * dn)
三、Geary’s C
Geary’s C是另一种用于测量全局空间相关性的指标。它的值也可以在-1到1之间取值,其中-1表示完全的负相关,1表示完全的正相关,0表示不存在相关性。
Geary’s C的计算方法如下:
def geary_c(data, w):
data = np.array(data)
w = np.array(w.todense())
dn = np.sum(w)
data_mean = np.mean(data)
numerator = 0
denominator = 0
for i in range(data.shape[0]):
for j in range(data.shape[0]):
numerator += w[i, j] * (data[i] - data[j]) ** 2
denominator += (data[i] - data_mean) ** 2
return (data.shape[0] - 1) * numerator / (2 * denominator * dn)
四、Local Moran’s I
Local Moran’s I是一种用于测量局部空间自相关性的指标。它可以用来发现空间领域内的聚类现象。
Local Moran’s I的计算方法如下:
def local_moran_i(data, w):
data = np.array(data)
w = np.array(w.todense())
dn = np.sum(w)
data_mean = np.mean(data)
data_std = np.sqrt(np.var(data))
numerator = np.zeros(data.shape[0])
for i in range(data.shape[0]):
for j in range(data.shape[0]):
numerator[i] += w[i, j] * (data[i] - data_mean) * (data[j] - data_mean)
denominator = np.zeros(data.shape[0])
for i in range(data.shape[0]):
for j in range(data.shape[0]):
denominator[i] += w[i, j]
expected_value = denominator * numerator / dn
local_moran_i = (data - data_mean) ** 2
for i in range(data.shape[0]):
local_moran_i[i] = (data[i] - expected_value[i]) / (data_std * np.sqrt((dn - denominator[i]) / (dn - 1)))
return local_moran_i
五、空间插值
空间插值(Spatial Interpolation)技术是用于推算未知位置的值的一种方法。它在GIS领域中有着广泛的应用,比如在地形图制作、气候预测等方面。
常见的空间插值方法包括克里金插值、反距离权重插值等。
下面是一个简单的克里金插值的代码示例:
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF
from scipy.spatial.distance import cdist
def krige(data, coordinates, predict_coordinates):
kernel = RBF(0.1)
gp = GaussianProcessRegressor(kernel=kernel)
X = np.array(coordinates)
y = np.array(data).reshape(-1, 1)
X_pred = np.array(predict_coordinates)
d_mat = cdist(X, X, 'minkowski', p=2)
k_mat = kernel(d_mat)
gp.fit(X, y)
y_pred, std = gp.predict(X_pred, return_std=True)
return y_pred.flatten(), std.flatten()
