尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

BCI Competition IV 2a 数据集完整指南:5 步从脑电原始数据画到第一条试次波形

BCI Competition IV 2a 数据集完整指南:5 步从脑电原始数据画到第一条试次波形 BCI Competition IV 2a 数据集完整指南5 步从脑电原始数据画到第一条试次波形【免费下载链接】bcidatasetIV2aThis is a repository for BCI Competition 2008 dataset IV 2a fixed and optimized for python and numpy. This dataset is related with motor imagery项目地址: https://gitcode.com/gh_mirrors/bc/bcidatasetIV2a想入门运动想象motor imagery即大脑想象某个动作而非真正执行的脑电信号解码打开 bcidatasetIV2a 仓库时却常常卡住一堆 A01T.npz 文件该怎么读事件编码 768、772 又代表什么本文带你完成一条真实路径克隆仓库 → 读懂实验范式 → 画出第一个试次trial即一次完整的想象任务记录的波形 → 批量提取全部有效试次共 5 个可执行步骤。获取数据集克隆仓库并装好依赖克隆仓库并看清目录结构这个仓库是BCI Competition IV 2a数据集的 Python 移植版9 名被试的脑电EEGelectroencephalography头皮电极记录的大脑电活动信号从原始 GDF 格式提取后存成了 numpy 可直接读取的.npz 文件。先克隆下来看看有什么git clone https://gitcode.com/gh_mirrors/bc/bcidatasetIV2a cd bcidatasetIV2a ls执行后你会看到 18 个数据文件和几个说明文件文件含义A01T.npz ~ A09T.npz被试 1~9 的训练集T trainA01E.npz ~ A09E.npz被试 1~9 的评估集E evaluationmi_paradigm.png / event_table.png实验范式图与事件编码表来自原论文README.md数据说明与取数示例examples/plot_c3c4cz.py完整示例多通道试次提取与绘图安装两个依赖即可跑通只需要 Python 3 NumPy 加载数据再加 Matplotlib 画波形做后续预处理和分类时再按需加 SciPy 和 scikit-learnpip install numpy matplotlib加载一个 .npz检查 5 个数组.npz 本质是一个压缩的数组集合。加载 A01T.npz 并打印每个键的形状先建立数据里到底有什么的直觉import numpy as np data np.load(A01T.npz) # 被试 1 的训练集 for k in data.files: print(k, data[k].shape, data[k].dtype)预期输出s (672528, 25) float64 etyp (603, 1) uint16 epos (603, 1) int32 edur (603, 1) uint16 artifacts (288, 1) uint8其中s是原始信号672528 个采样点 × 25 个通道etyp/epos/edur分别是事件标记的类型、起始采样点位置、持续时长采样点数一一对应。注意s的排列是采样点在前、通道在后通道是列维度。动手前先读懂范式试次时间轴与事件编码表看懂单个试次的 7.5 秒时间轴不理解实验设计就切数据切出来的片段必然对不上任务。每个试次的时序如下250 Hz 采样率即每秒 250 个采样点图 1BCI Competition IV 2a 运动想象范式单个试次共 1875 个采样点7.5 秒时间段阶段你在数据里的对应物0~2 s注视点基线事件 768试次开始所在位置起2~3 s视觉提示cue事件 769~772位置比 768 晚 500 个采样点2.0 s3~6 s运动想象执行特征最丰富的分析窗口6~7.5 s休息试次结束背下这张事件编码速查表事件编码是原始信号和任务信息之间的翻译字典错读一个码标签全错图 2事件类型编码表摘自原论文试次开始为 768四类提示为 769~772事件编码十六进制含义7680x0300试次开始7690x0301提示左手想象类别 17700x0302提示右手想象类别 27710x0303提示双足想象类别 37720x0304提示舌头想象类别 410230x03FF被拒绝试次需剔除327660x7FFE新一轮录制开始自测一下一个试次的类别由哪个事件决定答紧跟 768 之后的 769~772 提示事件分析运动想象特征应重点看哪个时间窗答3~6 s 想象期C3 通道在s数组的哪个索引答列索引 7记住三个关键通道的索引数据集共 25 个通道运动皮层区域的三个核心通道列索引固定为C3 7Cz 9C4 11。仓库示例 examples/plot_c3c4cz.py 就是围绕这三个通道展开的入门阶段盯着它们就够。第一个任务画出第一个试次的 C3 波形定位试次开始事件所有取数都从事件 768 出发。在 A01T.npz 中768 共出现 288 次每类 12 次 × 4 类 288 个试次import numpy as np from matplotlib import pyplot as plt data np.load(A01T.npz) raw data[s] # 形状 (672528, 25)第 7 列是 C3 etyp data[etyp].ravel() # 事件类型 epos data[epos].ravel() # 事件起始采样点 edur data[edur].ravel() # 事件持续时长采样点 x np.where(etyp 768)[0][0] # 第一个试次开始事件的下标用位置与时长切出信号再读出类别试次事件本身持续 1875 个采样点7.5 s直接用它切信号类别则看紧随其后的提示事件trial raw[epos[x]:epos[x] edur[x], 7] # 取 C3 通道 1875 个采样点 cls etyp[x 1] # 772 → 舌头想象若为 1023 则被拒绝 plt.plot(trial) plt.show()预期效果画出一条 7.5 秒、幅值约在 ±30 之间的波形对第一个试次cls的值是 772即舌头想象任务。仓库 README.md 中还有同一逻辑的注释版值得逐行对照。批量提取把被试的全部有效试次取出来遍历所有 768 事件要训练模型需要整个被试的全部试次而不是单条。思路就是找所有 768 → 看下一个事件定类别 → 按位置切信号class_map {769: left, 770: right, 771: foot, 772: tongue} starts np.where(etyp 768)[0] trials, labels [], [] for i in starts: cls class_map.get(etyp[i 1]) # 下一个事件决定类别 if cls is None: # 下一个是 1023 等跳过 continue s, e epos[i], epos[i] edur[i] trials.append(raw[:, s:e]) # 25 通道 × 1875 采样点 labels.append(cls)用下一个事件是否可识别过滤被拒绝试次上面class_map.get(...)返回None的分支正好把被拒绝试次1023剔除。在 A01T.npz 上执行后288 个试次开始事件中有 15 个被拒绝剩余 273 个有效试次四类分布为 left/right/foot/tongue 69/69/68/67。实操心得每个被试的被拒数量不同所以有效试次数 288 − 该文件 1023 事件数处理前先np.sum(etyp 1023)心里有数不要假设一定是 288。多通道扩展想同时取 C3/Cz/C4把raw[:, s:e]换成逐通道循环即可仓库里 examples/plot_c3c4cz.py 给出了完整实现含用plt.imshow把全部试次画成热图可直接运行参考。常见报错排查四个典型坑❌/✅ 对照清单❌ 直接data[y]或data[events]取标签 → ✅ 本数据集没有现成标签数组类别由 768 之后的事件编码推出❌ 以为s是 (通道, 采样点)按行取通道 → ✅s是 (672528, 25)通道在列维度C3 是s[:, 7]❌ 把 288 个 768 事件全部当有效试次 → ✅ 先检查下一个事件是否为 1023剔除被拒绝试次❌ 25 个通道全部平均使用 → ✅ 从 C3/Cz/C4索引 7/9/11入手再逐步扩展症状 → 原因 → 解决症状原因解决KeyError: ynpz 里只有 s/etyp/epos/edur/artifacts 五个键用etyp[i1]推导类别切出的 trial 为空数组事件位置与信号维度用反行/列搞混确认raw[epos:eposedur, 通道]的写法或先data[s].T转成 (通道, 采样点) 再用raw[通道, s:e]有效试次不足 288 个存在 1023 被拒绝试次属正常现象保持剔除逻辑提示出现时间与范式图对不上误把 768 位置当 cue 位置cue 事件位置比 768 晚 500 个采样点2.0 s总结与下一步路线关键收获✅ 掌握了 npz 五个键s/etyp/epos/edur/artifacts的含义与 (采样点, 通道) 的排列方式✅ 能读懂 7.5 秒试次的四段时序并背下 768~772、1023 等核心事件码✅ 能独立画出任一被试某个试次 C3 通道的波形✅ 能批量提取有效试次并理解 288 与有效数的差值来自被拒绝试次工具与资源推荐任务类型工具核心功能学习难度适用阶段加载数据NumPynp.load读取 .npz☆入门绘图Matplotlib波形、试次热图☆☆入门滤波预处理SciPy.signal带通、陷波滤波★★★进阶特征与分类scikit-learnLDA/SVM、交叉验证★★★☆进阶完整 EEG 流程MNE-Python通道、参考、功率谱密度★★★★专业四周路线图第一周对 A01T~A09T 全部 9 个文件跑一遍批量提取核对每个被试的有效试次数与四类分布第二周加 0.5~30 Hz 带通滤波计算想象期3~6 s窗口的平均功率或 PSD 特征第三周用 T 集训练 LDA/SVM在对应的 E 集如 A01E.npz上评估对比不同通道组合第四周汇总 9 名被试的个体差异输出一份小实验报告BCI Competition IV 2a 虽然经典但把数据读对这一步就走通了半壁江山——剩下的预处理、特征、分类都有成熟套路可以套用。现在就把 A01T.npz 跑通画出你的第一条试次波形过程中遇到任何加载或取数问题欢迎到仓库提交 Issue 或直接参与讨论你的踩坑记录很可能正是下一位新手最需要的那份文档。【免费下载链接】bcidatasetIV2aThis is a repository for BCI Competition 2008 dataset IV 2a fixed and optimized for python and numpy. This dataset is related with motor imagery项目地址: https://gitcode.com/gh_mirrors/bc/bcidatasetIV2a创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表