在networkx中模拟图模型
Posted
技术标签:
【中文标题】在networkx中模拟图模型【英文标题】:Simulate graph model in networkx 【发布时间】:2021-12-01 03:02:51 【问题描述】:我在 networkx 中有一个非常具体的图形问题:
我的有向图有两种不同类型的节点(我将它们称为 I 和 T),并且仅在 IT 之间使用边构建> 和 TI(所以 T 不与其他 T 连接,与 I 相同)
现在我需要模拟一个具有相同行为的新图:我有一定数量的 I 和 T 并且 IT 之间的边以一定的概率存在(也适用于 TI,但概率不同,我们称它们为 p_i 和 p_o)。
所以我的问题是我不能用 for 循环来迭代 I 和 T 因为两者都很大(我现在正在分析的数据是 5000 T 和 5000 I 但可能会增加到每个 300000),而我的电脑无法处理。
在这种情况下创建图表的最佳方法是什么?
【问题讨论】:
你能澄清一下边缘存在的概率吗? 通过查看第一个图(即真实图)的数据,我获得了边在可能数量上的比例。我使用这个比例作为模拟图的概率。不知道这样是否更清楚 “相当大”有多大?请给一个号码。此外,您的图称为 二分图。我建议尝试networkx.org/documentation/networkx-1.9/reference/generated/… “所以我的问题是我无法使用 for 循环进行迭代……因为两者都很大,我的电脑无法处理。”这很奇怪,似乎是你真正的问题。当你尝试时究竟会发生什么? (我经常使用迭代超过一百万个节点的图的代码) Networkx 与其他图形库相比速度较慢,而且您的问题似乎与性能有关 - 您是否考虑过例如网络吗?参见例如这个基准timlrx.com/blog/benchmark-of-popular-graph-network-packages-v2 【参考方案1】:这是@ravenspoint 通过他的评论让我达到的解决方案。
对于T=5000
和I=5000
,它通过在I
中执行for loops
和在T
中执行一个以及使用numpy
中的np.random.binomial(1, pi, nI)
和np.random.binomial(1, po, nO)
来工作,其中nO
和@987654 @ 是实际图中O
和I
的长度,如果这些数组为1,则创建边。
如果po=pi
(在我的示例中发生)也可以使用@Stef 解决方案,您可以使用nx.bipartite.random_graph(countadd, countt, p, seed=None,directed=True)
【讨论】:
以上是关于在networkx中模拟图模型的主要内容,如果未能解决你的问题,请参考以下文章