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

加权脑网络指标与权重归一化

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

用模拟的 4 系统功能连接矩阵(只保留正相关)构建加权网络,比较: 强度 s_i、Onnela 加权聚集系数(networkx 的 clustering(weight=…) 即此定义,权重先除以最大权重)、 加权全局效率(边长取 1/w,Dijkstra 最短路径),以及“对所有权重乘同一常数”后各指标是否改变。 输出解读:加权聚集系数对整体缩放不变(已按最大权重归一化);加权效率随整体缩放成比例变化, 因此组间比较加权效率前要决定是否归一化(如除以最大权重或与保持强度的零模型之比),否则“效率差异”可能只是整体 FC 强度差异。

Output输出图

加权脑网络指标与权重归一化:输出图 1

Output文字输出

整体缩放 ×1.0: 平均强度 = 5.473,加权聚集 = 0.1965,加权全局效率 = 0.1728
整体缩放 ×0.7: 平均强度 = 3.831,加权聚集 = 0.1965,加权全局效率 = 0.1210
强度最高的 5 个节点: [15, 10, 31, 0, 35]
提示:权重整体乘 0.7,效率也乘 0.7;聚集系数不变。

Code代码

# 用模拟的 4 系统功能连接矩阵(只保留正相关)构建加权网络,比较:
# 强度 s_i、Onnela 加权聚集系数(networkx 的 clustering(weight=...) 即此定义,权重先除以最大权重)、
# 加权全局效率(边长取 1/w,Dijkstra 最短路径),以及“对所有权重乘同一常数”后各指标是否改变。
# 输出解读:加权聚集系数对整体缩放不变(已按最大权重归一化);加权效率随整体缩放成比例变化,
# 因此组间比较加权效率前要决定是否归一化(如除以最大权重或与保持强度的零模型之比),否则“效率差异”可能只是整体 FC 强度差异。
import numpy as np
import networkx as nx

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

def weighted_graph(W):
    G = nx.Graph()
    N = W.shape[0]
    G.add_nodes_from(range(N))
    for i in range(N):
        for j in range(i + 1, N):
            if W[i, j] > 0:
                G.add_edge(i, j, weight=W[i, j], length=1.0 / W[i, j])
    return G

def weighted_global_efficiency(G):
    N = G.number_of_nodes()
    tot = 0.0
    for i, dist in nx.all_pairs_dijkstra_path_length(G, weight="length"):
        tot += sum(1.0 / d for j, d in dist.items() if j != i)
    return tot / (N * (N - 1))

R, labels = simulate_fc()
W = np.clip(R, 0, None)                       # 只保留正权(负权需另行处理)
np.fill_diagonal(W, 0)

for scale in [1.0, 0.7]:                      # 0.7:模拟整体 FC 减弱 30% 的“另一组”
    G = weighted_graph(scale * W)
    s = np.array([d for _, d in G.degree(weight="weight")])
    Cw = nx.average_clustering(G, weight="weight")
    Ew = weighted_global_efficiency(G)
    print(f"整体缩放 ×{scale}: 平均强度 = {s.mean():.3f},加权聚集 = {Cw:.4f},加权全局效率 = {Ew:.4f}")

G = weighted_graph(W)
s = np.array([d for _, d in G.degree(weight="weight")])
print("强度最高的 5 个节点:", np.argsort(s)[::-1][:5].tolist())
print("提示:权重整体乘 0.7,效率也乘 0.7;聚集系数不变。")

import matplotlib.pyplot as plt
scales = np.linspace(0.4, 1.0, 7)
met = []
for sc in scales:
    Gs = weighted_graph(sc * W)
    met.append([np.mean([d for _, d in Gs.degree(weight="weight")]),
                nx.average_clustering(Gs, weight="weight"), weighted_global_efficiency(Gs)])
met = np.array(met) / np.array(met)[-1]
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
im = axes[0].imshow(W, cmap="Reds", vmin=0)
fig.colorbar(im, ax=axes[0], shrink=0.8, label="weight (positive r)")
axes[0].set(title="Positive-weight FC (sorted by system)", xlabel="Region", ylabel="Region")
for k, (mk, ls, lab) in enumerate([("o", "-", "mean strength"), ("s", "--", "weighted clustering"),
                                   ("^", ":", "weighted global efficiency")]):
    axes[1].plot(scales, met[:, k], marker=mk, ls=ls, label=lab)
axes[1].set(xlabel="Global weight scaling factor", ylabel="Metric / value at scale 1",
            title="Clustering is scale-invariant; efficiency is not")
axes[1].legend(fontsize=8)
plt.tight_layout(); plt.show()

Run在浏览器中运行

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

加权脑网络指标与权重归一化