NetworkX提供了4种常见网络的建模方法,分别是:规则图,ER随机图,WS小世界网络和BA无标度网络。本文首先介绍在NetworkX生成这些网络模型的方法,然后以BA无标度网络的建模为例,分析利用NetworkX进行复杂网络演化模型设计的基本思路,以便将来开发出我们自己的模型。同时这篇文章里还涉及到一点复杂网络可视化的方法(后边有时间会另文介绍网络可视化的方法)。

一、规则图

规则图差不多是最没有复杂性的一类图了,在NetworkX中,用random_graphs.random_regular_graph(d, n)方法可以生成一个含有n个节点,每个节点有d个邻居节点的规则图。下面是一段示例代码,生成了包含20个节点、每个节点有3个邻居的规则图:

import networkx as nx

import matplotlib.pyplot as plt

RG = nx.random_graphs.random_regular_graph(3,20)  #生成包含20个节点、每个节点有3个邻居的规则图RG

pos = nx.spectral_layout(RG)          #定义一个布局,此处采用了spectral布局方式,后变还会介绍其它布局方式,注意图形上的区别

nx.draw(RG,pos,with_labels=False,node_size = 30)  #绘制规则图的图形,with_labels决定节点是非带标签(编号),node_size是节点的直径

plt.show()  #显示图形

运行结果如下:

图1   NetworkX生成的规则图

二、ER随机图

ER随机图是早期研究得比较多的一类“复杂”网络,这个模型的基本思想是以概率p连接N个节点中的每一对节点。在NetworkX中,可以用random_graphs.erdos_renyi_graph(n,p)方法生成一个含有n个节点、以概率p连接的ER随机图:

import networkx as nx

import matplotlib.pyplot as 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   NetworkX生成的随机图

三、WS小世界网络

在NetworkX中,可以用random_graphs.watts_strogatz_graph(n, k, p)方法生成一个含有n个节点、每个节点有k个邻居、以概率p随机化重连边的WS小世界网络,下面是一个例子:

import networkx as nx

import matplotlib.pyplot as plt

WS = nx.random_graphs.watts_strogatz_graph(20,4,0.3)  #生成包含20个节点、每个节点4个近邻、随机化重连概率为0.3的小世界网络

pos = nx.circular_layout(WS)          #定义一个布局,此处采用了circular布局方式

nx.draw(WS,pos,with_labels=False,node_size = 30)  #绘制图形

plt.show()

运行结果如下:

图3   NetworkX生成的WS小世界网络

四、BA无标度网络

在NetworkX中,可以用random_graphs.barabasi_albert_graph(n, m)方法生成一个含有n个节点、每次加入m条边的BA无标度网络,下面是一个例子:

import networkx as nx

import matplotlib.pyplot as plt

BA= nx.random_graphs.barabasi_albert_graph(20,1)  #生成n=20、m=1的BA无标度网络

pos = nx.spring_layout(BA)          #定义一个布局,此处采用了spring布局方式

nx.draw(BA,pos,with_labels=False,node_size = 30)  #绘制图形

plt.show()

运行结果如下:

图4   NetworkX生成的BA无标度网络

五、对BA模型实现代码的分析

前面我们介绍了NetworkX提供的4种网络演化模型的应用方法,但仅停留在使用已有的模型是不够的,实际工作中我们可能会自己开发一些网络演化模型。利用NetworkX提供的数据结构,我们可以比较方便的完成这一工作。下面以NetworkX中BA模型的实现代码为例,分析用NetworkX开发网络演化模型的一般思路。NetworkX中关于网络建模的代码在random_graphs.py这个文件中,可以用记事本打开它。为了叙述简便起见,我删掉了原始代码中的一些错误处理与初始条件定义的语句,红色部分是翻译后的注释。

#定义一个方法,它有两个参数:n - 网络节点数量;m - 每步演化加入的边数量def barabasi_albert_graph(n, m):

# 生成一个包含m个节点的空图 (即BA模型中t=0时的m0个节点)    G=empty_graph(m)

# 定义新加入边要连接的m个目标节点

targets=range(m)

# 将现有节点按正比于其度的次数加入到一个数组中,初始化时的m个节点度均为0,所以数组为空    repeated_nodes=[]

# 添加其余的 n-m 个节点,第一个节点编号为m(Python的数组编号从0开始)

source=m

# 循环添加节点

while source

# 从源节点连接m条边到选定的m个节点targets上(注意targets是上一步生成的)

G.add_edges_from(zip([source]*m,targets))

# 对于每个被选择的节点,将它们加入到repeated_nodes数组中(它们的度增加了1)

repeated_nodes.extend(targets)

# 将源点m次加入到repeated_nodes数组中(它的度增加了m)        repeated_nodes.extend([source]*m)

# 从现有节点中选取m个节点 ,按正比于度的概率(即度优先连接)

targets=set()

while len(targets)

#按正比于度的概率随机选择一个节点,见注释1

x=random.choice(repeated_nodes)

#将其添加到目标节点数组targets中

targets.add(x)

#挑选下一个源点,转到循环开始,直到达到给定的节点数n        source += 1

#返回所得的图G

return G

注释1:此步是关键,random.choice方法是从一个数组中随机地挑选一个元素。由于repeated_nodes数组中的节点出现次数是正比于节点度的,所以这样处理可以保证按度大小的概率选出节点,即实现了度优先连接。如果是按正比于节点适应性等非整数值优先连接,可以参考我的另一篇博文《根据值的大小随机取数组元素的方法》。

六、小结

NetworkX的优势之一就是开源,这也是所有Python库的优势(Python是脚本语言,它没有办法隐藏源代码)。NetworkX的源代码结构清晰,风格简练,注释详尽,是学习、研究复杂网络不错的参考资料。当然在这方面我也是初学者,更多的功能还需要在实际应用中不断去发掘和领会…………

相关专题:复杂网络研究

转载本文请联系原作者获取授权,同时请注明本文来自闫小勇科学网博客。

链接地址:http://blog.sciencenet.cn/blog-404069-337689.html

上一篇:复杂网络分析库NetworkX学习笔记(2):统计指标计算

下一篇:复杂网络分析库NetworkX学习笔记(4):网络可视化

python复杂网络分析_科学网—复杂网络分析库NetworkX学习笔记(3):网络演化模型 - 闫小勇的博文...相关推荐

  1. matlab mic系数_科学网—最大信息系数 (Maximal Information Coefficient, MIC)详解(1) - 彭勇的博文...

    最大信息系数 (Maximal Information Coefficient, MIC)详解(1) 四年前看过的一篇论文,当时还在组会上报告过,很确信当时把它弄懂了,由于当时是用机器学习的方法来做预 ...

  2. python做社会网络分析_科学网-python 社会网络分析工具之igraph-郗强的博文

    1.networkx 2.igraph 3.SNAP 2.igraph igraph是免费的复杂网络(graphs)处理包,可以处理百万级节点的网络(取决于机器内存).igraph提供了R和C语言程序 ...

  3. python 面板数据分析_科学网—Python中的结构化数据分析利器-Pandas简介 - 郑俊娟的博文...

    此文转载于XXXXXX处... Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数 ...

  4. python读取网站_科学网—python 获取网址 - 林清莹的博文

    Python获取网址的内容# coding=utf-8 import urllib url = "http://www.baidu.com" data = urllib.urlop ...

  5. python 数据去重_科学网—python学习——根据条件提取数据,并去重 - 李立的博文...

    [Python字符串提取] 摘要:根据要求进行字符串的提取,并去重 导入分析所需的库import pandas as pd 构造数据集 as1 = pd.DataFrame({'a':[1,2,3,4 ...

  6. python编程口诀_科学网—Python编程技巧汇总 - 高关胤的博文

    正在学习python编程,把一些小技巧记录下来备查 ======================计算技巧========================== 正常的条件语句如下if a>b:c= ...

  7. python 基因序列提取_科学网—简单的Python脚本提取对应位置基因序列(fasta文件) - 王彬忠的博文...

    最近,用Python脚本提取,在基因号已知,位置已知条件下,相对应位置的基因序列时发现,这样很简单但是很实用的脚本,在网上却比较难找.而且,能被找到的脚本,相对于具有初级编程能力的人而言,有点难.本人 ...

  8. anaconda中python的位置_科学网—查询Anaconda安装路径、安装包位置及授予访问权限 - 张伟的博文...

    (1)确认安装路径 输入以下命令: conda info --env 可以知道当前有哪些环境,以及环境路径: (2)Anaconda管理的包的位置 具体路径为F:\Anaconda\Lib\site- ...

  9. 如何用python爬视频_科学网—利用python爬取一个小视频 - 李鸿斌的博文

    工具 : requests 库 解析: beautifulsoup 任务: 视频抓取 1,分析目标网站 寻找一个虚拟的头文件 User-Agent: Mozilla/5.0 (Windows NT 6 ...

  10. python 病毒 基因_科学网—RNA病毒基因组组装指南 - 倪帅的博文

    从前几年的猪流感和埃博拉,再到上个月在韩国流行的MERS, 病毒的每次爆发都能使全球陷入一阵恐慌,病毒虽然没有真正在全球爆发,但是各国在预防上消耗的资源比在治疗上消耗的还要多.殊不知,病毒是世界上最简 ...

最新文章

  1. OpenCV坎尼探测器Canny Detector的实例(附完整代码)
  2. copy-maven-plugin - where is it configured - Maven原理探究
  3. Linux多线程实践(1) --线程理论
  4. JavaScript 中 Number
  5. 设计模式之——抽象工厂模式
  6. 中国计划建设自己的卫星导航系统
  7. idea导入java项目步骤_idea导入javaweb项目
  8. word自带公式编辑_如何在word自带的公式编辑器中设置字体格式
  9. Python常用中文字体对应名称
  10. 图形化编程Mixly——RFID智能门禁
  11. GUI学习笔记——04更改背景板颜色,鼠标进入事件
  12. 腐蚀rust图纸怎么找_rust腐蚀建家图纸 | 手游网游页游攻略大全
  13. 三阶及四阶Runge-Kutta法
  14. c语言 运行结果是空白的,为什么输出是空白
  15. 2022-2028全球与中国锂电池隔膜市场现状及未来发展趋势
  16. Linux命令基础入门
  17. 使用cl_gui_docking_container实现多ALV
  18. 疯狂python讲义学习笔记——中十章完结
  19. javascript按照期望的顺序给对象数组排序,中文汉字大写数字排序
  20. 【解禁】钉钉直播回放下载

热门文章

  1. 跟我一起数据挖掘(19)——什么是数据挖掘(2)
  2. 将log4j重定向到指定函数
  3. 智能电视也需“杀毒”
  4. install mysql with source code
  5. 想成为优秀的技术人员你必须做到的几件事情【转载】
  6. MySQL 如何删除有外键约束的表数据
  7. ImageView之android:tint= 属性方法作用详解
  8. Writing udev rules
  9. 【045】HTML初学
  10. 28th Dec, 2012 我自己的问题