我正在尝试从一组国家中获取二维向量。我通过以下过程构建了我的图(见图):
- 每个节点代表一个国家
- 每条边代表两个国家(或节点)之间的陆地边界
我使用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 walksnode2vec = Node2Vec(graph, dimensions=2, walk_length=2, num_walks=50)# Learn embeddings model = node2vec.fit(window=1)
我希望得到共享陆地边界的国家彼此更接近。如下所示,西班牙离法国太远了。我只考虑了直接边界,这就是为什么walk-length = 2
。
你有适合我问题的任何想法吗?
回答:
如果我理解正确的话,Node2Vec
基于word2Vec,因此像word2vec一样,需要大量多样的训练数据,并且在学习每个实体的密集高维向量时显示有用结果。
仅仅7个“词”(国家节点)和仅仅10个由2个词组成的“句子”(边对)不太可能做任何有用的事情。(在word2vec中也是如此。)
这些国家实际上是球体上的区域。球体的表面可以映射到二维平面——因此,有“地图”。如果你只是想要每个国家的二维向量,反映它们相对的边界/距离关系,为什么不将你的二维坐标覆盖在一个足够大以显示所有国家的实际地图上,并将每个国家视为其“地理中心”点呢?
或者更正式地说:将每个国家地理中心的x经度/y纬度转换为你需要的任何原点/尺度。
如果这种简单、基于物理的方法不够充分,那么明确说明为什么它不够充分可能会建议下一步。那些对这些起始点进行增量转换以满足你想要的任何额外约束的东西可能是最佳解决方案。
例如,如果你尚未陈述的正式目标是“每个有实际边界的国家对应该比任何没有边界的国家对更接近”,那么你可以编写代码来检查这一点,列出任何偏差,并尝试“调整”这些偏差以更符合该约束。(这可能无法满足;我不确定。如果你添加了其他约束,比如“任何只隔一个国家的国家对应该比隔两个国家的国家对更接近”,同时满足所有这些可能会变得更难。)
最终,下一步可能取决于你为什么想要这些每个国家的向量。
另一个值得查看的东西可能是“力导向图”背后的算法。在那里,指定图的所需边/边长以及其他一些参数后,一个受物理启发的仿真将得出一些试图满足输入的二维布局。例如,来自JS世界的例子: