使用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訓練整合到一條實用的流水線中,為城市功能推斷任務提供了可複製的程式碼實現。