随机加权子图

时间:2014-08-30 18:15:01

标签: python graph networkx

我正在处理跨语言的语义地图,例如here

我希望能够得到这个图并提取 n 加权随机子图,其中权重由链接权重确定。也就是说,优先选择由较高权重连接的节点用于随机子图。我用google搜索是徒劳的,主要是获取有关创建具有特定子图属性的完全随机图的软件和论文。

盯着networkx的文档并没有给我带来任何可能有帮助的东西,但不幸的是我在这个领域喋喋不休,可能因术语无知而遗漏了一些东西。

我正在寻找关于正确术语的建议(如果我错过了一些明显的东西),或指向可以执行此任务的工具(甚至是其他编程语言)。

1 个答案:

答案 0 :(得分:1)

以下是算法的草图。

  1. 将图表转换为距离矩阵。
  2. 使用vanilla Python v_0函数随机选择一个单元格(random)。
  3. 假设图表是无向的,请抓住包含v_0的列或行(它是对称的,因此它们相同)。
  4. 使用weighted choice function抓取可能远离该行的初始顶点的顶点。由于您的权重是顶点之间的距离,这意味着从weighted_pick链接的代码段中将行放入picks = 1。设这个顶点为v_1
  5. 将包含v_0的行归零,以便永远不会再次挑选它。
  6. 重复m/n次,开始下一次迭代,v_1作为新的起始顶点。将您刚刚选择的顶点保存在子图中。
  7. 重复整个过程n次以获取子图的完整列表。
  8. 这并不是你要求的 - 因为它选择的是长路径而不是重边缘 - 但这很容易解决。如果d(v_1, v_2) = 0v_1之间没有任何边缘,您可以调整距离矩阵v_2。然后你只会得到连接的子图,这似乎是你想要的。

    这应该在O(|V|) * t时间运行,其中t是加权选择函数的时间复杂度。不幸的是,numpy并没有说出searchsorted的时间复杂度是什么,但我猜它会成为O(log n),因为它是&#39} ; s插入排序列表。那将为你提供O(|V| log |V|)时间,这是非常好的。我猜你可以用大约100行的Python来完成它,如果你的数据是一个很好的格式开始。