基于图的陆地边界表示

问题描述

我正在尝试从一组国家/地区获取二维向量。我通过以下过程构建了我的图表(见图):

  • 每个节点代表一个国家
  • 每条边代表两个国家(或节点)之间的陆地边界

Graph representation of land borders

我使用 Node2vec 库来管理它,但结果不相关。

countries = [
    "France","Andorra","Spain","Italy","Switzerland","Germany","Portugal"
]

crossing_borders = [
    ("France","Andorra"),("France","Spain"),("Andorra","Italy"),"Switzerland"),("Italy",("Switzerland","Germany"),("Spain","Portugal")
]

graph.add_nodes_from(countries)
graph.add_edges_from(crossing_borders)

# Generate walks
node2vec = Node2Vec(graph,dimensions=2,walk_length=2,num_walks=50)

# Learn embeddings 
model = node2vec.fit(window=1)

enter image description here

我想让共享陆地边界的国家彼此靠近。如下,西班牙离法国太远了。我只考虑了直接边界,这就是为什么 walk-length = 2

你有什么想法适合我的问题吗?

解决方法

如果我理解正确,Node2Vec 是基于 word2Vec,因此与 word2vec 一样,需要大量不同的训练数据,并且在学习每个实体的密集高维向量时显示出有用的结果。

仅仅 7 个“单词”(国家节点)和 10 个“句子”,每个 2 个单词(边缘对)因此不太可能做任何有用的事情。 (它不会在 word2vec 中。)

这些国家实际上是一个球体上的区域。球体的表面可以映射到二维平面 - 因此,“映射”。如果您只想要每个国家/地区的 2-D 向量,以反映它们的相对边界/距离关系,为什么不将您的 2-D 坐标放在足以显示所有国家/地区的实际地图上,并将每个国家/地区视为其 '地理中心点?

或更正式地说:将每个国家/地区地理中心的 x 经度/y 纬度转换为您需要的任何原点/比例尺。

如果这种简单的、以物理为基础的方法是不够的,那么明确说明它为什么不合适可能会建议下一步。对这些起点进行渐进式转换以满足您想要的任何额外约束可能是最佳解决方案。

例如,如果您尚未声明的正式目标是“每个有实际边界的国家/地区对应该比没有边界的任何国家/地区对更近”,那么您可以编写代码来检查这一点,列出任何偏差,并尝试“轻推”偏差以使其更符合该约束。 (它可能无法满足;我不确定。如果你添加了其他约束,比如“任何一个国家之间只有 1 个国家的国家对应该比他们之间有 2 个国家的任何国家对更接近”,同时满足它们可能会变得更难。)

最终,接下来的步骤可能取决于您为什么需要这些每个国家/地区的向量。

另一件值得一试的事情可能是“力导向图”背后的算法。在那里,在指定图形所需的边/边长度和一些其他参数后,受物理启发的模拟将到达一些试图满足输入的二维布局。参见 JS 世界的例子:

https://github.com/d3/d3-force