十一个人留下五份 — 音乐下的 n-back 工作记忆库

五人 / 两场音乐 / 九类记录

来源 https://physionet.org/content/multimodal-nback-music/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 13
十一个人留下五份 — 音乐下的 n-back 工作记忆库

信息速览

数据集名称十一个人留下五份 — 音乐下的 n-back 工作记忆库
数据类型时序信号,波形,元数据,人工标注
规模5 名受试者(招募 11 人,留存 5 人)
接入方式https://physionet.org/content/multimodal-nback-music/1.0.0/
AI 就绪度

把耳机戴上,屏幕上跳出一个字母。你记着前一个是不是它,同时还要记着再往前两个。这时候背景里的音乐是大调还是小调、鼓点密不密,你觉得不影响判断——但手腕上的皮电和额头上的近红外探头未必同意。

休斯顿的一间实验室里,五个人各坐了两场。第一场放舒缓的音乐,第二场放激昂的音乐,两场里各有十六个区块,一半只要记一格,一半要记三格。就在这三十一分钟里,五台设备同时开着,把皮电、心电、皮温、呼吸、脉搏、肌电、前额血氧、脸部表情和每一次按键都记了下来。

这批记录 2025 年 2 月挂上 PhysioNet,编号 1.0.0。它的规模小得有点意外,结构却比多数同类库更杂——正是这种「小而杂」决定了它能做什么、不能做什么。一屏速览见下表。

维度 内容
全名 A Multimodal Dataset for Investigating Working Memory in Presence of Music
站点标识 multimodal-nback-music
发布方 PhysioNet(MIT 计算生理学实验室维护)
作者 Saman Khazaei、Srinidhi Parshi、Samiul Alam、Md Rafiul Amin、Rose T. Faghih
机构 纽约大学与休斯顿大学
首次发布 2025 年 2 月 26 日,版本 1.0.0
DOI 10.13026/6vh4-dk68
配套论文 Frontiers in Neuroscience 2024 年第 18 卷,文章号 1406814
受试者 招募 11 人,留存 5 人(编号 3、4、6、8、11)
任务 字母 1-back 与 3-back,每场 16 块、每块 22 试次
场次 两场:Calming 在前,Vexing 在后
单场时长 964 秒,约 16 分钟
生理模态 皮电、心电、皮温、呼吸、脉搏、肌电、fNIRS
派生模态 面部表情评分、逐试次对错与反应时
fNIRS 规格 44 通道,7.6294 赫兹,输出四种血红蛋白量
采集设备 Biopac MP160、Empatica E4、NIRSport 2、FaceReader、E-Prime 配 Chronos
许可 ODC-BY 1.0,免注册
缺什么 脑电、原始录像、对照组、主观负荷评分

§1 它要解决的具体麻烦

1.1 想调一个人的状态,先得能看见他的状态

闭环脑机接口这条路子的设想很直白:测到状态偏离,就施加一个干预,把状态拉回来,然后再测。听觉刺激是最容易施加的一类干预——不需要电极贴到运动皮层,不需要受试者配合做动作,一段音乐放出去就行。

难点不在干预,在「看见」。工作记忆的负荷高低是一个藏在行为背后的量,你只能从按键对不对、按得快不快去反推,而反推的延迟以秒计,噪声又大。多记录几路生理信号,相当于多开几个观察窗口,让同一个隐藏状态在不同通道上留下不同的痕迹。

这个库就是为这件事准备的一组素材:同一个人的同一段任务,被七路生理信号、一路表情评分和一路行为同时盯着。它不提出新算法,也不给出结论,只把「多窗口同时观看」这件事做成了可下载的文件。

1.2 三条常见的错误期待

第一条,期待它里面有脑电。 库名里的 multimodal 很容易让人以为这是又一份脑电加外围信号的数据集。官方在背景段落里也确实并列提到过 PPG、EEG、fNIRS 与 EDA 四种模态,但那是在讲领域图景,不是讲这次采了什么。实际清单里没有任何脑电通道,神经层面只有 44 通道功能近红外。按「脑电 64 导」的思路写解析代码,第一步就会读不到文件。

第二条,期待它有十几二十个人。 摘要里写的是 11 人参与,这是招募数。方法与数据说明里另有一句:并非每位受试者都采全了所有传感器,模态太少的被整体剔除。附表中带勾的只有五行——编号 3、4、6、8、11。真正能用的样本是五个,其中编号 6 还缺面部表情这一路。

第三条,期待它有情绪或负荷的主观标签。 库里没有一份自评量表。官方的局限说明里明确写着「the lack of any cognitive state score provided by subjects」。能被当作标签的只有三层:场次(Calming 与 Vexing)、区块类型(1-back 与 3-back)、以及逐试次的判断对错。想在「高负荷」与「低负荷」之间画一条连续的线,这里没有刻度。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
多设备同步的原始信号 五台设备、六个文件夹、触发器对齐 够,同步信息是齐全的
工作记忆负荷的两档对比 1-back 与 3-back 区块各半 够做二分类,只有两档
背景音乐作为条件变量 两场,舒缓在前、激昂在后 能当条件,但与顺序混在一起
神经层面的直接观测 44 通道前额 fNIRS 勉强,只有前额且时间分辨率低
逐试次的行为标签 对错序列与反应时 够,这是它最细的一层标注
面部表情的动态 FaceReader 的状态与概率分布 部分够,五个人里只有四个有
脑电相关的任何分析 无 不够,一路都没有
主观负荷或情绪评分 无 不够
大样本的跨人泛化 五个人 不够,怎么切都薄
对照组比较 无对照组 不够,官方自己列为局限

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

你的处境 它能帮你什么 下一步该做什么
你要做一个多设备同步的采集原型,缺一份「人家怎么对齐」的参考 触发器文件分区块级与试次级两层,时间轴统一置零 先读 §5.3 的对齐代码,把两路设备的时间戳对齐一次
你在做认知负荷的二分类,想找一份带 fNIRS 的公开数据 两档负荷、逐试次标签、44 通道前额血氧 按受试者留一划分,先拿五折的诚实基线
你在研究音乐对认知表现的影响 同一批人、同一任务、两种音乐,配对设计 注意顺序不可交换,只能当「场次效应」讲
你要做表情与生理的联合建模 四个人有表情评分,与生理可对齐 先把人数缩到四个,再谈模型
你在教学,要讲清一次多模态实验的全链路 从设备到目录到触发器,每一环都有文字说明 用一名受试者的一场做演示,两小时能讲完
你需要大样本训练深度模型 五个人、每人 704 试次 换库,或只把它当外部验证集
你要研究脑电的负荷指标 没有脑电 换库,看 §6.1 的对照
你的课题要求健康对照与患者对照 只有健康成人,无对照 换库,这里一条临床记录都没有

1.5 一句话判断

它不提供规模,提供的是一个罕见的组合:同一个人、同一段字母流、同一批电极,只换背景里的那段音乐。

1.6 不适合谁:四条边界

不适合拿它证明某个模型「能识别认知负荷」。 五个人的数据,无论报告多高的准确率,都要先回答一个问题:测试集里的人,训练时见过没有。把所有试次打散随机切分,同一个人会同时出现在两侧,模型学到的是这个人的皮电基线,不是负荷。这个坑在这个库上格外深,因为每人有 704 个试次,泄漏起来的样本量看着很充裕。

不适合拿它做神经影像层面的负荷定位。 fNIRS 只有 44 个前额通道,采样率 7.6294 赫兹,时间分辨率以秒计。n-back 的血氧响应本来就在数秒尺度上延迟,再叠上这个采样率,做「第几个试次负荷升高」这类分析基本无从下手。

不适合拿它做音乐的疗效结论。 两场音乐固定了顺序,第一场舒缓、第二场激昂,中间只隔两分钟。任何「激昂音乐让人表现更好」的说法,都无法与「第二场时人更熟练」分开。官方自己在局限里点了这一条,并提出需要打乱任务难度与音乐场次才能推广。

不适合拿它做人群推断。 五名健康成人,无年龄分层、无临床组、无对照。关于老年人、注意力缺陷或康复期患者的任何推论,都超出了这批数据的边界。

§2 数据构成与规格

2.1 六个文件夹、一套命名

整包解开后是六个顶层文件夹,每个文件夹对应一台设备或一类产物。没有按受试者分包,也没有按场次分包,跨文件夹的关系全靠文件名里的受试者编号与场次词。

multimodal-nback-music/
├── Behavioral_data/          #-- E-Prime 导出的行为与 Chronos 按键
├── Biopac_data/              #-- 有线生理,五个信号各一子目录
│   ├── EDA/  ECG/  PPG/  RESP/  EMG/
│   └── Timing/               #-- 区块级与试次级触发器
├── Face_reader_data/         #-- 每人一个子目录,表情状态与概率
├── fNIRS_data/               #-- 四种血红蛋白量与触发器表
└── Empatica_data/            #-- 腕带七类文件

命名有两套写法,官方在描述里分别给出过。行为数据写作「场次名 + 受试者编号 + .csv」,Biopac 与 fNIRS 写作「受试者编号 + 性别 + 下划线 + 类型」,Empatica 与表情则举例写作 subject_3F 这种带下划线的目录名。两套写法不是笔误,而是不同设备的导出习惯,落地时以目录里实际存在的名字为准,不要按某一套模板硬拼路径。

其中只有 Biopac 是先按信号类型分五个子目录、再按受试者平铺;表情与腕带是先按受试者分目录、再按内容分文件;行为与 fNIRS 完全扁平,靠文件名里的编号区分。三种组织方式并存,意味着遍历脚本不能只写一套通配。

2.2 字段与记录的完整字典

把官方数据说明逐条拆开,能得到下面这张对照表。左列是文件或字段,中列是官方给的口径,右列是读取时要注意的地方。

文件或字段 官方口径 读取注意
Behavioral_data 的 CSV 场次名 + 受试者编号,含行为与按键 场次词是 Calming 与 Vexing
Biopac EDA 皮电,微西门子 与 Empatica 的 EDA 是两套独立测量
Biopac ECG 心电波形 原始采样 2 千赫兹
Biopac PPG 光电容积脉搏 与腕带 BVP 同源不同设备
Biopac RESP 呼吸带位移 反映胸廓收缩与扩张
Biopac EMG 表面肌电 贴附位置官方未细述
Timing 的 block 文件 每个区块的起始触发器 用于切区块
Timing 的 trial 文件 每个试次的触发器 用于切单试次
fNIRS 的 tothb 总血红蛋白,单位写作 mmol 单位记法偏简,按官方原文
fNIRS 的 ohb 氧合血红蛋白 论文中记作 HbO
fNIRS 的 dohb 脱氧血红蛋白 论文中记作 HbR
fNIRS 的 O2 血氧饱和度 与其他三路同表
fNIRS 触发器表 Excel,按会话与受试者 用于与 Biopac 对齐
Empatica TEMP 皮温,摄氏度 首行时间,次行采样率
Empatica EDA 皮电,微西门子 与 Biopac EDA 可互为校验
Empatica BVP 血容量脉搏 由它派生出 IBI 与 HR
Empatica ACC 三轴加速度,单位 1/64 g 量程正负 2 g
Empatica IBI 逐搏间期,秒 无采样率,两列
Empatica HR 平均心率 由 BVP 抽取
Empatica tags 按键事件时刻 与状态灯点亮同刻
表情 state 文件 每帧最可能的状态 纯文本,逐行
表情 detailed 文件 每帧各状态的概率分布 与 state 一一对应

有一处需要留意:官方把 fNIRS 四种量的单位统一写作 mmol。血红蛋白浓度的常规写法会带长度量纲,这里只写了毫摩尔。这不影响读取,但写方法学时应照抄官方单位,不要自行补一个量纲上去。

2.3 一条记录的完整解剖

拿受试者 3 的 Calming 场次做例子,从目录走到一个具体数值,中间要经过四层。

#-- 逐层解剖:目录 -> 文件 -> 行 -> 采样点
from pathlib import Path
import pandas as pd

root = Path("multimodal-nback-music")
beh = pd.read_csv(root / "Behavioral_data" / "Calming_3.csv")
print(beh.shape, list(beh.columns)[:8])

#-- Empatica 的 csv 头两行是元信息,不是数据
emp = root / "Empatica_data" / "subject_3F" / "EDA.csv"
head = emp.read_text().splitlines()[:3]
print("首行起始时间", head[0])
print("次行采样率", head[1])
eda = pd.read_csv(emp, header=2, names=["eda"])
print("样本数", len(eda), "均值", round(eda["eda"].mean(), 3))

#-- fNIRS 每个量一个文件,44 列对应 44 通道
nir = pd.read_csv(root / "fNIRS_data" / "3F_ohb.csv")
print("fNIRS 形状", nir.shape)

跑完会看到三层不同的形状:行为表是「一行一个试次」,Empatica 是「一行一个采样点」且头部两行不是数据,fNIRS 是「一行一个时刻、一列一个通道」。这三种形状混在同一个库里,是这个数据集最先要适应的东西。

解剖层级 内容 数量 备注
库 全部留存受试者 五人 编号不连续
受试者 一个人的全部记录 两场 Calming 与 Vexing
场次 一次 964 秒的连续记录 每场 16 个区块 含区块间与场中休息
区块 一种 n-back 条件 22 个试次 块前 5 秒指令
试次 一个字母 0.5 秒呈现 + 1.5 秒注视 逐试次有对错与反应时
采样点 一路信号的一个时刻 因设备而异 2 千赫兹与 7.6294 赫兹并存

2.4 时序账:964 秒是怎么拼出来的

官方给的几个时间数字彼此咬合得很紧,值得单独核一遍,因为它是判断「文件是否完整」最省事的尺子。

单个区块 49 秒:开头 5 秒指令,然后 22 个试次,每个试次 0.5 秒字母加 1.5 秒注视十字,合计 5 + 22 × 2 = 49。区块之间另有 10 秒放松窗,屏幕显示注视十字。八个区块之后插入一次 20 秒的场中休息。

一场 16 个区块,于是:16 × 49 = 784,加 16 × 10 = 160,加 20 秒场中休息,正好 964。三个数字严丝合缝,说明 964 秒这个总时长把区块后的放松窗也算进去了,而不是只算任务段。

时段 单次时长 一场出现次数 小计
区块指令 5 秒 16 80 秒
字母呈现 0.5 秒 352 176 秒
注视十字 1.5 秒 352 528 秒
区块后放松 10 秒 16 160 秒
场中休息 20 秒 1 20 秒
合计 — — 964 秒
#-- 用官方给的四个数复核总时长,对不上说明有一项理解错了
blocks, trials, instr, stim, isi, rest, mid = 16, 22, 5, 0.5, 1.5, 10, 20
block_len = instr + trials * (stim + isi)
total = blocks * block_len + blocks * rest + mid
print(block_len, total)
assert block_len == 49 and total == 964

两场之间还有一次 2 分钟的休息,官方没有把它计入 964 秒,所以两场之间的实际间隔比单场时长之外的空白更短。做跨场次拼接时,这 120 秒必须显式补进去,否则第二场的时间轴会整体前移两分钟。

2.5 与同类资源的字段差异

同为「任务态 + 生理信号」,不同库在字段设计上的取向差别很大,而这些差别直接决定能做什么。

字段维度 本库 心算脑电类 稳态视觉诱发电位类 穿戴压力类
受试者规模 五人 三十余人 十余人 十余人
神经信号 44 通道 fNIRS 十九至六十四导脑电 八至十六导脑电 无
外周信号 六路 通常仅心电 通常无 三至四路
表情或视频 表情评分 无 无 无
行为粒度 逐试次对错与反应时 段级汇总 逐试次 段级
条件设计 两档负荷 × 两场音乐 单一任务 多频率刺激 多情境
采样率 2 千赫兹与 7.6294 赫兹 数百赫兹 数百至千赫兹 数十赫兹

它真正的稀缺处在最后三列之外的那一列:同时有神经、外周、表情、行为四层,且共享同一套触发器。代价是每一层的深度都不够。

§3 它是谁的数据:两所学校、一间实验室、五个人

3.1 五位作者与两个机构

作者栏是五个人,机构是两家:纽约大学与休斯顿大学。页面标注的隶属关系里,第一作者与通讯作者在纽约大学,中间三位在休斯顿大学电子与计算机工程系。这是一条跨州的合作线,采集地点在休斯顿。

角色 姓名 页面标注机构
第一作者 Saman Khazaei 纽约大学
作者 Srinidhi Parshi 休斯顿大学电子与计算机工程系
作者 Samiul Alam 休斯顿大学
作者 Md Rafiul Amin 休斯顿大学
通讯作者 Rose T. Faghih 纽约大学

五位作者同时也是 2024 年那篇论文的作者,顺序一致。数据集页面另有一句致谢,感谢 Dilranjan S. Wickramasuriya 在采集期间的贡献——他不在作者栏,属于采集协助。

3.2 配套论文说了什么

论文标题比数据集多一个尾巴:a pilot study。这三个词很关键,它把这份工作的定位说清楚了——这是一次可行性试验,不是一份确立结论的研究。

摘要给了四层信息。第一层是动机:解码音乐刺激与认知负荷共同作用下的隐藏脑状态,是闭环脑机接口的前提。第二层是方法:用皮电估计唤醒度,用行为估计表现,用氧合血红蛋白关联表现,并计算每个音乐场次的总血红蛋白信号能量。第三层是结果:唤醒度随任务难度变化不大,但随音乐类型变化明显;表现指数在激昂场次更好;氧合血红蛋白与表现的正相关在 3-back 条件下最强;总血红蛋白能量峰值出现在激昂场次。第四层是讨论:这些结果支持把音乐当作调节认知状态的一种干预手段。

读这篇摘要要分清两件事:它证明了作者在自己的五个人身上看到了什么,不等于这两件事在别人身上也成立。样本量已经在标题里自我标注了。

3.3 时间线

时间 事件 依据
2024 年 论文发表于 Frontiers in Neuroscience 第 18 卷 论文元数据
2024 年 同组另一篇方法论文发表于 IEEE OJEMB 数据集页参考文献第 10 条
2025 年 2 月 26 日 数据集 1.0.0 版上线 PhysioNet 项目页版本栏
2025 年之后 页面仅显示一个版本,无修订记录 项目页版本栏

数据晚于论文一年上线,这个顺序影响引用方式:引用数据要写版本号与 DOI,引用方法要写论文 DOI,两者不能相互替代。

3.4 采集现场:五台设备同时开

官方的设备清单写得很具体,逐条对应到文件,能还原出采集台上的样子。

设备 采集内容 关键参数 产出目录
Biopac MP160 配 BioNomadix 心电、皮电、呼吸、脉搏、肌电 原始 2 千赫兹,起点置零 Biopac_data 五个子目录
Empatica E4 腕带 皮温、皮电、脉搏、加速度、逐搏间期、心率 采样率逐文件写在第二行 Empatica_data
NIRSport 2 前额 44 通道近红外 7.6294 赫兹,经 Nirslab 处理 fNIRS_data
FaceReader(Noldus) 面部表情状态与概率 逐帧,两种文本文件 Face_reader_data
E-Prime 配 Chronos 刺激呈现、按键、触发器 行为与时间戳 Behavioral_data 与 Timing

两套皮电同时存在,是这个库的一个隐含优势:Biopac 的有线通道与 Empatica 的腕带通道测的是同一个生理量,可以互为校验。如果两路在同一时段出现不一致的漂移,多半是电极接触或佩戴位置的问题,而不是生理变化。

3.5 现场布置:一台电视、一台笔记本、两台采集机

刺激呈现的链路是这样的:笔记本电脑经 HDMI 接到一台 65 英寸智能电视,字母与注视十字都显示在电视上;另一台笔记本接所有采集设备,负责记录。两台机器分开,是为了避免采集软件的负载影响刺激呈现的时序。

这个布置带来一个后果:刺激端与采集端的时钟是两台机器各自的。官方对此的处理是把 Biopac 与 fNIRS 的时间轴起点都置零,再用 Chronos 发出的触发器把两端对齐。所以对齐的锚点不是绝对时间,而是触发器。

现场要素 取值 对数据的影响
显示设备 65 英寸智能电视 视角大,视觉诱发更强
呈现端 笔记本经 HDMI 输出 与采集端时钟独立
采集端 另一台笔记本 记录所有设备
对齐锚点 Chronos 触发器 时间轴置零后按触发器对齐
座椅与距离 官方未写 视角与照度无法复算

§4 它最独特的东西:把音乐当成自变量

4.1 两场音乐,两种唤醒

这个库和绝大多数工作记忆数据集的区别,就在背景里那段声音。多数 n-back 实验把环境噪声当作要消除的干扰,这里反过来,把它当成要操纵的条件。

音乐的来源也很特别:不是实验者选的标准化曲目,而是请受试者自己提供。官方说用了两类内容,一类舒缓,一类激昂,第一场放舒缓的,第二场放激昂的。这个做法有一个明显的好处和一个明显的代价。好处是每个人听到的都是自己熟悉的、愿意听的音乐,唤醒效果更真实;代价是曲目在人与人之间完全不同,「激昂」这个条件在不同人身上不是同一件事。

设计要素 本库做法 常见做法 后果
音乐来源 受试者自选 实验者指定标准曲目 生态效度高,可比性低
音乐类型 舒缓与激昂两类 单一背景或无音乐 有对照,但无中性基线
场次顺序 舒缓在前,激昂在后 随机或交叉平衡 与顺序效应混淆
场次标注 Calming 与 Vexing 通常用情绪维度命名 标注词与叙述词不一致
场次间隔 2 分钟休息 常更长 疲劳与残留效应难分离

值得注意的是标注词:第一场标 Calming,第二场标 Vexing。而摘要与方法的叙述里用的是 calming 与 exciting。Vexing 的语气比 exciting 更负面,两者不是同义词。这里不判断哪个更准确,只提醒:读文件名时看到的是 Vexing,读正文时看到的是 exciting,指同一个场次。

4.2 1-back 与 3-back 只差两格,负荷差很多

任务本身是字母版的 n-back:屏幕上一个字母接一个字母地出现,受试者判断当前这个是否与前第 n 个相同。n 等于 1 时,只需要把上一个字母留在脑子里;n 等于 3 时,要同时维持三个并不断更新。

这两个条件在脑力上的差别,比「一格」与「三格」的字面差距大得多。1-back 更接近感觉登记加简单匹配,3-back 才真正压到工作记忆的更新环节。多数 n-back 研究把 2-back 当标准难度,这里跳过 2-back 直接用 1 与 3,两端拉得更开,二分类的可分性可能更好,但也失去了中间档。

条件 需要维持的项目数 认知成分 每场区块数 每场试次
1-back 1 个 维持与匹配 8 176
3-back 3 个 维持、更新与抑制 8 176
合计 — — 16 352

每个区块之前有 5 秒指令,屏幕会明确写出这一块是 1-back 还是 3-back。这一点很重要:条件标签不需要从文件里推断,区块起点与类型都可以从触发器与指令时段对上。

4.3 案例:受试者 3 的三十一分钟

拿一个人走一遍,比抽象描述有用。选编号 3,理由很实在:它是附表里第一行五列全勾的人,也是官方举例时用的目录名 subject_3F。

她的两场各 964 秒,合计 1928 秒,约三十二分钟。第一场 Calming,第二场 Vexing,中间 120 秒休息。每场 16 个区块、352 个试次,两场共 32 个区块、704 个试次。这 704 个试次里,一半是 1-back,一半是 3-back,每个试次都有一次判断、一个对错、一个反应时。

在这三十二分钟里,她身上的设备同时在记:Biopac 以 2 千赫兹记心电、皮电、呼吸、脉搏、肌电;腕带以各自采样率记皮温、皮电、脉搏、加速度与逐搏间期;NIRSport 2 以 7.6294 赫兹记前额 44 个通道;摄像头录下她的脸,事后由 FaceReader 转成逐帧表情;E-Prime 记下每次按键。

§4.3 的案例换个角度看,它也是这个库最小的完整单元:一个人、两场、九类记录。全库只有五个这样的单元,其中编号 6 少了表情那一路,所以真正「九类齐全」的只有四个。

她在两场之间的差别,正是这个库想捕捉的东西:同样的字母流、同样的按键规则,只有背景里的音乐换了。但这个差别里还混着别的东西——第二场时她已经做过一遍,按键更熟练,坐姿可能更僵,也可能更放松。官方没有交叉平衡顺序,所以严格说来,场次差异是一个复合量。

4.4 九类记录怎么对上同一条时间轴

多设备数据集的第一道坎不是建模,是把时间对上。这个库的解法分三步,每一步都能在文件里找到落点。

第一步,把连续记录的时间轴起点置零。Biopac 与 fNIRS 都从 0 开始,官方明写。第二步,用 Chronos 发出的触发器标记每个区块与每个试次的起点,触发器文件分 block 与 trial 两层。第三步,对无法置零的设备(腕带与表情录像),保留一个去标识后的绝对起点,靠这个起点反推相对偏移。

#-- 三步对齐:置零记录 + 触发器 + 绝对起点换算
import pandas as pd

#-- 第一步:Biopac 从 0 开始,直接按采样率还原时间轴
fs_bio = 2000
trig = pd.read_csv("Biopac_data/Timing/3F_Triggers_trial.csv")
trig["t_bio"] = trig["sample"] / fs_bio

#-- 第二步:fNIRS 也从 0 开始,但采样率不同
fs_nir = 7.6294
trig["t_nir"] = (trig["t_bio"] * fs_nir).round().astype(int)

#-- 第三步:腕带只有绝对起点,差值即相对时刻
onset = float(open("Empatica_data/subject_3F/EDA.csv").readline())
trig["t_emp"] = trig["unix"] - onset
print(trig[["t_bio", "t_nir", "t_emp"]].head())

这段的关键不是代码,而是那个 round()。7.6294 赫兹不是整数,一秒落不到整数个采样点上,任何按秒取整的做法都会累积漂移。正确做法是先把时间换算成采样点索引,再按索引切窗。

对齐环节 依据 精度 风险
Biopac 时间轴 起点置零,2 千赫兹 0.5 毫秒 设备内部时钟漂移
fNIRS 时间轴 起点置零,7.6294 赫兹 约 131 毫秒 非整数采样率累积误差
腕带时间轴 首行绝对时间戳 取决于采样率 与采集端时钟偏移
表情时间轴 首段视频起点 逐帧 视频分段接续的间隙
跨设备锚点 Chronos 触发器 与触发器同精度 触发器丢失则整段错位

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

第一种,任务从两档变成连续难度。 只有 1-back 与 3-back 两个点,中间没有 2-back,也没有更难的四格。要画一条负荷与生理指标的曲线,两个点只能定一条直线,谈不上形状。

第二种,需要把音乐效应单独拎出来。 顺序固定、曲目自选、没有中性基线。三个条件叠在一起,音乐效应、顺序效应、曲目熟悉度效应无法分开。

第三种,需要秒级以下的神经响应。 fNIRS 的血流动力学响应本身滞后数秒,采样率又只有 7.6294 赫兹。事件相关式的分析在这里没有立足点。

第四种,需要人群层面的统计。 五个人,其中四个有完整九类记录。

第五种,需要原始视频或可复算的表情。 官方明确不公开录像,只给 FaceReader 的导出结果。想换一个表情识别模型重跑,做不到。

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

5.1 访问面:一个页面能开,目录打不开

这是使用这个库时最先遇到、也最容易被误判成「链接写错」的一件事。

项目页可以正常打开,摘要、方法、数据说明、参考文献全都在,许可写着 ODC-BY 1.0,访问政策写着「任何人只要遵守许可条款即可访问」。但文件目录这一层,在当前网络位置返回 403,页面上的文件区显示的是另一句话:该数据因法律或政策限制在本地区不可用。

入口 返回 说明
项目页 /content/multimodal-nback-music/ 200 文档齐全,可读全文
文件目录 /files/multimodal-nback-music/1.0.0/ 403 区域限制,非登录问题
页面文件区 提示不可用 与 403 同源
论文页 doi.org/10.3389/fnins.2024.1406814 可访问 开放获取,方法细节的主要来源

这个限制不影响对数据本身的判断,但影响「能不能现在就跑通」。如果你的网络位置同样受限,可用的替代路径有两条:换一个不受限的出口,或直接读论文的方法与结果部分,先把字段与流程理解清楚。两条都不改变数据的内容。

5.2 目录结构与下载

假设已经拿到访问权限,整包结构是六个文件夹加若干说明文本。下面的脚本先把整包拉下来再展开,随后核对人数。

#-- 拉整包并展开,随后清点受试者目录
BASE="https://physionet.org/files/multimodal-nback-music/1.0.0"
mkdir -p mnbm && cd mnbm
curl -sSL --retry 3 -o pkg.zip "$BASE/"
unzip -q pkg.zip
#-- 目录层级:六个顶层文件夹
ls -d */
#-- 受试者编号不连续,直接从目录名读,不要按 1..5 拼
ls Empatica_data | sort

最后一行是这份数据最容易踩的坑之一。留存编号是 3、4、6、8、11,如果按 range(1, 6) 拼路径,五个路径里四个是空的,而代码不会报错,只会安静地少读几个人。

获取方式 命令要点 适合 注意
整包 ZIP 页面按钮 一次拿全 体积未知,先看页面
命令行下载 curl 加 retry 需要续传 403 时先确认出口
逐文件 拼目录 URL 只取一人一场 目录名不连续
论文补充材料 论文页链接 只想要方法细节 不含原始信号

5.3 读 Biopac 与触发器

Biopac 的五类信号分在五个子目录,每类每人一份。触发器单独放,分区块级与试次级。读的时候两件事必须同时做:把触发器读进来,把采样率固定为 2 千赫兹。

#-- 读一路 Biopac 信号,并按区块触发器切成 16 段
import pandas as pd

fs = 2000
subj = "3F"
eda = pd.read_csv(f"Biopac_data/EDA/{subj}_EDA.csv", header=0)
sig = eda.iloc[:, 0].to_numpy()

blocks = pd.read_csv(f"Biopac_data/Timing/{subj}_Triggers_block.csv")
starts = (blocks["onset"] * fs).astype(int).to_numpy()
ends = list(starts[1:]) + [len(sig)]

segs = [sig[a:b] for a, b in zip(starts, ends)]
print("切出段数", len(segs), "首段时长秒", round(len(segs[0]) / fs, 1))

切出 16 段是正确结果。如果只有 15 段,多半是最后一个区块的终点没有补上,ends 那一行很关键。若段数变成 32,说明误读了试次级触发器。

读入对象 采样率 时间单位 常见错误
Biopac EDA 2000 赫兹 秒 当成 1 千赫兹,时长差一倍
Biopac ECG 2000 赫兹 秒 未做 R 波检测直接当心率
fNIRS ohb 7.6294 赫兹 秒 按整数赫兹取整
Empatica EDA 文件第二行给出 秒 把首行时间当数据
行为表 逐试次 秒 与区块触发器混用

5.4 读 fNIRS 与腕带

fNIRS 的四个量各一个文件,每个文件 44 列。腕带更麻烦一点:每个文件的前两行是元信息,第一行是起始时间,第二行是采样率。

#-- fNIRS 四路对齐,腕带跳过前两行
import pandas as pd

def nir(subj, kind):
    df = pd.read_csv(f"fNIRS_data/{subj}_{kind}.csv")
    df.columns = [f"ch{i:02d}" for i in range(df.shape[1])]
    return df

ohb, dohb = nir("3F", "ohb"), nir("3F", "dohb")
print("通道数", ohb.shape[1], "样本数", len(ohb))
print("前额均值", round(float(ohb.mean().mean()), 5))

def empatica(subj, name):
    path = f"Empatica_data/subject_{subj}/{name}.csv"
    with open(path) as f:
        t0, sr = float(f.readline()), float(f.readline())
    df = pd.read_csv(path, header=2)
    df["t"] = t0 + df.index / sr
    return df

temp = empatica("3F", "TEMP")
print("腕带首样本时刻", temp["t"].iloc[0], "采样率约", round(1 / (temp["t"].iloc[1] - temp["t"].iloc[0]), 2))

44 这个数字要自己数一遍,因为它是判断 fNIRS 文件是否读对的最快方式。腕带那两行元信息如果不跳过,read_csv 会把时间戳当数据,均值算出来会是天文数字。

5.5 对齐与切窗

到这一步,各路信号都读进来了,剩下的是把它们放到同一个窗口里。窗口的边界应该由试次触发器决定,而不是按固定秒数切,因为区块之间有 10 秒与 20 秒的休息,固定步长会跨过这些空隙。

#-- 以试次为窗口单位,把 fNIRS 与行为表连起来
import numpy as np
import pandas as pd

fs_nir = 7.6294
trials = pd.read_csv("fNIRS_data/3F_Triggers.csv")
trials["i0"] = (trials["onset"] * fs_nir).round().astype(int)

X, y = [], []
for _, r in trials.iterrows():
    i0, i1 = int(r["i0"]), int(r["i0"] + 2.0 * fs_nir)
    win = ohb.iloc[i0:i1].to_numpy()
    if win.shape[0] < 4:
        continue
    X.append(win.mean(axis=0))
    y.append(int(r["condition"]))

X, y = np.vstack(X), np.array(y)
print("样本", X.shape, "两类计数", np.bincount(y))

按试次切出来的样本量看着很可观:一名受试者就有 704 行。这正是最危险的地方。这些行彼此高度相关——同一个区块里的 22 个试次共享一段血氧基线,同一个人的 704 个试次共享同一个前额解剖结构。把它们当独立样本,等于把一个信息量很小的数据集放大成一个大样本。

#-- 清点每人每场的文件数,缺一路就是缺一路
for s in 3F 4F 6F 8F 11F; do
  n=$(ls "Biopac_data/EDA/${s}_EDA.csv" "fNIRS_data/${s}_ohb.csv" 2>/dev/null | wc -l)
  echo "$s $n"
done

上面这段里的编号只是示例写法,实际后缀要以目录为准:官方只在举例处写了 subject_3F 这一种形态,其余人的性别后缀需要打开目录确认,不能凭编号猜。

5.6 六个最容易出错的地方

出错点 表现 原因 处理
按 1 到 5 循环编号 只读到一两个人 留存编号是 3、4、6、8、11 从目录列表读编号
把 704 试次当独立样本 准确率高得离谱 同一人同一区块高度相关 按受试者与区块分组划分
把腕带首行当数据 均值出现天文数字 前两行是时间与采样率 header=2 或手工跳过
按整数赫兹切 fNIRS 窗口逐渐偏移 采样率是 7.6294 用采样点索引而非秒
把 Vexing 当第三种条件 条件数对不上 Vexing 就是第二场 场次只有两个
找脑电通道 一条都找不到 本库无脑电 改用 fNIRS,或换库

第三条与第四条是这个库特有的,其余四条在多数多设备数据集上都会遇到。第五条值得再说一句:Calming 与 Vexing 是场次标签,1-back 与 3-back 是区块标签,两者是正交的两维,不是四个并列类别。把它们拼成一个四分类,样本会被切成四份,每份更薄。

§6 与库内条目的关系

6.1 关系图谱

站内与脑电、生理信号相关的记录已经成规模,彼此的分工也清楚。与本库最需要划清界限的,是三类:同为 n-back 的近红外库、同为音乐刺激的库、以及各类以脑电为主的任务库。

库内记录 与本库的关系 主要差别
mental-fnirs 最接近的一份:同为 n-back 加 fNIRS 它是 14 人单场、无音乐、另有经颅多普勒;本库五人两场、有音乐条件
eegmat 同为认知负荷任务,同为小样本 它是连续减法、纯脑电、只两种状态;本库是 n-back、无脑电、九类记录
deap 同为音乐刺激下的多模态记录 它是看音乐视频诱发情绪、32 人、有主观量表;本库是用音乐做背景、标签是负荷
wesad 同为可穿戴多路生理 它是压力情境诱发、15 人、以皮电与心电为主;本库另有近红外与表情
body-sway-music-vr 同为音乐刺激条件 它测的是身体摇摆,28 人、12 个条件;本库测的是工作记忆
erpbci 同属任务态神经信号 它是 P300 拼写、64 导脑电、逐次闪烁锁时;本库无锁时电生理
mssvepdb 同属视觉刺激任务 它是稳态视觉诱发电位、多范式多设备;本库的视觉刺激是字母
meditation 同属生理状态记录 它只有逐搏心率、无任务;本库任务结构完整

规律很清楚。库内以脑电为主的记录,靠导联数换空间分辨率,靠试次数换统计功效;本库反过来,放弃电生理,用近红外换前额深部的血流信息,用九类同步换观察窗口。它和 mental-fnirs 是同一族里的一对:任务相同、模态重叠,差别在有没有音乐这一维,以及样本的组织方式。

6.2 检索路径

站内检索用 slug multimodal-nback-music,或全名 A Multimodal Dataset for Investigating Working Memory in Presence of Music。中文关键词建议用「工作记忆 音乐」而不是单用「工作记忆」——后者会命中一批 n-back 相关记录;用「近红外」也会命中一批 fNIRS 库,需要再叠加「音乐」收窄。

按需求找:要 n-back 加近红外但不需要音乐条件,去 mental-fnirs;要纯脑电的认知负荷两状态对比,去 eegmat;要看音乐诱发的情绪与脑电,去 deap;要可穿戴压力检测,去 wesad;要看音乐对身体姿态的影响,去 body-sway-music-vr;要「音乐 + 工作记忆 + 多设备同步」这个交叉点,才轮到本库。

6.3 三张对照表:任务、标签粒度、同步方式

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

第一张是任务与人群。

库 任务 受试者 样本单位
本库 字母 n-back,两场音乐 五人 试次
mental-fnirs 字母 n-back,单场 14 人 区块
eegmat 连续减法心算 36 人 段
deap 观看音乐视频 32 人 试次
wesad 压力情境诱发 15 人 窗口

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

库 最细标签 条件维度 是否有主观评分
本库 逐试次对错 负荷两档 × 音乐两场 无
mental-fnirs 区块级负荷 负荷多档 无
eegmat 段级两状态 静息与任务 无
deap 试次级多维 效价、唤醒、支配、喜好 有,1 至 9 分
wesad 窗口级三分类 中性、压力、娱乐 有

第三张是同步方式,这一维最容易被忽略,却直接决定多模态能不能真的联起来。

库 神经信号 同步锚点 需自行对齐的工作量
本库 fNIRS 44 通道 触发器加置零时间轴 中,五台设备三套时钟
mental-fnirs fNIRS 加经颅多普勒 设备同步盒 中
eegmat 脑电 19 导 单文件内自然对齐 低
deap 脑电 32 导加外周 单文件内自然对齐 低
wesad 胸带加腕带 单文件内自然对齐 低

把三张表叠起来看,本库的位置很清楚:任务维度最多、同步成本最高、人群最少。它不是任何一份库的替代品,而是一个交叉点。想省事的场合,用别的库;只有当你确实需要「同一段任务、同一批人、两种音乐、九路同步」这个组合时,它的价值才成立。

6.4 与站外音乐与负荷资源的区别

站外常被拿来比较的有三类。

第一类是驾驶与飞行模拟中的负荷监测数据。标签来自路况或飞行阶段,生态效度高,场景不可控,受试者通常只有十几位。本库相反:条件可控到每个字母出现 0.5 秒,代价是完全脱离真实环境。

第二类是音乐治疗与康复方向的多模态记录。它们通常带临床量表与疗程信息,人群是患者,时间跨度以周计。本库只有一次到访、两场、健康人,跟这类数据几乎不重叠。

第三类是公开的 n-back 基准,把负荷当成一个纯粹的计算任务,尽量减少环境变量。本库反过来把环境变量做成条件之一。前者适合比模型,后者适合比条件。

§7 质量评估与局限性

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

先校正一个几乎一定会犯的误判:把「只有五个人」读成「这份数据不合格」。

这两件事在这批数据上不是一回事。五人不是采集能力的上限,是筛选的结果:11 人做完实验,凡是有设备没采全的被整体剔除,剩下的才是「九类记录齐全」的那几套。这个筛选标准很严,严到把一半以上的人扔掉了,但它保证了留下的人的每一路信号都能互相对上。对一个主打多设备同步的数据集来说,这个取舍是自洽的——宁可少几个人,也不要出现「三个人有近红外、两个人没有」的残缺组合。

校正之后,五维评分的读法也要跟着变。规模分低衡量的是「能不能喂饱模型」,不是「采得规不规矩」。真正的减分项在别处:音乐顺序不可交换、没有中性基线、没有主观评分、原始录像不公开、本地区访问受限。

还有一处误判要提:把「没有脑电」当成缺陷。对做脑电方法的课题,它确实是硬伤;但这个库的目标不是电生理,而是闭环干预——干预手段是音乐,观察窗口是外周与血流。近红外的空间分辨率优于脑电,能落到前额皮层,在这个目标下是合目的的选择,不是降级。同一份数据在不同课题下的正负号不同,这是判断任何模态选择时的基本前提。

7.1 五维评分

按 DAIMS 的常用维度打分,每项一至五分,分数针对「作为工作记忆负荷的多模态同步数据」这个用途。

维度 分数 理由
数据规模 1 五人、每人 704 试次,按人划分后训练集只剩四个
标注质量 2 逐试次对错可靠,但负荷标签只有两档,无主观评分
任务适配 4 多设备同步齐全,触发器分两层,条件正交清晰
文档完整 3 设备、时序、目录都写清了,但缺体积、缺采样率逐项表
可获取性 4 免注册、ODC-BY,但文件目录在本地区 403

合计十四分(满分二十五)。这个分布说明它不是全能选手:规模是硬伤,任务适配拉满,其余三项在中间。与同类多模态库相比,它在「同步做得干净」上领先,在「能拿来做多少事」上受人数限制。

「标注质量」如果按「标签是否正确」打分可以给四分——区块类型由实验程序写入,不靠人工判读;若按「能承载多少分析」打分,两分都偏高。它的标注是「少而准」,不是「多而全」。

7.2 标注质量的两层

第一层是标签是否正确。这一层它做得比多数库干净:区块类型由 E-Prime 程序在呈现时写入,试次对错由按键与标准答案自动比对,两者都不经过人工。触发器分 block 与 trial 两层,切窗时不用猜。

第二层是标签能承载多少信息。这一层很薄。负荷只有 1-back 与 3-back 两档,中间缺 2-back;场次只有两个,且顺序固定;没有任何主观评分,也没有疲劳、困倦、投入度这类协变量。§4.3 的案例里那 704 个试次,每一个都只有一个二值标签加一个连续的反应时,此外没有别的标注。

这两层合起来,决定了它的分析范式:能做「条件之间有没有差异」,做不了「负荷随时间的连续变化」。

7.3 已知的、可枚举的偏差

偏差 表现 影响
样本极小 五人,其中四人九类齐全 跨人结论的置信区间极宽
筛选偏严 11 人中剔除 6 人 留存者可能系统性偏「配合度高」
顺序不可交换 舒缓在前,激昂在后 场次效应与音乐效应混淆
曲目自选 每人音乐不同 「激昂」不是同一刺激
无中性基线 只有两种音乐 无法分离「有音乐」与「音乐类型」
无对照组 全部受试者做同一任务 无组间比较
无主观评分 只有行为与生理 无法校准负荷的主观量级
无脑电 神经层面只有 fNIRS 毫秒级动态不可得
录像不公开 只给表情评分 换模型重跑不可能
区域受限 文件目录返回 403 部分网络位置无法直接获取

前四条是设计与筛选带来的,改不了;中间三条是实验范式的选择,可以规避或交代清楚;最后两条是发布策略与合规带来的,只能接受。

有一处统计上的提醒:这个库的天然统计单位是人,不是试次。按试次统计能把样本量做到数千,但同一区块的试次共享血氧基线,同一个人共享解剖结构,独立性不成立,显著性会被严重高估。稳妥的做法是每人每条件取一个汇总量,把样本量压到五,再做配对比较——结论会很弱,但那才是这份数据能支撑的强度。

7.4 外部验证矩阵

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

验证角色 做法 讲得通的地方 风险
多设备同步的方法样例 复现触发器对齐流程 三层时间轴齐全 403 时流程跑不通
负荷与音乐的双因素分析 两档负荷 × 两场音乐 条件正交、区块均衡 场次与顺序混淆
皮电唤醒度建模 用皮电估计唤醒 两套皮电可互校 五人无法做跨人验证
近红外与行为关联 血氧与反应时做相关 论文已给出范式 相关不等于因果
闭环干预的原型演示 把音乐当可控输入 干预与观测同场 无实时回路,只是离线

第二类最贴合设计目的;第一类最适合教学;第三、四类受人数限制,只能当探索;第五类只能做离线演示,因为这个库没有实时反馈环节。

7.5 它为何能持续:把一次不可能并行的采集留成了文件

它发布至今只有一个版本,作者没有承诺维护,却仍有引用。原因不在规模,在于它替使用者省掉了一件几乎无法复现的事:让同一个人在同一天里,被五台设备同时盯着做两场不同音乐下的同一任务。

要做这件事,需要一间实验室、五台设备、两名实验员、一份伦理审批,以及十一名愿意坐满三十二分钟的受试者,最后还要接受「一半以上的人因数据不全被剔除」这个结果。这套流程无法外包,也无法靠拼接别的库得到——跨库拼出来的多模态,设备不同、时钟不同、任务不同,同步优势立刻消失。

边界同样明确:只在「多模态同步 + 条件对比」上成立。课题一旦转向大样本、连续负荷估计或毫秒级神经动态,短板立刻暴露。

成本也是原因。重做一次要五台设备和一整套排期;拿到这份数据只需要一次下载。

§8 生态位与历史

8.1 历史沿革

这批数据诞生在 PhysioNet 收录范围扩张的几年里。平台早期以心电、重症、睡眠为主,后来逐步纳入范式化的认知实验与可穿戴记录。本库属于后一类:不是为了临床监护顺手录的,而是为了一项具体的机制问题专门设计的。

它的加入方式也很典型:一个课题组做完 pilot 研究,把整理好的记录捐给平台,托管与版本管理交给平台。这让它在没有后续基金、没有维护团队的情况下也能长期可访问,也让文档停在「一次讲清」的状态——没有勘误,没有补充说明。

资助信息透露了它的来路:美国国家科学基金会两个项目,一个是 CAREER 性质的 MINDWATCH,全称大意是「面向可穿戴自适应闭环架构的多模态无创脑状态解码器」,另一个是可穿戴机器接口架构的基础研究。也就是说,这个库从立项起就是闭环系统的一块拼图,不是一份独立的数据集产品。

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

它没有进过任何挑战赛。PhysioNet 历年挑战赛涉及的生理信号任务集中在心电、脑电、呼吸与重症,工作记忆与音乐干预从未成为赛题。这意味着它没有官方划分、没有排行榜、没有社区基线,也意味着它不会被刷分式的研究快速消耗。

它与聚合型资源的关系则相反。聚合库的价值在规模与统一格式,代价是把单个实验的细节磨平。本库恰好相反:五个人、六个文件夹、三套时钟,每个字段都对应一次真实的采集决定。两者不是替代关系,是粗细两层。

8.3 生态位:单被试深描的一端

把站内外的多模态库按「每人被记录多深」排:临床连续监护最浅,一路心电可以连续几天;竞赛集居中,每人几分钟到几十分钟、固定模态;本库在深的一端,一个人三十二分钟里被九类记录同时覆盖;再往深走,就是需要卧床与多导睡眠的整夜记录。

这个位置带来两个稳定用途:一是多设备同步的方法样例,任何要做「触发器对齐」的团队都能从这里抄一遍流程;二是闭环干预的原型素材,音乐是最容易施加的干预之一,而这个库提供了干预前后的完整观测。

这个位置也不容易被替代。拼一个模态更多的库不难,难的是让所有模态共享同一套触发器、同一段时间轴、同一批人——而这恰恰是扩大规模时最先放弃的东西。

8.4 谁在用它,用来做什么

从公开信息看,引用集中在三个方向。第一是同组的方法论文,2024 年发表在 IEEE 开放期刊上的那篇,用贝叶斯方法从皮电与行为反推隐藏的认知表现与唤醒状态,本库是它的数据来源。第二是多模态融合的探索性工作,把皮电、心电、近红外拼在一起看负荷。第三是音乐干预与人因方向的综述性引用,把它当作「音乐作为可控变量」的一个例子。

还有一类不常被提及的用法:教学。一次实验、两场、九类记录、六个文件夹,链路每一环都有文字说明,人数少到可以在一节课里讲完整个人。它不宏大,但足够完整。

§9 使用指引

9.1 三种角色的路径

算法研究者的最短路径。 先确认访问权限,按 §5.2 拿全量,从一个人一场开始跑通读取与对齐,再按受试者分组做留一,最后才考虑是否需要全量。别一上来就把 704 个试次打散。

认知神经科学方向的最短路径。 先读方法与 964 秒的时序账,理解区块、试次、休息的边界,再挑一名受试者(推荐 §4.3 的案例)把 fNIRS 与行为对齐一次。然后比较 1-back 与 3-back 的血氧差异,在两场里分别看,判断结论是否只在某一场上成立。

工程落地方向的最短路径。 先确认要的是离线分析还是在线回路。离线可直接用;在线要自己定义实时特征与闭环策略,这个库帮不上忙——它没有实时反馈环节,把它当「多模态同步的离线上界」估计更合适。

三种角色有一个共同的起点:都先把一个人一场跑通,再谈全量。这个库的人数少,看上去可以直接上全量,但顺序反过来更省时间——链路上一半的错都在读取与对齐这两步,而这两步用一个人就能验证。

9.2 一条最短的可用流程

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

#-- 最小可用流程:按受试者分组,区块内取均值做特征
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GroupKFold
from sklearn.metrics import roc_auc_score

FS = 7.6294

def one_subject(subj):
    ohb = pd.read_csv(f"fNIRS_data/{subj}_ohb.csv")
    eda = pd.read_csv(f"Biopac_data/EDA/{subj}_EDA.csv").iloc[:, 0].to_numpy()
    trig = pd.read_csv(f"fNIRS_data/{subj}_Triggers.csv")
    rows = []
    for bid, g in trig.groupby("block"):
        i0 = int(g["onset"].min() * FS)
        i1 = int((g["onset"].max() + 2.0) * FS)
        win = ohb.iloc[i0:i1].to_numpy()
        if win.shape[0] < 4:
            continue
        e0, e1 = int(i0 / FS * 2000), int(i1 / FS * 2000)
        rows.append({
            "subj": subj,
            "block": bid,
            "label": int(g["condition"].iloc[0]),
            "nir_mean": float(win.mean()),
            "nir_std": float(win.std()),
            "eda_mean": float(eda[e0:e1].mean()),
        })
    return pd.DataFrame(rows)

df = pd.concat([one_subject(s) for s in ["3F", "4F", "6F", "8F", "11F"]],
               ignore_index=True)
X = df[["nir_mean", "nir_std", "eda_mean"]].to_numpy()
y = df["label"].to_numpy()

for tr, te in GroupKFold(n_splits=5).split(X, y, groups=df["subj"]):
    clf = LogisticRegression(max_iter=1000).fit(X[tr], y[tr])
    print("留一人 AUC", round(roc_auc_score(y[te], clf.predict_proba(X[te])[:, 1]), 3))

这里刻意用 GroupKFold 并按 subj 分组:五个人正好五折,每一折都是「用四个人预测第五个人」。得到的数字通常不好看,这正是这份数据的诚实之处——五个人的跨人可分性,本来就不该期待太高。

9.3 引用方式

官方要求引用三件东西:数据集本身、2024 年的论文、以及 PhysioNet 平台。

数据集那一条要写到版本级:名称、版本号 1.0.0、DOI 10.13026/6vh4-dk68、访问日期。论文那一条是 Khazaei 与 Parshi 等五人于 2024 年发表在 Frontiers in Neuroscience 第 18 卷、文章号 1406814 的 pilot 研究,DOI 10.3389/fnins.2024.1406814。平台那一条按 PhysioNet 的现行建议引用其 2026 年的平台综述。

若做了再加工(重参考、重采样、重新切窗),应在方法里写清步骤,因为这些会改变别人复现的结果。许可为 ODC-BY 1.0,允许商用与再分发,条件是署名。

§10 AI 使用声明

项目 声明
文本生成 本文由 AI 辅助撰写,编辑负责结构与事实核对
数字来源 规模、结构、边界三类数字取自 PhysioNet 官方页面与配套论文摘要
页面核验 项目页于 2026 年 10 月 28 日直接访问,返回 200,正文逐段读取
文件核验 文件目录返回 403,未能读取任何原始文件,字段结构取自官方文字说明
口径冲突 Calming 与 Vexing、calming 与 exciting 两组词已在 §4.1 并列呈现
论文信息 仅参考 Europe PMC 返回的摘要与元数据,未读全文
未核验内容 实际文件体积、逐人性别后缀、Empatica 逐文件采样率、表情评分覆盖人数
图像 无配图;封面为生成式提示词,不含真实生理波形
免责 本文不构成任何临床或工程建议;使用须遵守 ODC-BY 1.0 署名条款

常见误读(避坑清单)

说法 实际 证据
「这是一个脑电多模态库」 没有任何脑电通道 官方信号清单七路生理加表情加行为,无 EEG
「有十一名受试者」 招募 11 人,留存 5 人 附表只有编号 3、4、6、8、11 五行带勾
「编号是 1 到 5」 编号不重排,为 3、4、6、8、11 官方附表与目录举例
「每人只做了几分钟」 每人两场,每场 964 秒 方法段明写单场时长
「每场有 8 个区块」 每场 16 个区块,两种各 8 个 摘要与方法一致
「第二场标注是 Exciting」 标注为 Vexing,正文用 exciting 方法段的场次命名
「有主观情绪或负荷评分」 一份都没有 官方局限段自述
「面部表情有五个人的」 编号 6 缺表情那一路 附表表情列未勾
「可以按试次随机切分」 必须按受试者与区块分组 每人 704 试次高度相关
「数据随时可直接下载」 文件目录在部分区域返回 403 2026 年 10 月 28 日访问结果

FAQ

Q1:一共几名受试者,为什么只有五个?
官方写明最初招募 11 人,但因为并非每位都采全了所有传感器,模态过少的被整体剔除,最终留下编号 3、4、6、8、11 共五人。编号没有重排,所以不能按 1 到 5 循环。

Q2:这个库里有脑电吗?
没有。记录项是皮电、心电、皮温、呼吸、脉搏、肌电、fNIRS、面部表情评分与行为,没有任何脑电通道。神经层面只有 44 通道功能近红外,量的是前额血氧动力学。

Q3:一场实验多长、多少试次?
单场 964 秒,约 16 分钟,含 16 个区块(1-back 与 3-back 各 8 个),每块 22 试次,即每场 352 试次。两场合计每人 704 试次、32 个区块。

Q4:两个场次的标签是什么?
分别是 Calming 与 Vexing。官方叙述里第一场配舒缓音乐、第二场配激昂音乐,但标注词用的是 Calming 与 Vexing,与正文的 calming、exciting 不是同一组词。

Q5:为什么文件下载不了?
项目页可以打开,但文件目录在本地区返回 403,页面同时显示该数据因法律或政策限制在本地区不可用。这不是需要登录,也不是链接写错。

Q6:fNIRS 输出哪些量、什么单位?
四种:总血红蛋白、氧合血红蛋白、脱氧血红蛋白与血氧饱和度。官方把单位统一写作毫摩尔,未附长度量纲,写方法学时照抄原文即可。

Q7:采样率是多少?
Biopac 原始记录为 2 千赫兹,fNIRS 为 7.6294 赫兹。Empatica 腕带的采样率逐文件写在第二行,官方没有汇总表,只能逐文件读。

Q8:音乐是什么曲子?
由受试者自己提供,分舒缓与激昂两类,第一场放舒缓的,第二场放激昂的。曲目在人与人之间不同,官方没有公布清单。

Q9:能不能做跨被试分类?
能,但要接受结果很弱。五个人正好五折,每折用四个人训练、一个人测试;把 704 个试次打散随机切分得到的准确率几乎都来自同一个人。

Q10:面部表情是原始视频吗?
不是。官方明确不公开录像,只提供 FaceReader 导出的逐帧状态与概率分布,两类文本文件。

Q11:有没有对照组或患者数据?
都没有。全部是健康成人志愿者,无对照组,官方自己把「absence of a control group」列为局限之一。

Q12:许可允许商用吗?
ODC-BY 1.0 允许,包括商业用途,条件是署名。署名要覆盖数据集与 PhysioNet 平台两层,并同时引用 2024 年那篇论文。

术语表

术语 解释
n-back 判断当前刺激是否与前第 n 个刺激相同的连续工作记忆任务
1-back 只需与上一个刺激比较,负荷较低的档位
3-back 需同时维持三个刺激并持续更新,负荷较高的档位
区块 一段连续的同一条件试次,本库为 22 试次
试次 一次字母呈现加一次判断,本库为 0.5 秒呈现加 1.5 秒注视
工作记忆 在秒级时间内维持与操作信息的认知系统
认知负荷 任务占用工作记忆资源的程度,本库用 n 值代理
唤醒度 生理激活水平,本库用皮电与心率相关指标近似
闭环脑机接口 测量状态、施加干预、再测量的循环系统
fNIRS 功能近红外光谱,用近红外光测皮层血氧变化
氧合血红蛋白 携带氧的血红蛋白,fNIRS 的主要观测对象
脱氧血红蛋白 已释放氧的血红蛋白,与氧合量走势相反
总血红蛋白 氧合与脱氧之和,反映局部血容量
血流动力学响应 神经活动引起的血氧变化,滞后数秒
皮电活动 汗腺活动引起的皮肤电导变化,反映交感激活
光电容积脉搏波 用光吸收变化记录的血流搏动波形
逐搏间期 相邻两次心搏之间的时间,由脉搏波导出
表面肌电 体表电极记录到的肌肉电活动
面部动作编码 把面部表情分解为可计分单元的方法体系
FaceReader Noldus 出品的自动表情分析软件
触发器 标记事件时刻的电信号,用于跨设备对齐
时间轴置零 把记录起点设为 0 秒,便于按相对时刻定位
去标识 移除可直接识别个人的信息,本库按 HIPAA 十八条执行
受试者泄漏 同一人的样本同时进入训练与测试,导致成绩虚高
分组交叉验证 按受试者或区块分组切分,避免泄漏的验证方式
pilot 研究 小规模可行性试验,用于验证范式而非确立结论
ODC-BY 开放数据共享署名许可,允许商用需署名

附录 A:核心数字核对表

项 值 来源 来源层级
招募人数 11 摘要与方法段 官方页面
留存人数 5 附表带勾行 官方页面
留存编号 3、4、6、8、11 附表左列 官方页面
缺表情的人数 1(编号 6) 附表表情列 官方页面
场次数 2 方法段 官方页面
每场区块数 16 摘要与方法段 官方页面
每场每类区块数 8 摘要 官方页面
每块试次数 22 摘要与方法段 官方页面
单场试次数 352 16 × 22 推算 官方数字推算
每人试次数 704 2 × 352 推算 官方数字推算
单块时长 49 秒 方法段明写 官方页面
指令时长 5 秒 方法段 官方页面
字母呈现 0.5 秒 方法段 官方页面
注视十字 1.5 秒 方法段 官方页面
区块后放松 10 秒 方法段 官方页面
场中休息 20 秒 方法段 官方页面
单场时长 964 秒 方法段明写 官方页面
场间休息 120 秒 方法段 官方页面
Biopac 采样率 2 千赫兹 数据说明 官方页面
fNIRS 通道数 44 数据说明 官方页面
fNIRS 采样率 7.6294 赫兹 数据说明 官方页面
fNIRS 输出量 4 种 数据说明 官方页面
屏幕尺寸 65 英寸 方法段 官方页面
伦理批号 STUDY00002013 伦理段 官方页面
许可 ODC-BY 1.0 页面许可栏 官方页面
数据 DOI 10.13026/6vh4-dk68 页面发现栏 官方页面
论文 DOI 10.3389/fnins.2024.1406814 页面引用栏 官方页面
首发日期 2025-02-26 页面版本栏 官方页面

附录 B:数字的来源分层

第一层,官方页面。 受试者数、留存编号、场次与区块结构、试次数、各项时长、采样率、通道数、输出量、设备型号、伦理批号、许可与两个 DOI,全部来自项目页的摘要、方法、数据说明、伦理与文件区文字。这一层可直接引用,重查可得同样结果。

第二层,官方数字推算。 单场试次 352、每人试次 704、单场区块合计时长 964 秒的构成,都是官方给出的几个数相乘相加的结果。推算过程在 §2.4 与附录 D 的代码里可复算,结论与官方明写的总时长一致,因此可信度高;但它们仍属推算,不是官方逐项列出。

第三层,论文摘要。 结果是「唤醒度随难度变化小、随音乐类型变化大」「表现指数在激昂场次更好」「氧合血红蛋白与表现的正相关在 3-back 最强」这三条,来自 Europe PMC 返回的摘要,只代表作者在自己五个人身上的观察。

第四层,未核实。 文件实际体积、逐人的性别后缀、Empatica 各文件的采样率、表情评分实际覆盖的帧数与时长、是否存在未公开的补充材料、两场之间的实际间隔是否严格为 120 秒。正文中凡涉及这些的地方,都只做定性表述或明确标注为「以目录为准」。

附录 C:完整参考文献

编号 文献 链接 用途
1 A Multimodal Dataset for Investigating Working Memory in Presence of Music v1.0.0 https://physionet.org/content/multimodal-nback-music/1.0.0/ 规模、结构、边界数据
2 该库文件目录(本地区 403) https://physionet.org/files/multimodal-nback-music/1.0.0/ 目录结构的官方描述来源
3 Khazaei S, Parshi S, Alam S, Amin MR, Faghih RT. Front Neurosci 2024;18:1406814 https://doi.org/10.3389/fnins.2024.1406814 实验设计与主要结果
4 同上的 Europe PMC 摘要 https://www.ebi.ac.uk/[europepmc](https://www.qianfanghub.com/ai-ready-dataset/europepmc/1353)/webservices/rest/search?query=DOI:10.3389/fnins.2024.1406814 摘要文本与元数据
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 NIRx NIRSport 2 产品页 https://nirx.net 设备与 Nirslab 处理流程
8 Empatica E4 数据格式说明 https://www.empatica.com 腕带七类文件的字段含义
9 BIOPAC MP160 产品页 https://www.biopac.com 有线生理通道与采样能力
10 mental-fnirs(库内对照) https://physionet.org/content/mental-fnirs/1.0.0/ §6.3 的任务与模态对比

附录 D:任务代码

把一名受试者的两场拼成一条时间轴,并标出区块类型,这段够用,不需要训练模型。

#-- 把两场拼成一条时间轴,逐块标出负荷与音乐
import numpy as np
import pandas as pd

FS, BLOCK, REST, MID, GAP = 7.6294, 49, 10, 20, 120

def timeline(subj):
    out, t = [], 0.0
    for session, music in ((1, "Calming"), (2, "Vexing")):
        trig = pd.read_csv(f"Behavioral_data/{music}_{subj[:1]}.csv")
        for k, bid in enumerate(trig["block"].unique()):
            cond = int(trig.loc[trig["block"] == bid, "condition"].iloc[0])
            out.append({"session": session, "music": music, "block": int(bid),
                        "load": cond, "t0": t, "t1": t + BLOCK})
            t += BLOCK + REST
            if k == 7:
                t += MID
        if session == 1:
            t += GAP
    return pd.DataFrame(out)

df = timeline("3F")
print(len(df), "块;总时长", round(df["t1"].max()))
print(df.groupby(["music", "load"]).size())

输出应当是 32 块,四组各 8 块,总时长落在两场之和加场间休息上。如果四组不均衡,多半是区块类型那一列读错了字段名。

附录 E:如果只记五件事

第一,它是 PhysioNet 上的工作记忆多模态库,五人、两场音乐、九类记录,2025 年 2 月发布 1.0.0 版。

第二,它没有脑电。神经层面只有 44 通道前额功能近红外,采样率 7.6294 赫兹。

第三,招募 11 人只留 5 人,编号 3、4、6、8、11 不重排,其中编号 6 缺面部表情。

第四,两场各 964 秒、16 个区块、352 个试次,1-back 与 3-back 各半;音乐顺序固定,舒缓在前、激昂在后。

第五,现实的用法是按受试者分组做五折,把区块当样本而不是把试次当样本;按试次随机切分得到的准确率几乎都来自同一个人。

编辑说明

核验时间 2026 年 10 月 28 日。核验方式:直接访问 PhysioNet 项目页,返回 200,逐段读取摘要、背景、方法、数据说明、去标识、使用说明、伦理、致谢与参考文献各节;读取受试者附表并逐行核对五行带勾记录;读取页面文件区与版本栏,确认单版本状态;尝试访问文件目录,返回 403,页面同时显示区域限制提示,故未读取任何原始文件。论文信息仅取 Europe PMC 返回的摘要与元数据。964 秒的时序构成按官方给出的四个数复算,与官方明写的总时长一致。场次标注词(Calming、Vexing)与叙述词(calming、exciting)按并列呈现,不作判断。未覆盖:文件实际体积、逐人性别后缀、Empatica 逐文件采样率、表情评分覆盖范围、采集年份。


相关数据集导航

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

  • wearable-exam-stress — 共享标签:生理信号 / 可穿戴传感 / 神经科学 / 多模态
  • mental-fnirs — 共享标签:生理信号 / 可穿戴传感 / 神经科学 / 多模态
  • multimodal-gait-dataset — 共享标签:生理信号 / 可穿戴传感 / 神经科学 / 多模态
  • wesad — 共享标签:生理信号 / 可穿戴传感 / 多模态
  • cves — 共享标签:生理信号 / 神经科学 / 多模态
  • dandi-archive — 共享标签:生理信号 / 神经科学 / 多模态
  • nqmitcsxpd — 共享标签:生理信号 / 可穿戴传感 / 神经科学
  • noneeg — 共享标签:生理信号 / 可穿戴传感 / 神经科学
  • tappy — 共享标签:生理信号 / 可穿戴传感 / 神经科学
  • cgmacros — 共享标签:生理信号 / 可穿戴传感 / 多模态

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

返回 AI-Ready 数据集