Example02 / 10
BA 网络与 ER 网络的度分布(CCDF)
生成节点数和平均度相同的 BA 网络(n=3000,m=2)与 ER 网络,画两者度分布的互补累积分布 P(K ≥ k)。 CCDF 不需要分箱,尾部比直方图平滑;幂律 P(k)~k^-γ 的 CCDF 斜率为 -(γ-1)。 输出:两者平均度相同,BA 的最大度远大于 ER;双对数坐标下 BA 的 CCDF 尾部近似直线(斜率约 -2),ER 很快“掉崖”。
Output输出图

Output文字输出
BA: 平均度 4.00, 最大度 142 ER: 平均度 3.97, 最大度 13
Code代码
# 生成节点数和平均度相同的 BA 网络(n=3000,m=2)与 ER 网络,画两者度分布的互补累积分布 P(K ≥ k)。
# CCDF 不需要分箱,尾部比直方图平滑;幂律 P(k)~k^-γ 的 CCDF 斜率为 -(γ-1)。
# 输出:两者平均度相同,BA 的最大度远大于 ER;双对数坐标下 BA 的 CCDF 尾部近似直线(斜率约 -2),ER 很快“掉崖”。
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
n, m = 3000, 2
G_ba = nx.barabasi_albert_graph(n, m, seed=1)
avg_k = 2 * G_ba.number_of_edges() / n
G_er = nx.gnp_random_graph(n, avg_k / (n - 1), seed=1)
def ccdf(degrees):
"""返回 (k 值, P(K >= k))。"""
degrees = np.asarray(degrees)
ks = np.unique(degrees)
p = np.array([(degrees >= k).mean() for k in ks])
return ks, p
deg_ba = [d for _, d in G_ba.degree()]
deg_er = [d for _, d in G_er.degree()]
print("BA: 平均度 %.2f, 最大度 %d" % (np.mean(deg_ba), max(deg_ba)))
print("ER: 平均度 %.2f, 最大度 %d" % (np.mean(deg_er), max(deg_er)))
plt.figure(figsize=(6, 4))
for degs, lab, mk in [(deg_ba, "BA", "o"), (deg_er, "ER", "s")]:
ks, p = ccdf(degs)
plt.loglog(ks, p, mk, ms=3, label=lab)
plt.xlabel("k")
plt.ylabel("P(K ≥ k)")
plt.legend()
plt.title("CCDF of degree")
plt.show()Run在浏览器中运行
首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。