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

比例阈值下网络指标随密度变化

所属专题
脑连接组:结构与功能连接
下载
Notebook · .py

proportional_threshold 保留 |r| 最大的前 density 比例的边,得到二值无向图。 在密度 0.05–0.40 上计算平均聚集系数 C、全局效率 E、连通分量数,并与同边数的 ER 随机图比较。 输出解读:E 随密度单调上升;C 先升后降(系统内的强边用完后,新增的是跨系统的弱边); 低密度时网络断成多个分量;C/C_rand 随密度下降。 同一个相关矩阵在不同密度下给出不同的“拓扑”,只报告单一密度会使结论依赖于该选择。

Output输出图

比例阈值下网络指标随密度变化:输出图 1

Output文字输出

密度   C      E      分量数  C/C_rand
0.05  0.337  0.081     16   31.10
0.10  0.588  0.142      8   6.76
0.15  0.797  0.228      3   6.04
0.20  0.878  0.265      3   4.14
0.30  0.740  0.619      1   2.58
0.40  0.621  0.698      1   1.52

Code代码

# proportional_threshold 保留 |r| 最大的前 density 比例的边,得到二值无向图。
# 在密度 0.05–0.40 上计算平均聚集系数 C、全局效率 E、连通分量数,并与同边数的 ER 随机图比较。
# 输出解读:E 随密度单调上升;C 先升后降(系统内的强边用完后,新增的是跨系统的弱边);
# 低密度时网络断成多个分量;C/C_rand 随密度下降。
# 同一个相关矩阵在不同密度下给出不同的“拓扑”,只报告单一密度会使结论依赖于该选择。
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

def simulate_bold(n_mod=4, per=10, T=200, seed=0):
    rng = np.random.default_rng(seed)   # 模拟数据,仅用于演示方法
    labels = np.repeat(np.arange(n_mod), per)
    sys_sig = rng.standard_normal((n_mod, T))
    glob = rng.standard_normal(T)
    load = rng.uniform(0.4, 1.0, size=n_mod * per)
    X = load[:, None] * sys_sig[labels] + 0.3 * glob + rng.standard_normal((n_mod * per, T))
    X[9] += 0.8 * sys_sig[1]
    return X, labels

def proportional_threshold(R, density):
    """保留 |r| 最大的前 density 比例的边,返回含全部 N 个节点的无向图。"""
    N = R.shape[0]
    iu = np.triu_indices(N, k=1)
    w = np.abs(R[iu])
    m = int(round(density * len(w)))
    keep = np.argsort(w)[::-1][:m]
    G = nx.Graph()
    G.add_nodes_from(range(N))
    G.add_edges_from(zip(iu[0][keep], iu[1][keep]))
    return G

X, labels = simulate_bold()
R = np.corrcoef(X)
N = R.shape[0]

rows = []
for d in [0.05, 0.10, 0.15, 0.20, 0.30, 0.40]:
    G = proportional_threshold(R, d)
    Gr = nx.gnm_random_graph(N, G.number_of_edges(), seed=1)
    C, E = nx.average_clustering(G), nx.global_efficiency(G)
    Cr = nx.average_clustering(Gr)
    rows.append((d, C, E, nx.number_connected_components(G), C / max(Cr, 1e-9)))

print("密度   C      E      分量数  C/C_rand")
for d, C, E, nc, ratio in rows:
    print(f"{d:.2f}  {C:.3f}  {E:.3f}  {nc:5d}   {ratio:.2f}")

ds = [r[0] for r in rows]
plt.plot(ds, [r[1] for r in rows], "o-", label="average clustering C")
plt.plot(ds, [r[2] for r in rows], "s-", label="global efficiency E")
plt.xlabel("network density")
plt.legend()
plt.title("Metrics depend on the threshold (simulated data)")
plt.show()

Run在浏览器中运行

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

比例阈值下网络指标随密度变化