【问题标题】:Random Weighted Subgraphs随机加权子图
【发布时间】:2014-08-30 18:15:01
【问题描述】:

我正在处理跨语言语义地图,例如看到here 表示

我希望能够对此进行绘制并提取 n 个加权随机子图,其中权重由链接权重确定。也就是说,通过更高权重连接的节点将被优先选择用于随机子图。我用谷歌搜索是徒劳的,主要是获取有关创建具有特定子图属性的完全随机图的软件和论文。

盯着networkx 的文档并没有发现任何让我觉得可能有帮助的东西,但不幸的是,我是这个领域的涉足者,可能由于对术语的无知而遗漏了一些东西。

我正在寻找有关正确术语的建议(如果我遗漏了一些明显的东西),或者指向可以执行此任务的工具(甚至是另一种编程语言)的指针。

【问题讨论】:

  • 子图是什么意思?您想从图中删除随机的低权重边吗?或者您想删除仅由低权重边连接的顶点?您要删除多少条边?
  • 您可能没有找到太多东西,因为这可能是一项非常昂贵的操作,具体取决于您的要求。 n-vertex 图的子图呈指数级增长。
  • 我不想删除边,我想将图随机划分为 n 个部分,高权重的边更有可能最终出现在同一个子图中。
  • “对图形进行分区”是什么意思?您的意思是“创建不相交的顶点子集”还是“创建不相交的边子集”?您是否希望每个子集都具有相同数量的边/顶点?我不清楚我将如何查看图表并说“是的,这里有 5 块我将把它剪成。”标准是什么?
  • 我的意思是不相交的顶点子集。该不相交子集的成员之间的边完好无损,但在这些之外没有边。

标签: python graph networkx


【解决方案1】:

这是一个算法的粗略草图。

  1. 将图表转换为距离矩阵。
  2. 使用普通 Python random 函数随机选择一个单元格 (v_0)。
  3. 假设图形是无向的,抓取包含v_0 的列或行(它是对称的,所以它们是相同的)。
  4. 使用weighted choice function 从该行中抓取可能远离初始顶点的顶点。由于您的权重是顶点之间的距离,这仅意味着将行从链接的 sn-p 和picks = 1 输入到weighted_pick。设此顶点为v_1
  5. 将包含v_0 的行归零,这样它就不会被再次选中。
  6. 重复m/n 次,以v_1 作为新的起始顶点开始下一次迭代。将刚刚选择的顶点保存在子图中。
  7. 重复整个过程n 次以获得子图的完整列表。

这并不完全符合您的要求 - 因为它选择长路径而不是重边缘 - 但这很容易解决。如果v_1v_2 之间没有任何边,您可以调整距离矩阵,使d(v_1, v_2) = 0。然后你只会得到连接的子图,这似乎是你想要的。

这应该在O(|V|) * t 时间运行,其中t 是您的加权选择函数的时间复杂度。不幸的是,numpy 没有说明searchsorted 的时间复杂度是多少,但我猜它会是O(log n),因为它正在插入一个排序列表。这会给你O(|V| log |V|) 整个事情的时间,这非常好。我猜你可以用大约 100 行 Python 来完成它,如果你的数据一开始就采用了很好的格式。

【讨论】:

  • 看,只要知道距离矩阵,这一切就更容易思考了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2010-09-08
相关资源
最近更新 更多