生成具有一定程度分布的图?

我正在尝试生成一个具有小世界属性的随机图(显示幂律分布)。我刚开始使用networkx包,发现它提供了多种随机图生成方法。有人可以告诉我是否可以生成一个图形,其中给定节点的度遵循伽马分布(在R中或使用python的networkx包)?

回答:

如果要使用配置模型,则应在NetworkX中使用以下方法:

import random 

import networkx as nx

z=[int(random.gammavariate(alpha=9.0,beta=2.0)) for i in range(100)]

G=nx.configuration_model(z)

您可能需要根据伽马分布中的参数调整序列z的平均值。同样z不需要是图形的(您将获得多图),但是它确实需要一个偶数和,因此您可能必须尝试一些随机序列(或加1)…

关于configuration_model的NetworkX文档注释提供了另一个示例,参考以及如何删除平行边和自循环:

Notes

-----

As described by Newman [1]_.

A non-graphical degree sequence (not realizable by some simple

graph) is allowed since this function returns graphs with self

loops and parallel edges. An exception is raised if the degree

sequence does not have an even sum.

This configuration model construction process can lead to

duplicate edges and loops. You can remove the self-loops and

parallel edges (see below) which will likely result in a graph

that doesn't have the exact degree sequence specified. This

"finite-size effect" decreases as the size of the graph increases.

References

----------

.. [1] M.E.J. Newman, "The structure and function

of complex networks", SIAM REVIEW 45-2, pp 167-256, 2003.

Examples

--------

>>> from networkx.utils import powerlaw_sequence

>>> z=nx.create_degree_sequence(100,powerlaw_sequence)

>>> G=nx.configuration_model(z)

To remove parallel edges:

>>> G=nx.Graph(G)

To remove self loops:

>>> G.remove_edges_from(G.selfloop_edges())

这是一个类似于http://networkx.lanl.gov/examples/drawing/degree_histogram.html上的示例的示例,该示例绘制的图形包括最大连接组件的图形布局:

#!/usr/bin/env python

import random

import matplotlib.pyplot as plt

import networkx as nx

def seq(n):

return [random.gammavariate(alpha=2.0,beta=1.0) for i in range(100)]

z=nx.create_degree_sequence(100,seq)

nx.is_valid_degree_sequence(z)

G=nx.configuration_model(z) # configuration model

degree_sequence=sorted(nx.degree(G).values(),reverse=True) # degree sequence

print "Degree sequence", degree_sequence

dmax=max(degree_sequence)

plt.hist(degree_sequence,bins=dmax)

plt.title("Degree histogram")

plt.ylabel("count")

plt.xlabel("degree")

# draw graph in inset

plt.axes([0.45,0.45,0.45,0.45])

Gcc=nx.connected_component_subgraphs(G)[0]

pos=nx.spring_layout(Gcc)

plt.axis('off')

nx.draw_networkx_nodes(Gcc,pos,node_size=20)

nx.draw_networkx_edges(Gcc,pos,alpha=0.4)

plt.savefig("degree_histogram.png")

plt.show()

以上是 生成具有一定程度分布的图? 的全部内容, 来源链接: utcz.com/qa/399249.html

回到顶部