生物医学网络科学Biomedical Network Science
Example04 / 13

度保持零模型与“真实值 vs 零分布”图

所属专题
结果呈现与研究前沿
下载
Notebook · .py

ER 不保留度分布;更严格的基线是度保持重连(nx.double_edge_swap 反复交换两条边的端点)。 生成 30 个度保持随机网络,计算平均聚集系数的均值、标准差和空手道网络的 z 分数; 再把零分布画成直方图、真实值画成竖线——这是呈现“与什么比较”的常用图式。 解读:z 明显大于 2 说明高聚集不能仅由度分布解释;与 ER 基线相比,度保持基线下的偏离程度更小, 说明换不同零模型,“高聚集”的程度判断会不同,报告中必须写清所用零模型。

Output输出图

度保持零模型与“真实值 vs 零分布”图:输出图 1

Output文字输出

C = 0.571,度保持随机 = 0.362 ± 0.058,z = 3.6

Code代码

# ER 不保留度分布;更严格的基线是度保持重连(nx.double_edge_swap 反复交换两条边的端点)。
# 生成 30 个度保持随机网络,计算平均聚集系数的均值、标准差和空手道网络的 z 分数;
# 再把零分布画成直方图、真实值画成竖线——这是呈现“与什么比较”的常用图式。
# 解读:z 明显大于 2 说明高聚集不能仅由度分布解释;与 ER 基线相比,度保持基线下的偏离程度更小,
# 说明换不同零模型,“高聚集”的程度判断会不同,报告中必须写清所用零模型。
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

G = nx.karate_club_graph()
C = nx.average_clustering(G)
C_null = []
for s in range(30):
    R = G.copy()
    nx.double_edge_swap(R, nswap=10 * R.number_of_edges(), max_tries=10**5, seed=s)
    C_null.append(nx.average_clustering(R))
z = (C - np.mean(C_null)) / np.std(C_null)
print(f"C = {C:.3f},度保持随机 = {np.mean(C_null):.3f} ± {np.std(C_null):.3f},z = {z:.1f}")

plt.figure(figsize=(5, 3))
plt.hist(C_null, bins=10, color="0.7", edgecolor="white", label="degree-preserving null (n=30)")
plt.axvline(C, color="C3", lw=2, label="observed")
plt.xlabel("average clustering"); plt.ylabel("count")
plt.title(f"Observed clustering exceeds the null (z = {z:.1f})")
plt.legend(fontsize=8); plt.tight_layout(); plt.show()

Run在浏览器中运行

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

度保持零模型与“真实值 vs 零分布”图