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

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