本文主要介绍了如何初步构建一个地理图神经网络,构建具体的网络结构敬请期待后续的更新!!
1.准备节点和边
1.1准备节点
本文使用的是街景图像(在采集前期已经在GIS中生成了采样点,我采用的是语义分割数据)
这里你可是使用任何数据,只要能映射到点中。(说白了GCN就是将不同的内容通过张量进行连接)注:由于一条街道对应多个街景图像(这里取均值),本文构建的是单层网络,多层可以参考论文 http://dx.doi.org/10.1016/j.isprsjprs.2023.03.008
看一下,我的道路有5075条边,要保证无路多少数据,最后都要映射到这些边上面(每条边意味着每个点,所以一共是5075个点)
1.2准备边
准备边的方式很多,但最重要的是起点&终点两个参数。你可以使用空间统计工具--空间关系模型--生成空间权重矩阵 进行边的准备。或者参考这一篇帖子↓空间相关分析(一) 空间权重矩阵_皖渝的博客-CSDN博客 之前的博客分享了各行政区shp文件的制作方法,在拿到shp文件后就可以进行空间相关分析啦。今天来介绍一下空间相关分析的第一步——空间权重矩阵的创建。目录定义介绍Geoda创建空间权重矩阵Arcgis创建空间权重矩阵定义介绍 &n...https://blog.csdn.net/shine4869/article/details/105786062
① 使用生成空间权重矩阵寻找道路的邻接内容(你可以尝试不同的邻接方式)
② 使用这个工具将权重矩阵转化为表的形式(最后的数据结构如图所示)
③ 将这些数据准备好放在csv文件中(方便下一步操作!!)
Edge_Knear.csv ↓,点与点之间的连接是有距离的,这里将点与点之间的距离之和作为边的权重。我的文件中一共是28543条边(根据你使用的邻接方法,边的数量也不同)
Node.csv ↓,注意这个文件中的id序号一定是5075个,因为对应着每个点。
2.构建图(DGL库)
2.1构建点(建议先构建点)
先把点特征load进来,转化成tensor
# 点特征
embeddings=pd.read_csv('.....csv').values[:,1:].T #图嵌入后的点特征
x = torch.tensor(embeddings, dtype=torch.float)
接着创建一个空的DGL图,把节点利用G.ndata 方法添加节点。
# 创建一个空的 DGL 图
G = dgl.DGLGraph()
# 添加节点并设置节点特征
num_nodes = len(x)
node_features = x
G.add_nodes(num_nodes)
G.ndata['features'] = node_features
G
打印出图的初步结构,这一步没有边的特征。(注:这里用的是别的数据所以点数量是5458)
如果你有多个点特征,你可以将他们转为字典的形式更新
g.ndata.update({'club' : club, 'club_onehot' : club_onehot})
2.2构建边
# load 边数据
edge_data = pd.read_csv('....csv')
print(edge_data)
# 将数据转化为numpy或者tensor都可以
src = edge_data['src'].to_numpy()
dst = edge_data['dst'].to_numpy()
# 使用 add_edges() 方法向图形对象中添加边缘
G.add_edges(src, dst)
# 添加边的权重信息
edge_weight = torch.tensor(edge_data['Weight'].to_numpy())
# 使用edata添加边的权重
g.edata['weight'] = edge_weight
2.3可视化
可以使用networkx包进行可视化,需要注意的是,当你的图特别大的时候可能要花很长时间才能可视化出来。
# 先可视化一下这张图
import networkx as nx
import matplotlib.pyplot as plt
nx_G = g.to_networkx() #先把图转成network的格式
pos = nx.spring_layout(nx_G)
nx.draw(nx_G.to_undirected(), pos, with_labels=True, node_size=200) #把图转化成无向图
plt.show()
更多自学内容可以参考以下:
B站子豪兄的图神经网络讲解:【斯坦福CS224W图机器学习、图神经网络、知识图谱【同济子豪兄】】 https://www.bilibili.com/video/BV1pR4y1S7GA/?share_source=copy_web&vd_source=b1540cf6d9c18239cab6743ed8bd05b2
李沐大佬的讲解:【零基础多图详解图神经网络(GNN/GCN)【论文精读】】 https://www.bilibili.com/video/BV1iT4y1d7zP/?share_source=copy_web&vd_source=b1540cf6d9c18239cab6743ed8bd05b2
关于GeoAI的论文,可以参考以下学者的研究:
https://www.researchgate.net/profile/Yan-Zhang-532
https://www.researchgate.net/profile/Pengyuan-Liu-3
还有distill上面的文章:A Gentle Introduction to Graph Neural Networks