使用city2graph、OSMnx和PyTorch Geometric进行城市功能推断的空间图神经网络编码实现
本教程介绍了使用city2graph构建端到端空间图学习流水线的方法,用于城市功能推断。它从OpenStreetMap收集兴趣点(POI)和街道网络数据,设计了合成数据回退机制以确保可靠性。接着,工程化空间特征,构建多种近邻图家族(如KNN、Delaunay、Gabriel等),并比较它们在表示同一城市环境时的差异。然后,同时构建异质图和同质图,转换为PyTorch Geometric格式,并训练GraphSAGE模型根据空间结构预测POI类别。整个工作流整合了地理空间数据处理、图构建和GNN训练,提供了一个实用的实现范例。
在本教程中,我们将构建一个完整的端到端空间图学习流水线,用于城市功能推断,该流水线基于city2graph库实现。我们首先从OpenStreetMap收集真实的城市兴趣点(POI)数据和街道网络信息。为了确保工作流在任何情况下都能可靠运行,我们还设计了一个合成数据回退机制:如果OSM请求失败,会自动生成一个聚类的合成POI数据集。具体来说,我们选取东京涩谷地区(坐标35.6595, 139.7005)作为实验区域,在半径1100米范围内通过OSMnx库获取四种类别的兴趣点:餐饮(包括餐厅、咖啡馆、快餐、酒吧和酒馆)、零售(所有商店)、教育(学校、大学、学院、幼儿园、图书馆)和健康(医院、诊所、药房、医生、牙医)。同时下载步行街道网络。获取的数据集如果超过700个点,则随机抽样至700点以控制计算量。所有数据被投影到适当的UTM坐标系以确保距离计算准确。
接下来进行空间特征工程。对于每个POI,我们提取其投影坐标(cx, cy),计算局部密度(在150米半径内的邻居数量),并估计到最近街道段的距离(通过空间连接)。这些特征被标准化处理。然后我们构建多种近邻图家族来连接这些POI,包括KNN(k=8)、Delaunay三角剖分、Gabriel图、相对邻域图(RNG)、欧几里得最小生成树(EMST)和Waxman图。通过比较每种图的边数和平均度,我们可视化了几种代表性拓扑(KNN、Delaunay、EMST)并观察它们连接同一组POI的方式差异。
在构建图结构方面,我们同时采用两种方式。首先是异质图:将POI按类别分为不同节点类型(food、retail、education、health),然后使用桥接边(k=3的KNN)连接不同类型之间的邻近节点,最后转换为PyTorch Geometric的HeteroData格式。其次是同质图:基于KNN(k=8)构建无向图,并为每个节点添加度特征,与之前的空间特征一起构成节点特征向量。图数据被转换为PyG的Data对象。
我们定义了一个两层GraphSAGE模型:第一层SAGEConv将输入特征映射到64维隐藏层,经过ReLU激活和dropout(概率0.3)后,第二层SAGEConv再次映射到64维,最后通过线性层输出类别数。使用Adam优化器(学习率0.01,权重衰减5e-4)进行训练。数据集按6:2:2的比例划分为训练集、验证集和测试集。训练共200个epoch,每20个epoch在验证集上评估准确率和宏F1,并保存最佳模型。最终在测试集上报告性能指标。
此外,教程还包括了节点嵌入的可视化(通过PCA降维)以及异质GNN的前向传播演示。整个过程完整地展示了如何将地理空间数据处理、图构建和GNN训练整合到一条实用的流水线中,为城市功能推断任务提供了可复制的代码实现。