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

阈值敏感性——枢纽排名随网络密度如何变化

所属专题
研究问题、可复现分析与敏感性分析
下载
Notebook · .py

用三因子模型模拟 80 个样本、50 个节点的数据,按比例阈值(保留绝对相关最强的前 d 比例的边)建网, 在密度 5%–40% 范围内取度最高的 5 个节点为“枢纽”,计算其与 10% 密度下枢纽集合的 Jaccard 相似度 (交集大小 / 并集大小)。 解读:密度离参考值越远,枢纽集合通常变化越大;报告时应说明结论在哪个密度区间内成立。

Output输出图

阈值敏感性——枢纽排名随网络密度如何变化:输出图 1

Output文字输出

10% 密度下的枢纽: [3, 6, 14, 20, 36]
密度 0.05: 枢纽 [3, 6, 14, 36, 47],Jaccard = 0.67
密度 0.10: 枢纽 [3, 6, 14, 20, 36],Jaccard = 1.00
密度 0.15: 枢纽 [3, 6, 14, 36, 41],Jaccard = 0.67
密度 0.20: 枢纽 [3, 6, 14, 36, 42],Jaccard = 0.67
密度 0.25: 枢纽 [3, 6, 14, 20, 36],Jaccard = 1.00
密度 0.30: 枢纽 [3, 6, 20, 36, 42],Jaccard = 0.67
密度 0.35: 枢纽 [6, 20, 36, 39, 48],Jaccard = 0.43
密度 0.40: 枢纽 [6, 36, 39, 48, 49],Jaccard = 0.25

Code代码

# 用三因子模型模拟 80 个样本、50 个节点的数据,按比例阈值(保留绝对相关最强的前 d 比例的边)建网,
# 在密度 5%–40% 范围内取度最高的 5 个节点为“枢纽”,计算其与 10% 密度下枢纽集合的 Jaccard 相似度
# (交集大小 / 并集大小)。
# 解读:密度离参考值越远,枢纽集合通常变化越大;报告时应说明结论在哪个密度区间内成立。
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

def simulate_corr(n_samples=80, n_nodes=50, seed=15):
    """三因子模型生成的相关矩阵(模拟数据)。"""
    rng = np.random.default_rng(seed)
    F = rng.normal(size=(n_samples, 3))
    L = rng.uniform(0, 0.8, size=(n_nodes, 3)) * (rng.random((n_nodes, 3)) < 0.5)
    X = F @ L.T + rng.normal(size=(n_samples, n_nodes))
    return np.corrcoef(X.T)

def network_at_density(C, density):
    """保留绝对相关最强的前 density 比例的边(比例阈值法)。"""
    n = C.shape[0]
    iu = np.triu_indices(n, 1)
    keep = np.argsort(-np.abs(C[iu]))[:int(round(density * len(iu[0])))]
    G = nx.Graph(); G.add_nodes_from(range(n))
    G.add_edges_from(zip(iu[0][keep], iu[1][keep]))
    return G

def top_hubs(G, k=5):
    return set(sorted(G.nodes, key=lambda v: (-G.degree(v), v))[:k])

C = simulate_corr()
ref = top_hubs(network_at_density(C, 0.10))
print("10% 密度下的枢纽:", sorted(ref))
densities = np.arange(0.05, 0.41, 0.05)
jac = []
for d in densities:
    h = top_hubs(network_at_density(C, d))
    jac.append(len(h & ref) / len(h | ref))
    print(f"密度 {d:.2f}: 枢纽 {sorted(h)},Jaccard = {jac[-1]:.2f}")

plt.figure(figsize=(5, 3))
plt.plot(densities, jac, "o-"); plt.axvline(0.10, color="gray", ls="--")
plt.xlabel("network density"); plt.ylabel("Jaccard vs. hubs at 10%"); plt.ylim(0, 1.05)
plt.tight_layout(); plt.show()

Run在浏览器中运行

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

阈值敏感性——枢纽排名随网络密度如何变化