生物医学网络科学Biomedical Network Science
Example06 / 09

聚集谱 C(k) 与层次模块网络(Ravasz–Barabási 型确定性模型)

所属专题
度相关性与网络结构的高阶统计
下载
Notebook · .py

递归构造层次网络:基本单元是 5 个节点的完全图(1 个中心 + 4 个外围);每一层把当前网络复制 4 份, 并把各副本中“最底层外围节点”全部连到原网络的中心节点。 对比 BA 网络:层次网络的 C(k) 随 k 近似按 k^(-1) 下降,BA 网络的 C(k) 基本与 k 无关。 解读:C(k) 的负斜率是层次模块性的一个必要而非充分的信号;度相关与 C(k) 的估计也相互影响。

Output输出图

聚集谱 C(k) 与层次模块网络(Ravasz–Barabási 型确定性模型):输出图 1

Output文字输出

层次网络: N = 625, 平均聚集系数 = 0.815, log C(k) ~ log k 斜率 = -1.11, 度相关 r = -0.129
   部分 C(k): {4: 1.0, 5: 0.9, 6: 0.8, 7: 0.714, 20: 0.158, 84: 0.036, 340: 0.009}
BA 网络: N = 625, 平均聚集系数 = 0.046, log C(k) ~ log k 斜率 = -0.13, 度相关 r = -0.069
   部分 C(k): {3: 0.071, 8: 0.025, 13: 0.01, 18: 0.016, 23: 0.024, 35: 0.024, 80: 0.026}

Code代码

# 递归构造层次网络:基本单元是 5 个节点的完全图(1 个中心 + 4 个外围);每一层把当前网络复制 4 份,
# 并把各副本中“最底层外围节点”全部连到原网络的中心节点。
# 对比 BA 网络:层次网络的 C(k) 随 k 近似按 k^(-1) 下降,BA 网络的 C(k) 基本与 k 无关。
# 解读:C(k) 的负斜率是层次模块性的一个必要而非充分的信号;度相关与 C(k) 的估计也相互影响。
import numpy as np
import networkx as nx


def hierarchical_network(levels=3):
    G = nx.complete_graph(5)
    center = 0
    periphery = [1, 2, 3, 4]                 # 当前网络中“最外围”的节点
    for _ in range(levels):
        n = G.number_of_nodes()
        H = G.copy()
        new_periph = []
        for c in range(1, 5):
            offset = c * n
            H = nx.union(H, nx.relabel_nodes(G, {v: v + offset for v in G}))
            for p in periphery:
                H.add_edge(center, p + offset)
                new_periph.append(p + offset)
        G, periphery = H, new_periph
    return G


def ck_curve(G):
    cl = nx.clustering(G)
    deg = dict(G.degree())
    out = {}
    for k in sorted(set(deg.values())):
        if k >= 2:
            out[k] = np.mean([cl[i] for i in G if deg[i] == k])
    return out


H = hierarchical_network(levels=3)
B = nx.barabasi_albert_graph(H.number_of_nodes(), 3, seed=1)
for name, G in [("层次网络", H), ("BA 网络", B)]:
    ck = ck_curve(G)
    ks = np.array([k for k in ck if ck[k] > 0], float)
    cs = np.array([ck[k] for k in ck if ck[k] > 0])
    slope = np.polyfit(np.log(ks), np.log(cs), 1)[0]
    print(f"{name}: N = {G.number_of_nodes()}, 平均聚集系数 = {nx.average_clustering(G):.3f}, "
          f"log C(k) ~ log k 斜率 = {slope:.2f}, 度相关 r = {nx.degree_assortativity_coefficient(G):+.3f}")
    show = list(ck.items())[:: max(1, len(ck) // 6)]
    print("   部分 C(k):", {k: round(float(v), 3) for k, v in show})

# 作图:双对数坐标下的聚集谱 C(k),并画出 k^-1 参考线
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6.4, 4.2))
for G, lab, mk in [(H, "hierarchical network", "o"), (B, "BA network", "s")]:
    ck = {k: c for k, c in ck_curve(G).items() if c > 0}
    ax.loglog(list(ck), list(ck.values()), mk, ms=5, alpha=0.8, label=lab)
kref = np.array([4, 100])
ax.loglog(kref, 2.0 / kref, "k--", lw=1, label="~ k^-1")
ax.set_xlabel("degree k"); ax.set_ylabel("clustering spectrum C(k)")
ax.set_title("Hierarchical modularity: C(k) falls as k^-1, BA stays flat")
ax.legend(); plt.tight_layout(); plt.show()

Run在浏览器中运行

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

聚集谱 C(k) 与层次模块网络(Ravasz–Barabási 型确定性模型)