当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python NetworkX LFR_benchmark_graph用法及代码示例


本文简要介绍 networkx.generators.community.LFR_benchmark_graph 的用法。

用法:

LFR_benchmark_graph(n, tau1, tau2, mu, average_degree=None, min_degree=None, max_degree=None, min_community=None, max_community=None, tol=1e-07, max_iters=500, seed=None)

返回 LFR 基准图。

该算法进行如下:

  1. 找到具有幂律分布和最小值 min_degree 的度数序列,其具有近似平均度数 average_degree 。这是通过任一方式完成的

    1. 指定 min_degree 而不是 average_degree

    2. 指定 average_degree 而不是 min_degree ,在这种情况下将找到合适的最小度数。

    max_degree 也可以指定,否则将设置为 n 。每个节点 u 将有 mu mathrm{deg}(u) 边将其连接到其自身以外的社区中的节点,并有 (1 - mu) mathrm{deg}(u) 边将其连接到其自己社区中的节点。

  2. 根据 index tau2 的幂律分布生成社区大小。如果 min_communitymax_community 未指定,它们将分别被选择为 min_degreemax_degree 。生成社区大小,直到它们的大小之和等于 n

  3. 每个节点将被随机分配一个社区,条件是社区足够大,可以容纳节点的intra-community度,(1 - mu) mathrm{deg}(u),如步骤 2 所述。如果社区变得太大,将选择一个随机节点重新分配给一个新的社区,直到所有节点都被分配了一个社区。

  4. 然后每个节点 u 添加 (1 - mu) mathrm{deg}(u) intra-community 边和 mu mathrm{deg}(u) inter-community 边。

参数

nint

创建的图中的节点数。

tau1浮点数

创建图的度数分布的幂律 index 。该值必须严格大于一。

tau2浮点数

创建图中社区规模分布的幂律 index 。该值必须严格大于一。

mu浮点数

入射到每个节点的inter-community 边的分数。该值必须在区间 [0, 1] 内。

average_degree浮点数

创建的图中节点的所需平均度数。此值必须在区间 [0, n ] 内。必须指定其中一个和 min_degree,否则会引发 NetworkXError

min_degreeint

创建的图中节点的最小度数。此值必须在区间 [0, n ] 内。必须指定其中一个和 average_degree,否则会引发 NetworkXError

max_degreeint

创建的图中节点的最大度数。如果未指定,则设置为 n ,即图中的节点总数。

min_communityint

图中社区的最小规模。如果未指定,则设置为 min_degree

max_communityint

图中社区的最大大小。如果未指定,则设置为 n ,即图中的节点总数。

tol浮点数

比较浮点数时的容差,特别是比较平均度数值时。

max_itersint

尝试创建社区大小、度分布和社区隶属关系的最大迭代次数。

seed整数、random_state 或无(默认)

随机数生成状态的指示符。请参阅随机性。

返回

GNetworkX 图

根据指定参数生成的 LFR 基准图。

图中的每个节点都有一个节点属性'community',用于存储包含它的社区(即节点集)。

抛出

NetworkXError

如果任何参数不满足其上限和下限:

  • tau1tau2 必须严格大于 1。
  • mu 必须在 [0, 1] 中。
  • max_degree 必须在 {1, ..., n } 中。
  • min_communitymax_community 必须在 {0, ..., n } 中。

如果不完全指定average_degreemin_degree 之一。

如果未指定 min_degree 并且找不到合适的 min_degree

ExceededMaxIterations

如果在max_iters 迭代次数内无法创建有效的度数序列。

如果在max_iters 迭代次数内无法创建一组有效的社区大小。

如果在10 * n * max_iters 迭代次数内无法创建有效的社区分配。

注意

该算法与 [1] 中呈现的原始方式略有不同。

  1. 我们不是通过配置模型连接图形然后重新布线以匹配intra-community 和inter-community 度数,而是在最后明确地进行此布线,这应该是等效的。

  2. 作者网站 [2] 上发布的代码使用连续近似计算随机幂律分布变量及其平均值,而我们在这里使用离散分布,因为度数和社区大小都是离散的。

尽管作者将该算法说明为非常稳健,但在开发过程中的测试表明,稍微窄一些的参数集可能会成功生成图形。如果出现例外情况,提供了一些建议。

参考

1

“Benchmark graphs for testing community detection algorithms”, Andrea Lancichinetti, Santo Fortunato, and Filippo Radicchi, Phys. Rev. E 78, 046110 2008

2

https://www.santofortunato.net/resources

例子

基本用法:

>>> from networkx.generators.community import LFR_benchmark_graph
>>> n = 250
>>> tau1 = 3
>>> tau2 = 1.5
>>> mu = 0.1
>>> G = LFR_benchmark_graph(
...     n, tau1, tau2, mu, average_degree=5, min_community=20, seed=10
... )

继续上面的示例,您可以从图的节点属性中获取社区:

>>> communities = {frozenset(G.nodes[v]["community"]) for v in G}

相关用法


注:本文由纯净天空筛选整理自networkx.org大神的英文原创作品 networkx.generators.community.LFR_benchmark_graph。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。