信息速览
脑机接口的教科书故事通常从 P300 讲起:屏幕上六行六列字符循环闪烁,受试者盯着想拼的那一个,只有含它的那一行与那一列会在他脑里激起一个正向波,几百毫秒后出现,机器据此反推他看的是哪一格。故事讲到这里往往就停了,很少有人追问一句——同一个字符被闪了二十遍,这二十次的 P300 长得一样吗?
埃塞克斯那组人没有停。他们把「目标之前隔了几个非目标」当成自变量,发现它会让 P300 的幅度系统性变化,进而决定分类器该怎么给多次呈现加权。为了让这项建模可复现,他们把十二名受试者的原始记录一并放上了 PhysioNet:六十四导联、两千零四十八赫兹、每段四十六秒,附逐次闪烁的标注。
所以这是一批为「研究波形为什么变」而留的原始记录,不是为「比谁分类准」而做的基准。这个出身决定了它的全部长处与短处。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | ERP-based Brain-Computer Interface recordings |
| 发布方 | PhysioNet(贡献者 Luca Citi、Riccardo Poli、Caterina Cinel) |
| 首次发布 | 2014 年 3 月 4 日,版本 1.0.0 |
| DOI | 10.13026/C2101S |
| 受试者 | 十二个目录 s01–s12(官方摘要写十名参与者) |
| 记录数 | 二百四十五段,每段一次单字符拼写 |
| 每段时长 | 四十六秒(三百六十八个数据记录 × 0.125 秒) |
| 每段通道 | 七十路:六十四脑电 + 双耳垂 + 四眼电,另有 1 路标注通道 |
| 采样率 | 2048 Hz |
| 采集设备 | BioSemi ActiveTwo,参考电极 CMS |
| 范式 | 6×6 字符矩阵拼写,行与列随机不放回强化 |
| 刺激时序 | 亮 100 毫秒、灭 50 毫秒,标称刺激起始异步 150 毫秒 |
| 标签层级 | 运行级目标字符(三十六类)+ 闪烁级目标/非目标(二类) |
| 文件格式 | EDF+(含内嵌标注通道)+ 同源 .event 二进制标注 |
| 体积 | 未压缩二点二吉字节,压缩包一点七吉字节 |
| 许可 | ODC-BY 1.0,免注册 |
| 缺什么 | 在线反馈、分类器输出、患者人群、官方划分与基线成绩 |
§1 它要解决的具体麻烦
1.1 一个字符要闪两百次,才够做一次判断
P300 是头皮上能看到的最"慢"也最"弱"的信号之一。它出现在刺激之后三百毫秒上下,幅度通常只有几个微伏,而同一时刻的头皮上还叠着自发的 alpha 节律、眨眼带来的数百微伏跳变、以及放大器本身的噪声。单次刺激诱发的那一小段波形,信噪比低到几乎不可用。于是所有 P300 拼写器都走同一条路:把同一个目标闪很多次,再把多次响应叠起来平均。
平均能提高信噪比,代价是时间。六行六列,每一轮要点亮十二次(六行加六列),要让每个目标至少出现十次,就得走十轮,一百二十次闪烁;按官方标称的一百五十毫秒一个刺激,这一轮下来将近二十秒才出一个字符。这就是九十年代到两千年代 P300 拼写器的真实速度:每分钟几个字符。想让它快,只有两条路——减少平均次数(信噪比下降),或者让每一次呈现携带更多信息。
第二条路正是这批数据的主题。Citi 等人在 2010 年的论文里指出:多次呈现并不等价。目标之前隔了多少个非目标,会改变这一次 P300 的幅度——隔得越远,幅度往往越大。背后的解释是习惯化与注意的恢复:连续被非目标"轰炸"之后,目标出现时的新异性和显著性更高,诱发的波更大;如果目标刚刚出现过,紧接着的下一次响应就会打折扣。既然每一次的信息量不同,平均就该变成加权平均,权重由"这个目标之前隔了几个非目标"决定。
验证它需要四样东西:逐次时刻、前置数、采样率、同一批人的大量运行。
它顺手也解释了为什么这个库的标注长得有点怪。一般的脑机接口数据集只给"刺激时刻 + 目标字符",这里每次闪烁之后还跟了一串数字,记录该次闪烁占了几帧、间隔几帧(§4.2)。那不是冗余信息,那是自变量本身。
1.2 三条常见的错误期待
第一条,期待它是一个分类基准。 它没有官方训练/测试划分,没有基线成绩表,没有排行榜,也没有一篇"用本库达到多少准确率"的配套论文。官方页面把实验协议、设备、标注结构写得很细,却一个字没提"该怎么评测"。拿它当基准用,你得自己定协议,而自己定的协议没法跟别人比。
第二条,期待它样本量够训练深度模型。 十二个目录、二百四十五段、每人约二十个字符。按运行算,样本是两百多;按闪烁算,事件数确实上万,但同一段里的闪烁高度相关,有效独立样本远小于名义事件数。用它从头训一个字符级分类器,两三轮就能把训练集背下来。
第三条,期待它有临床人群。 官方描述里只有"参与者"(participants),没有患者、没有诊断、没有量表。这与它的姊妹库形成鲜明对照——面向肌萎缩侧索硬化用户的那些拼写器数据集,会明确标注患者分组与功能评分。本库没有,它是健康人的实验室数据。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 单试次 P300 检测的训练与测试 | 每段两百余次闪烁,目标/非目标可精确对齐 | 够,事件量足以训一个小型卷积网络 |
| 字符级拼写精度的复现 | 每人约二十个字符,全库两百余段 | 勉强,字符级指标的方差大到难以比较 |
| 延迟与幅度调制的建模 | 逐次闪烁的帧数后缀 + 两千零四十八赫兹采样 | 够,这是它几乎无可替代的用法 |
| 跨受试者泛化研究 | 十二个受试者目录 | 只够做留一受试者,不够做人群分层 |
| 在线闭环脑机接口研究 | 无反馈刺激、无分类器输出 | 不够,闭环环节要自己补 |
| 眼电伪迹去除与校正 | 四通道眼电与脑电严格同步 | 够,且比多数库给得全 |
| 电极位置与参考方式研究 | 六十四导联加双耳垂参考,位置表可外查 | 够 |
| 患者人群的可用性评估 | 全部为健康受试者 | 不够,一点都没有 |
| 语言模型辅助的拼写解码 | 三十六格字符集,含下划线 | 可做,但语料规模撑不起统计 |
| 高密度(128 导以上)空间滤波 | 六十四导 | 不够 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做单试次 P300 检测,手上的公开数据只有几十段 | 一次性拿到两百多段、同设备同协议的高采样率记录 | 先按受试者划分做留一交叉验证,别按段随机分(§5.5) |
| 你的解码器在固定刺激间隔上训练,担心换设备就崩 | 逐次间隔不恒定,天然是一个"时序扰动"测试床 | 把间隔帧数当协变量入模,观察权重是否随之变化 |
| 你想复现 2010 年那套加权平均 | 原始波形、闪烁时刻、前置非目标数都能从标注还原 | 按 §4.2 解析后缀,重建每次闪烁的前置计数 |
| 你在做眼电校正,需要多通道同步参照 | 四路眼电与六十四路脑电共用一套时钟 | 直接跑回归或独立成分分析,注意参考电极要先换(§5.6) |
| 你在研究下采样对 ERP 的影响 | 原始两千零四十八赫兹,可无损降到任意目标率 | 固定同一批 epoch,只改重采样率,其余流程别动 |
| 你在教学,要讲清一次 ERP 实验的完整链路 | 从刺激矩阵到标注文件的每一环都有原始材料 | 用一段四十六秒的记录做演示,比看示意图直观 |
| 你在核对某篇论文的可复现性 | 体积不大、免注册、结构简单 | 全量一点七吉字节,可一次下完 |
1.5 一句话判断
它不是"更多数据",而是"更细的一把尺":把刺激呈现的每一次间隔都记下来,让 P300 的幅度变化第一次可以被逐次检验,而不是被平均抹平。
1.6 不适合谁:四条边界
不适合拿来做规模训练。 十二个人、两百多段、每人二十个字符。任何参数量超过几万的模型都会迅速记住这些人。想靠数据量换性能,请左转去汇总型数据库(§6.3)。
不适合拿来做在线系统的端到端验证。 记录里没有反馈、没有分类器输出、没有决策时刻。离线解码器可以在这里训练与评估,但"解码→反馈→再解码"的闭环只能另找数据。
不适合拿来做临床可用性结论。 全部受试者是健康人,官方连年龄性别都没给。任何"这套范式对患者也有效"的推论,都不能由这批数据支撑。
不适合拿来做精细的源定位。 六十四导是标准扩展布局,但记录只有头皮电位、没有个体头模型、没有核磁结构像,参考方式还是 CMS 而非平均参考。做皮层源成像的误差会大于你想研究的效应。
§2 数据构成与规格
2.1 一个目录、两种文件、七十一路信号
整个库的顶层只有十样东西:十二个受试者目录,加上 ANNOTATORS、README、RECORDS、SHA256SUMS.txt 与一张 speller.png。这个结构简单到可以用一句话概括——一个人一个目录,一次拼写两个文件。
受试者目录名是 s01 到 s12,运行文件名是 rc01 起。两者拼起来构成记录的唯一标识,例如 s03/rc07。同一目录下,每个运行有且仅有两个文件:.edf 是 EDF+ 信号文件,.event 是等价的 WFDB 标注文件。官方明确说明两者内容完全一致,.event 只是为了让 PhysioToolkit 那套老工具能直接读。
目录里没有受试者信息表、电极坐标文件、事件字典与划分文件,元信息全压在 README 的一段散文与每段的标注头里。
| 顶层项 | 体积 | 作用 | 能否省 |
|---|---|---|---|
| s01–s12 | 主体 | 十二个受试者的运行 | 不能 |
| ANNOTATORS | 24 字节 | 声明标注类型为 event |
可省,内容仅一行 |
| README | 4.0 KB | 实验协议与标注结构说明 | 不能,是唯一的文字说明 |
| RECORDS | 3.1 KB | 二百四十五行记录清单 | 不能,是遍历入口 |
| SHA256SUMS.txt | 39.1 KB | 全库校验和 | 建议留,用于完整性核对 |
| speller.png | 8.3 KB | 6×6 字符矩阵的截图 | 可省 |
2.2 字段/记录的完整字典
EDF+ 的头部分成两截:前 256 字节是固定字段,之后每个信号各占 256 字节。这批文件里信号数是 71,所以头长恰为 256 + 71 × 256 = 18432 字节。以 s01 的第一次运行为例,固定字段的取值如下。
| EDF 固定字段 | 字节位置 | 实际取值 | 含义与注意点 |
|---|---|---|---|
| 版本 | 0–7 | 0 后跟空格 |
EDF+ 的连续记录标记 |
| 患者标识 | 8–87 | s01 |
只有受试者编号,无年龄性别 |
| 记录标识 | 88–167 | X X X |
未填写,运行号不在这里 |
| 开始日期 | 168–175 | 13.05.79 |
两位数年份,读取器可能解析成 2079 |
| 开始时间 | 176–183 | X X X |
未填写 |
| 头字节数 | 184–191 | 18432 | 与 71 路信号吻合 |
| 保留字段 | 192–235 | EDF+C |
声明为连续记录 |
| 数据记录数 | 236–243 | 368 | 每记录 0.125 秒,合计四十六秒 |
| 记录时长 | 244–251 | 0.125 | 秒 |
| 信号数 | 252–255 | 71 | 六十四脑电 + 二耳垂 + 四眼电 + 一标注 |
每路信号再占 256 字节,字段顺序固定。下面这张表把 71 路信号的构成与各自的标定差异列清楚,这是读取时最容易翻车的地方。
| 信号组 | 路数 | 标签 | 单位 | 物理上下限 | 说明 |
|---|---|---|---|---|---|
| 脑电 | 64 | Fp1、AF7、AF3…O2 | 微伏 | 组内一致 | 按 BioSemi 标准扩展布局排列 |
| 耳垂参考 | 2 | EARL、EARR | 微伏 | 与脑电同组 | 用于离线重参考 |
| 垂直眼电 | 2 | VEOGL、VEOGR | 微伏 | 与脑电同组 | 左眼上下 |
| 水平眼电 | 2 | HEOGL、HEOGR | 微伏 | 与脑电同组 | 左右外眦 |
| 标注通道 | 1 | EDF Annotations | 无 | 不适用 | 每记录 57 字节,存 TAL 文本 |
数字量范围统一是 −32768 到 32767,但物理上下限在文件内部并不统一:脑电与眼电一套标定,标注通道另一套。任何"把整数直接当微伏"的写法都会错,必须逐通道线性还原。
2.3 一条记录的完整解剖
把 s01/rc01 完整拆开——§4.3 的案例也是从这一段起步——一层层看下去,能看清这批数据的组织逻辑。下面这段可以直接跑,前提是装了 pyedflib。
#-- 逐层解剖一段记录:头、通道、时长、标注
import pyedflib
path = "s01/rc01.edf"
with pyedflib.EdfReader(path) as f:
print("信号数", f.signals_in_file)
print("采样率", set(f.getSampleFrequencies()))
print("开始时间", f.getStartdatetime())
print("时长秒", f.getFileDuration())
labels = f.getSignalLabels()
print("前五路", labels[:5])
print("末三路", labels[-3:])
#-- 单通道取前 10 个采样点,确认量纲
print("Fp1 前十个采样", f.readSignal(0)[:10])
#-- 标注通道单独取出
ann = f.readAnnotations()
print("标注条数", len(ann[0]))
print("首条标注", ann[2][0])
跑完会看到几个数字:71 路信号、统一的 2048 赫兹、四十六秒、标注条数在两百上下。首条标注形如 #TgtM_RC01_SOA63,这一行同时编码了三件事——目标字符是 M、运行名是 RC01、标称刺激时序是"亮 6 帧灭 3 帧"。六十赫兹屏幕下,6 帧是 100 毫秒、3 帧是 50 毫秒,正好对上官方说的 150 毫秒刺激起始异步。
再往下是数据区。368 个数据记录,每个 0.125 秒。每个记录内部按信号顺序把 70 路各 256 个采样点(两字节整数)连续排开,最后接 57 字节的标注通道。这个交错布局决定了你没法"只下某一路"——想拿 Fp1,也得把整条记录读完再抽列。
| 解剖层级 | 内容 | 数量 | 备注 |
|---|---|---|---|
| 库 | 一次实验的全部记录 | 二百四十五段 | 分布在十二个目录 |
| 目录 | 一个受试者 | 二十或二十一段 | s03 至 s06 与 s12 为二十一段 |
| 记录 | 一次单字符拼写 | 一段四十六秒 | 目标字符在运行前随机指定 |
| 数据记录 | EDF 的一个块 | 三百六十八个 | 每块 0.125 秒 |
| 采样点 | 一路信号的一个时刻 | 每路 94208 个 | 46 秒 × 2048 赫兹 |
| 事件 | 一次行或列的闪烁 | 两百余次 | 每次带行/列字符集与帧数后缀 |
2.4 标注词汇表:五次元事件与两百次闪烁
标注通道里只有五类"元事件",其余全是闪烁。区分方法很简单:以 # 开头的都是元事件,不带 # 的是闪烁,内容是被点亮的那一行或那一列的全部字符。
| 标注形态 | 出现位置 | 示例 | 含义 |
|---|---|---|---|
#Tgt<字符>_RC<号>_SOA<帧> |
第一条 | #TgtM_RC01_SOA63 |
目标字符、运行名、标称时序 |
#start |
第二条 | #start |
运行开始 |
| 六字符串 + 数字后缀 | 中间大量 | MNOPQR3 |
第三行被点亮,后缀记帧数 |
| 六字符串 + 数字 + 下划线 + 数字 | 中间少量 | FLRX4_1 |
同一次闪烁的另一种帧数编码 |
#counted<k>of<n> |
倒数第二条 | #counted22of22 |
受试者自报计数与实际次数 |
#end |
最后一条 | #end |
运行结束 |
这套词汇表的精巧之处在于"闪烁标注即自变量":一般数据集只给时刻与事件码,这里额外带帧数后缀,而两次闪烁之间隔了几帧,正决定这一次的 P300 处在恢复曲线的哪个位置。
它的粗糙之处也很明显:官方 README 只逐字解释了首条标注(目标字符、运行名、时序),对闪烁后缀里那一到两个数字没有给出完整的形式化说明。想严格使用,必须自己从标注序列反推,并用标称时序做交叉校验(§4.2)。
2.5 与同类资源的字段差异
同为 PhysioNet 上的脑电库,字段设计差别很大,而这些差别直接决定能做什么任务。
| 字段维度 | 本库 | 汇总型 P300 库 | 运动想象竞赛库 | 通用临床脑电库 |
|---|---|---|---|---|
| 受试者规模 | 十二个目录 | 数百人次 | 个位数 | 数百至数千例 |
| 采样率 | 2048 Hz | 多为 256 Hz | 250 Hz | 多为 256 至 512 Hz |
| 通道数 | 64 + 6 | 因研究而异 | 22 + 3 | 19 至 256 |
| 事件标记标准 | 自定义字符串 | IEEE P2731 分级 | 竞赛规定事件码 | 临床惯例,不统一 |
| 逐次呈现间隔 | 有,写在标注后缀 | 通常只有时刻 | 固定,不记 | 不适用 |
| 反馈标记 | 无 | 部分有 | 有 | 不适用 |
| 患者信息 | 无 | 有量表 | 无 | 有病种与诊断 |
| 标注文件 | EDF 内嵌 + 二进制 | EDF 内嵌 | 独立事件文件 | 多为独立标注 |
它的信息密度集中在"刺激时序"这一列,其它列都偏薄。
2.6 三十六格的字符表
标注里的字符集把矩阵摊开来看是这样的六行:
| 行号 | 内容 |
|---|---|
| 1 | A B C D E F |
| 2 | G H I J K L |
| 3 | M N O P Q R |
| 4 | S T U V W X |
| 5 | Y Z 1 2 3 4 |
| 6 | 5 6 7 8 9 _ |
二十六个字母、九个数字、一个下划线,合计三十六格。这个布局是 Donchin 拼写器的经典配置,唯一的改动是末位用下划线而非空格——官方页面没有解释这个替换,按拼写器惯例它承担词间分隔的角色。
对做解码的人来说,这个字符表有两个后果。一是类别数是三十六而非二十六,按字母表建的先验会错位;二是每段只给一个目标字符,字符级样本量等于段数,全库两百多个,而真正能支撑训练的是闪烁级的二分类标签。
§3 它是谁的数据:一间实验室、一台放大器、十二个文件夹
3.1 三位作者与一项 2010 年的建模研究
官方页面把贡献者写成三个人:Luca Citi、Riccardo Poli、Caterina Cinel。没有机构,没有实验室名,没有伦理批号。这种克制的写法在 PhysioNet 的早期捐赠里很常见——平台只负责托管,署名的责任交还给作者。
与这个名字绑定的是 2010 年《Journal of Neural Engineering》第七卷的一篇文章,编号 056006,标题直译过来是《记录、建模并利用 Donchin 拼写器中可变目标延迟引起的 P300 幅度变化》。摘要里把动机说得很直白:P300 是内源性事件相关电位,由罕见而显著的刺激自然诱发,用它做脑机接口的好处是使用者不需要训练;坏处是波形难以检测,所以界面在做出可靠判断之前必须多次呈现目标。过去的研究把注意力放在"如何更好地检测 P300",却很少关注"P300 的形状与时刻本身在变"。
文章的贡献有三层。第一层是记录:把幅度与前置非目标数的关系系统地量出来。第二层是建模:给出一个能精确估计拼写器准确率的数学模型,并预测加权平均相对朴素平均能提升多少。第三层是利用:用这个模型算出的权重替代等权平均,在两组独立数据上取得了相对当时最优算法的统计显著提升。摘要里还有一句关键的话——方法本身是通用的,稍加改动就能用在其它基于 P300 的脑机接口上。
它不是性能报告,而是一份关于"P300 会怎么变"的证据。证据要能被重新检验,就得公开到能还原每一次呈现——这是它标注比同期多数库都细的原因。
| 项目 | 内容 | 来源 |
|---|---|---|
| 论文标题 | Documenting, modelling and exploiting P300 amplitude changes due to variable target delays in Donchin’s speller | Europe PMC 摘要 |
| 期刊 | Journal of Neural Engineering | Europe PMC 摘要 |
| 年份与卷页 | 2010 年,第 7 卷,056006 | 官方页面与摘要一致 |
| DOI | 10.1088/1741-2560/7/5/056006 | 官方页面 |
| 作者 | Citi L、Poli R、Cinel C | 官方页面 |
| 核心变量 | 目标之前的前置非目标数 | 摘要 |
| 核心结论 | 按前置数加权的平均优于等权平均 | 摘要 |
| 数据角色 | 支撑上述建模与验证的原始记录 | 官方页面 |
3.2 时间线
这批数据的时间线有一段明显的空档,值得单独说。
| 时间 | 事件 | 依据 |
|---|---|---|
| 2010 年 | 论文发表于 Journal of Neural Engineering | 官方引用 |
| 2014 年 1 月 29 日 | 目录内多数文件的修改时间 | 文件列表 |
| 2014 年 2 月 18 日 | README 的最后修改时间 | 文件列表 |
| 2014 年 3 月 4 日 | PhysioNet 正式发布 1.0.0 版 | 官方页面 |
| 2019 年 2 月 20 日 | 校验和清单 SHA256SUMS.txt 的修改时间 | 文件列表 |
从论文到发布隔了四年,从发布到补录校验和又隔了五年。全程只有一个版本号,没有修订说明,说明信号与标注自 2014 年以来没被动过——对要写复现报告的人是好事。
3.3 采集现场:旅行枕、二十二寸屏、八十厘米
官方对采集现场的描述细到有点可爱,而这些细节恰恰是判断数据质量的关键。
受试者坐姿舒适,颈部用 C 形充气旅行枕托住,以减少颈部肌电。眼睛距二十二英寸液晶屏约八十厘米,刷新率六十赫兹。前者决定字符的视网膜成像尺寸,进而影响 P300 幅度;后者决定时序量化单位——所有"帧"都以十六点七毫秒为步长。
设备是 BioSemi ActiveTwo,两千零四十八赫兹。主动电极把阻抗转换放在电极帽上,长线缆干扰不成问题;这个采样率约为屏幕帧率的三十四倍,足以把每一帧的响应分开。
参考方式是这套系统特有的:所有信号以 CMS 电极为参考,而 CMS 与 DRL 构成一个反馈回路,用来把受试者身上的共模电压拉回中点。官方特意提醒,这个模式下拿不到完整的共模抑制比,所以离线处理时应该用软件重新参考——比如以双耳垂 EARL 与 EARR 的均值为新参考——才能拿到完整的共模抑制比并改善信噪比。
这条提醒把"官方推荐的预处理"写进了数据说明。很多人拿到 EDF 直接滤波切段,用的还是 CMS 参考,看到低频漂移就归咎于数据质量——其实是参考没换。
| 采集要素 | 取值 | 为什么重要 |
|---|---|---|
| 设备 | BioSemi ActiveTwo | 主动电极,阻抗容忍度高 |
| 采样率 | 2048 Hz | 可无损降采样,保留高频细节 |
| 脑电通道 | 64 | 标准扩展布局,支持空间滤波 |
| 参考电极 | CMS | 需离线换参考才能拿到完整共模抑制比 |
| 辅助通道 | 双耳垂 + 四眼电 | 重参考与伪迹校正都要用 |
| 屏幕 | 22 英寸液晶,60 Hz | 决定帧长与视角 |
| 观看距离 | 约 80 厘米 | 决定字符的视网膜尺寸 |
| 固定方式 | C 形充气旅行枕 | 减少颈部肌电 |
3.4 数据来源的三个层次
这批数据的来源可以分三层看,每一层的可信度不同。
第一层是原始记录本身。这是唯一的一手材料,所有分析都必须回到它。它的可靠性由两件事保证:一是校验和清单,二是 EDF+ 的自描述结构。只要校验和对得上,就能确认拿到的字节与作者上传的一致。
第二层是官方 README 与页面描述。它们解释了协议、设备、标注结构,是理解第一层的钥匙。但它们是散文,不是规范,存在表述不精确的地方——最典型的是闪烁后缀没有形式化定义(§4.2)。
第三层是 2010 年那篇论文。它解释了为什么要这样采,给出了理论模型与结论。但它不是数据说明文档,不能用来替代 README。论文里的样本量、受试者数、实验轮次,与公开的这批记录是否一一对应,官方没有明说。
三层之间的关系是:论文给动机,页面给协议,文件给事实。三者冲突时以文件为准,这是处理任何公开数据集都适用的顺序。
3.5 两个口径:十个人还是十二个文件夹
这里必须把一处不一致摊开来讲,因为它会影响任何按受试者做的划分。
官方页面摘要的原话是:十名参与者的每人二十段记录,包含带标注的六十四通道脑电与四通道眼电。按这句话算,总数应该是两百段。
而文件树列出的是 s01 到 s12 十二个目录,记录清单 RECORDS 里有二百四十五行。逐目录数,s01、s02、s07 至 s11 各二十段,s03 至 s06 与 s12 各二十一段。
| 口径 | 受试者数 | 记录数 | 出处 |
|---|---|---|---|
| 页面摘要 | 10 | 200(十人 × 二十段) | 官方页面正文 |
| 文件树 | 12 | 245 | 目录列表与 RECORDS 逐行 |
两个口径差两个人、四十五段。差额从哪来,官方没有说明;页面文字沿用论文时期描述、或后来补采了两名受试者,都只是猜测。
对使用的实际影响很具体:如果你按"十名受试者"设计留一交叉验证,会漏掉两个目录;如果你按目录数算样本量,又会在写方法学时与官方摘要对不上。稳妥的写法是同时报告两个数字,并说明划分以目录为准。
这也解释了为什么 s03 到 s06 与 s12 会多出一段。多出来的那段是 rc21,编号接在 rc20 之后,位置没有特殊性。它可能是一次补测,也可能是一次失败后重来。官方没有解释,标注里也没有额外字段能区分。
§4 它最独特的东西:把延迟当成变量
4.1 为什么固定的刺激间隔会掩盖幅度调制
多数 P300 数据集的刺激间隔是固定的:每 150 毫秒闪一次,从头到尾不变。这种设计对分类器友好——所有样本的时序结构一致,滤波器、窗长、基线都能用同一套参数。但它有一个副作用:它把"前置非目标数"这个变量变成了固定值。
标准行列闪烁的一轮是十二次(六行加六列),目标出现两次。若每轮严格按序走完,目标之前的非目标数总在很窄的范围里浮动,"幅度随前置数变化"就被压扁了——你能看到波动,却无法归因。
要分离它,就得让前置数真正变动。这批数据用"随机不放回":每一轮把十二个行与列打乱后依次点亮,目标在序列中的位置每次都不同,前置数可以从零变到十一。这个设计把潜在的混淆变量变成了可观测的自变量。
这也解释了为什么它的标注要写得那么细。如果只是打乱顺序,你事后仍然能从闪烁序列里数出前置数——但前提是每一次闪烁都被记下来了。两百多次闪烁,一次不落,才可能重建这条曲线。
| 设计选择 | 常见做法 | 本库做法 | 后果 |
|---|---|---|---|
| 闪烁顺序 | 固定轮转 | 每轮随机不放回 | 前置非目标数成为变量 |
| 刺激间隔 | 全程固定 | 标称固定,逐次有微差 | 需要解析后缀才能精确对齐 |
| 目标位置 | 固定或半随机 | 运行前随机抽取 | 类别分布不可预设 |
| 单段长度 | 数十次试验 | 一次拼写即一段 | 段内相关性强 |
| 反馈 | 多数有 | 没有 | 无法研究反馈相关电位 |
4.2 标注后缀里的帧数
闪烁标注的形态是"六个字符 + 数字后缀"。六个字符是被点亮的那一行或那一列,这个好理解;后缀才是需要琢磨的部分。
对照官方 README 对首条标注的解释:刺激亮 6 个刷新周期(100 毫秒)、灭 3 个(50 毫秒),标称刺激起始异步 150 毫秒。首条标注写作 #TgtM_RC01_SOA63,那个 63 就是"亮 6 帧、灭 3 帧"的缩写。这条线索给出了后缀的读法:数字是以帧为单位的时长,一帧约十六点七毫秒。
于是闪烁标注里的 MNOPQR3 可以读成"第三行被点亮,随后间隔 3 帧"。而 FLRX4_1 这种带下划线的形态,则像是把两个量并排写在一起。官方没有给出后者的形式化定义,只能从上下文推断它与前者的差别在于记录了不止一个时长。
| 后缀形态 | 示例 | 帧数解读 | 折算时间 | 置信度 |
|---|---|---|---|---|
| 单数字 3 | MNOPQR3 |
间隔 3 帧 | 约 50 毫秒 | 高,与标称一致 |
| 单数字 1 或 2 | FLRX4_1 前半 |
间隔 1 至 2 帧 | 约 17 至 33 毫秒 | 中,属短间隔 |
| 单数字 4 或 6 | STUVWX4 |
间隔 4 至 6 帧 | 约 67 至 100 毫秒 | 中 |
| 下划线加数字 | FLRX4_1 后半 |
可能是亮屏帧数 | 未定 | 低,官方未定义 |
| 首条 SOA 码 | SOA63 |
亮 6 灭 3 | 150 毫秒 | 高,README 明示 |
这张表里"置信度"一列是本文的判断,不是官方说法。稳妥的做法是只依赖三样确定的东西——闪烁时刻、被点亮的字符集、首条标注里的标称时序;后缀只当辅助的时间微调信息。
即便只用这三样,也足够重建前置非目标数了:按时间排序所有闪烁,对每一次目标闪烁,数它之前连续出现了多少个非目标闪烁即可。这个量不需要后缀,只需要顺序。
4.3 案例:s01/rc01 那四十六秒
拿一段具体记录走一遍,比抽象描述有用。选 s01/rc01,因为它是全库第一段,任何人都能直接对上。
打开它的头:71 路信号,采样率统一两千零四十八赫兹,368 个数据记录,每个 0.125 秒,合起来四十六秒。第一条标注是 #TgtM_RC01_SOA63——这次要拼的字符是 M,在字符表的第三行第三列。第二条是 #start,最后一条是 #end,倒数第二条是 #counted22of22。
倒着看这几个标注,一段实验的轮廓就出来了:实验员指定目标 M,受试者开始盯着看,屏幕上的行与列被打乱着点亮两百多次,受试者默数 M 被点亮的次数,结束后报出自己数到的数,运行结束。全程四十六秒。
把标注序列中间那两百多条摊开,会看到它们全是六个字符加数字。六个字符有两种:横排的(MNOPQR)和竖排的(MGSY5_)——后者是把矩阵同一列的六个字符连起来写。这就是行列闪烁的编码方式,行有六条、列有六条,各十二种。
再看信号本身。四十六秒里,每一路有九万四千二百零八个采样点。以两千零四十八赫兹的采样率计,一个 P300 从起峰到回落大约要三百毫秒,对应六百多个采样点——这个分辨率足以看清波形的上升沿与下降沿,也足以做不同低通截止频率下的对比实验。这正是两千零四十八赫兹相对二百五十六赫兹的实际价值:不是精度更高所以更准,而是保留了可以选择的权利。
最后看这段记录缺什么。它没有分类器的输出,没有屏幕上是否显示了解码结果的标记,没有受试者按键的时刻(除了那次口头报数),也没有电极阻抗记录。这四样东西,恰好是在线脑机接口研究最常需要的四样。
§4.3 的案例换个角度看:四十六秒里前两秒准备、中间四十二秒是两百多次闪烁、最后两秒报数结束。几乎全是有效载荷,没有块间休息与过渡段。
4.4 计数标注:一条被忽略的行为学通道
#counted22of22 这条标注容易被当成装饰,其实它是一条独立的行为学测量。
官方说明:从第三名受试者开始,要求受试者在每次运行结束时报告自己数到的目标闪烁次数。这条要求看着像实验者的强迫症,实际上是在测注意力——P300 拼写器依赖受试者主动注意目标,如果他在中途走神,计数会偏离实际次数,P300 的幅度也会下降。计数因此成了一个廉价而有效的注意力代理指标。
用它可以做几件有意思的事。第一,把"计数准确"与"计数偏差"的运行分开,比较两组的解码准确率,可以直接量化注意力对拼写性能的贡献。第二,把偏差方向当成特征——数多了和数少了可能对应不同的注意状态。第三,把它当作剔除标准,在做跨受试者比较时先把明显走神的运行剔掉。
| 计数标注 | 覆盖范围 | 用法 | 限制 |
|---|---|---|---|
#counted<k>of<n> |
从 s03 起的运行 | 注意力代理、剔除标准、协变量 | 前两个目录没有 |
k 与实际次数 n 的差 |
同上 | 偏差方向与幅度 | 自报,无客观校验 |
| 缺失 | s01、s02 | 只能靠信号本身判断 | 无法补齐 |
覆盖范围是这条通道最大的限制。s01 与 s02 没有计数标注,任何使用计数的分析样本会自动缩到十个目录——又和官方摘要的"十名参与者"撞上。这个巧合不必过度解读,但方法学里要交代清楚。
还有一层限制:计数是自报的,没有客观校验。受试者可能数错,也可能为了显得专注而报一个整数。把它当协变量可以,当金标准不行。
4.5 边界条件:什么情况下它不再适用
四种情况下这批数据会失效,且失效方式各不相同。
第一种,任务从"检测"变成"分类"。 如果你的目标是区分三十六类字符,这批数据给不了——每人二十个字符,类别数比样本还多。它能支持的是二分类的单试次检测,字符级结果只能作为端到端的汇总指标。
第二种,实验条件必须固定。 如果你的方法假设所有刺激间隔相同(例如按固定窗长切段、按固定延迟做重叠平均),这批数据会不断违反假设。它的价值在于间隔不固定,代价也是间隔不固定。
第三种,需要闭环。 没有反馈,就没有错误相关电位,没有 P300 之后的调整行为,没有"分类器错了受试者怎么反应"的数据。所有依赖闭环动力学的课题都用不了。
第四种,需要人群推断。 十二个健康人,没有年龄性别,没有招募方式说明。任何关于"人"的结论都超出这批数据能承载的范围,最多只能说"在这十二个人身上"。
§5 怎么拿到:从 curl 到可训练张量
5.1 目录结构与下载面
官方给三条路:浏览器点 ZIP(一点七吉字节)、wget 递归、AWS 开放桶同步。内容一样,差别在断点续传与速度。
目录是扁平的:十二个受试者目录,每个目录里二十来个 EDF 与同名 event 文件。对脚本友好,对人工浏览不友好。
| 下载方式 | 命令要点 | 适合场景 | 注意 |
|---|---|---|---|
| ZIP | 页面按钮 | 一次性拿全量 | 一点七吉字节,断了要重来 |
| wget 递归 | 加 -r -N -c -np |
需要续传 | 会连目录索引一起拉 |
| AWS 同步 | s3 sync --no-sign-request |
批量、可并行 | 需要装命令行工具 |
| 逐文件 | 直接拼 URL | 只要几段做实验 | 最省流量 |
5.2 批量下载
只想要某几个受试者时,别下整包。下面这段按目录拉取,跳过已经存在的文件,中断后重跑不会重复下载。
#-- 只拉 s01 到 s03,跳过已存在文件
BASE="https://physionet.org/files/erpbci/1.0.0"
mkdir -p erpbci && cd erpbci
for s in s01 s02 s03; do
mkdir -p "$s"
for i in $(seq -w 1 20); do
for ext in edf event; do
f="$s/rc${i}.${ext}"
if [ ! -s "$f" ]; then
curl -sSL --retry 3 -o "$f" "$BASE/$f"
fi
done
done
done
#-- 核对行数与体积,EDF 每段约 9 MB
du -sh s01 s02 s03
seq -w 给出两位数编号,正好对上 rc01 到 rc20。s03 至 s06 与 s12 有二十一段,上限要改成 21——这就是依赖 RECORDS 清单比硬编码编号更稳的原因。
5.3 读头、换参考、降采样
读进来之后第一件事不是滤波,是换参考。官方明确说 CMS 参考拿不到完整共模抑制比,建议用双耳垂均值重参考。第二件事是按需降采样,两千零四十八赫兹对多数流程是浪费。
#-- 读入、按耳垂均值重参考、降到 256 Hz
import numpy as np, mne
raw = mne.io.read_raw_edf("s01/rc01.edf", preload=True, verbose="ERROR")
raw.set_channel_types({"VEOGL": "eog", "VEOGR": "eog",
"HEOGL": "eog", "HEOGR": "eog"})
#-- 用双耳垂均值做新参考,耳垂通道随后保留为普通信号
raw.set_eeg_reference(ref_channels=["EARL", "EARR"], verbose="ERROR")
#-- 抗混叠后降到 256 Hz,P300 主要能量在 20 Hz 以下
raw.resample(256, npad="auto", verbose="ERROR")
print(raw.info["sfreq"], len(raw.ch_names), raw.n_times / raw.info["sfreq"])
打印出来应是 256、71、约 46。第三个数不对,说明时长解析错了,先回去查头文件的数据记录数,别继续往下走。
5.4 读标注
标注有两个来源,内容一致,选一个即可。用 mne 读 EDF 时,标注会随文件一起进来;用 wfdb 读 .event 则是另一条路。后者更快,因为它不用解码信号。
#-- 从 EDF 内嵌通道取标注,按类型分流
import mne
raw = mne.io.read_raw_edf("s01/rc01.edf", preload=False, verbose="ERROR")
desc = raw.annotations.description
onset = raw.annotations.onset
meta = [(o, d) for o, d in zip(onset, desc) if d.startswith("#")]
flashes = [(o, d) for o, d in zip(onset, desc) if not d.startswith("#")]
print("元事件", meta[:3])
print("闪烁条数", len(flashes))
print("首个闪烁", flashes[0])
元事件只有五类,按前缀分流即可。闪烁的字符串有两种长度:六字符是纯粹的行或列,带数字后缀的则多了时长信息。解析时建议把字符集与后缀分开存两列,别把整串当类别用——否则同一个行 MNOPQR 会因为后缀不同被当成十几个不同的类别。
另一条路是不解码信号、直接读二进制标注,速度快得多,适合批量预检。
#-- 直接读 WFDB 二进制标注,只取事件不取波形
import wfdb
ann = wfdb.rdann("s01/rc01", "event")
print("标注条数", len(ann.sample))
print("前五条", ann.aux_note[:5])
#-- 采样点换算成秒,应与 EDF 标注通道逐条一致
print("前三秒位置", (ann.sample[:3] / 2048.0).round(3))
两条路读出来的条数与位置应当完全一致,官方明确说过内容相同。如果不一致,多半是文件没下全。
5.5 切 epoch 与划分
切段的关键是"围绕闪烁对齐",而不是围绕字符对齐。每一次闪烁都是一个候选事件,标签由它是否包含目标字符决定。
#-- 以闪烁为事件切段,标注目标/非目标
import numpy as np, mne
TARGET = "M"
raw = mne.io.read_raw_edf("s01/rc01.edf", preload=True, verbose="ERROR")
raw.set_eeg_reference(ref_channels=["EARL", "EARR"], verbose="ERROR")
events, labels, codes = [], [], []
for o, d in zip(raw.annotations.onset, raw.annotations.description):
if d.startswith("#"):
continue
charset = d[:6]
events.append([int(o * raw.info["sfreq"]), 0, 1])
labels.append(1 if TARGET in charset else 0)
#-- 窗长 0.8 秒,刺激前 0.2 秒作基线
epochs = mne.Epochs(raw, np.array(events), tmin=-0.2, tmax=0.8,
baseline=(-0.2, 0), preload=True, verbose="ERROR")
X = epochs.get_data(copy=True)
y = np.array(labels)[: len(X)]
print(X.shape, y.mean().round(3))
这段出来是一个三维数组:段数 × 通道 × 采样点。y.mean() 是目标闪烁的占比,按行列设计应该在六分之一上下,如果明显偏离,多半是字符集解析错了——比如把目标字符 M 与数字或下划线搞混。
划分必须按受试者做,不能按段随机。同一个人在不同运行里的脑电特征高度相似,随机切分会让模型在测试集上见到"同一颗脑袋",成绩虚高。正确做法是留一受试者:拿十一个目录训练,第十二个测试,轮十二次。样本只有十二个人,这已经是最粗的粒度,再细就没有统计意义了。
5.6 五个最容易出错的地方
| 出错点 | 表现 | 原因 | 处理 |
|---|---|---|---|
| 把 .event 当文本 | 打开是乱码,行数为零 | 它是 WFDB 二进制标注 | 用 wfdb 读,或直接读 EDF 内嵌通道 |
| 沿用 CMS 参考 | 低频漂移大,受试者间差异诡异 | 该模式共模抑制比不完整 | 用 EARL 与 EARR 均值重参考 |
| 把整数当微伏 | 幅值量级差几个数量级 | 未按物理上下限还原 | 用读取库的标定,别手撸字节 |
| 按段随机划分 | 测试成绩异常高 | 同一受试者跨集泄漏 | 按目录留一受试者 |
| 把后缀当类别 | 类别数暴涨到几十 | 行字符与时长后缀混在一起 | 字符集与后缀分列存储 |
还有一处不算错误但常被忽略:EDF 的开始日期是两位数年份,13.05.79 可能被读成 2079 年,按年份筛选的流程会出错。
§6 与库内条目的关系
6.1 关系图谱
库内与脑电相关的记录不少,但真正需要与之划清界限的只有四条:汇总型 P300 库、运动想象竞赛库、基准框架、以及另一个同期的快速序列视觉呈现实验。
| 库内记录 | 与本库的关系 | 主要差别 |
|---|---|---|
| bigP3BCI | 同范式,不同粒度 | 它是十八项研究的汇总,本库是单一实验的原始记录 |
| BCI Competition IV-2a | 同为脑机接口,不同范式 | 它是运动想象四分类,本库是事件相关电位二分类事件 |
| MOABB | 基准框架,非数据集 | 它聚合多个库并提供统一评测,本库是一手数据 |
| EEGMMIDB | 同平台,不同任务 | 它是运动执行与想象,一百零九人,一百六十赫兹 |
| ltrsvp | 同平台,同为视觉诱发电位 | 它是快速序列呈现的目标检测,八通道,三档速率 |
| CHB-MIT 等临床脑电库 | 同模态,不同用途 | 那些是癫痫临床记录,本库是健康人的实验记录 |
6.2 检索路径
想找本库,站内搜索用 slug erpbci,或者用全名 ERP-based Brain-Computer Interface recordings。中文关键词用"事件相关电位 拼写"比"脑机接口"更准,因为后者会返回一大批运动想象与稳态视觉诱发电位的词条。
按需求找:要规模训练去 bigP3BCI;要运动想象的经典基准去 BCI Competition IV-2a;要统一评测框架去 MOABB;要研究刺激时序与波形形态,才轮到本库。
6.3 三张对照表:范式、类别数、反馈
三张表分开列,因为这三个维度最容易混淆,而它们恰好决定了一个库能做什么。
第一张是范式。
| 库 | 范式 | 刺激 | 受试者任务 |
|---|---|---|---|
| 本库 | 矩阵拼写,行列闪烁 | 6×6 字符,行与列轮流强化 | 注视目标字符并默数 |
| bigP3BCI | 矩阵拼写,多研究汇总 | 因研究而异,多为行列 | 拼写指定字符 |
| BCI IV-2a | 运动想象 | 屏幕箭头提示 | 想象左手、右手、双脚、舌头 |
| EEGMMIDB | 运动执行与想象 | 屏幕提示开合拳 | 执行或想象动作 |
| ltrsvp | 快速序列视觉呈现 | 每秒五至十张图像流过 | 发现目标图像时报数 |
第二张是类别数与样本量。
| 库 | 目标类别数 | 受试者 | 每受试者样本 | 采样率 |
|---|---|---|---|---|
| 本库 | 三十六字符;事件级二类 | 十二个目录 | 二十或二十一段 | 2048 Hz |
| bigP3BCI | 字符级,多套字符表 | 二百七十八人次 | 数十段 | 256 Hz |
| BCI IV-2a | 四类 | 九 | 五百七十六试次 | 250 Hz |
| ltrsvp | 二类(有/无目标) | 十一 | 数次飞行 | 2048 Hz |
第三张是在线反馈,这是最容易被忽略又最影响课题选择的一维。
| 库 | 有无在线反馈 | 有无分类器输出 | 能否做闭环研究 |
|---|---|---|---|
| 本库 | 无 | 无 | 不能,需自行搭建 |
| bigP3BCI | 部分研究有反馈标记 | 部分有预测字符标记 | 可以,取决于子研究 |
| BCI IV-2a | 有提示与反馈段 | 有分类结果反馈 | 可以,但反馈是离线的 |
| ltrsvp | 无 | 无 | 不能 |
把三张表叠起来看,本库的位置很清楚:范式最经典、类别最细(三十六格)、受试者最少、反馈完全没有、采样率最高。它占的是"精细但单薄"这个角,而不是"规模与通用"那个角。任何把它当 bigP3BCI 替代品的用法,都会在第一步就撞上样本量。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
先校正一个会被反复触发的误判:把"样本少"直接读成"质量差"。这两件事在这批数据上不是一回事。
它的少是设计出来的。四十六秒一段、一段一次拼写,让每段对应一个干净的行为单元:目标确定、起止明确、没有块间休息。拉长成十分钟一段,会混进多个目标与多次走神,标注复杂度上升而有效信息不增。段短不是省事,是让"一次拼写"成为可对齐的原子单位。
校正之后,五维评分的读法也要跟着变。规模分低衡量的是"能不能喂饱模型",不是"记录得规不规矩";而在规矩这件事上,它比多数同期库都讲究。
真正该扣分的地方在别处:两个口径对不上(十人还是十二人)、闪烁后缀没有形式化定义、没有划分与基线。这些是文档与规范层面的欠缺,与采集质量无关。把两类问题混着看,就会得出"这库不严谨"的错误结论。
7.1 五维评分
按 DAIMS 的常用维度打分,每项一至五分,分数针对"作为事件相关电位研究数据"这个用途。
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据规模 | 2 | 十二个目录、两百多段,训练不足,做精细分析够用 |
| 标注质量 | 4 | 逐次闪烁带时序,事件与信号严格同步,但后缀缺形式化定义 |
| 任务适配 | 4 | 可变延迟设计稀缺,眼电齐全,唯独不支持闭环 |
| 文档完整 | 3 | 协议写得细,但受试者数与记录数两个口径冲突,元信息缺项多 |
| 可获取性 | 5 | 免注册、ODC-BY、体量适中,三条下载路径都可用 |
合计十八分(满分二十五)。这个分布说明它不是全能选手:规模是硬伤,可获取性拉满,标注与适配性稳居中上,文档因为口径冲突掉了一档。
"任务适配"这一项最值得说。按"通用脑机接口研究"打分它只有三分——没有反馈、没有患者、类别不平衡;按"事件相关电位波形研究"打分它是四分往上,因为可变延迟这个设计在公开库里几乎找不到第二个。
7.2 标注质量的两层
第一层是同步准不准。这一层它做得很好。闪烁时刻与信号共用一套时钟,标注直接写在 EDF 的标注通道里,不存在"信号一个文件、事件另一个文件、时间基准还不一样"的经典麻烦。四路眼电与六十四路脑电同步采样,做伪迹校正时不需要额外对齐。
第二层是语义清不清楚。这一层它做得不够。五类元事件的语义是清楚的,闪烁标注的前半段(哪一行或哪一列)也是清楚的,但后缀的语义没有定义。官方 README 只解释了首条标注里的 SOA63,没有说清 MNOPQR3 与 FLRX4_1 这两种形态的差别到底在哪。
| 标注层 | 可靠性 | 影响 | 建议 |
|---|---|---|---|
| 闪烁时刻 | 高,与采样时钟同源 | 切段、对齐可直接用 | 直接用 |
| 行/列身份 | 高,六字符串唯一 | 目标判定可直接用 | 直接用 |
| 运行边界 | 高,有 start 与 end | 段级切分可靠 | 直接用 |
| 目标字符 | 高,写在首条标注 | 字符级评估可靠 | 直接用 |
| 帧数后缀 | 中,部分形态未定义 | 精细时序分析有风险 | 用标称时序交叉校验 |
| 自报计数 | 中,主观且覆盖不全 | 只能当协变量 | 别当金标准 |
这六层里,前四层足以支撑绝大多数分析。真正需要小心的是第五层——如果你的方法对刺激时刻的精度要求在毫秒级,就必须自己从标注里反推间隔,而不能假设"每 150 毫秒一次"。
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响 |
|---|---|---|
| 受试者极少 | 十二个目录,官方摘要写十名 | 留一交叉验证的方差极大 |
| 人群单一 | 全部健康,无年龄性别 | 不能外推到患者 |
| 单中心单设备 | 一台 BioSemi,一套屏幕 | 设备差异无法从数据内部估计 |
| 采集年份未公布 | 只有发布年份 | 无法判断与论文的时间关系 |
| 字符级样本薄 | 每人约二十个字符 | 字符级指标不可比 |
| 段内相关 | 一段内的闪烁共享同一状态 | 有效样本远小于事件数 |
| 无反馈 | 无分类器输出 | 闭环课题无法开展 |
| 计数覆盖不全 | 仅从 s03 起有 | 使用计数的分析少两个目录 |
| 后缀语义不全 | 官方未形式化 | 精细时序需自行校验 |
这些偏差里,前四条是结构性的,改不了;中间三条是设计选择带来的,理解之后可以规避;最后两条是文档问题,可以靠交叉校验绕过。
有一条值得单独说:段内相关。一段里两百多次闪烁看上去样本很多,但同一分钟内的注意水平、眨眼频率、电极阻抗近似恒定。把这些闪烁当独立样本做检验会严重高估显著性,统计单位应该是段或人,不是闪烁。
7.4 外部验证矩阵
这批数据在文献里的用法,可以归成四类角色。判断依据是官方说明与论文摘要,不涉及具体数值比较。
| 验证角色 | 做法 | 讲得通的地方 | 风险 |
|---|---|---|---|
| 方法复现 | 复现可变延迟加权平均 | 原始波形与逐次时序都在 | 论文的受试者与公开记录是否完全对应未说明 |
| 单试次检测基准 | 在其上跑分类器比 AUC | 事件量足、信噪比高 | 只有十二人,跨人方差主导结果 |
| 预处理对比 | 比较高采样率与降采样后的检测率 | 两千零四十八赫兹可无损降 | 降采样策略不同会让结论不可比 |
| 伪迹校正评测 | 用四路眼电做回归或分解 | 眼电与脑电严格同步 | 无独立标注的伪迹段 |
四类角色里,第一类最稳,因为那是这批数据的设计目的;第二类最常见,但要小心统计单位;第三类最适合它,因为高采样率是它相对汇总库的独有优势。
第二类的坑要提醒一句:若一篇报告说"在该库达到百分之九十五的单试次准确率",这个数字本身说明不多——目标闪烁只占六分之一,而各家的窗长、滤波、划分都不同。没有统一协议,跨论文比较没有意义。
7.5 它为何能持续:稀缺的不是样本量,是那次打乱
它自 2014 年发布以来没有扩版,也没有官方维护,却持续被引用。原因不在规模,在于它记录了一件别处很难查到的事:每一次闪烁与上一次之间隔了多久。
汇总库把不同研究拼在一起,标记统一了,刺激时序却被压成"时刻加事件码",间隔信息丢失;竞赛集时序固定,间隔没有变异;临床库不涉及范式化刺激。只有为单项建模研究保留的原始记录,才会把间隔写到逐次粒度。只要还有人研究 P300 的幅度调制与注意恢复,这个组合就有位置(§4.1)。
成本也是原因。重做一次这样的实验,需要一台六十四导主动电极系统、六十赫兹屏幕、十几名受试者和伦理审批。下载则只要一点七吉字节。
§8 生态位与历史
8.1 历史沿革
这批数据诞生在 PhysioNet 数据捐赠的一个特定阶段。平台上已经有大量心电、脑电、多参数重症记录,但"范式化认知实验"这一类相对少——临床信号是顺手录下来的,认知实验则要为研究目的专门设计,愿意公开的人不多。
它的加入方式很典型:研究组做完建模后把原始记录整理成平台能接受的格式捐出来,托管与版本管理交给平台。这种模式让它在没有后续基金的情况下活了十多年。
从格式上也能看出年代。EDF+ 加上同源的 WFDB .event,是那个时期平台的标准做法——新格式要照顾老工具,于是同一份标注存两遍。后来的汇总型数据库大多只用 EDF+ 内嵌标注,不再生成 .event。这个细节说明它的整理工作发生在一个过渡期。
8.2 与挑战赛、汇总库的关系
它没有进过任何挑战赛。PhysioNet 历年挑战赛涉及的脑电任务主要是癫痫检测、睡眠分期、意识状态判断,事件相关电位拼写从未成为赛题。这意味着它没有官方划分、没有排行榜、没有社区基线,也意味着它不会被"刷分"式的研究消耗。
它与汇总型 P300 库的关系更微妙。汇总库的价值在于规模与统一标记,代价是抹平了单个研究的细节——不同实验室的刺激时序被压成统一的事件码,间隔信息不再保留。本库恰好相反:规模小,标记朴素,但细节完整。两者不是替代关系,而是粗细两层。做规模训练用汇总库,做时序机制研究用本库,这个分工在短期内不会变。
与基准框架的关系则是另一回事。基准框架聚合多个库并提供统一评测协议,本身不含新数据。本库是否被某个框架收录,取决于该框架的维护者,官方页面没有提及这类集成。要用框架跑本库,得自己写适配层。
8.3 生态位:细刻度的参照物
把市面上的脑电库按"刻度"排:临床长程记录最粗,几小时到几天,标注稀疏;竞赛集居中,几百试次,事件码规范;汇总库规模大、标记规范;本库在最细的一端。
因此它有两个用途:一是细刻度参照,任何关于刺激时序的假设都能在这里检验;二是教学材料,一段四十六秒从矩阵到标注每一环都对得上。
这个位置也不容易被新库替代。拼一个汇总库容易,拼一个"逐次时序完整、单实验室、健康受试者、两千零四十八赫兹"的库难,因为需要的不是数据量,是一次愿意公开的完整实验。
8.4 谁在用它,用来做什么
从公开文献摘要看,引用集中在三个方向:事件相关电位检测方法,把它当独立验证集;刺激时序与波形形态的关系,承接 2010 年那篇论文的问题;预处理与伪迹校正,看中高采样率与齐全眼电。
还有一类不常被提及的用法:工具链测试。它简单到几十行代码就能读完,又包含 EDF+ 标注通道、二进制事件文件、多路眼电、非标准年份字段这些真实麻烦,拿来给读取库做回归测试很合适。
三类用法有个共同点:都不要求大样本。课题一旦要求"至少一百人",它就会被换掉。
§9 使用指引
9.1 三种角色的路径
算法研究者的最短路径。 按 §5.2 拉三到四个受试者,换参考、降到二百五十六赫兹、切段,跑一个逻辑回归拿到基线,再决定是否扩到全部目录。别一上来下全量。
认知神经科学方向的最短路径。 先读 README 的协议段,再挑一段(推荐 §4.3 的案例)把标注逐条打印出来,确认自己理解了行/列编码与目标标记。然后按前置非目标数分组,比较各组的目标响应幅度。这一步不需要训练任何模型,叠加平均就够。
工程落地方向的最短路径。 先确认要的是离线解码还是在线系统。离线可直接用;在线要自己补反馈环节,这批数据帮不上忙,把它当"离线性能上限"的估计更合适。
| 角色 | 先做什么 | 别做什么 | 预期产出 |
|---|---|---|---|
| 算法研究者 | 三到四个受试者跑通全链路 | 一上来下全量 | 可复现的基线 |
| 认知方向 | 打印一段的全部标注 | 直接对全库做统计 | 前置数与幅度的关系 |
| 工程落地 | 确认离线与在线的差别 | 指望它提供反馈数据 | 离线性能上限估计 |
| 教学 | 用一段四十六秒做演示 | 用整库做课堂练习 | 完整链路的直观理解 |
9.2 一条最短的可用流程
从零到第一个可比较的数字,下面这段够用。它不追求性能,只保证每一步都对得上。
#-- 最小可用流程:下载一段、换参考、切段、留一受试者基线
import numpy as np, mne
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
def load_epochs(path, target):
raw = mne.io.read_raw_edf(path, preload=True, verbose="ERROR")
raw.set_eeg_reference(ref_channels=["EARL", "EARR"], verbose="ERROR")
raw.filter(0.5, 20.0, verbose="ERROR")
raw.resample(256, npad="auto", verbose="ERROR")
ev, y = [], []
for o, d in zip(raw.annotations.onset, raw.annotations.description):
if d.startswith("#"):
continue
ev.append([int(o * raw.info["sfreq"]), 0, 1])
y.append(1 if target in d[:6] else 0)
ep = mne.Epochs(raw, np.array(ev), tmin=-0.2, tmax=0.8,
baseline=(-0.2, 0), preload=True, verbose="ERROR")
X = ep.get_data(copy=True)
return X.reshape(len(X), -1), np.array(y)[: len(X)]
Xtr, ytr = load_epochs("s01/rc01.edf", "M")
Xte, yte = load_epochs("s02/rc01.edf", "P")
clf = LogisticRegression(max_iter=2000).fit(Xtr, ytr)
print("跨受试者 AUC", round(roc_auc_score(yte, clf.predict_proba(Xte)[:, 1]), 3))
这里刻意做的是跨受试者:用 s01 训练、s02 测试。AUC 大概会落在零点七到零点九之间,具体取决于两人的相似度。如果换成同一受试者的另一段做测试,数字会明显更高——那不是模型变强了,是泄漏。这条对照实验值得每个人自己做一遍,它对"跨人泛化有多难"的说服力,比任何文字描述都强。
9.3 引用方式
官方要求同时引用两件东西:原始论文与 PhysioNet 平台。论文那一条是 Citi、Poli、Cinel 在 2010 年《Journal of Neural Engineering》第七卷 056006 的文章,DOI 为 10.1088/1741-2560/7/5/056006。平台那一条按 PhysioNet 的现行建议引用其 2026 年的平台综述。
数据本身建议写到版本级:数据集名称、版本号 1.0.0、DOI 10.13026/C2101S、访问日期。许可为 ODC-BY 1.0,允许商用与再分发,条件是署名。若做了再加工(重参考、降采样、重新切段),应在方法里写清楚,因为这些步骤会改变别人复现的结果。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑负责结构与事实核对 |
| 数字来源 | 规模、结构、边界三类数字取自 PhysioNet 官方页面与官方文件 |
| 文件核验 | RECORDS、README、ANNOTATORS、s01/rc01 的头与标注经直接访问确认 |
| 口径冲突 | 官方摘要写十名参与者,文件树为十二个目录,已在 §3.5 并列呈现 |
| 论文信息 | 仅参考 Europe PMC 返回的摘要,未读全文 |
| 未核验内容 | 全部二百四十五段的标注条数、受试者年龄性别、采集年份 |
| 图像 | 无配图;封面为生成式提示词,不含真实脑电波形 |
| 免责 | 本文不构成任何临床或工程建议;使用须遵守 ODC-BY 1.0 署名条款 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「它是一个 P300 分类基准」 | 无官方划分、无基线、无排行榜 | 官方页面只有协议与格式说明 |
| 「它有十名受试者」 | 文件树是十二个目录 | s01 至 s12,RECORDS 二百四十五行 |
| 「它是两百段记录」 | 二百四十五段 | RECORDS 逐行计数 |
| 「每段是几分钟的长记录」 | 每段四十六秒 | 头文件 368 × 0.125 秒 |
| 「刺激间隔全程固定 150 毫秒」 | 标称固定,逐次有变异 | 闪烁标注带帧数后缀 |
| 「标注文件是文本」 | 是 WFDB 二进制 | 文本打开行数为零 |
| 「可以直接用 CMS 参考做分析」 | 官方建议换耳垂均值参考 | README 明确要求重参考 |
| 「它包含在线反馈」 | 没有任何反馈或分类器输出 | 标注只有五类元事件 |
| 「它可以替代汇总型 P300 库」 | 规模差两个数量级 | 十二个目录对二百七十八人次 |
| 「字符集是二十六个字母」 | 三十六格,含数字与下划线 | 标注中的行内容为 A 到 Z、1 到 9、下划线 |
FAQ
Q1:这个库到底有十名还是十二名受试者?
两个口径并存。官方页面摘要写十名参与者、每人二十段;文件树列出 s01 至 s12 十二个目录、二百四十五行记录。差额从哪来,官方没有说明。做划分时以目录为准,写方法学时把两个数字都报出来。
Q2:它是 P300 拼写器吗?
是。官方描述为传统矩阵拼写器,六行六列共三十六格,行与列随机不放回强化,受试者注视目标字符并默数它被点亮的次数。标注里的字符集是 A 到 Z、1 到 9 与一个下划线。
Q3:能不能拿它训练在线拼写器?
不能直接用于在线闭环。这批记录是离线采集,没有分类器输出、没有反馈刺激、没有决策时刻标记。可以用它训练与评估离线解码器,反馈环节要自己补。
Q4:两千零四十八赫兹必须重采样吗?
不必,但多数流程会降。高采样率适合研究滤波截止频率的影响;若只做常规带通,降到二百五十六或五百赫兹可显著减小内存,且不损失 P300 的主要能量。
Q5:标注文件为什么打不开?
它是以 WFDB 二进制存的,用文本编辑器打开只会看到乱码,行数统计为零。用 wfdb 的读取函数,或直接读 EDF+ 内嵌的标注通道,两者内容一致。
Q6:它和 bigP3BCI 有什么区别?
bigP3BCI 是十八项研究的汇总,二百七十八人次、六千二百余段、二百五十六赫兹、按统一标准标记,含患者。本库是单一实验,十二个目录、二百四十五段、两千零四十八赫兹、无统一标记、无患者。前者适合规模训练,后者适合时序与波形研究。
Q7:为什么每段只有四十六秒?
因为一段就是一次单字符拼写。把段拉长会混进多个目标与休息段,标注复杂度上升,而可用于建模的有效信息不会同比增加。短段还让"段"成为天然的统计单位。
Q8:字符级准确率能比吗?
很难。每人只有约二十个字符,一个人的准确率精度大约是五个百分点一格,跨人比较基本被方差淹没。要比就比单试次检测的 AUC,且固定划分与随机种子。
Q9:眼电怎么用?
四路眼电与脑电同步采样,可以直接做回归扣除、独立成分分析,或者把眼电通道作为特征让模型自己学。先换参考再处理,顺序别反。
Q10:许可允许商用吗?
ODC-BY 1.0 允许,包括商业用途,条件是署名。署名要覆盖数据集本身与 PhysioNet 平台两层,具体条款以官方许可全文为准。
Q11:为什么开始日期显示成 2079 年?
EDF 格式的年份只有两位,79 在部分读取器里被映射到 2079。它不影响信号,但会让按时间排序或按年份筛选的流程出错。
Q12:官方有扩版计划吗?
页面只显示一个版本,2014 年首发,2019 年补录校验和,之后没有更新说明。从格式年代与作者状态看,扩版的可能性不大。
术语表
| 术语 | 解释 |
|---|---|
| 事件相关电位 | 与特定刺激锁时的脑电成分,幅度通常只有几微伏 |
| P300 | 刺激后约三百毫秒出现的正向成分,对新异刺激敏感 |
| 奇球范式 | 稀有刺激混在频繁刺激中呈现,用于诱发 P300 |
| Donchin 拼写器 | 用六乘六字符矩阵与行列闪烁实现的 P300 拼写界面 |
| 行列闪烁 | 每次点亮一整行或一整列,含目标的两次点亮才对分类有贡献 |
| 刺激起始异步 | 相邻两次刺激起点之间的时间,本库标称一百五十毫秒 |
| 刷新周期 | 屏幕的一次重绘,六十赫兹下约十六点七毫秒 |
| 前置非目标数 | 目标闪烁之前连续出现的非目标闪烁个数,本文的核心自变量 |
| 单试次检测 | 不用多次平均,直接对一次刺激判断是否为目标 |
| 叠加平均 | 把多次锁时片段相加平均,用牺牲时间换信噪比 |
| 加权平均 | 按信息量给各次呈现不同权重,是 2010 年论文的核心方法 |
| 分段 | 按事件时刻从连续记录中截取固定长度片段 |
| 基线校正 | 用刺激前的片段均值抵消慢漂移 |
| 共模抑制比 | 放大器抑制两端共同干扰的能力,参考方式会影响它 |
| CMS 与 DRL | BioSemi 系统的参考与驱动电极,构成反馈回路 |
| 耳垂参考 | 以双耳垂均值为参考,常用于离线重参考 |
| 眼电 | 眼球运动产生的电位,本库有垂直与水平各两路 |
| 伪迹 | 非脑源信号,如眨眼、肌电、电极松动 |
| 独立成分分析 | 把多通道信号分解为统计独立成分的盲源分离方法 |
| 留一受试者 | 每次留一个受试者做测试,其余训练,衡量跨人泛化 |
| 数据泄漏 | 训练与测试共享同一受试者或同一段,导致成绩虚高 |
| EDF+ | 欧洲数据格式的扩展版,支持标注通道与连续记录 |
| 标注通道 | EDF+ 中专门存放文本事件的信号道,本库每记录五十七字节 |
| WFDB | PhysioNet 的波形数据库工具链与格式 |
| ODC-BY | 开放数据共享署名许可,允许商用需署名 |
| 降采样 | 降低采样率,须先抗混叠滤波 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 受试者目录数 | 12(s01–s12) | 官方文件树 | 官方文件 |
| 摘要所称参与者 | 10 | 官方页面正文 | 官方页面 |
| 记录数 | 245 | RECORDS 逐行 | 官方文件 |
| 每段数据记录数 | 368 | s01/rc01 头文件 | 官方文件 |
| 每段时长 | 46 秒 | 368 × 0.125 秒 | 官方文件推算 |
| 信号路数 | 71 | 头文件信号数字段 | 官方文件 |
| 脑电通道 | 64 | 头文件通道标签 | 官方文件 |
| 辅助通道 | 6(双耳垂 + 四眼电) | 头文件通道标签 | 官方文件 |
| 采样率 | 2048 Hz | 官方页面与头文件 | 官方页面 |
| 头字节数 | 18432 | 头文件 | 官方文件 |
| 字符格数 | 36 | 标注中的行内容 | 官方文件 |
| 标称刺激起始异步 | 150 毫秒 | 官方 README | 官方页面 |
| 亮灭时长 | 100 毫秒 / 50 毫秒 | 官方 README | 官方页面 |
| 未压缩体积 | 2.2 GB | 官方页面文件区 | 官方页面 |
| 压缩包体积 | 1.7 GB | 官方页面下载按钮 | 官方页面 |
| 许可 | ODC-BY 1.0 | 官方页面 | 官方页面 |
| DOI | 10.13026/C2101S | 官方页面 | 官方页面 |
| 首次发布 | 2014-03-04 | 官方页面 | 官方页面 |
| 校验和补录 | 2019-02-20 | 文件列表修改时间 | 官方文件 |
附录 B:数字的来源分层
第一层,官方页面与官方文件。 受试者目录数、记录数、通道构成、采样率、每段时长、字符格数、体积、许可、DOI、发布与补录日期,全部来自项目主页、README、RECORDS 与 s01/rc01 的头文件。这一层的数字可以直接引用,且经得起任何人重查。
第二层,论文摘要。 可变延迟与 P300 幅度调制的关系、加权平均相对等权平均的提升、方法的通用性,来自 Europe PMC 返回的摘要。摘要能支撑"作者主张了什么",不能支撑"效果有多大"——具体提升幅度需要读全文。
第三层,未核实。 全部二百四十五段的标注条数、每个受试者的年龄与性别、采集年份与地点、各段的目标字符分布、帧数后缀的完整语义。这些要么需要下载全量逐条统计,要么官方根本没有公布。正文中凡涉及这些的地方,都只做定性表述或明确标注为推断。
附录 C:完整参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | ERP-based Brain-Computer Interface recordings v1.0.0 | https://physionet.org/content/erpbci/1.0.0/ | 全部规模、结构、边界数据 |
| 2 | 该库文件目录 | https://physionet.org/files/erpbci/1.0.0/ | RECORDS、README、头文件 |
| 3 | Citi L, Poli R, Cinel C. J Neural Eng 2010;7:056006 | https://doi.org/10.1088/1741-2560/7/5/056006 | 实验动机与核心方法 |
| 4 | 同上的 Europe PMC 摘要记录 | https://www.ebi.ac.uk/[europepmc](https://www.qianfanghub.com/ai-ready-dataset/europepmc/1353)/ | 摘要层面的动机与结论 |
| 5 | PhysioNet 平台综述(2026,Nature Health) | https://doi.org/10.1038/s44360-026-00096-z | 托管模式与引用规范 |
| 6 | BioSemi 电极坐标表 | http://www.biosemi.com/download/Cap_coords_all.xls | 六十四导位置 |
| 7 | BioSemi 关于 CMS 与 DRL 的说明 | http://www.biosemi.com/faq/cms&drl.htm | 参考方式与共模抑制比 |
| 8 | bigP3BCI(库内对照) | https://physionet.org/content/bigp3bci/ | §6.3 的规模与标记对比 |
附录 D:任务代码
把一段记录变成"前置非目标数 → 响应幅度"的曲线,这段够用,不需要训练模型。
#-- 按前置非目标数分组,比较目标响应的平均幅度
import numpy as np, mne
raw = mne.io.read_raw_edf("s01/rc01.edf", preload=True, verbose="ERROR")
raw.set_eeg_reference(ref_channels=["EARL", "EARR"], verbose="ERROR")
raw.filter(1.0, 15.0, verbose="ERROR")
raw.resample(256, npad="auto", verbose="ERROR")
target = "M"
seq = [(o, d[:6]) for o, d in zip(raw.annotations.onset,
raw.annotations.description)
if not d.startswith("#")]
seq.sort()
rows = []
prev_gap = 0
for onset, charset in seq:
if target in charset:
rows.append((onset, prev_gap))
prev_gap = 0
else:
prev_gap += 1
sfreq = raw.info["sfreq"]
data = raw.get_data(picks="eeg")
bins = {}
for onset, gap in rows:
a = int(onset * sfreq) - int(0.2 * sfreq)
b = int(onset * sfreq) + int(0.8 * sfreq)
if a < 0 or b > data.shape[1]:
continue
seg = data[:, a:b]
seg = seg - seg[:, : int(0.2 * sfreq)].mean(axis=1, keepdims=True)
amp = seg.mean(axis=0)[int(0.4 * sfreq)]
bins.setdefault(gap, []).append(amp)
for gap in sorted(bins):
print(gap, len(bins[gap]), round(float(np.mean(bins[gap])), 3))
输出的每一行是"前置非目标数、该组的试次数、平均幅度"。组间趋势是否单调,正是 2010 年那篇论文要回答的问题。一段记录只有二十来次目标闪烁,趋势会很抖,需要把多个受试者的结果叠起来看。
附录 E:如果只记五件事
第一,它是单实验室的 P300 拼写原始记录,十二个目录、二百四十五段、每段四十六秒映射一次字符拼写。
第二,它最独特的不是规模,是逐次闪烁的时序标注——前置非目标数可以完整重建,这是多数库给不了的。
第三,两千零四十八赫兹与四路眼电是它的工程优势,但必须先把 CMS 参考换成耳垂均值。
第四,它没有在线反馈、没有患者人群、没有官方划分,任何闭环或临床结论都超出它的边界。
第五,字符级样本极薄(每人约二十个),现实的用法是单试次二分类加留一受试者验证。
编辑说明
核验时间 2026 年 10 月 28 日。核验方式:直接访问 PhysioNet 项目页与文件目录,读取 RECORDS 全表、README、ANNOTATORS,并下载 s01/rc01 的头区与首个数据记录解析信号数与标注结构;另抽查 s01/rc05、s03/rc01、s05/rc01、s12/rc21 的首条标注以确认标称时序一致。论文信息仅取 Europe PMC 摘要。未覆盖:全部记录的标注条数、受试者人口学信息、采集年份。关于闪烁后缀的解读属推断,置信度已在 §4.2 逐项标注。官方摘要与文件树的受试者数冲突按两个口径并列呈现,不作判断。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- mssvepdb — 共享标签:生理信号 / 脑电信号 / 脑机接口 / 神经科学
- eegmmidb — 共享标签:生理信号 / 脑电信号 / 脑机接口 / 神经科学
- bci-competition-iv-2a — 共享标签:生理信号 / 脑电信号 / 脑机接口 / 神经科学
- moabb — 共享标签:生理信号 / 脑电信号 / 脑机接口 / 神经科学
- stroke-eeg-fnirs — 共享标签:生理信号 / 脑电信号 / 脑机接口 / 神经科学
- auditory-eeg — 共享标签:生理信号 / 脑电信号 / 脑机接口
- earh — 共享标签:生理信号 / 脑电信号 / 神经科学
- earndb — 共享标签:生理信号 / 脑电信号 / 神经科学
- mental-fnirs — 共享标签:生理信号 / 脑电信号 / 脑机接口 / 神经科学
- openneuro — 共享标签:生理信号 / 脑电信号 / 神经科学
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

