生物医学网络科学Biomedical Network Science
Example01 / 10

复现 Watts–Strogatz 的经典曲线

所属专题
小世界与无标度网络模型
下载
Notebook · .py

对一组重连概率 β(0.001 到 1,对数间隔),生成 WS 网络(N=300,K=10), 计算平均聚集系数 C(β) 与平均最短路径 L(β),除以 β=0 时的值后画在对数横轴上。 connected_watts_strogatz_graph 保证网络连通,才能计算平均最短路径。 输出:L(β)/L(0) 在 β≈0.01 附近已大幅下降,而 C(β)/C(0) 要到 β≈0.1 以后才明显下降,两者之间即小世界区间。

Output输出图

复现 Watts–Strogatz 的经典曲线:输出图 1

Output文字输出

β=0(规则网格): C(0)=0.667(理论 3(K-2)/(4(K-1))=0.667),L(0)=15.45
β=0.0010: C/C0=0.997, L/L0=0.912
β=0.0022: C/C0=0.994, L/L0=0.696
β=0.0046: C/C0=0.985, L/L0=0.542
β=0.0100: C/C0=0.977, L/L0=0.486
β=0.0215: C/C0=0.947, L/L0=0.336
β=0.0464: C/C0=0.883, L/L0=0.270
β=0.1000: C/C0=0.732, L/L0=0.227
β=0.2154: C/C0=0.530, L/L0=0.202
β=0.4642: C/C0=0.182, L/L0=0.182
β=1.0000: C/C0=0.050, L/L0=0.175

Code代码

# 对一组重连概率 β(0.001 到 1,对数间隔),生成 WS 网络(N=300,K=10),
# 计算平均聚集系数 C(β) 与平均最短路径 L(β),除以 β=0 时的值后画在对数横轴上。
# connected_watts_strogatz_graph 保证网络连通,才能计算平均最短路径。
# 输出:L(β)/L(0) 在 β≈0.01 附近已大幅下降,而 C(β)/C(0) 要到 β≈0.1 以后才明显下降,两者之间即小世界区间。
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

N, K = 300, 10
betas = np.logspace(-3, 0, 10)          # 0.001 ... 1

G0 = nx.watts_strogatz_graph(N, K, 0)
C0 = nx.average_clustering(G0)
L0 = nx.average_shortest_path_length(G0)
print("β=0(规则网格): C(0)=%.3f(理论 3(K-2)/(4(K-1))=%.3f),L(0)=%.2f" % (C0, 3 * (K - 2) / (4 * (K - 1)), L0))

C_ratio, L_ratio = [], []
for b in betas:
    G = nx.connected_watts_strogatz_graph(N, K, b, seed=42)
    C_ratio.append(nx.average_clustering(G) / C0)
    L_ratio.append(nx.average_shortest_path_length(G) / L0)
    print("β=%.4f: C/C0=%.3f, L/L0=%.3f" % (b, C_ratio[-1], L_ratio[-1]))

plt.figure(figsize=(6, 4))
plt.semilogx(betas, C_ratio, "o-", label="C(β)/C(0)")
plt.semilogx(betas, L_ratio, "s-", label="L(β)/L(0)")
plt.xlabel("rewiring probability β")
plt.ylabel("normalized value")
plt.legend()
plt.title("Watts–Strogatz: N=%d, K=%d" % (N, K))
plt.show()

Run在浏览器中运行

首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。

复现 Watts–Strogatz 的经典曲线