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

共激活模式(CAP):种子阈值选帧 + k-means

所属专题
动态功能连接与多层脑网络
下载
Notebook · .py

思路来自 Liu & Duyn(2013, PNAS):只取种子区信号超过阈值(此处取最高 15%)的时间帧, 对这些帧的全脑空间模式做 k-means,每类求平均得到 CAP。 模拟:20 个脑区;种子区(0 号)高活动时,伴随两种不同的空间模式之一(模式 A:1–6 号;模式 B:7–12 号)。 输出解读:全部帧平均(相当于种子相关图)把两种模式混在一起;k = 2 的 CAP 能把它们分开。

Output输出图

共激活模式(CAP):种子阈值选帧 + k-means:输出图 1

Output文字输出

选中帧数 = 450(占 15%)
全部选中帧平均(类似种子相关图):区 1–6 均值 0.55,区 7–12 均值 0.62
CAP 0:帧数 152,区 1–6 均值 -0.09,区 7–12 均值 2.01
CAP 1:帧数 298,区 1–6 均值 0.87,区 7–12 均值 -0.08

Code代码

# 思路来自 Liu & Duyn(2013, PNAS):只取种子区信号超过阈值(此处取最高 15%)的时间帧,
# 对这些帧的全脑空间模式做 k-means,每类求平均得到 CAP。
# 模拟:20 个脑区;种子区(0 号)高活动时,伴随两种不同的空间模式之一(模式 A:1–6 号;模式 B:7–12 号)。
# 输出解读:全部帧平均(相当于种子相关图)把两种模式混在一起;k = 2 的 CAP 能把它们分开。
import numpy as np
from scipy.cluster.vq import kmeans2

rng = np.random.default_rng(4)
N, T = 20, 3000
X = rng.standard_normal((N, T))
events = rng.choice(T, 300, replace=False)
kind = rng.integers(0, 2, events.size)               # 每个事件随机属于模式 A 或 B
for e, k in zip(events, kind):
    X[0, e] += 3.0
    members = np.arange(1, 7) if k == 0 else np.arange(7, 13)
    X[members, e] += 2.5
X = (X - X.mean(1, keepdims=True)) / X.std(1, keepdims=True)

thr = np.quantile(X[0], 0.85)                         # 种子信号最高 15% 的帧
frames = np.where(X[0] > thr)[0]
F = X[:, frames].T                                    # (帧数, N)
_, lab = kmeans2(F, 2, seed=0, minit="++")
seed_map = F.mean(0)
print(f"选中帧数 = {frames.size}(占 {frames.size / T:.0%})")
print("全部选中帧平均(类似种子相关图):区 1–6 均值 %.2f,区 7–12 均值 %.2f"
      % (seed_map[1:7].mean(), seed_map[7:13].mean()))
for c in range(2):
    cap = F[lab == c].mean(0)
    print(f"CAP {c}:帧数 {np.sum(lab == c):3d},区 1–6 均值 {cap[1:7].mean():.2f},"
          f"区 7–12 均值 {cap[7:13].mean():.2f}")

import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=(10, 3.6), sharey=True)
maps = [("Mean of all selected frames", seed_map)] + \
       [(f"CAP {c} ({np.sum(lab == c)} frames)", F[lab == c].mean(0)) for c in range(2)]
for ax, (ttl, mp) in zip(axes, maps):
    ax.bar(np.arange(N), mp, color=np.where(mp >= 0, "#CC6677", "#4477AA"))
    ax.axvspan(0.5, 6.5, color="#DDCC77", alpha=0.25)
    ax.axvspan(6.5, 12.5, color="#88CCEE", alpha=0.25)
    ax.set(title=ttl, xlabel="Region (0 = seed)")
axes[0].set_ylabel("Mean z-score")
plt.tight_layout(); plt.show()

Run在浏览器中运行

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

共激活模式(CAP):种子阈值选帧 + k-means