复杂网络的结构与演化,复杂网络与社会网络分析与研究,复杂网络的结构与演化,复杂网络与社会网络分析的关系

  复杂网络的结构与演化,复杂网络与社会网络分析与研究,复杂网络的结构与演化,复杂网络与社会网络分析的关系

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: