复杂网络的结构与演化,复杂网络与社会网络分析与研究,复杂网络的结构与演化,复杂网络与社会网络分析的关系
NetworkX提供了四种常用的网络建模方法:规则图、ER随机图、WS小世界网络和BA无标度网络。本文首先介绍了在NetworkX中生成这些网络模型的方法,然后以BA无标度网络的建模为例,分析了用NetworkX设计复杂网络演化模型的基本思路,以便将来开发我们自己的模型。同时,本文还涉及到一些复杂网络可视化的方法(有时间的话后面另一篇文章会介绍网络可视化的方法)。
一.规则图
规则图几乎是最不复杂的图。在NetworkX中,可以使用random _ graphs . random _ regular _ graph(d,n)的方法生成一个具有n个节点和d个邻居的规则图。下面是一个示例代码,它生成一个有20个节点的规则图,每个节点有3个邻居:
将networkx作为nx导入
将matplotlib.pyplot作为plt导入
RG=NX . random _ graphs . random _ regular _ graph(3,20) #生成一个有20个节点的正则图RG,每个节点有3个邻居
Pos=nx.spectral_layout(RG) #定义布局。这里采用的是光谱布局法,其他的布局方法后面会介绍。注意图形的不同。
Nx.draw (rg,pos,with_labels=false,node_size=30) #画一个正则图的图,with_labels决定一个节点是否无标号(编号),node_size是该节点的直径。
Plt.show() #显示图形
运行结果如下:
图1 NetworkX生成的规则图
二、ER随机图
ER随机图是一种“复杂”网络,在早期已经得到了大量的研究。这个模型的基本思想是把每对N个节点用概率p连接起来,在NetworkX中,你可以用random _ graphs . Erdos _ Renyi _ graph(N,p)的方法,生成N个节点用概率p连接的ER随机图:
将networkx作为nx导入
将matplotlib.pyplot作为plt导入
er=NX . random _ graphs . Erdos _ Renyi _ graph(20,0.2) #生成一个随机图,20个节点以0.2的概率相连。
Pos=nx.shell_layout(ER) #定义一个布局,这里采用的是shell布局。
nx.draw(ER,pos,with_labels=False,node_size=30)
plt.show()
运行结果如下:
图2网络生成的随机图
三。WS小世界网络
在NetworkX中,可以使用random _ graphs . watts _ strogatz _ graph(n,k,p)方法生成一个有n个节点的WS小世界网络,每个节点有k个邻居,重新连接的边以概率p随机化,下面是一个例子:
将networkx作为nx导入
将matplotlib.pyplot作为plt导入
WS=NX . random _ graphs . watts _ strogatz _ graph(20,4,0.3) #生成一个小世界网络,有20个节点,每个节点有4个邻居,随机重连概率为0.3。
Pos=nx.circular_layout(WS) #定义一个布局,这里采用圆形布局。
Nx.draw (ws,pos,with _ labels=false,node _ size=30) #绘制图形
plt.show()
运行结果如下:
图3ws NetworkX生成的小世界网络
四。BA无标度网络
在NetworkX中,可以使用random _ graphs . bara basi _ Albert _ graph(n,m)方法生成一个BA无标度网络,每次n个节点,m条边。这里有一个例子:
将networkx作为nx导入
将matplotlib.pyplot作为plt导入
BA=NX . random _ graphs . bara basi _ Albert _ graph(20,1) #生成一个BA无标度网络,n=20,m=1
Pos=nx.spring_layout(BA) #定义了一个布局,这里采用了spring布局。
Nx.draw (ba,pos,with _ labels=false,node _ size=30) #绘制图形
plt.show()
运行结果如下:
图4网络生成的无标度网络
5.BA模型的实现代码分析
我们已经介绍了NetworkX提供的四种网络演进模型的应用方法,但是仅仅使用现有的模型是不够的。在实践中,我们可能会自己开发一些网络演化模型。利用NetworkX提供的数据结构,我们可以方便地完成这项工作。以NetworkX中BA模型的实现代码为例,分析了用NetworkX开发网络演化模型的一般思路。NetworkX中关于网络建模的代码在文件random_graphs.py中,可以用记事本打开。为了简洁起见,我删除了原代码中一些错误处理和初始条件定义的语句,红色部分是翻译过来的注释。
#定义具有两个参数的方法:n-网络节点的数量;m-在进化的每一步中增加的边的数量
def barabasi_albert_graph(n,m):
#生成具有M个节点的空图(即BA模型中t=0时的m0个节点)
g=空图(m)
#定义由新添加的边连接的M个目标节点
目标=范围(米)
#将现有节点按照与其度数成正比的次数添加到数组中。初始化时,M个节点的度都是0,所以数组是空的。
repeated_nodes=[]
#添加剩余的n-m个节点,第一个节点编号为m(Python的数组编号从0开始)
源=m
#循环添加节点
while sourcen:
#将M条边从源节点连接到选定的M个节点目标(注意,目标是在上一步中生成的)
g . add _ edges _ from(zip([源]*m,目标))
#对于每个选定的节点,将它们添加到repeated_nodes数组中(它们的阶数增加1)
repeated_nodes.extend(目标)
#将源点添加到repeated_nodes数组m次(其次数增加m)
repeated _ nodes . extend([source]* m)
#从现有节点中选择M个节点,按照与度成正比的概率(即度优先)连接
targets=set()
而len(目标)m:
#按照与度成正比的概率随机选择一个节点,见注1。
x=random.choice(重复节点数)
#将其添加到目标节点数组目标中
目标. add(x)
#选择下一个源点,并转到循环的开始,直到达到给定的节点数N
源=1
#返回结果图g。
返回G
注意:这一步是关键。random.choice方法是从数组中随机选取一个元素。由于repeated_nodes数组中节点的出现次数与节点的度成正比,这种处理可以保证节点是按照度大小的概率选取的,即实现了度优先连接。请参考我的另一篇博文,《根据值的大小随机取数组元素的方法》,如果是通过与节点适应度成正比的非整数值优先连接。
不及物动词摘要
NetworkX的优势之一是开源,这也是所有Python库的优势(Python是脚本语言,没有办法隐藏源代码)。NetworkX源代码结构清晰,风格简洁,注释详细,对于学习和研究复杂网络是很好的参考。当然,我在这方面是个初学者,更多的功能需要在实际应用中去发现和理解……………………
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。