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

BA 网络与 ER 网络的度分布(CCDF)

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

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

Output输出图

BA 网络与 ER 网络的度分布(CCDF):输出图 1

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 秒;可以修改参数后重新运行。

BA 网络与 ER 网络的度分布(CCDF)