简介一份围绕脑科学与复杂网络交叉研究的PPT学习教案面向神经科学、网络科学与生物信息方向的学习者与研究者也适合课程讲授与组会交流使用。全包共1个pptx文件约2.38MB含45页内容按主题分模块推进先说明复杂网络研究的现实意义再介绍社会网络、信息网络、技术网络与生物网络等真实网络类型进而展开度分布、平均路径长度、集聚系数与介数等基本参数并梳理规则网络、随机图ER、小世界网络WS与无尺度网络BA的演化脉络。教案以欧拉七桥问题切入网络科学的思想源头结合Internet结构、合作网络与通信网络案例最后落到脑科学应用涉及神经元网络、语言演化、癌症基因网络、基因组工程与系统生物学等前沿话题。目前已有91人学习适合需要系统建立复杂网络知识框架并了解脑科学应用进展的读者。1. 从一份叫「脑科学与复杂网络研究PPT学习教案.pptx」的文件说起很多人的硬盘里都躺着这样一份文件文件名叫得极其正式点开是四十多页幻灯片前半段在讲节点、边、小世界网络后半段忽然跳到某类精神疾病的组间差异中间那一大段——原始的磁共振信号是怎么变成一个 90×90 的连接矩阵的——被压缩成了孤零零的一页。给本科生或跨专业的新生讲这节课时问题往往不出在概念上而出在从数据到图这一步没人讲透学生记不住公式却能记住图结果就是把复杂网络当成形容词用。脑科学与复杂网络的交叉本质上干一件事把大脑拆成若干个可定义的区域当作节点把区域之间的解剖纤维或时间序列同步性当作边然后用图论的一套量化指标去描述大脑这张图长什么样。它的落地价值在于小世界性、模块化、富人俱乐部这些指标可以把脑功能整合与分离这类抽象假设变成可以算、可以比、可以统计检验的数字。这份教案要面向的人群是刚进组的研究生、跨到神经影像方向的工程师以及需要把分析方法复现给下一届学生的助教。2. 脑网络的图论基础与必算的六个指标复杂网络在脑科学里不是隐喻而是一套有明确定义的数学模型。讲清楚这套模型教案的后半部分才有落脚点否则所有临床结论都像是从天上掉下来的。这一章先把节点、边和六个核心指标钉死再给一段能直接跑出数字的代码。2.1 节点用哪套脑区模板边分哪两种节点划分最常见的是 AAL90、AAL116、Brainnetome246 和 Schaefer 系列。AAL 系列基于解剖图谱区域大、数量少适合第一次上课演示Schaefer 系列基于功能连接聚类分区更细做组间比较时对细微差异更敏感但对样本量和预处理质量要求更高。选模板时要在教案里写清版本号和区域数量因为换一套模板所有指标的绝对值都会变跨研究比较必须先对齐模板。边的定义分两类。结构连接来自弥散张量成像DTI的纤维追踪权重通常是两个区域之间的流线数量反映的是物理通路功能连接来自静息态 fMRI 或 EEG 的时间序列相关性反映的是统计意义上的同步两者不能混着说。新手最容易犯的错是把功能连接当成神经 fiber 在放电教案里最好用一句话点破功能连接有方向不代表有因果也不代表存在直接解剖通路。2.2 六个指标度、聚类系数、特征路径长度、小世界性、模块度、富人俱乐部指标不用贪多六个足够撑起整门课而且互相之间有清晰的解释链条。度为节点连边数或权重和回答哪些脑区连接广泛聚类系数衡量邻居之间互连的紧密程度对应功能分离特征路径长度是任意两节点最短路径的平均值对应功能整合小世界性把前两者归一化到随机网络的基准上看网络是否同时具备高聚类和短路径模块度刻画网络能否被切成若干内部紧密、彼此稀疏的社区富人俱乐部系数则看高连接度的 hub 是否倾向于互相连接。指标计算对象常见取值范围教案里的讲解重点度 / 强度单节点0 到 N-1区分二值度与加权强度别混用聚类系数单节点或全脑0 到 1加权版本要用 Onnela 或 BCT 默认定义特征路径长度全脑越大整合越弱只对连通图有意义断连时要取最大连通子图小世界性 sigma全脑通常 1 视为小世界必须配套生成 20 个以上随机网络做基准模块度 Q全脑0.3 以上算结构明显模块划分有随机性要跑多次取稳定解富人俱乐部系数全脑随阈值变化剧烈必须画随度阈值变化的曲线不给单点值2.3 用 networkx 与 BCT 跑通最小计算流程下面这段代码把预处理好的连接矩阵读进来按稀疏度二值化再算出全部六个指标。之所以把二值化和指标计算写在一起是因为教案演示时最容易被追问的就是阈值怎么定的。import numpy as np import networkx as nx from bct import (clustering_coef_bu, charpath, modularity_und, rich_club_bu, randmio_und) # W: 90x90 AAL 连接矩阵已完成 Fisher z 变换 W np.load(sub-01_aal90_fisherz.npy) np.fill_diagonal(W, 0) W np.clip(W, 0, None) # 负相关边按常见做法截断为 0 def binarize_by_density(W, density0.15): 按比例阈值保留最强 density 比例的边返回对称二值矩阵 n W.shape[0] k int(round(density * n * (n - 1) / 2)) # 目标边数 iu np.triu_indices(n, k1) thr np.sort(W[iu])[::-1][k - 1] # 第 k 大的权重 A (W thr).astype(float) A np.triu(A, 1) return A A.T A binarize_by_density(W, 0.15) # 只保留最大连通子图否则路径长度无定义 G nx.from_numpy_array(A) giant max(nx.connected_components(G), keylen) A_g A[np.ix_(list(giant), list(giant))] C clustering_coef_bu(A_g).mean() # 平均聚类系数 L, _ charpath(A_g, include_diagonalFalse) # 特征路径长度 # 生成 20 个保持度序列的随机网络作为基准 Cs, Ls [], [] for _ in range(20): R, _ randmio_und(A_g.astype(int), 10) Cs.append(clustering_coef_bu(R).mean()) Ls.append(charpath(R, include_diagonalFalse)[0]) sigma (C / np.mean(Cs)) / (L / np.mean(Ls)) # 小世界性 Q, modules modularity_und(A_g) # 模块度与模块划分 Rc rich_club_bu(A_g.astype(int)) # 富人俱乐部系数序列 print(fC{C:.3f} L{L:.3f} sigma{sigma:.3f} Q{Q:.3f})binarize_by_density的 density 参数直接决定网络密度做组间比较时所有被试必须用同一个 density绝对阈值则要逐被试自适应两种策略的取舍在下一章展开。charpath返回的是最短路径矩阵和特征路径长度如果网络断连会得到 inf所以先取最大连通子图这一步不能省。randmio_und的第二个参数是边交换次数太小的话随机化不充分基准网络会不自觉地和原网络相似sigma 就会被高估常见做法是取边数的十倍量级。rich_club_bu返回一串随度阈值递减的系数教案里应当画成曲线而不是只报一个数。提示二值网络的 L 对连通性极度敏感加权网络的路径长度要用距离矩阵的倒数做变换两套结果不能直接对比。3. 从影像数据到连接矩阵的构建流程教案里最容易被跳过、也最容易被追问的就是这一章。指标算得快不快不重要矩阵建得对不对才决定结论站不站得住。下面按 fMRI 与 DTI 两条线拆开讲最后统一到阈值策略上。3.1 静息态 fMRI时间序列到相关矩阵标准流程是预处理后的 BOLD 图像配准到标准空间用脑区模板提取每个区域内的平均时间序列去线性漂移、带通滤波常用 0.01 到 0.1 Hz再做两两皮尔逊相关最后做 Fisher z 变换把相关系数拉回近似正态分布才能进组间统计。滤波这一条经常被省略但全局信号漂移会在低频段制造大量虚假的高相关让整张矩阵看起来到处都是连接。from nilearn import datasets, maskers from nilearn.connectome import ConnectivityMeasure atlas datasets.fetch_atlas_aal() # 返回 maps 与 labels masker maskers.NiftiLabelsMasker( labels_imgatlas.maps, standardizezscore_sample, # 逐体素标准化抑制尺度差异 detrendTrue, # 去线性漂移 t_r2.0, # 重复时间滤波必须提供 low_pass0.1, high_pass0.01, # 带通滤波频段 ) ts masker.fit_transform(sub-01_task-rest_bold.nii.gz) conn ConnectivityMeasure(kindcorrelation, standardizezscore_sample) C conn.fit_transform([ts])[0] # 90x90 相关矩阵已做 Fisher zt_r必须和采集参数一致写错会让滤波截止频率整体偏移得出的图看着正常但频段已经错了。standardize用 zscore 而不是默认值是为了让不同区域的信号量纲可比否则方差大的区域会主导相关性。如果要做组水平分析ConnectivityMeasure可以一次传入所有被试的时间序列列表但相关系数的组间检验仍建议在 z 空间做。3.2 DTI 结构连接纤维追踪与权重归一化结构网络一般用确定性或概率性纤维追踪得到流线再统计每条流线上有多少条经过某对脑区得到流线计数矩阵。流线计数受区域体积、追踪算法参数和距离影响极大直接拿来比较会得到大区域连接更强这种平凡结论所以常见做法是做归一化一种是用两个区域的表面积或体积之和做分母另一种是把每条流线按长度或路径概率加权。教案里至少要讲清归一化选项否则学生复现时数值对不上。追踪参数方面FA 阈值常用 0.2和角度阈值常用 45 度会显著改变流线数量做组间比较时所有被试必须使用同一套参数。此外流线计数是计数型数据分布严重右偏进统计前通常做对数变换。3.3 阈值怎么选绝对阈值、比例阈值与加权保留策略操作优点风险绝对阈值权重大于固定值保留生理含义直观各被试密度不同无法直接比较比例阈值固定保留最强 10%20% 边所有被试密度一致弱连接被试被迫保留噪声边加权保留不做二值化全权重参与计算信息损失最小部分指标路径长度定义复杂多阈值扫描10% 到 30% 逐点计算结论稳健性可验证计算量大需多重比较校正新手最常问的是到底用哪个阈值。合理的回答是主分析选一个比例阈值同时把指标随阈值变化的曲线画出来放进教案如果结论只在某一个阈值上成立那它大概率不是稳定的生物学效应。注意二值化后如果出现孤立节点先别急着删先看是不是模板区域本身信噪比太低删掉会在后续组间比较里引入选择偏差。3.4 负相关边到底要不要保留功能连接矩阵里出现负值是正常的但负值的解释一直有争议一派认为它代表抑制或竞争关系另一派认为它更多是全局信号回归和血流动力学延迟带来的伪影。工程上最稳的做法是明确写清处理方式然后做敏感性分析。常见做法有三种截断为 0、取绝对值、单独作为一层分析并在教案中标注。三种做法给出的模块度和小世界性会有可见差别教案里放一张三者的对比表比讲十分钟原理都有效。4. 把指标画成教案里的图出图规范与可复现教案的说服力有一半来自图。同一份数据画成什么样直接决定学生看不看得懂。这一章给三张必出的图连接矩阵热图、脑区节点图、指标随阈值变化的曲线。4.1 连接矩阵热图与排序技巧热图的默认布点顺序是按模板编号图看起来是一团噪点。按模块划分把节点重排后模块内的方块结构会立刻显现这一步在教案里的教学效果极强。import numpy as np import matplotlib.pyplot as plt import seaborn as sns C np.load(sub-01_aal90_fisherz.npy) np.fill_diagonal(C, 0) order np.argsort(modules) # modules 来自上一章的模块度划分 C_ord C[np.ix_(order, order)] fig, ax plt.subplots(figsize(7, 6), dpi200) sns.heatmap(C_ord, cmapRdBu_r, center0, vmin-0.8, vmax0.8, squareTrue, cbar_kws{label: Fisher z}, axax) ax.set_xlabel(Brain region (module-sorted)) ax.set_ylabel(Brain region (module-sorted)) fig.tight_layout() fig.savefig(fig_connectivity_matrix.png, dpi300, bbox_inchestight) # 另存矢量图投屏和打印都不糊 fig.savefig(fig_connectivity_matrix.pdf, bbox_inchestight)cmap用发散色带并让center0是为了让正负相关有对称的视觉权重用顺序色带会把负值压成一片浅色。vmin和vmax固定成同一组值是为了让所有被试的图可直接对照否则每人一套色标组间差异就被色标吃掉了。dpi输出 300 是打印底线同时存一份 PDF 矢量图投屏放大时不会出现锯齿。4.2 脑区节点图与 hub 标注把节点按解剖坐标画到脑图上可以直观展示 hub 的分布。工程上一般用 nilearn 的plot_connectome传入节点坐标和边超过阈值的边才画否则连线糊成一团。from nilearn import plotting import numpy as np coords np.load(aal90_coords_mni.npy) # 90x3 的 MNI 坐标 C np.load(sub-01_aal90_fisherz.npy) np.fill_diagonal(C, 0) display plotting.plot_connectome( C, coords, edge_threshold95%, # 只画最强 5% 的边 node_size40, edge_vmin-0.8, edge_vmax0.8, colorbarTrue, ) display.savefig(fig_brain_network.png, dpi300)edge_threshold接受百分比字符串或绝对值教案演示时用百分比更稳因为不同被试的权重尺度不一致。node_size设小一点是因为 AAL90 在小脑和皮层上坐标密集节点太大会互相遮挡。如果想突出 hub可以再传node_color数组把度最高的前十位节点染成另一种颜色这一招在讲富人俱乐部时非常有效。4.3 指标随阈值变化的曲线单点指标几乎没有说服力曲线才有。把稀疏度从 0.10 扫到 0.30步长 0.01每个点算一次聚类系数和路径长度画成双轴折线图。绘图参数建议值原因稀疏度范围0.10 0.30低于 0.10 图易断连高于 0.30 趋近随机图扫描步长0.01兼顾平滑度与计算时间重复抽样次数每被试每阈值固定不随机避免曲线抖动来自抽样而非阈值横轴标签Network density (%)中文教案里统一写网络稀疏度纵轴范围所有被试共用便于目视比较曲线图在教案中的作用是训练怀疑精神如果小世界性只在 0.12 这一个点上大于 1其他点都塌到 1 附近那就该重新检查数据而不是挑那个点写进结论。5. 用 python-pptx 自动生成教案 PPT手工做四十页幻灯片、每页贴一张被试图和一张参数表是纯体力活而且下次换数据就得重来一遍。把上几章的图和指标结果丢给 python-pptx可以做到跑完分析直接出教案。这一章讲版式设计、图表插入和备注页三个关键点。5.1 先定版式再写内容python-pptx 的slide_layouts索引跟着模板文件走直接用空白演示文稿时常用的几个是0 标题页、1 标题和内容、5 仅标题、6 空白。做教案最实用的做法是准备一个自己的母版文件把字体、配色、页脚统一好代码里只引用索引这样换学校模板时不用改代码逻辑。from pptx import Presentation from pptx.util import Inches, Pt prs Presentation(teaching_template.pptx) # 自定义母版含统一页脚 title_layout prs.slide_layouts[0] content_layout prs.slide_layouts[1] blank_layout prs.slide_layouts[6] # 第 1 页课程标题 s prs.slides.add_slide(title_layout) s.shapes.title.text 脑科学与复杂网络研究 s.placeholders[1].text 从影像数据到图论指标可复现的分析流程 # 第 2 页要点页用项目符号占位符 s prs.slides.add_slide(content_layout) s.shapes.title.text 本章要算的六个指标 body s.placeholders[1].text_frame body.text 度与强度连接广度 for item in [聚类系数功能分离, 特征路径长度功能整合, 小世界性 sigma相对随机网络的偏离, 模块度 Q社区结构强度, 富人俱乐部系数hub 之间的互连倾向]: p body.add_paragraph() p.text item p.font.size Pt(20) # 第 3 页空白版式放图避免占位符挤占版面 s prs.slides.add_slide(blank_layout) s.shapes.add_picture(fig_connectivity_matrix.png, leftInches(0.8), topInches(1.2), heightInches(5.2))add_slide每次返回一个新的 slide 对象占位符索引在不同母版里可能不同稳妥做法是先用s.placeholders打印一遍确认。add_paragraph是追加而不是替换所以第一行用text_frame.text直接赋值后续行才用add_paragraph否则会多出一个空行。图片用高度定位而不是同时给宽高是为了保持长宽比同时给宽高会强行拉伸热图会被压变形。5.2 把指标表写进幻灯片教案里指标数值必须有一页汇总表用 python-pptx 的表格 API 直接从 DataFrame 生成避免手抄出错。import pandas as pd from pptx.util import Inches, Pt df pd.read_csv(group_metrics.csv) # 列subject, C, L, sigma, Q s prs.slides.add_slide(content_layout) s.shapes.title.text 组水平指标汇总 rows, cols df.shape[0] 1, df.shape[1] table s.shapes.add_table(rows, cols, Inches(0.6), Inches(1.5), Inches(9.0), Inches(0.4 * rows)).table for j, name in enumerate(df.columns): cell table.cell(0, j) cell.text name cell.text_frame.paragraphs[0].font.size Pt(14) for i in range(df.shape[0]): for j in range(df.shape[1]): v df.iat[i, j] table.cell(i 1, j).text f{v:.3f} if isinstance(v, float) else str(v)表格行高在创建时就决定了add_table的高度参数是初始值行数多的时候文字会自动换行撑高所以给一个偏保守的高度即可。数值统一格式化到三位小数是因为教案里的指标横向对比时位数不一致会让读者误以为精度不同。列名建议直接用C、L、sigma这类短名幻灯片宽度有限中文长列名会被截断。5.3 备注页放参数与脚本路径教案真正的价值在于别人能不能复现正文页放不下这些信息放进备注页最合适。听众看不到助教和下一届学生看得到。备注内容写法建议原因数据来源与版本数据集名称、被试数、模板版本换模板就换结论必须写死预处理参数TR、滤波频段、稀疏度复现失败九成出在这里脚本路径相对路径不用绝对路径换机器仍可运行已知问题该阈值下网络偏稀疏提前说明避免被当场问倒notes s.notes_slide.notes_text_frame notes.text (模板AAL90TR2.0s带通 0.01-0.1Hz 稀疏度 15%脚本 scripts/02_build_network.py) prs.save(脑科学与复杂网络研究PPT学习教案.pptx)notes_slide是惰性创建的第一次访问时才生成备注页不影响正文排版。保存时文件名和标题保持一致是为了让整个课题组按同一命名习惯检索减少最新版是哪个的沟通成本。6. 进阶阈值扫描与零模型检验怎么写进教案教案如果只教到算出指标学生交上来的作业会是一堆无法判断真假的数字。真正拉开差距的是稳健性检验而这一步恰好最容易在课堂上被压缩掉。下面三件事建议直接做成教案里的固定环节。第一件是阈值扫描加显著性带。把每个阈值的组间差异算出来同时用置换检验给出参考分布。置换检验的写法很直接把被试的标签随机打乱若干次常见 5000 次每次都重算组间统计量得到零分布再看真实统计量落在什么位置。这样得到的 p 值不依赖正态假设对样本量小的神经影像研究更稳。import numpy as np from scipy import stats def permutation_test(x, y, n_perm5000, seed42): 两组指标的置换检验返回真实差异与双侧 p 值 rng np.random.default_rng(seed) obs np.mean(x) - np.mean(y) pooled np.concatenate([x, y]) nx len(x) cnt 0 for _ in range(n_perm): rng.shuffle(pooled) diff pooled[:nx].mean() - pooled[nx:].mean() if abs(diff) abs(obs): cnt 1 return obs, (cnt 1) / (n_perm 1) # 加 1 避免 p 值为 0seed固定是为了让教案里的结果可复现学生跑的和你跑的一致。(cnt 1) / (n_perm 1)这个修正是标准做法不加的话最小可能 p 值是 0写进表格不好看也不严谨。多层阈值扫描后要做多重比较校正教案里可以直接用 FDR把校正前后的 p 值并排放比讲公式管用。第二件是零模型选择。小世界性的基准网络有两种常用生成方式保持度序列的随机重连和保持边数但随机布点。前者对富人俱乐部和聚类系数的检验更严格后者更宽松。教案里最好同时给出两条基准曲线让学生看到同一份数据在两种零模型下的 sigma 差了将近一倍从而理解为什么读论文要先看它用了什么零模型。第三件是把整条流水线固化成一条命令。分析脚本、绘图脚本、PPT 生成脚本串起来输入是被试目录输出是 pptx 文件和一份指标 csv。# 一次跑完提取连接矩阵 - 计算指标 - 出图 - 生成教案 python scripts/01_build_network.py --bids /data/ds001 --density 0.15 python scripts/02_compute_metrics.py --input results/matrices --perm 5000 python scripts/03_make_figures.py --input results/metrics --style teaching python scripts/04_build_slides.py --template teaching_template.pptx \ --out 脑科学与复杂网络研究PPT学习教案.pptx每个脚本都保留--density和--perm这类关键参数的命令行入口是为了让下一届学生能在不改代码的前提下试不同设置教案的可教性就体现在这里改一个参数看结论怎么变然后自己判断哪个设置更可信。本文还有配套的精品资源点击获取
