machine-learning - 陆地边界的基于图形的表示
问题描述
我正在尝试从一组国家/地区获取 2D 向量。我通过以下过程构建了我的图表(见图):
- 每个节点代表一个国家
- 每条边代表 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 个“单词”(国家节点)和每个 2 个单词(边缘对)的 10 个“句子”,因此不太可能做任何有用的事情。(它不会在 word2vec 中。)
这些国家实际上是一个球体上的区域。球体的表面可以映射到二维平面 - 因此,“映射”。如果您只想为每个国家/地区提供一个二维矢量,以反映它们的相对边界/距离关系,为什么不将您的二维坐标放在足够大以显示所有国家/地区的实际地图上,并将每个国家/地区视为它的 '地理中心点?
或更正式地说:将每个国家地理中心的 x 经度/y 纬度转换为您需要的任何原点/比例。
如果这种简单的、以物理为基础的方法不合适,那么明确说明它为什么不合适可能会建议下一步。对这些起点进行增量转换以满足您想要的任何额外限制的方法可能是最佳解决方案。
例如,如果您尚未声明的正式目标是“每个有实际边界的国家对应该比任何没有边界的国家对更接近”,那么您可以编写代码来检查,列出任何偏差,并尝试“轻推”偏差以更符合该约束。(这可能无法满足;我不确定。如果您添加其他约束条件,例如“任何国家对之间只有 1 个国家/地区应该比任何国家对之间只有 2 个国家/地区更接近”,同时满足它们可能会变得更难。)
最终,下一步可能取决于您想要这些按国家/地区向量的确切原因。
另一件值得检查的事情可能是“力导向图”背后的算法。在那里,在指定图形的所需边/边长和一些其他参数之后,受物理启发的模拟将到达一些试图满足输入的二维布局。参见 JS 世界的示例:
推荐阅读
- android - 系统完整性调用错误。907135701
- html - 使文本输入在引导程序中的卡片中采用 12 col
- python - Django 如何从模板中的查询集中获取查询集
- sql-server - 从查询中提取数据到变量
- flutter - Dart 中的嵌套 Map 操作
- amazon-web-services - 亚马逊短信发送状态和收到的短信
- javascript - 切换显示/隐藏元素,其中默认刷新为隐藏
- android - 没有构建器可用于构建“org.jetbrains.plugins.gradle.model.internal.DummyModel”类型的模型
- go - 停止 goroutine 在 bufio.NewScanner 上等待
- socat - 使用 Socat 监听多个端口(端口范围)