基于图形的陆地边界表示
Graph-based representation for land borders
我正在尝试从一组国家/地区获取二维矢量。我通过以下过程构建了我的图表(见图):
- 每个节点代表一个国家
- 每条边代表2个国家(或节点)之间的陆地边界
我正在使用 Node2vec 库来管理它,但结果不相关。
countries = [
"France", "Andorra",
"Spain", "Italy", "Switzerland",
"Germany", "Portugal"
]
crossing_borders = [
("France", "Andorra"),
("France", "Spain"),
("Andorra", "Spain"),
("France", "Italy"),
("France", "Switzerland"),
("Italy", "Switzerland"),
("Switzerland", "Italy"),
("Switzerland", "Germany"),
("France", "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)
我想让共享陆地边界的国家彼此靠近。如下图,西班牙离法国太远了。我只考虑了直接边界,这就是为什么 walk-length = 2
.
你有什么想法可以解决我的问题吗?
如果我理解正确,Node2Vec
是基于word2Vec的,因此像word2vec一样,需要大量不同的训练数据,并且在学习每个实体的密集高维向量时显示有用的结果。
只有 7 个 'words'(国家节点),每个节点只有 10 'sentences' 个 2 个词(边对),因此不太可能做任何有用的事情。 (它不会在 word2vec 中。)
这些国家实际上是一个球体上的区域。球体的表面可以映射到二维平面 - 因此,'maps'。如果您只想要每个国家/地区的二维矢量,反映它们的相对 border/distance 关系,为什么不将您的二维坐标放在一张大到足以显示所有国家/地区的实际地图上,并将每个国家/地区视为它的 'geographical center' 点?
或者更正式地说:将每个国家/地区的地理中心的 x-longitude/y-latitude 翻译成您需要的任何 origin-point/scale。
如果这种简单的、以物理为基础的方法不充分,那么明确说明它不充分的原因可能会建议采取后续步骤。对这些起点进行增量转换以满足您想要的任何 额外 约束可能是最好的解决方案。
例如,如果您尚未说明的正式目标是“每个具有实际边界的国家对应该比任何没有边界的国家对更近”,那么您可以编写代码来检查这一点,列出任何偏差,并尝试 'nudge' 偏差更符合该约束。 (它可能无法满足;我不确定。如果你添加其他约束,比如“任何只有 1 个国家的国家对应该比任何有 2 个国家的国家对更接近”,同时满足它们可能会变得更难。)
最终,接下来的步骤可能完全取决于为什么您需要这些针对每个国家/地区的向量。
另一件值得检查的事情可能是 'force-directed graphs' 背后的算法。在那里,在指定图形的所需 edges/edge-lengths 和一些其他参数后,受物理启发的模拟将到达一些试图满足输入的二维布局。参见来自 JS 世界的示例:
我正在尝试从一组国家/地区获取二维矢量。我通过以下过程构建了我的图表(见图):
- 每个节点代表一个国家
- 每条边代表2个国家(或节点)之间的陆地边界
我正在使用 Node2vec 库来管理它,但结果不相关。
countries = [
"France", "Andorra",
"Spain", "Italy", "Switzerland",
"Germany", "Portugal"
]
crossing_borders = [
("France", "Andorra"),
("France", "Spain"),
("Andorra", "Spain"),
("France", "Italy"),
("France", "Switzerland"),
("Italy", "Switzerland"),
("Switzerland", "Italy"),
("Switzerland", "Germany"),
("France", "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)
我想让共享陆地边界的国家彼此靠近。如下图,西班牙离法国太远了。我只考虑了直接边界,这就是为什么 walk-length = 2
.
你有什么想法可以解决我的问题吗?
如果我理解正确,Node2Vec
是基于word2Vec的,因此像word2vec一样,需要大量不同的训练数据,并且在学习每个实体的密集高维向量时显示有用的结果。
只有 7 个 'words'(国家节点),每个节点只有 10 'sentences' 个 2 个词(边对),因此不太可能做任何有用的事情。 (它不会在 word2vec 中。)
这些国家实际上是一个球体上的区域。球体的表面可以映射到二维平面 - 因此,'maps'。如果您只想要每个国家/地区的二维矢量,反映它们的相对 border/distance 关系,为什么不将您的二维坐标放在一张大到足以显示所有国家/地区的实际地图上,并将每个国家/地区视为它的 'geographical center' 点?
或者更正式地说:将每个国家/地区的地理中心的 x-longitude/y-latitude 翻译成您需要的任何 origin-point/scale。
如果这种简单的、以物理为基础的方法不充分,那么明确说明它不充分的原因可能会建议采取后续步骤。对这些起点进行增量转换以满足您想要的任何 额外 约束可能是最好的解决方案。
例如,如果您尚未说明的正式目标是“每个具有实际边界的国家对应该比任何没有边界的国家对更近”,那么您可以编写代码来检查这一点,列出任何偏差,并尝试 'nudge' 偏差更符合该约束。 (它可能无法满足;我不确定。如果你添加其他约束,比如“任何只有 1 个国家的国家对应该比任何有 2 个国家的国家对更接近”,同时满足它们可能会变得更难。)
最终,接下来的步骤可能完全取决于为什么您需要这些针对每个国家/地区的向量。
另一件值得检查的事情可能是 'force-directed graphs' 背后的算法。在那里,在指定图形的所需 edges/edge-lengths 和一些其他参数后,受物理启发的模拟将到达一些试图满足输入的二维布局。参见来自 JS 世界的示例: