当前文章将使用Python库Networkx处理围绕复杂网络的概念。它是一个Python语言软件包,用于创建,操纵和研究复杂网络的结构,动力学和函数。使用NetworkX,您可以以标准和非标准数据格式加载和存储网络,生成多种类型的随机和经典网络,分析网络结构,构建网络模型,设计新的网络算法,绘制网络等等。
本文将讨论使用优先附件模型生成随机无标度网络的算法。对这种模型感兴趣的原因可以追溯到1990年代,当时Albert Lazlo Barabasi和Reka Albert提出了开创性的研究方法,描述了该模型,随后是世界范围内的无标度网络。他们认为,包括互联网,万维网,引文网络和某些社交网络在内的几种自然的和人为的系统被认为是近似无标度的网络。
无标度网络是其度分布至少渐近遵循幂定律的网络。也就是说,网络中与其他节点有k个连接的节点的分数P(k)会随着k的大值而变化,
在哪里是一个参数,其值通常在2 < <3,尽管有时它可能位于这些界限之外,并且c是比例常数。
巴拉巴西-阿尔伯特(Barabási-Albert)模型是几个提出的可生成无标度网络的模型之一。它包含两个重要的一般概念:增长和优先依恋。增长和优惠依恋在现实网络中广泛存在。增长意味着网络中的节点数量会随着时间增加。
优先连接意味着节点之间的连接越紧密,则接收新链接的可能性就越大。具有较高程度的节点具有更强的能力来捕获添加到网络的链接。直觉上,如果我们从连接人的社交网络的角度考虑,可以理解优先依恋。在这里,从A到B的链接意味着人A“知道”或“认识”人B。重链接的节点表示具有很多关系的知名人士。当新人进入社区时,他/她更有可能结识较易见的人之一,而不是相对的陌生人。提出BA模型是通过假设在万维网中,新页面优先链接到集线器(即Google等知名网站),而不是鲜为人知的页面。如果有人通过随机选择现有链接来选择要链接的新页面,则选择特定页面的可能性将与其程度成正比。
下图将描述具有50个节点的BA模型图,该模型遵循优先附件模型。
上图完全满足了富人致富和穷人致富的逻辑。
代码:
以下代码是我们最终将使用networkx库实现的函数的一部分。
def barabasi_albert_graph(n, m, seed=None):
"""Returns a random graph according to the Barabási–Albert preferential
Attachment model.
A graph of ``n`` nodes is grown by attaching new nodes each with ``m``
Edges that are preferentially attached to existing nodes with high degree.
Parameters
----------
n : int
Number of nodes
m : int
Number of edges to attach from a new node to existing nodes
seed : int, optional
Seed for random number generator (default=None).
Returns
-------
G : Graph
Raises
------
NetworkXError
If ``m`` does not satisfy ``1 <= m < n``.
if m < 1 or m >=n:
raise nx.NetworkXError("Barabási–Albert network must have m >= 1"
" and m < n, m = %d, n = %d" % (m, n))
if seed is not None:
random.seed(seed)
# Add m initial nodes (m0 in barabasi-speak)
G=empty_graph(m)
G.name="barabasi_albert_graph(%s,%s)"%(n,m)
# Target nodes for new edges
targets=list(range(m))
# List of existing nodes, with nodes repeated once for each adjacent edge
repeated_nodes=[]
# Start adding the other n-m nodes. The first node is m.
source=m
while source
上面的代码是networkx库的一部分,该库用于在Python有效处理随机图。在运行以下代码之前,必须先安装它。
>>> import networkx as nx
>>> G= nx.barabasi_albert_graph(50,40)
>>> nx.draw(G, with_labels=True)
为了显示上面的图,我使用了matplotlib库。我们需要在执行以下代码之前安装它。
>>> import matplotlib.pyplot as plt
>>> plt.show()
所以最终的代码看起来像:
>>> import networkx as nx
>>> import matplotlib.pyplot as plt
>>> G= nx.barabasi_albert_graph(40,15)
>>> nx.draw(G, with_labels=True)
>>> plt.show()
输出:
因此,我想进一步描述有关networkx库及其模块的更多信息,这些模块主要侧重于网络的中心性度量(尤其是无标度模型)。
参考
您可以在以下位置阅读更多关于相同内容
。