无标度网络mark

无标度网络

无标度网路的度的分布具有幂律性。

networkx包中有生成无标度网络的方法。

G=nx.barabasi_albert_graph(100,20)

第一个参数是节点数n,第二个参数是每个节点的连通数m(m<n)。生成一个含有n个节点、每次加入m条边的BA无标度网络。

验证该网络是否为无标度网络,参考这篇博客 复杂网络学习笔记:验证无标度网络的幂律分布特性

import random
import networkx as nx
import matplotlib.pyplot as plt
from collections import Counter
import math
degree=[]
for i in G.degree():
    degree.append(i[1])
Dick_k = Counter(d for d in degree)
#取了对数的数据
f=open('result.txt','w')
try:
    for x in Dick_k:
        y=math.log(Dick_k[x])
        logx=math.log(x)
        if y!=0 and logx!=0:
            f.write(str(logx)+' '+str(y)+'\n')
finally:
	f.close()
	print ('程序执行完毕,可以查看文件了')#提示程序已经执行完毕         

得到的result.txt在excel中打开,插入散点图并在散点图上做回归分析,即可

在NetworkX中,可以用random_graphs.watts_strogatz_graph(n, k, p)方法生成一个含有n个节点、每个节点有k个邻居、以概率p随机化重连边的WS小世界网络。这里提供一种生成小世界网络的方式:

#生成一个100节点的图
def rand_edge(i,j,p=0.2):
		probability=random.random()
		if (probability<p):
    			G.add_edge(i,j)
G=nx.Graph()
H=nx.path_graph(100)#画出100个节点的简单路径
G.add_nodes_from(H)
i=0
while(i<100):
	j=0
	while(j<i):
		rand_edge(i,j)
		j+=1
	i+=1

同时提供图形可视化方法:

nx.draw(G,with_labels=True)
plt.show()
#画degree的散点图
degree=[]
for i in G.degree():
    degree.append(i[1])
counts = Counter(d for d in degree)#生成{度:频数}的字典
b = [counts.get(i) for i in range(max(counts) + 1)]
x = range(len(b)) # x轴
y = [z for z in b] # y轴
plt.figure(figsize=(5.8, 5.2), dpi=50)
plt.xlabel("Degree")
plt.ylabel("Frequency")
plt.xticks(fontproperties='Times New Roman', size=14)
plt.yticks(fontproperties='Times New Roman', size=14)
plt.loglog(x, y, '.')
plt.show()
posted @ 2022-04-24 17:08  梅落南山  阅读(419)  评论(0编辑  收藏  举报