心算的那一分钟 — EEGMAT 序列减法脑电库

三十六人 / 七十二段 EDF / 500 赫兹

来源 https://physionet.org/content/eegmat/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 12
心算的那一分钟 — EEGMAT 序列减法脑电库

信息速览

数据集名称心算的那一分钟 — EEGMAT 序列减法脑电库
数据类型时序信号,波形,元数据,人工标注
规模36 名受试者 / 72 段记录(每人两段)
接入方式https://physionet.org/content/eegmat/1.0.0/
AI 就绪度

闭上眼睛从三千一百四十一开始,每次减四十二。三千零九十九,三千零五十七,三千零一十五……到第三个数的时候,脑子里的数字开始打滑,你得回去重算一遍。这段体验几乎每个人都有过,但它落在头皮上是什么样子,需要一台放大器才能看见。

基辅的两支团队在 2010 年代初做了一件很朴素的事:让三十六名大学生坐在椅子上,先安静地记录一分钟,再让他们做一分钟连续减法,把这两分钟各留一段六十秒的干净记录。库里没有复杂的范式、没有反馈界面、没有几百个通道,只有这两段被清洗过的脑电,和一张写着年龄、性别、减法次数的表格。

正因为朴素,它成了认知负荷研究里被反复取用的那一份。本篇按官方页面与文件本身的口径把这个库讲清楚:它是什么、结构如何、能做什么、在哪里会失灵。一屏速览见下表。

维度 内容
全名 EEG During Mental Arithmetic Tasks
库名缩写 EEGMAT(MAT 指 Mental Arithmetic Task,不是 .mat 文件)
发布方 PhysioNet
贡献者 Igor Zyma、Sergii Tukaev、Ivan Seleznov 等七人
首次发布 2018 年 12 月 17 日,版本 1.0.0
DOI 10.13026/C2JQ1P
配套论文 Zyma 等,《Data》2019 年第 4 卷第 1 期,文章号 14
受试者 36 名健康大学生(16 至 26 岁,女 27 男 9)
记录数 72 段,每人静息与心算各一段
每段时长 60 秒,官方称无伪迹片段
采样率 500 Hz(页面未写,见文件头)
通道 官方称 23 通道系统;文件头 22 路信号(19 脑电 + A2-A1 + 心电 + 标注道另计)
参考 互联耳电极
预处理 30 赫兹高通、50 赫兹陷波、独立成分分析去伪迹
标签 段级:静息/心算;受试者级:减法次数与好差分组
文件格式 EDF,附 subject-info.csv
体积 未压缩 175.1 兆字节
许可 ODC-BY 1.0,免注册
缺什么 原始未清洗信号、逐题行为记录、官方划分、采样率说明

§1 它要解决的具体麻烦

1.1 心算是最便宜的认知负荷,也是最难量化的

让一个人进入"努力思考"的状态,实验室里有几十种办法:n-back、持续注意、情绪诱发、视觉搜索。它们各有代价——要程序、要显示器、要精密的计时、要经过验证的图片库。

连续减法几乎是所有办法里最便宜的一种。实验员口头给出两个数,受试者开始减,每减一次报一次结果,不需要屏幕,也不需要纸笔。正因为便宜,它在临床神经心理评估里用了几十年,一百减七就是简易精神状态检查的经典题。

便宜的另一面是难以量化。减法的速度取决于数字大小、算术熟练度、旁边有没有人听、错了要不要重来;同一个人在同一分钟里,也可能前半段极快、后半段卡住。这些差异落在脑电上,会和任务本身的效果搅在一起。这个库的贡献,就是把"任务"和"行为"分开记:脑电是两段各六十秒,行为压缩成两个受试者级的数字——四分钟内减了多少次,以及据此分到哪一组。

1.2 三条常见的错误期待

第一条,期待它是一个 .mat 格式的库。 这是库名最容易引发的误读。EEGMAT 的 MAT 来自 Mental Arithmetic Task,官方全名写得很清楚。文件清单里七十二个文件全部是 .edf,加一张逗号分隔表,没有一个是 MATLAB 的二进制 .mat。指望用 scipy.io.loadmat 打开的人,第一步就会卡住。

第二条,期待它包含原始记录。 公开的是清洗后的结果。官方原话是全部记录都是经独立成分分析处理过的无伪迹片段,处理掉的是眼、肌与心搏三类干扰。这带来了极干净的波形,也带走了原始信号:没有原始数据,就没有成分分离矩阵,也就无法比较"我的校正方法"与"他们的校正方法"谁更好。

第三条,期待它有逐题标注。 库里没有任何一个时间点被标成"这一题答对了"或"这一题卡住了"。任务期间只有一条连续六十秒的信号,行为数据在受试者表里是四个数字之一:减法次数。要研究"答错前后脑电怎么变",这个库给不了。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
静息与任务态的两状态对比 每人一对严格配对的六十秒记录 够,配平设计是它最大的优点
认知负荷的二分类基线 七十二段,标签干净 够做基线,跨人泛化难
频谱与相干分析 十九路脑电,耳电极参考,覆盖标准布点 够,这正是论文的分析对象
去趋势波动分析等时间尺度指标 六十秒连续片段,五百赫兹 够,长度与采样都支持
伪迹校正方法的比较 只有清洗后的结果 不够,没有原始信号
逐题的反应时与正确率 只有四分钟的总次数 不够,粒度太粗
个体内重复测量与稳定性 每人只有一段任务 不够
老年或临床人群的负荷评估 全部是十几到二十几岁的学生 不够,一点都没有
高密度空间滤波与源定位 十九路标准布点 勉强,只能做粗定位
在线负荷监测系统的训练 离线数据,无时间标签 可做离线原型,不能直接上线

1.4 你的处境与它能帮到的事

你的处境 它能帮你什么 下一步该做什么
你要做一个认知负荷检测的原型,手上没有任何数据 三十六人、两种状态、标签干净,够跑通管线 先按受试者留一做划分,拿到诚实的基线(§5.5)
你在做脑电的频谱与相干分析,需要一个标准练手库 十九路标准布点,耳电极参考,处理流程清楚 直接复现论文的频段对比,看看结论是否成立
你在读心算相关的文献,想核对原文的数字 原始 EDF 与官方表格一一对应,可逐条核对 先打开一段(§4.3 的案例)确认字段含义
你想比较不同伪迹校正方法 它只能当"已经被清洗过"的参照 另找一个保留原始信号的库,把本库当上界参照
你在教学,要讲清楚一次认知实验的完整链路 从设备、布点、任务到文件命名,全部有据可查 用一段六十秒做演示,学生一次就能看懂
你需要做跨数据集的外部验证 体量小、免注册、格式标准 全量 175 兆,一次下完,当外部测试集用
你要研究不同参考方式的影响 耳电极参考已在文件里,脑电为单极导联 可以离线换成平均参考或重参考,做对照
你的课题要求受试者有年龄跨度 全部为 16 至 26 岁 换库,这里没有年龄分层

1.5 一句话判断

它不提供更多数据,而是提供一组配得最齐的对照片:同一个人、同一副电极、同一分钟长度,唯一的差别是算不算题。

1.6 不适合谁:四条边界

不适合拿它证明某类模型"能识别认知负荷"。 三十六个人、每人一对记录,任何在随机划分下取得的高准确率,都要先排除受试者泄漏。在这个库上报一个漂亮的数字很容易,报一个经得起留一受试者检验的数字很难。

不适合拿它做伪迹处理研究。 公开数据已经过独立成分分析,眼电、肌电与心搏成分都不在了。拿它评估一个去伪迹算法,相当于拿一篇已经改过的稿子去测校对软件。

不适合拿它做行为学推论。 行为只剩减法次数,而且是四分钟的总数,没有逐题记录。关于"心算难度如何随进度上升"、"出错后是否变慢"这类问题,库里没有可用的时间序列。

不适合拿它做临床或老年人群的结论。 受试者是基辅一所大学的学生,年龄集中在十八九岁。任何关于老年人认知衰退、注意力缺陷或术后谵妄的推论,都超出了这批数据的边界。

§2 数据构成与规格

2.1 一个扁平目录、七十二个文件

整个库的顶层结构简单到可以用一句话讲完:七十二个 EDF 文件,加上记录清单、校验和、说明文件与一张受试者表。没有子目录,没有分组文件夹,没有按任务或按年份拆开的结构。

文件名只有一种形态:SubjectNN_1.edf 与 SubjectNN_2.edf,NN 从 00 到 35 两位数字。后缀 _1 是任务前静息,_2 是心算。也就是说,受试者编号与段类型完全由文件名编码,读目录就够,不需要先读一张映射表。

顶层项 体积 作用 能否省
Subject00_1.edf 至 Subject35_2.edf 主体 七十二段六十秒记录 不能
RECORDS 1.1 KB 七十二行文件清单 不能,是遍历入口
README.txt 2.7 KB 协议、设备、预处理、任务说明 不能,是唯一的文字说明
subject-info.csv 1.0 KB 受试者级元信息,三十六行 不能,标签都在这里
SHA256SUMS.txt 5.9 KB 全库校验和 建议留,用于完整性核对

体积上有一条明显规律:多数 _1 文件是 3.7 兆字节,_2 文件是 1.3 兆字节,少数 _1 只有 1.6 兆字节。官方没有解释差别,它只影响存储,不改变标称时长。

2.2 字段与记录的完整字典

EDF 的头部分成两截:前 256 字节是固定字段,之后每路信号各占 256 字节。官方称系统是 23 通道,而文件头里报告的信号数是 22,头长因此是 256 + 22 × 256 = 5888 字节。以 Subject00 的静息段为例,固定字段的取值如下。

EDF 固定字段 实际取值 含义与注意点
版本 0 后跟空格 标准 EDF 标记
患者标识 Subject0 只有编号,被截在十六字符以内
记录标识 空 未填写运行名
开始日期 01-JAN-1990 官方另写了一句:全部文件的记录时间被设为 1 月 1 日
开始时间 0 与日期一样,是占位值
设备标识 NeuroCom_Professional_3.0.0 采集软件与版本
保留字段 EDF+C 声明为连续记录
数据记录数 182 每秒一块,每块 500 点
记录时长 1 秒,即每个数据记录一秒
信号数 22 与官方所称 23 通道差一路

设备标识这一栏里另有一段串码 01.01.1100.00.005888,紧挨着还有一句 Startdate 01-JAN-2011。后者可能与实际的采集年份有关,但它是软件写入的自由文本,官方没有把它作为字段来解释,读取时不宜当成可靠日期。

每路信号再占 256 字节,字段顺序固定。把 22 路拆开来看,构成如下。

信号组 路数 标签 说明
脑电 19 Fp1、Fp2、F3、F4、F7、F8、T3、T4、C3、C4、T5、T6、P3、P4、O1、O2、Fz、Cz、Pz 10/20 国际系统的标准十九点
耳电极参考 1 A2-A1 两侧耳电极的差分,官方称全部电极以此为参考
心电 1 ECG 一路心电,用于识别心搏伪迹
标注道 1 EDF Annotations 标准 EDF+ 标注通道,本库几乎为空

十九个脑电标签正好是 10/20 系统的经典十九点:额极两路、额四路、额外侧两路、中颞两路、中央两路、后颞两路、顶两路、枕两路,再加中线三路。这个布点覆盖了整个头皮,适合做从头前到枕区的梯度比较,但不支持高密度的空间滤波——采样点之间的距离太远。

2.3 一条记录的完整解剖

把 Subject00 的静息段完整拆开,一层层看下去,能看清这批数据的组织逻辑。下面这段代码只读文件头与首个数据记录,不需要把整个文件读进内存。

#-- 逐层解剖一段记录:头、通道、时长
import pyedflib

path = "Subject00_1.edf"
with pyedflib.EdfReader(path) as f:
    print("信号数", f.signals_in_file)
    print("采样率", set(f.getSampleFrequencies()))
    print("时长秒", f.getFileDuration())
    print("通道名", f.getSignalLabels())
    #-- 前六路取前十个采样点,确认量纲
    for i in range(6):
        print(f.getLabel(i), f.readSignal(i)[:10].round(2))
    #-- 标注道通常没有内容,取出来确认为空即可
    print("标注条数", len(f.readAnnotations()[0]))

跑完会看到三样东西:22 路信号、统一的 500 赫兹、六十秒的时长。采样率是这批数据里最容易被忽略的一项——官方页面从头到尾没有写它,只能从文件头读出来。

再往下是数据区。每个数据记录是一秒,一秒之内按信号顺序把 22 路各若干采样点排开,路与路之间不是按时间交错,而是按通道整块排列。这意味着只想要某一路时,仍然要把整条记录读进来再抽列,不能像某些多通道格式那样跳读。

解剖层级 内容 数量 备注
库 一次实验的全部记录 七十二段 扁平存放
文件 一名受试者的一个状态 一段六十秒 后缀 _1 静息、_2 心算
数据记录 EDF 的一个块 六十个 每块一秒
信号 一路电极 二十二路 十九脑电 + 耳电极 + 心电 + 标注
采样点 一路信号的一个时刻 与采样率相乘 见文件头
标签 段级任务状态 二类 由文件名后缀给出

2.4 受试者表:一行一个人,五列信息

subject-info.csv 是这个库唯一的结构化元信息。三十六行,每行一名受试者,六列。

列名 取值形态 说明
Subject Subject00 至 Subject35 与文件名前七字符一致,是连接键
Age 整数,16 至 26 官方论文称受试者年龄相当
Gender F 或 M 以字母表示
Recording year 2010、2011、2012 三年分批采集
Number of subtractions 小数,带两位 四分钟内完成的减法次数
Count quality 0 或 1 1 为好数者,0 为另一组

最后两列是这个库最有信息量、也最容易被误读的地方。减法次数不是整数,说明它是一次换算的结果;计数质量是 0 或 1,官方页面把 1 解释为质量好的那一组、0 为另一组。

分组 官方定义 人数 四分钟内减法次数的官方均值
质量好的组 计数质量好,官方标签为 1 24 21
质量差的组 计数质量差,官方标签为 0 12 7

值得注意的是,同一份材料对这两个数字只给了均值与标准差,没有给出逐人明细的说明;而表里逐人的小数次数是可以直接读出来的。两类口径之间不需要互相验证,它们是同一件事的两种呈现——一个汇总在官方正文,一个展开在表里。

2.5 与同类资源的字段差异

同为脑电,认知任务库与临床库在字段设计上差别很大,而这些差别直接决定能做什么任务。

字段维度 本库 运动想象类库 情绪诱发类库 临床癫痫长程库
受试者规模 三十六人 百人量级 三十余人 数十至数百例
每人记录数 两段 十余次运行 数十个试次 数小时至数天
通道数 十九脑电 六十余导 三十余导 十九至二十余导
任务标签 段级二类 试次级四类 试次级多维 发作区间
行为数据 一个汇总次数 无 自评量表 临床记录
预处理状态 已做独立成分分析 多为原始 多为原始 原始
时长粒度 六十秒 数分钟一次运行 数十秒一段 连续数小时

它的信息密度集中在"配对整齐"这一列,其它维度的密度都偏薄,尤其是行为数据与原始信号。

2.6 一百七十五兆的体量与三次下载

官方页面给出的未压缩体积是一百七十五点一兆字节。对一个有七十二段、每段六十秒、二十二路信号的库来说,这个数字是合理的:每段约两兆字节,符合画面里 3.7 兆与 1.3 兆交替出现的观察。

同一页面上还列出了三条获取途径:整包 ZIP、wget 递归、AWS 命令行同步到开放桶。三条路径内容一致,差别只在断点续传与并行度。对一个一百多兆的库来说,这几乎是下载方式的全部区别——无论哪条路,几分钟内都能拿全。

2.7 用一个循环拼出全部七十二个文件名

#-- 枚举全部文件名,顺序与 RECORDS 一致
names = [f"Subject{n:02d}_{s}.edf" for n in range(36) for s in (1, 2)]
print(len(names), names[0], names[-1])
assert names == open("RECORDS").read().split()

最后一行把拼接结果与官方清单逐项比对,不通过说明某个编号有特殊处理。

§3 它是谁的数据:一支联合团队、一台高采样的机器

3.1 七位作者与两所学校

官方页面的作者栏列了五个人:Igor Zyma、Ivan Seleznov、Anton Popov、Mariia Chernykh、Oleksii Shpenkov,并在贡献者一栏另写三人:Igor Zyma、Sergii Tukaev、Ivan Seleznov,机构记为乌克兰国立技术大学「伊戈尔·西科尔斯基基辅理工」电子工程系。论文的作者列表则是七人,多出 Sergii Tukaev 与 Ken Kiyono 两位。

拼起来看,作者是一条横跨两所基辅高校、又牵到大坂的线:生理方向在舍甫琴科国立大学,信号方向在基辅理工,方法学合作在大坂大学。

角色 姓名 机构 出处
第一作者 Igor Zyma 基辅塔拉斯·舍甫琴科国立大学 论文与页面一致
贡献者 Sergii Tukaev 同上,脑与心理生理方向 论文与 README
贡献联系人 Ivan Seleznov 基辅理工电子工程系 页面联系邮箱
贡献者 Anton Popov 基辅理工电子工程系 页面
贡献者 Mariia Chernykh 基辅塔拉斯·舍甫琴科国立大学 页面
贡献者 Oleksii Shpenkov 基辅塔拉斯·舍甫琴科国立大学 页面
方法学合作 Ken Kiyono 大坂大学基础工学研究科 论文作者列表

页面作者栏与贡献者栏并不完全重合,这是 PhysioNet 的常见现象:前者是元数据里的署名,后者是捐赠时的登记。两者都以官方页面为准并列,不存在谁更正的问题。

3.2 配套论文说了什么

官方推荐的引用是一篇发表在《Data》期刊的文章,标题直译是《心算任务执行期间的脑电图》。摘要里把动机写得很清楚:这项工作的目的是支撑对脑电的傅里叶功率谱、相干与去趋势波动特征的考察——也就是在完成心算任务时,这些特征怎么变。

摘要还交代了三件关键信息。第一,记录涵盖国际 10/20 系统的脑电,既有任务态也有对应的静息参照。第二,根据减法表现(次数与结果准确性),受试者被分成好数者与差数者两组,后者的心算需要付出更多努力。第三,受试者是三十六名年龄相当的健康志愿者,全部是基辅塔拉斯·舍甫琴科国立大学的学生,记录通过 PhysioBank 平台公开。

这篇论文属于"数据描述论文"这一类型:它的核心产出不是一项新发现,而是把数据本身连同采集协议、预处理流程与分析示例一起讲清楚,让后来者能复现。读它主要是为了理解字段与流程,而不是为了拿一个结论。

3.3 时间线

从采集到发布,这批数据跨了将近十年,中间几段时间长度差别很大。

时间 事件 依据
2010 至 2012 年 受试者分批采集,表中记录年份三年 subject-info.csv
2018 年 11 月 15 日 README 文件的修改时间 文件清单
2018 年 12 月 12 日 RECORDS 与受试者表的修改时间 文件清单
2018 年 12 月 17 日 PhysioNet 正式发布 1.0.0 版 官方页面
2019 年 1 月 18 日 论文正式出版 Crossref
2019 年 3 月 20 日 校验和清单的最后修改时间 文件清单

有两个细节值得记住。第一,数据先上平台、论文后出版,中间隔了一个月,所以引用的规范是"数据 DOI 加论文 DOI"两条并列。第二,最后的修改是补校验和,说明信号与标签自发布起没被动过,只有一个版本号,没有修订说明。

3.4 采集现场:一台 23 通道系统、一副耳电极

官方对采集条件的描述不长,但每一句都对应一个后来会遇到的读取问题。

系统是 Neurocom 出品的 23 通道脑电仪,产地乌克兰。官方写明按 10/20 国际系统布点,银氯化银电极单极导联。参考方式是关键:全部电极以互联的耳电极为参考。这意味着文件里的脑电幅值不是相对某个导入电极的电位,而是相对双耳平均。要换参考,得自己动手。

预处理也写在数据说明里:30 赫兹高通、50 赫兹工频陷波,再做独立成分分析去掉眼、肌与心搏三类干扰。拿到的脑电既没有低频漂移,也没有工频噪声,也没有眨眼跳变。

采集要素 取值 后果
设备 Neurocom 23 通道系统 官方通道数与文件头场数差一路
电极 银氯化银,单极导联 类似湿电极,阻抗需记录但未公开
布点 10/20 国际系统 十九个经典点,位于头皮全覆盖
参考 互联耳电极 脑电幅值相对于双耳平均
高通 30 赫兹 慢波与直流成分已被移除
陷波 50 赫兹 工频噪声已抑制
伪迹处理 独立成分分析 眼、肌与心搏成分已剔除

三十赫兹高通是一项特征很强的选择。它保留了伽马以上的一部分,但把 delta 与 theta 的低端大幅削弱。做 theta 频段分析时,这个截止频率会直接影响结果,必须知道自己用的是什么滤波器、原数据已经滤过什么,否则会重复滤波或误判能量分布。

3.5 两个口径:23 通道系统与 22 路信号

有一处必须摊开来讲,因为它会影响任何按通道做的分析。

官方页面与 README 的原话是:脑电记录使用 23 通道的 Neurocom 系统。按字面理解,文件里应该有二十三个信号道。

而文件头里报告的信号数是 22,逐路标签读出来是十九路脑电、一路 A2-A1、一路心电、一路标注道。合格的通道合计二十,加标注道二十一路,仍比官方说的二十三少两路。

口径 数量 构成 出处
官方描述 23 采集系统标称通道数 页面与 README
文件头 22 信号字段的实际取值 Subject00_1.edf 头区
逐路标签 22 19 脑电 + A2-A1 + 心电 + 标注 同上

差额从哪来,官方没有说明。常见的可能有两类:采集系统的 23 路里有一路是系统内部的参考或触发通道,未被写入 EDF;也可能有两路在导出时被合并。两种都只是推测。稳妥的写法是:做分析时以文件头为准,写方法学时同时交代两个数字。

这不是小事。如果你的流程按"二十三路脑电"设计通道数组,代码会在读入时直接报维度不匹配;如果按二十三路除以人数做统计,通道数与样本量的口径会对不上。

§4 它最独特的东西:把静息当成对照组

4.1 组内设计:同一副电极、同一分钟、只差一次任务

多数认知负荷数据集是组间设计:一部分人做任务、一部分人不做。这类设计的麻烦在于,任务态的差异可能混进时间、疲劳、阻抗变化这些与任务无关的因素。

这个库选了最省钱也最干净的做法:每个人都在同一次到访里,先记录一段静息,再做一段心算。两段用同一副电极、同一个参考、同一套滤波、同样的六十秒长度,唯一变化的变量就是"算不算题"。

代价也很明确。同一分钟里,后一段天然比前一段晚;受试者在任务段可能更紧张、更专注,也可能因为坐得久了而更疲惫。设计上没有用一个交叉顺序来平衡这个效应——官方没有提到有半数是先算题后静息。所以"任务态与静息态的差异"这个结论,严格说来包含了一部分时间效应。

设计选择 常见做法 本库做法 后果
受试者内对比 多条件、交叉平衡 只有两段,顺序固定 干净但含时间效应
每段长度 数十秒到几分钟不等 统一六十秒 可直接对齐、可直接叠加
伪迹处理 多数留原始信号 独立成分分析后交付 干净但不可再处理
行为记录 逐题反应时与正确率 只有四分钟总数 只能做粗粒度分组
任务难度调节 多档难度 一档,因人而异 难度是自然变异不是自变量

第四行是它最特殊的地方。难度的调节不是由实验者设定的,而是由受试者自己的表现自然形成的——官方据减法次数把三十六人分成好数者与差数者两组。这是把"行为变异"当成了分组标签,而不是当成受控的自变量。

4.2 好数者与差数者:一个自然形成的分组

官方据四分钟内的减法次数与结果准确性把受试者分成两组,描述里说差的那一组"心算需要付出更多努力"。

这个分组有两层用处:当协变量放进模型,看任务态差异是否主要体现在差数者身上;当稳健性检验,看某个结论是否只在好数者身上成立——若如此,它反映的可能是"算术熟练"而非"认知负荷"。

同样是四分钟,一组做了二十来次减法,另一组只做了七次。差额主要来自计算速度与是否卡住,这两者在脑电上可能对应完全不同的模式:一个流畅的连续加工,一个断续的重新起始。差数者只有十二人,以这一组为主体的分析统计功效有限。

4.3 案例:Subject00 的两分钟

拿一名具体受试者走一遍,比抽象描述有用。选 Subject00,因为它在清单第一行,任何人都能直接对上,且它的两段文件都在常规体积之列。

打开两段的头:都是 22 路信号、六十秒。第一段文件名后缀是 1,第二段是 2。在受试者表里找到第 00 行,年龄二十一岁、性别女、记录年份 2011、四分钟减法次数与计数质量各有一个值——她属于哪一组,从表里一眼可见。

把两段并排放在一张图上,能看到的不是"任务态更活跃"这么简单。三十赫兹高通已经削掉了慢波,工频噪声也不在,剩下的差异主要体现在节律的强弱与相位关系上,而这两样正是论文要量的东西:功率谱、相干、去趋势波动。

再看这两段缺什么。没有原始信号、没有眨眼时刻、没有每一道减法的起止、没有按键或口头报数的时刻。要研究"从静息进入任务的那几秒怎么过渡",数据里没有那段过渡——两段是分开截取的,中间可能隔了很久。

§4.3 的案例换个角度看:这两段合计两分钟,是全部十二分钟实验里被保留下来的六分之一。剩下的十分钟去哪了,官方没有交代,只说交付的是无伪迹片段。

两段之间只有一处差别:算不算题。

4.4 减法任务本身:四位数减两位数

任务形式决定了信号里会有什么。

官方描述是:每次试验开始时,实验员口头给出一个四位数(被减数)与一个两位数(减数),例如三千一百四十一与四十二。受试者接着连续相减,每一次的结果成为下一次的被减数。

被减数每次不同,意味着每道题的难度略有浮动;减数是两位数,借位在所难免;口头给出而非屏幕显示,意味着没有视觉诱发成分,也没有锁时事件。最后这点最重要:库里没有任何刺激时刻标记,所以做不了事件相关电位分析,只能做连续信号的统计特征分析。

受试者在不停地报数,口腔与颌部的肌电会很强。成分分析若不彻底,残余高频噪声会抬高高频段功率,影响跨组比较;做频谱分析时把伽马段单独看一眼,是个便宜的检查。

4.5 边界条件:什么情况下它不再适用

五种情况下这批数据会失效,且失效方式各不相同。

第一种,任务从"两状态"变成"多难度"。 库里只有一档难度,且难度是自然变异。要做负荷的连续估计或三档以上的分级,这里没有对应的标签。

第二种,需要时间分辨的标签。 六十秒是一整段,中间没有任何分界。想在秒级上标记"这一秒负荷高",只能自己造标签,而造出来的标签没有金标准。

第三种,需要比较伪迹处理。 交付物已经被清洗过,原始信号未公开。任何以"去伪迹前后的差异"为核心的课题都用不了。

第四种,需要人群推断。 三十六名基辅的大学生,年龄十六到二十六。任何关于老年人、儿童或临床患者的结论都超出范围。

第五种,需要重复测量。 每人只有一段任务。想估计个体内的稳定性,或想做前后测的干预研究,这里给不出第二条任务段。

§5 怎么拿到:从 curl 到可训练张量

5.1 目录结构与下载面

官方给三条路:浏览器点 ZIP、wget 递归、AWS 开放桶同步。文件是扁平的,脚本遍历非常直接——不需要先解析目录树,只要按 Subject00 到 Subject35 与两个后缀拼文件名即可。

下载方式 命令要点 适合场景 注意
ZIP 页面按钮 一次性拿全量 一百七十五兆,几分钟内完成
wget 递归 加 -r -N -c -np 需要续传 会连目录索引一起拉
AWS 同步 s3 sync --no-sign-request 批量、可并行 需要装命令行工具
逐文件 直接拼 URL 只取几段做实验 最省流量

因为体积小,三条路的差别远不如大库明显。真正值得挑的是"只下一部分"这个选项:做教学演示拿两三个人就够,做留一受试者验证才需要全量。

5.2 批量下载

下面这段把全量拉到本地,跳过已存在的文件,中断后重跑不会重复下载。

#-- 拉取全部七十二段,跳过已存在文件
BASE="https://physionet.org/files/eegmat/1.0.0"
mkdir -p eegmat && cd eegmat
curl -sSL -O "$BASE/RECORDS"
for n in $(seq -w 0 35); do
  for seg in 1 2; do
    f="Subject${n}_${seg}.edf"
    if [ ! -s "$f" ]; then
      curl -sSL --retry 3 -o "$f" "$BASE/$f"
    fi
  done
done
#-- 同时拿受试者表与校验和
curl -sSL -O "$BASE/subject-info.csv"
curl -sSL -O "$BASE/SHA256SUMS.txt"
#-- 核对文件数应为七十二
ls Subject*_*.edf | wc -l

seq -w 0 35 给出两位编号,正好对上 Subject00 到 Subject35。最后一行输出七十二说明下载完整。若某个文件只有几百字节,多半是网络中断留下的残片,删掉重下即可——校验和清单可以确认。

#-- 校验完整性,失败会打印文件名
sha256sum -c SHA256SUMS.txt --quiet || echo "有文件校验失败"
#-- 统计文件数,应为七十二
ls Subject*_*.edf | wc -l

5.3 读头、接表、确认采样率

读进来之后第一件事不是滤波,是先确认采样率与通道名。官方页面没有写采样率,必须从文件里取。

#-- 读一段,核对采样率、通道与时长
import pandas as pd, pyedflib

info = pd.read_csv("subject-info.csv").set_index("Subject")
with pyedflib.EdfReader("Subject00_2.edf") as f:
    sfreq = f.getSampleFrequency(0)
    labels = f.getSignalLabels()
    dur = f.getFileDuration()
    print("采样率", sfreq, "时长", dur, "路数", len(labels))
    print("脑电通道", [x for x in labels if x.startswith("EEG")])
print(info.loc["Subject00"])

打印出来应能看到 22 路、六十秒、十九个以 EEG 开头的通道名,以及 Subject00 那一行的年龄、性别、年份与减法次数。三个数对不上的话,先回去确认文件是否下全,别继续往下走。

5.4 换参考与频段分析

参考方式决定幅值。文件里的脑电是相对互联耳电极的,如果要做平均参考,或者只保留十九路脑电做空间分析,这一步得自己补。

#-- 读入、转成平均参考、按频段算功率
import mne, numpy as np

raw = mne.io.read_raw_edf("Subject00_2.edf", preload=True, verbose="ERROR")
raw.set_channel_types({"ECG": "ecg"})
#-- 去掉非脑电通道后再设参考,避免把心电算进平均
eeg = raw.copy().pick([c for c in raw.ch_names if c.startswith("EEG")])
eeg.set_eeg_reference("average", verbose="ERROR")
bands = {"theta": (4, 8), "alpha": (8, 13), "beta": (13, 30)}
for name, (lo, hi) in bands.items():
    psd = eeg.compute_psd(method="welch", fmin=lo, fmax=hi, verbose="ERROR")
    print(name, round(float(psd.get_data().mean()), 3))

注意读取之后先用 pick 把心电与参考道排除,再做平均参考。十九路里混进一路心电,平均参考会被心电的尖峰带偏,进而污染每一路脑电。

另一个必须提醒的点是三十赫兹高通。官方在采集时已经滤过,读入后再滤一次并不会更干净,只会让三十赫兹附近的相位失真加倍。做频谱分析时,先看清原始数据已经滤掉了什么。

#-- 只读头区,批量核对时长与路数
for f in Subject*_*.edf; do
  python3 -c "
import pyedflib, sys
with pyedflib.EdfReader(sys.argv[1]) as e:
    print(sys.argv[1], e.getFileDuration(), e.signals_in_file)
" "$f"
done | sort | uniq -c | head

输出若出现与六十秒不符的行,先怀疑文件没下全。

5.5 切分与划分:按人,不按段

这个库最大的陷阱不在读文件,在划分。每人只有两段,一段静息一段任务,如果按文件随机切成训练集与测试集,同一个人极可能同时出现在两侧。

#-- 按受试者构造特征,留一受试者交叉验证
import numpy as np, pandas as pd

rows = []
for n in range(36):
    sid = f"Subject{n:02d}"
    for seg, task in (("1", 0), ("2", 1)):
        rows.append({"sid": sid, "task": task,
                     "file": f"{sid}_{seg}.edf"})
meta = pd.DataFrame(rows)
print(meta.groupby("sid")["task"].sum().value_counts())
#-- 每人两段,求和恒为 1,确认没有缺段
folds = sorted(meta["sid"].unique())
for held in folds[:3]:
    tr = meta[meta.sid != held]
    te = meta[meta.sid == held]
    print(held, len(tr), len(te))

这里的 groupby 求和应恒为 1:每人一段静息(0)加一段任务(1)。若某个编号出现 0 或 2,说明文件名后缀解析错了。划分时以 sid 为单位留一,测试集永远只含一个人的两段。

结果通常不好看,而这正是这个库的诚实之处。同一个人内部的两状态差异往往很大,跨人之后,任务态的脑电模式会向个体差异让位。无论报告什么数字,都要说明这是留一受试者的结果,而不是随机按段划分的结果。

5.6 五个最容易出错的地方

出错点 表现 原因 处理
当 .mat 文件读 找不到文件或格式错误 库名的 MAT 指心算任务 按 EDF 读,用 pyedflib 或 mne
按段随机划分 测试准确率异常高 同一人两段跨集泄漏 按受试者留一(§5.5)
假设采样率 时轴长度对不上 官方页面未写采样率 从文件头读,是 500 赫兹
把心电当脑电 平均参考后各路都带尖峰 未排除 ECG 与 A2-A1 先 pick 只要 EEG 通道
重复高通滤波 三十赫兹以下功率异常低 原数据已经过了 30 赫兹高通 读清预处理再决定滤不滤

最后一条值得多说一句。三十赫兹高通意味着原始数据里三十赫兹以下已经被大幅衰减,这会让 theta 与低频 alpha 的分析变得敏感——那里剩下的能量本就不多。若你的课题以 theta 为主,第一件事就是承认这个截止频率,并在方法里写清楚。

§6 与库内条目的关系

6.1 关系图谱

站内与脑电有关的记录已经不少,且分成了好几类。与本库真正需要划清界限的,是运动想象类、情绪诱发类、癫痫临床类与新生儿类这四族,以及一个容易混名的听觉注意库。

库内记录 与本库的关系 主要差别
EEGMMIDB 同为 PhysioNet 上的任务态脑电 它是运动执行与想象,百人量级,每人多次运行
ltrsvp 同为任务诱发,同为健康受试者 它是快速序列视觉呈现,八通道,二类目标检测
DEAP 同为三十余人的小样本任务库 它是情绪诱发,含主观量表与多路外围信号
bonn-eeg 同属二类分类用途 它是癫痫发作与间期的片段分类,不是认知任务
tuh-eeg-corpus 同为十九导临床布点 它来自医院连续记录,本库来自实验室实验
eeg-dash 同为运动想象,但是聚合镜像 它把多个来源打包,本库是单一实验
auditory-eeg 同属注意类任务 它研究听觉注意解码,有试次级标签
eeg-power-anesthesia 同属认知状态标签 它标的是麻醉意识状态,本库标的是算不算题

规律很清楚:本库是站内少数"任务极简、标签极粗、配对极整齐"的记录。其它任务态库用试次级标签换信息量,它则几乎放弃时间粒度,把全部信息压在"两状态对比"上。

6.2 检索路径

站内检索用 slug eegmat,或全名 EEG During Mental Arithmetic Tasks。中文关键词建议用"心算脑电"而不是"脑电",因为后者会返回一大批运动想象与癫痫库;用"认知负荷"也容易命中一批外部资源,需要再用"基辅"或"序列减法"收窄。

按需求找:要百人量级、多次运行的任务态脑电,去 EEGMMIDB;要试次级的视觉目标检测,去 ltrsvp;要带自评量表的情绪诱发,去 DEAP;要临床癫痫的片段分类,去 bonn-eeg;要两状态、配对干净、体量小到可以放进课程材料里的库,才轮到本库。

6.3 三张对照表:任务、标签粒度、处理状态

三个维度分开列,因为它们最容易混淆,也恰好决定了一个库能做什么。

第一张是任务与人群。

库 任务 受试者 样本量级
本库 连续减法心算 三十六名健康大学生 七十二段
EEGMMIDB 运动执行与想象 百余人 千余次运行
ltrsvp 快速序列图像目标检测 十余人 数次飞行
DEAP 音乐视频情绪诱发 三十余人 千余个试次
bonn-eeg 无任务,癫痫间期与发作 五名患者 五百段

第二张是标签粒度,决定能用什么统计单位。

库 最细标签 统计单位 是否支持事件相关分析
本库 段级二类(静息/心算) 人 否,无锁时事件
EEGMMIDB 运行级任务类型 运行 是,有提示时刻
ltrsvp 试次级有无目标 试次 是,有呈现时刻
DEAP 试次级评价值 试次 是,有刺激起止
bonn-eeg 片段级二类 片段 否

第三张是预处理状态,这一维最容易被忽略,却直接决定能不能做方法学研究。

库 原始信号 滤波状态 伪迹处理
本库 不保留 已 30 赫兹高通与 50 赫兹陷波 已做独立成分分析
EEGMMIDB 保留 未滤或仅轻微滤波 未处理
ltrsvp 保留 未滤 未处理
DEAP 保留 已下采样至 128 赫兹 未处理
bonn-eeg 保留 已带通 已人工剔除

把三张表叠起来看,本库的位置很清楚:任务最简单、人群最单一、标签最粗、预处理最深。它占的是"干净但对照片"这个角。把它当 EEGMMIDB 的替代品,第一步就会撞上样本量;把它当原始信号库,第二步就会发现无可处理。

6.4 与站外心算资源的区别

站外常被拿来比较的有三类。第一类是情绪与认知负荷混合的多模态库,同步记录脑电、眼动、皮电与心率,外加量表。模态全,但个体差异被多路信号稀释,单模态分析反而多一层对齐。本库只有脑电与一路心电,对齐成本几乎为零。

第二类是驾驶、飞行模拟等自然场景的负荷监测数据,标签来自任务难度分级,生态效度高,但受试者少、场景不可控。本库条件可控,代价是生态效度低。

第三类是公开的算术任务基准,把心算与其他认知任务混在同一批人身上。它们能做任务间对比,但每个任务分到的受试者更少。本库只在心算一件事上做深。

§7 质量评估与局限性

7.0 阅读本节前的一个前置校正

先校正一个几乎一定会犯的误判:把"每人只有两段"读成"数据质量差"。

这两件事在这个库上方向恰好相反。每人两段是设计的结果,不是采集能力的上限:一次到访、同一副电极、两个状态、各截一分钟,目的是让"任务态与静息态"这对比较尽可能干净。把每人的任务段拉成十段,会引入阻抗漂移、注意力衰减与疲劳,配对优势随段数增加迅速稀释。

校正之后,五维评分的读法也要跟着变。规模分低衡量的是"能不能喂饱模型",不是"记录得规不规矩"。真正该扣分的地方在别处:通道数的两个口径对不上、采样率页面未写、原始信号没有留存、行为记录压缩成一个数字。这些是文档与留存的欠缺,与采集质量本身无关。

还有一个误判要提:把三十赫兹高通当成缺陷。对做慢波或睡眠分期的课题,它确实是障碍;但对心算这种以 alpha 去同步为主要现象的任务,三十赫兹以上几乎全是噪声,滤掉反而是加分。同一个参数在不同课题下的正负号不同,这是判断任何预处理选择时的基本前提。

7.1 五维评分

按 DAIMS 的常用维度打分,每项一至五分,分数针对"作为认知负荷两状态对比数据"这个用途。

维度 分数 理由
数据规模 2 三十六人、七十二段,训练不足,做配对分析够用
标注质量 3 段级标签干净可靠,但只有二类,无逐题记录
任务适配 3 两状态对比设计精良,但无原始信号、无法闭环
文档完整 3 协议与预处理好读,通道数口径冲突、采样率未写
可获取性 5 免注册、ODC-BY、体量小,三条下载路径都可用

合计十六分(满分二十五)。这个分布说明它不是全能选手:规模是硬伤,可获取性拉满,其余三项都在中间档。与同类任务态库相比,它在"容易拿到"上领先,在"能拿来做多少事"上落后。

“标注质量"若按"标签是否正确"打分可以给四分,文件名就是标签,不可能错;若按"能支撑多少分析"打分,三分都偏高。它的标签是"少而准”,不是"多而全"。

7.2 标注质量的两层

第一层是标签是否正确。后半句是"由文件名后缀编码",不需要任何解析:后缀为 1 即静息,为 2 即心算,全库七十二个文件无一例外。这比靠事件码或注释文件传递标签的库可靠,因为不存在"标注文件丢失"这种故障模式。

第二层是标签能承载多少信息。这一层它很薄。除了二类标签,唯一的次级标签是受试者表里的计数质量分组,而它是受试者级的,不是段级的,且样本量不对等。年龄、性别、记录年份、减法次数这四层同样都是受试者级的量,只能做分组或协变量,做不了逐段的回归。

7.3 已知的、可枚举的偏差

偏差 表现 影响
受试者少 三十六人,其中差数者仅十二人 留一交叉验证的方差极大
人群单一 同一所大学的学生,十六至二十六岁 不能外推老年或临床人群
性别不平衡 女二十七人、男九人 性别对比的分析功效不足
单中心单设备 一台 Neurocom 系统 设备差异无法从内部估计
顺序固定 先静息后任务,未见平衡说明 差异中混有顺序与疲劳效应
行为粒度粗 只有一个四分钟总数 无法做逐题或时间分辨分析
无原始信号 只交付清洗后结果 伪迹处理研究无法开展
标签层级单一 只有段级二类 无法做难度分级或多任务比较
采样率未写 页面与 README 均未提及,文件头为 500 赫兹 使用者须自行从文件头读取

前四条是结构性的,改不了;中间三条是设计选择带来的,可以规避或交代清楚;最后两条是文档问题,靠读取文件即可解决。

有一处统计上的提醒:这个库的天然统计单位是人,不是段。按段统计会把样本量翻倍到七十二,但同一个人的两段高度相关,独立性不成立,显著性会被高估。稳妥的做法是每人在两状态间取一个差,把这个差当一条观测,样本量压到三十六,结论才站得住。

7.4 外部验证矩阵

这个库在文献里的用法,可以归成四类角色。判断依据是官方说明与论文摘要,不涉及具体数值比较。

验证角色 做法 讲得通的地方 风险
认知负荷检测基线 在配对数据上跑二分类 标签干净、预处理统一 只有三十六人,跨人泛化难
频谱与相干方法示例 复现论文的功率与相干对比 十九导标准布点、耳电极参考 三十赫兹高通限定了可用频段
时间尺度指标验证 在六十秒片段上算去趋势波动 长度与采样率都够 单段估计的方差大
预处理效果演示 比较降采样或重参考的影响 预处理已统一,参照组可靠 不能评价去伪迹算法本身

第一类最常见,但要小心划分方式;第二类与第三类最贴合它的设计目的,因为它们正是论文的分析对象;第四类只适合做"后处理"的对照。

还有一个不常被提起却很合适的用法:教学。一次实验、两名状态、十九个经典电极、一个二类标签,链路每一环都能在一个课时里讲完,文件也小到可以直接发给学生。

7.5 它为何能持续(省掉的是一次到访)

它自 2018 年发布以来只有一个版本,作者也没有持续维护,却仍在被引用。原因不在规模,在于它把一个成本极高的环节替使用者省掉了:让同一个人同时出现在两种状态里,且两种状态用同一副电极、同一套处理。

要做这件事,得把三十六名学生请进实验室一次,每次十几分钟,加上电极安装与清洗。听起来不多,但它不可外包:别的库给不了"同一个人、同一次到访"的配对,跨库拼时设备与处理全都不同,优势立刻消失。

边界也很明确:只在"两状态对比"上成立。课题一旦转向难度连续估计、时间分辨监测或伪迹处理,短板立刻暴露。

成本也是原因。重做一次需要一台多通道脑电仪、一名实验员、三十六名受试者和一项伦理审批;下载只要一百七十五兆。

§8 生态位与历史

8.1 历史沿革

这批数据诞生在 PhysioNet 数据捐赠的一个特定阶段。那时平台上心电、重症监护、睡眠记录已经很多,但"范式化的认知实验"相对少:临床信号是监护中顺手录下的,认知实验则为研究目的专门设计,愿意公开的团队不多。

它的加入方式很典型:两所高校联合的小组做完分析后,把记录整理成平台能接受的格式捐出来,托管与版本管理交给平台。这让它在没有后续基金、没有维护团队的情况下活了八年多,也让文档停在"一次讲清"的状态——没有勘误,也没有补充说明。

从格式上也能读出年代。EDF 加一张逗号分隔的表,是那个时期平台的标准做法:文件自描述、元信息另附一张表。后来的大规模数据集往往改用更结构化的清单,这个库仍停在"文件列表加一张表"的朴素形态。

8.2 与挑战赛和聚合库的关系

它没有进过任何挑战赛。PhysioNet 历年挑战赛涉及的脑电任务集中在癫痫检测、睡眠分期与重症监测,心算任务从未成为赛题。这意味着它没有官方划分、没有排行榜、没有社区基线,也意味着它不会被"刷分"式的研究快速消耗。

它与聚合型资源的关系则相反。聚合库的价值在于规模与统一格式,代价是把单个实验的细节磨平。本库恰好相反,规模小,格式朴素,但每个字段都对应一次真实的采集决定。两者不是替代关系,而是粗细两层。

它的出现时机也值得一提:那正是去趋势波动分析从物理学进入神经科学的几年,一个六十秒、已被清洗过的片段恰好是这类方法理想的输入,而作者之一正来自该方法的推动方。这让它同时具备两个身份——认知负荷数据集,与时间尺度分析的标准样例。

8.3 生态位:粗标签的一端

把站内外的脑电库按"标签粒度"排:临床连续记录最粗,几小时到几天,标注稀疏;本库居中偏粗,段级二类;竞赛集更细,试次级事件码;事件相关电位库最细,逐次刺激带时刻。

因此它有两个稳定的用途:一是两状态对比的参照物,任何关于"认知负荷会让脑电怎样"的假设都能在这里先验一遍;二是教学素材,一次实验从设备到文件每一环都对得上,且全库小到可以直接分发。

这个位置不容易被替代。拼一个规模更大的负荷库不难,难的是"同一个人、同一次到访、同一副电极"这种配对——而这恰恰是扩大样本量时最先放弃的东西。

8.4 谁在用它,用来做什么

从公开文献摘要看,引用集中在三个方向:认知负荷检测的分类方法,把它当标准测试集;频谱与相干特征分析,承接论文原本的问题;预处理与降采样影响的评估,看中它统一的处理流程。

还有一类不常被提及的用法:读取库的回归测试。它简单到一个函数就能读完,又包含 EDF 固定字段、二十二路信号、多字符通道名与非标准日期这些真实的边界情况,拿来检验一个 EDF 读取器是否稳健很合适。

三类用法有一个共同点:都不要求大样本。课题一旦要求"至少几百人",它就会被换掉,而换成什么,往往取决于那个课题需不需要配对。

§9 使用指引

9.1 三种角色的路径

算法研究者的最短路径。 按 §5.2 下一两个受试者、按 §5.3 读采样率、按 §5.5 按人划分,跑一个逻辑回归拿到基线,再决定是否扩到全量。别一上来就按段随机切。

认知神经科学方向的最短路径。 先读 README 的预处理段,再挑一名受试者(推荐 §4.3 的案例)把两段并排画出来,确认自己理解了三十赫兹高通之后还剩下什么。然后按频段算功率,在差数者与好数者两组里分别看,比较结论是否一致。

工程落地方向的最短路径。 先确认要的是离线分析还是在线监测。离线可直接用;在线要自己定义负荷标签与时间窗,这批数据帮不上忙,把它当"两状态的离线上限"估计更合适。

角色 先做什么 别做什么 预期产出
算法研究者 两名受试者跑通全链路 按段随机划分 可信的跨人基线
认知方向 并排画一段的两状态 忽略了三十赫兹高通 频段与分组的对照
工程落地 确认离线与在线的差别 指望它给出时间标签 两状态的可分性上界
教学 用一名受试者做演示 用全库做课堂练习 完整链路的一次直观演示

9.2 先建一份本地索引

#-- 把文件清单与受试者表合成一张分析索引
import pandas as pd

meta = pd.read_csv("subject-info.csv")
rows = []
for _, r in meta.iterrows():
    sid = r["Subject"]
    for seg, task in (("1", "静息"), ("2", "心算")):
        rows.append({"sid": sid, "file": f"{sid}_{seg}.edf",
                     "task": task, "age": r["Age"],
                     "group": r["Count quality"]})
idx = pd.DataFrame(rows)
print(idx.groupby("task").size(), idx["group"].value_counts().to_dict())

任务两栏各三十六,计数质量按官方分组为二十四与十二。

9.3 一条最短的可用流程

从零到第一个诚实可比的数字,下面这段够用。它不追求性能,只保证每一步都对得上。

#-- 最小可用流程:两名受试者的跨人基线
import numpy as np, pandas as pd, pyedflib
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score

def features(path):
    with pyedflib.EdfReader(path) as f:
        sf = f.getSampleFrequency(0)
        idx = [i for i, l in enumerate(f.getSignalLabels())
               if l.startswith("EEG")]
        x = np.vstack([f.readSignal(i) for i in idx])
    #-- 每一路去均值后取方差与零交叉率,作为最朴素的负荷特征
    var = x.var(axis=1)
    zcr = np.mean(np.abs(np.diff(np.sign(x), axis=1)) > 0, axis=1)
    return np.concatenate([var, zcr, [sf]])

def person(n):
    sid = f"Subject{n:02d}"
    X = np.vstack([features(f"{sid}_1.edf"), features(f"{sid}_2.edf")])
    y = np.array([0, 1])
    return X, y

Xtr, ytr = person(0)
Xte, yte = person(1)
clf = LogisticRegression(max_iter=2000).fit(Xtr, ytr)
print("跨受试者 AUC", round(roc_auc_score(yte, clf.predict_proba(Xte)[:, 1]), 3))

这里刻意做跨受试者:Subject00 训练、Subject01 测试。每人只有两条样本,AUC 只能落在零、零点五、一这三个点上,几乎没有统计意义——它的意义在于把流程跑通,并让人亲手体会到"两条样本训不出东西"。要换成留一受试者,把两个 person 调用改成三十六个编号轮流当测试集即可。

9.4 引用方式

官方要求同时引用两件东西:原始论文与 PhysioNet 平台。论文那一条是 Zyma、Tukaev、Seleznov 等七人于 2019 年发表在《Data》第四卷第一期、文章号 14 的数据描述文章,DOI 为 10.3390/data4010014。平台那一条按 PhysioNet 的现行建议引用其 2026 年的平台综述。

数据本身建议写到版本级:数据集名称、版本号 1.0.0、DOI 10.13026/C2JQ1P、访问日期。许可为 ODC-BY 1.0,允许商用与再分发,条件是署名。若做了再加工(重参考、降采样、重新分段),应在方法里写清楚,因为这些步骤会改变别人复现的结果。

§10 AI 使用声明

项目 声明
文本生成 本文由 AI 辅助撰写,编辑负责结构与事实核对
数字来源 规模、结构、边界三类数字取自 PhysioNet 官方页面与官方文件
文件核验 README、RECORDS、subject-info.csv、SHA256SUMS.txt 与单个 EDF 的头区经直接访问确认
口径冲突 官方称 23 通道系统,文件头报告 22 路信号,已在 §3.5 并列呈现
论文信息 仅参考 Crossref 返回的摘要与元数据,未读全文
未核验内容 全部七十二段的波形内容、各段标注道内容、精确采样率以外的采样细节
图像 无配图;封面为生成式提示词,不含真实脑电波形
免责 本文不构成任何临床或工程建议;使用须遵守 ODC-BY 1.0 署名条款

常见误读(避坑清单)

说法 实际 证据
「这是一个 .mat 格式的数据集」 全部是 EDF,无一 .mat 文件清单与 RECORDS 七十二行
「MAT 指 MATLAB」 MAT 指 Mental Arithmetic Task 官方全名与页面标题
「它有几百名受试者」 三十六人,每人两段 subject-info.csv 三十六行
「每段是几分钟的长记录」 每段六十秒 README 与文件头时长字段
「采样率很高,适合做高频分析」 500 赫兹,且已 30 赫兹高通 文件头每记录采样点字段为 500
「它包含原始未处理信号」 只有独立成分分析后的片段 README 明写预处理流程
「它有逐题的作答记录」 只有四分钟总数与好差分组的标签 subject-info.csv 只有一列次数
「可以直接随机切分训练测试」 必须按受试者划分 每人两段且成对,随机切必泄漏
「它是癫痫或异常检测数据」 全部为健康受试者的任务态记录 招募标准排除精神神经科主诉
「两组人数一样多」 好数者二十四人,差数者十二人 官方页面分组说明

FAQ

Q1:它是 .mat 格式的数据集吗?
不是。库名 EEGMAT 里的 MAT 指 Mental Arithmetic Task,即心算任务,与 MATLAB 的 .mat 文件无关。全库是 EDF 文件加一张受试者表,没有任何 .mat。

Q2:一共多少受试者、多少段记录?
三十六名受试者,每人两段,合计七十二个 EDF。命名从 Subject00 到 Subject35,后缀为 1 的是任务前静息,为 2 的是心算。RECORDS 逐行列出这七十二个文件。

Q3:采样率和通道数是多少?
官方页面只写设备是 23 通道的 Neurocom 系统,没有给出采样率。文件头报告 22 路信号:十九路脑电、一路 A2-A1、一路心电,另有一路标注道。采样率必须从文件里读,不要硬编码。

Q4:能直接用它做二分类认知负荷检测吗?
可以做,但必须按受试者划分。每人只有一段静息与一段任务,随机按段划分会让同一个人的两段分处训练与测试两侧,模型学到的是个体指纹而非任务状态。

Q5:原始信号还在吗?
不在了。官方说明全部记录是经独立成分分析处理后的无伪迹片段,公开的只有清洗结果。想比较去伪迹方法,只能把它当参照组。

Q6:三十赫兹高通对我有影响吗?
看课题。做 alpha 与 beta 频段的分析影响不大,因为这些能量在三十赫兹以上仍有相当部分;做 theta 或慢波分析就要格外小心,低频能量已被大幅削弱,读到的是滤波器之后剩下的部分。

Q7:好数者与差数者两组能直接比吗?
可以比,但要记住两组人数不对等:二十四人对十二人。以差数者为主体的分析功效有限,报告时应给出每组的样本量,并说明结论是否在两组里方向一致。

Q8:记录年份在哪里找?
在 subject-info.csv 的 Recording year 一列,取值为 2010、2011 或 2012。EDF 头里的开始日期被统一设成 1 月 1 日,是占位值,不能用来判断采集年份。

Q9:可以用来做源定位吗?
勉强可以做,但精度有限。十九个电极是 10/20 经典布点,间距较大,且没有个体头模型与结构像。做粗略的皮层分区比较可以,做精细源成像不行。

Q10:许可允许商用吗?
ODC-BY 1.0 允许,包括商业用途,条件是署名。署名要覆盖数据集本身与 PhysioNet 平台两层,具体条款以官方许可全文为准。

Q11:官方有扩版计划吗?
页面只显示一个版本,2018 年底首发,2019 年 3 月补录校验和,之后没有更新说明。从文档形态看,扩版的可能性不大。

Q12:它和运动想象库能拼在一起用吗?
技术上可以,但意义有限。两者的任务、标签体系、参考方式、采样率都不同,拼起来只能做"多个任务的负荷代理"这类粗粒度工作;若要研究任务本身,还是分开分析更可靠。

术语表

术语 解释
心算任务 不借助外部工具完成的算术运算,本库用的是连续减法
序列减法 每次结果成为下一次被减数的连续相减,是心算负荷的经典范式
认知负荷 工作记忆被任务占用的程度,本库用算不算题来近似
静息态 任务之外的安静闭眼或睁眼记录,本库作为配对对照
10/20 国际系统 按颅骨标志点按比例布放电极的国际惯例,本库取其十九点
单极导联 每个电极相对一个共同参考测量,本库的参考是双耳
互联耳电极 两侧耳垂电极短接后作参考,本库写作 A2-A1
独立成分分析 把多通道信号分解为统计独立成分的盲源分离方法
眼电伪迹 眼球运动与眨眼产生的电位,幅度远大于脑电
工频陷波 针对电网频率的窄带滤波,本库为 50 赫兹
高通滤波 保留高于截止频率的成分,本库截止在 30 赫兹
功率谱密度 信号能量在频率上的分布,是论文的核心分析对象
相干 两路信号在某一频段上的相位一致性,衡量功能连接
去趋势波动分析 用标度指数刻画信号长期相关性的方法,论文的另一个核心对象
标度指数 去趋势波动分析输出的斜率,反映信号的自相似程度
alpha 去同步 任务时 alpha 频段功率下降的现象,是最常见的负荷指标
事件相关电位 与特定刺激锁时的平均波形,本库无锁时事件,不适用
段级标签 标签覆盖整段记录而非其中某一时刻
受试者泄漏 同一受试者的样本同时出现在训练与测试集,导致成绩虚高
留一受试者 每次留一个人做测试、其余人做训练,衡量跨人泛化
组内设计 同一批受试者接受全部条件的实验设计
时间效应 由记录顺序或疲劳引起的偏差,与任务本身无关
EDF 欧洲数据格式,自描述的生理信号文件格式
数据记录 EDF 中固定时长的数据块,本库为每秒一块
ODC-BY 开放数据共享署名许可,允许商用需署名

附录 A:核心数字核对表

项 值 来源 来源层级
受试者数 36 subject-info.csv 行数 官方文件
记录数 72 RECORDS 逐行 官方文件
每段时长 60 秒 README 官方页面
信号路数 22 Subject00_1.edf 头区 官方文件
脑电通道 19 头区通道标签 官方文件
辅助通道 1 路 A2-A1 与 1 路心电 头区通道标签 官方文件
官方标称通道 23 页面与 README 官方页面
数据记录数 182 头区数据记录字段 官方文件
记录时长字段 1 秒 头区 官方文件
每记录采样点 500(每路) 头区采样点字段 官方文件
采样率 500 Hz 采样点除以记录时长 官方文件推算
头字节数 5888 256 + 22 × 256 官方文件推算
年龄范围 16 至 26 岁 subject-info.csv 官方文件
性别构成 女 27、男 9 subject-info.csv 计数 官方文件
记录年份 2010 至 2012 subject-info.csv 官方文件
好数者人数 24 页面分组说明 官方页面
差数者人数 12 页面分组说明 官方页面
未压缩体积 175.1 MB 页面文件区 官方页面
许可 ODC-BY 1.0 页面许可栏 官方页面
数据 DOI 10.13026/C2JQ1P 页面发现栏 官方页面
论文 DOI 10.3390/data4010014 Crossref 论文元数据
首发日期 2018-12-17 页面版本说明 官方页面

附录 B:数字的来源分层

第一层,官方页面与官方文件。 受试者数、记录数、每段时长、信号路数与通道标签、年龄范围、性别构成、记录年份、分组人数、体积、许可与 DOI,全部来自项目主页、README、RECORDS 与受试者表;头区字段来自对单个 EDF 的直接读取。这一层可直接引用,重查可得同样结果。

第二层,论文摘要与元数据。 受试者为基辅一所大学的学生、年龄相当、分析对象是功率谱与相干与去趋势波动,来自 Crossref 摘要;期刊与出版日期同样来自 Crossref。摘要能支撑"作者主张了什么",不能支撑"结论有多强"。

第三层,未核实。 全部七十二段的波形内容、标注道是否有内容、精确采样率、每段覆盖的减法次数、两段记录之间的间隔、是否有先算题后静息的受试者。正文中凡涉及这些的地方,都只做定性表述或明确标注为推断。

附录 C:完整参考文献

编号 文献 链接 用途
1 EEG During Mental Arithmetic Tasks v1.0.0 https://physionet.org/content/eegmat/1.0.0/ 规模、结构、边界数据
2 该库文件目录 https://physionet.org/files/eegmat/1.0.0/ README、RECORDS、受试者表、头区
3 Zyma I, Tukaev S, Seleznov I, et al. Data 2019;4(1):14 https://doi.org/10.3390/data4010014 实验动机与分析对象
4 同上的 Crossref 元数据与摘要 https://api.crossref.org/works/10.3390/data4010014 作者、机构、出版日期
5 PhysioNet 平台综述(2026,Nature Health) https://doi.org/10.1038/s44360-026-00096-z 托管模式与引用规范
6 ODC-BY 1.0 许可全文 https://opendatacommons.org/licenses/by/1-0/ 许可条款
7 10/20 国际系统电极布点惯例 https://www.eeg.tuwien.ac.at/eeg.tuwien.ac.at_pages/events/ec20/EC20_program.htm 十九点布点的来源
8 EEGMMIDB(库内对照) https://physionet.org/content/eegmmidb/1.0.0/ §6.3 的规模与标签对比

附录 D:任务代码

把一名受试者的两段记录画成"频段功率对比",这段够用,不需要训练模型。

#-- 逐人比较静息与心算的频段功率
import numpy as np, mne

BANDS = {"theta": (4, 8), "alpha": (8, 13), "beta": (13, 30)}

def band_power(path):
    raw = mne.io.read_raw_edf(path, preload=True, verbose="ERROR")
    eeg = raw.copy().pick([c for c in raw.ch_names if c.startswith("EEG")])
    eeg.set_eeg_reference("average", verbose="ERROR")
    psd = eeg.compute_psd(method="welch", verbose="ERROR")
    data, freqs = psd.get_data(), psd.freqs
    out = {}
    for name, (lo, hi) in BANDS.items():
        m = (freqs >= lo) & (freqs < hi)
        out[name] = float(data[:, m].mean())
    return out

rows = []
for n in range(36):
    sid = f"Subject{n:02d}"
    a = band_power(f"{sid}_1.edf")
    b = band_power(f"{sid}_2.edf")
    rows.append({k: b[k] / a[k] for k in BANDS})

for k in BANDS:
    v = np.array([r[k] for r in rows])
    print(k, "中位比值", round(float(np.median(v)), 3),
          "负项人数", int((v < 1).sum()))

输出的每一行是一个频段、三十六人任务态与静息态功率比值的中位数、以及有多少人的比值小于一。alpha 那一行通常会有明显的下降,这正是认知负荷最常见的脑电表现。

附录 E:如果只记五件事

第一,它是单实验室的心算任务脑电库,三十六名健康大学生,每人一段静息与一段六十秒心算,全部为 EDF,与 .mat 文件无关。

第二,它最大的价值是配对:同一副电极、同一长度、唯一变化的变量是算不算题,这个配对在别的库里买不到。

第三,它交付的是清洗结果,原始信号与成分分离矩阵都没有。

第四,通道数有两个口径:官方称 23 通道系统,文件头报告 22 路信号;采样率页面未写,须从文件读取。

第五,现实的用法是两状态二分类加留一受试者验证;按段随机划分得到的准确率几乎都来自同一受试者的泄漏。

编辑说明

核验时间 2026 年 10 月 28 日。核验方式:直接访问 PhysioNet 项目页,读取 README.txt、RECORDS 全表、subject-info.csv 与 SHA256SUMS.txt,并按字节区间读取 Subject00_1.edf 的头区,解析信号数、通道标签与固定字段;页面上的文件清单与体积亦逐一核对。论文信息仅取 Crossref 元数据与摘要。另读取 Subject01_1.edf 的采样点字段以确认每记录 500 点。未覆盖:全部七十二段的波形内容、标注道内容、两段记录之间的间隔。通道数的两个口径(23 与 22)按并列呈现,不作判断。


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • earh — 共享标签:生理信号 / 脑电信号 / 神经科学
  • earndb — 共享标签:生理信号 / 脑电信号 / 神经科学
  • openneuro — 共享标签:生理信号 / 脑电信号 / 神经科学
  • eeg-gaba-anesthesia — 共享标签:生理信号 / 脑电信号 / 神经科学
  • seed — 共享标签:生理信号 / 医学问答与基准
  • siena-scalp-eeg — 共享标签:生理信号 / 脑电信号 / 神经科学
  • eeg-power-anesthesia — 共享标签:生理信号 / 脑电信号 / 神经科学
  • ltrsvp — 共享标签:生理信号 / 脑电信号 / 神经科学
  • ibl-brain-wide-map — 共享标签:生理信号 / 脑电信号 / 神经科学
  • spikeinterface — 共享标签:生理信号 / 脑电信号 / 神经科学

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集