本文的内容源于南邮复杂动态网络理论与应用课程的两次课程实验中的一个,即网络模型及特性分析。
目录
前言
本文的内容来源于南邮研究生课程“复杂动态网络理论与应用”的两次课程实验,包括网络模型及统计特性分析、复杂网络传播动力学,实验内容包含常见社会网络模型构建、分析其统计学特征、传染病模型构建等。本文的侧重点在于记录实验内容,并给像笔者一样有课程上的需求,但不愿意支付太多学习成本的朋友一个参考。
此外,需要注意的是,笔者并不主修复杂动态网络理论与应用,对于一些理论知识的理解也浮于表面,文章的内容也不可避免地会存在谬误,需要读者们自行甄别。文章用到的一些代码,也是参考了一些他人的文章或是其他来源,笔者对这些代码的要求仅是能够运行,并产生一个“似是而非”的结果即可,至于程序编写是否合理,产生的结果是否准确等,也需要读者们自行甄别。
实验一:网络模型及统计特性分析
1. 实验目的
学习常见网络模型构建方法,分析统计特性,了解网络性质,并完成以下实验要求:
- 建立ER、WS和BA网络模型生成算法;
- 对比分析三种模型的统计特征,包括平均路径长度,度分布和聚类系数等;
- 修改BA模型,使其符合现实网络统计特征,例如使其幂律值在2-3之间,聚类系数在0.1以上。
2. 实验过程
(1)网络模型构建
在资料搜索过程中发现,Python有一个开发工具包NetworkX,包含了ER、WS和BA等常见网络的实现方法,只需要简单地调用几个函数,设置好参数即可,同时也包括了获取这些网络部分统计学特征的方法。本着能躺着绝不坐着的态度,笔者这里毫不犹豫地选择这个有些取巧的方式。
在NetworkX中内置了ER、WS、BA网络的构建函数,因此本次实验的网络模型构建如下,其中G表示构造的网络对象:
- ER网络利用G = erdos_renyi_graph(n, p)函数构建,参数n用于设置网络节点数,参数p用于设置连边概率;
- WS网络利用G = watts_strogatz_graph(n, k, p)函数构建,参数n用于设置网络节点数,参数k用于设置邻居节点数,参数p用于设置边的重连概率;
- BA网络利用G = barabasi_albert_graph(n, m)函数构建,参数n用于设置网络节点数,参数m用于设置从新节点附加到现有节点的边数;
- 利用draw()函数实现网络可视化。
(2)统计特征获取
本次实验重点关注平均路径长度、聚类系数和度分布三类统计特征,而NetworkX开发包中也包含了这些统计特征的获取方法,本次实验中采取的方法如下:
- 利用函数degree(G)获取各个节点的度;利用函数degree_histogram(G)获取度分布序列,可用于绘制度分布图;度分布序列表示每个度值的出现次数,因此利用循环,将度值乘上对应的出现次数并求和,即可获得网络的总度数,除以节点数后便可获得网络的平均度;
- 利用函数average_shortest_path_length(G)可以获得网络的平均路径长度,需要注意的是如果直接使用这一函数,要求G是连通图(connected graph);
- 利用函数clustering(G)获取单个节点的聚类系数,利用函数average_clustering(G)获得网络的聚类系数。
(3)BA模型修改
本次实验要求修改BA网络模型,使其幂律值在2-3之间,聚类系数在0.1以上,从而更接近现实网络。在查阅课程资料后发现,EBA网络模型便是BA网络模型的扩展,可以实现实验要求。因此实验采用了函数G = extended_barabasi_albert_graph(n, m, p, q)构建EBA网络,参数n表示网络节点数,参数m表示新节点连接到现有节点的边数,参数p表示现有节点之间的连边概率,参数q表示边的重连概率。其中p + q < 1,且当p = q = 0,EBA网络退化为BA网络。而实验过程中则需要对参数进行修改,使其满足实验要求。
(4)实验代码
- ER网络
import networkx as nx # 导入networkx包
import matplotlib.pyplot as plt # 导入科学绘图的matplotlib包
G = nx.random_graphs.erdos_renyi_graph(50,0.05) # 生成包含50个节点、连边概率0.05的随机图
pos = nx.circular_layout(G) # 节点分布形式
plt.title("ER Random Network n=50 p=0.05") # 标题
nx.draw(G, pos, node_color="green", edge_color="red", with_labels = False, node_size = 10)
plt.savefig('ER01.svg') # 图像保存
plt.show() # 显示网络图像
- WS网络
import networkx as nx
import matplotlib.pyplot as plt
#生成包含50个节点、每个节点5个近邻、随机化重连概率为0.05的小世界网络
G = nx.random_graphs.watts_strogatz_graph(50,5,0.05)
pos = nx.circular_layout(G)
plt.title("WS Small World Network n=50 k=5 p=0.05")
nx.draw(G, pos, node_color="green", edge_color="red", with_labels = False, node_size = 10)
plt.savefig('WS01.svg')
plt.show()
- BA网络
import networkx as nx
import matplotlib.pyplot as plt
G = nx.random_graphs.barabasi_albert_graph(50,5) #生成一个n=50,m=5的BA无标度网络
pos = nx.circular_layout(G)
plt.title("BA free scale Network n=50 m=5")
nx.draw(G, pos, node_color="green", edge_color="red", with_labels = False, node_size = 10)
plt.savefig('BA01.svg')
plt.show()
- 参数获取(以ER为例)
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
# 参数设置
n = 1000
p1 = 0.008
# 平均度计算
def ave(num,degree):
sum = 0
for i in range(len(degree)):
sum = sum + i * degree[i]
ave_degree = float(sum) / num
return ave_degree
# 构造网络
ER = nx.erdos_renyi_graph(n, p1)
# 度
ER_d = nx.degree_histogram(ER)
ER_ad = ave(n, ER_d)
print("平均度 ER", ER_ad)
# 聚类系数
ER_C = nx.average_clustering(ER)
print("聚类系数 ER", ER_C)
#平均路径长度
ER_L = nx.average_shortest_path_length(ER)
print("平均路径长度 ER ", ER_L)
# 绘制度分布图
x1 = range(len(ER_d))
y1 = [z1 for z1 in ER_d]
plt.title("ER degree")
plt.scatter(x1,y1,s=25,color='r',marker='*')
plt.savefig("ER02.svg")
plt.show()
- BA网络改进
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
def get_gamma(G):
hist=np.array(nx.degree_histogram(G))
p_k=hist/np.sum(hist)
k=np.arange(len(p_k))
sp,ep=None,None
cp_k=np.cumsum(p_k)
for i,v in enumerate(cp_k):
if v>0.1 and sp==None:
sp=i
if v>0.9 and ep==None:
ep=i
y=p_k[sp:ep]
x=k[sp:ep]
log_y=np.log(y)
log_a_p_alpha_log_x=np.log(x)
plt.scatter(log_a_p_alpha_log_x,log_y,c="orange")
alpha,a=np.polyfit(log_a_p_alpha_log_x,log_y,1)
plt.plot(log_a_p_alpha_log_x,log_a_p_alpha_log_x*alpha+a)
plt.savefig("EBA.svg")
return -alpha
G=nx.random_graphs.extended_barabasi_albert_graph(1000,15,0.15,0.15)
print("幂律值", get_gamma(G))
print('聚类系数', nx.average_clustering(G))
3. 实验结果
(1)网络模型构建结果
网络的构建结果即为上述图片,读者可以修改参数与绘图方式,从而产生不同的效果。
(2)统计特征
利用参数获取代码,设置参数为
n=1000,p1=0.008(ER),k=8,p2=0.05(WS),m=4(BA);
n=2000,p1=0.004,k=8,p2=0.05,m=4;
n=3000,p1=0.0027,k=8,p2=0.05,m=4。
可以获得类似下表及下图的结果
节点数 | 1000 | 2000 | 3000 | ||||||
网络类型 | ER | WS | BA | ER | WS | BA | ER | WS | BA |
平均度 | 8.088 | 8.000 | 7.968 | 8.014 | 8.000 | 7.984 | 8.129 | 8.000 | 7.989 |
聚类系数 | 0.008 | 0.552 | 0.038 | 0.004 | 0.554 | 0.023 | 0.002 | 0.554 | 0.016 |
平均路径长度 | 3.537 | 6.079 | 3.177 | 3.881 | 6.925 | 3.392 | 4.056 | 7.369 | 3.532 |
度分布图
(3)BA模型修改
实验设置EBA模型的参数为n=1000,m=15,p=0.15,q=0.15。获得幂律值拟合图像如下图所示,可以得到幂律值约为2.596,聚类系数为0.126,满足了实验要求。
(4)结果分析
由于代码比较简陋,可能运行结果并不会与文中给出的数据完全一致,因此需要读者自行甄别所得结果是否理想,是否需要修改,是否需要多次尝试。至于相关结果的分析,因为写在开头的原因,笔者也不多做介绍,避免误导读者。
总结
以上就是笔者针对网络模型及特性分析进行的实验内容,也再次强调笔者在复杂动态网络理论与应用方面也是一知半解,文章的内容也不可避免地会存在谬误,需要读者们自行甄别,文章用到的一些代码,编写是否合理,产生的结果是否准确等,也需要读者们自行甄别。