mcpField
G
gnnwr

gnnwr

github.com/steadfastasart数据与数据库7357 次安装6 周前更新
代码仓库

关于 gnnwr

GNNWR 是用于地理加权回归的 Python 工具,面向分析空间系数变化的数据工作者。它提供空间与时空模型、稀疏近邻距离处理,以及诊断和地图可视化功能。

主要功能

  1. 01神经网络地理加权空间回归
  2. 02支持时空回归模型 GTNNWR
  3. 03KNN 稀疏距离矩阵
  4. 04R²、RMSE 等模型诊断
  5. 05交互式系数与预测地图

适用场景

  1. 01分析空间变化的回归系数
  2. 02拟合包含时间坐标的时空模型
  3. 03处理大型空间回归数据集
  4. 04绘制系数和预测结果地图

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/steadfastasart/geoscience-skills --skill gnnwr

安装后在 Claude Code 中输入/gnnwr确认已加载。

附带文件references/diagnostics.mdreferences/visualization.md

详细介绍

GNNWR - 地理神经网络加权回归

快速参考

from gnnwr import models, datasets, utils
import pandas as pd

data = pd.read_csv("data.csv")

train, val, test = datasets.init_dataset(
    data=data, test_ratio=0.2, valid_ratio=0.1,
    x_column=["x1", "x2", "x3"], y_column=["y"],
    spatial_column=["lon", "lat"],  # REQUIRED: geographic coords
    batch_size=32, process_fn="minmax_scale"
)

model = models.GNNWR(train, val, test, use_gpu=True, optimizer="Adam", start_lr=0.01)
model.run(max_epoch=200, early_stop=30)

result = model.reg_result(only_return=True)  # DataFrame: coef_x1, coef_x2, ..., Pred_y
print(model.result())                         # R², AIC, RMSE, F-tests summary
时空模型(GTNNWR)
train, val, test = datasets.init_dataset(
    data=data, ...,
    spatial_column=["lon", "lat"],
    temp_column=["year", "month"],  # add temporal coords
    use_model="gtnnwr"
)
model = models.GTNNWR(train, val, test, use_gpu=True)
大规模数据(N > 10k)——KNN 模式
train, val, test = datasets.init_dataset(
    data=data, ..., knn_k=500  # only k nearest neighbor distances
)
# Memory: N=100k full=55GB → knn_k=2000 only 763MB

关键类

类用途
models.GNNWR通过神经网络进行地理加权的空间回归
models.GTNNWR结合时间和空间加权的时空回归
datasets.init_dataset数据拆分、归一化、距离矩阵构建
utils.Visualize内置 folium 交互式系数和预测地图

核心操作

init_dataset 参数
参数默认值说明
knn_kNoneKNN 稀疏距离;None=完整矩阵
process_fn"minmax_scale"或 "standard_scale"
spatial_funBasicDistance欧几里得距离;或 ManhattanDistance
ReferenceNone"train"、"train_val" 或自定义 DataFrame
sample_seed42确保结果可复现
模型超参数
参数推荐值说明
optimizer"Adam"也可以是:SGD、AdamW、Adagrad、RMSprop
start_lr0.01–0.1关键调优参数
drop_out0.20.0–0.5
dense_layersNone(自动)自动生成从 input_dim 到 n_coef 的 2 的幂次序列
early_stop20–50耐心值;-1=禁用
batch_normTrue稳定训练过程
use_olsTrue使用 OLS 初始化输出层
诊断
diag = model._test_diagnosis
diag.R2()           # always available
diag.RMSE()         # always available
diag.AIC()          # needs lite=False (auto for N<10k)
diag.AICc()         # corrected AIC
diag.F1_Global()    # GNNWR vs OLS significance
diag.F2_Global()    # spatial weight significance
diag.F3_Local()     # per-variable significance → (dict1, dict2)

lite=True(N>10k 时自动启用):仅计算 R²/RMSE;跳过帽子矩阵诊断。

可视化模式

Folium 交互式地图(内置)
viz = utils.Visualize(model, lon_lat_columns=["lon", "lat"], zoom=5)
m1 = viz.display_dataset(name="all", y_column="y")
m1.save("dataset_map.html")

for col in [c for c in result.columns if c.startswith("coef_")]:
    m = viz.coefs_heatmap(data_column=col, steps=20)
    m.save(f"map_{col}.html")
Matplotlib 静态地图(适用于出版物)
import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 3, figsize=(18, 12))
coef_cols = [c for c in result.columns if c.startswith("coef_")]

for ax, col in zip(axes.flat, coef_cols):
    sc = ax.scatter(
        result["lon"], result["lat"],
        c=result[col], cmap="RdYlBu_r", s=5, alpha=0.8,
        vmin=result[col].quantile(0.02), vmax=result[col].quantile(0.98)
    )
    ax.set_title(col.replace("coef_", "β_"), fontsize=14)
    plt.colorbar(sc, ax=ax, shrink=0.8)

plt.suptitle("Spatially Varying Coefficients (GNNWR)", fontsize=16)
plt.tight_layout()
plt.savefig("coefficients_map.png", dpi=300, bbox_inches="tight")
GeoPandas + Contextily(含底图)
import geopandas as gpd
import contextily as ctx

gdf = gpd.GeoDataFrame(result, geometry=gpd.points_from_xy(result.lon, result.lat), crs="EPSG:4326")
gdf_web = gdf.to_crs(epsg=3857)

fig, ax = plt.subplots(figsize=(12, 10))
gdf_web.plot(column="coef_x1", ax=ax, cmap="RdYlBu_r", legend=True,
             markersize=5, alpha=0.7, legend_kwds={"shrink": 0.6})
ctx.add_basemap(ax, source=ctx.providers.CartoDB.Positron)
ax.set_title("β_x1 Spatial Variation")
ax.set_axis_off()
plt.savefig("coef_basemap.png", dpi=300, bbox_inches="tight")

何时使用及替代方案

使用场景工具原因
空间变系数(神经网络)GNNWR非线性加权、可扩展、系数地图
经典地理加权回归mgwr / GWR4传统的带宽加权,理论成熟
空间插值(无协变量)verde / scikit-gstat无需回归即可进行网格化 / 克里金插值
全局回归基线statsmodels / scikit-learn不假设存在空间非平稳性
时空变系数GTNNWR在 GNNWR 基础上扩展了时间维度
大规模空间回归(N > 100k)GNNWR + knn_k稀疏距离矩阵,诊断复杂度为 O(n·k²)
地统计模拟geostatspy / SGeMS随机实现、量化不确定性

选择 GNNWR 的情况:需要具有空间变动回归系数和基于神经网络的地理加权,尤其是经典 GWR 在计算上难以处理的大型数据集。

选择经典 GWR 的情况:需要成熟的推断统计、基于带宽的加权,以及更简单的模型解释。

选择 verde/克里金的情况:需要在没有解释变量的情况下进行空间插值——仅根据观测值进行空间预测。

常见工作流

空间回归分析
  • EDA:检查空间分布、特征相关性和 OLS 基线
  • 数据拆分:使用合适的比例和 sample_seed=42 调用 init_dataset
  • 训练:从默认值开始,调优 start_lr 和 early_stop
  • 诊断:R²、RMSE、F1(GNNWR 与 OLS 对比)、F2(空间权重显著性)
  • 可视化:系数地图、残差空间分布、预测值与观测值对比
  • 解释:系数在哪些区域变化最大?哪些变量表现出最强的非平稳性?(F3_Local)
  • 报告:模型摘要表 + 系数地图 + 诊断统计量

常见问题

问题解决方案
模型退化为全局回归忘记设置 spatial_column — 务必传入
距离矩阵导致内存溢出N > 10k 且未设置 knn_k;请使用 knn_k=500–2000
训练期间损失爆炸start_lr 过高;请从 0.01 开始
过拟合未设置 early_stop;务必设置为 20–50
系数的尺度不正确使用 reg_result() 获取反归一化后的预测结果
GTNNWR 表现得像 GNNWR缺少 temp_column;系统会静默回退

参考资料

  • 诊断 — DIAGNOSIS 方法、F 检验、残差分析
  • 可视化 — 详细的可视化模式和出版级图表

评论

支持 Markdown