MATLAB 处理BCI Competition IV 2a数据集
前言
对于入门脑机接口(Brain-computer interface,BCI)同学来说,这一篇博客可以很直观的帮了解到公共数据集的详细处理,对于大佬而言,这篇文章其实没啥用,帮您巩固一下所学知识,如果有错误向往您不要吝啬自己的建议。本人BCI领域小白一名,希望可以相互学习相互交流。
这篇文章的参考许多GitHub与优快云上的文章与代码,在后续的致谢中给出详细资料。
BCI Competition IV 2a数据集介绍
图1
该数据集包含来自9名受试者的脑电图(EEG)数据。基于提示的脑机接口(BCI)范式包括四个不同的运动想象任务,分别是想象左手运动(类别1)、右手运动(类别2)、双脚运动(类别3)和舌头运动(类别4)。每个受试者在不同的两天进行了两个会话的记录。每个会话由6个运行组成,之间有短暂的休息时间。每个运行包含48个试次(每个类别12个),每个会话总共有288个试次。
当初看其的文章不懂啥是runs,trails,现在给大家解释一下:在BCI实验中,一个"run"是指一组连续的试次(trials)组成,一个trial指的就是一次完整的实验,比如说是一次左手运动想象任务从0秒到8秒就是一个trail。
这里不得不提到—“ 袋装猫 ” 博主给出了详细的下载链接,分别是.gdf的官方格式和.mat的格式。
链接:袋装猫的博客
我在这里再给一遍连接,以防止连接失效。
- BCI竞赛官方链接:BCI Competition IV— .GDF
- BNCI Horizon 2020官方链接:BNCI Horizon—.mat
对于BCI Competition IV 2a的详细介绍我就不在这里多说了,我把几位博主的博客链接放在下面:
BCI Competition IV 2a数据集处理
关于BCI Competition IV 2a竞赛的数据集处理网上大多数使用的方法使用python程序写的,导入mne库十分方便,考虑到未入门python的人,本篇博客使用Matlab对数据集进行处理。
下载数据集
通过BNCI Horizon 2020官方链接下载BCI Competition IV 2a的.mat文件,首先点击上面的链接进入下载界面,界面如下图所示。
接下来我们点击A01T , A01E,…对其进行下载。
在这里再一次对下载的数据集进行一个简单的介绍,A01T为训练集,A01E为测试集。在进行实验时为了解决数据量少的问题也可以把这2个大兄弟进行合并,但是不建议这样做,你这样做跑出来的结果没有说服力。
matlab 处理数据
数据介绍
使用matlab语句 load A01T.mat 将数据加载到工作区。
在data文件中有1*9个单元数组cell,每个单元数组里面都一个结构体struct,每个结构体都用于存放脑电数据。
前三个cell为EOG测试,即Eyes open,Eyes closed,Movement,在进行脑电分析时我们不需要他,我们只分析4~9的cell。
在matlab中输入data{1,i} 就可以加载对应的cell下的结构体。我们接下来详细看一下结构体中各个变量的含义。
代码详情
我们对A01T的脑电数据进行处理,使他改为github上最常用的形状,即shape=(采样点数,通道数,实验次数)。
// An highlighted block
clc
clear
% 加载下载的开源数据集
load A01T.mat
finally_data = [];
finally_label = [];
for i = 4:9
a = data{1, i}; % 从数据集中获取第i个样本的数据
k = 0;
data1 = zeros(1000, 22, 48); % 创建一个三维矩阵用于存储数据
for j = 1:length(a.trial)
k = k + 1;
% 从样本数据中提取特定时间范围内的数据,并选择前22个通道
data1(:, :, k) = a.X((a.trial(j) + 501):(a.trial(j) + 1500), 1:22);
end
label1 = a.y; % 获取样本的标签
finally_data = cat(3, finally_data, data1); % 将当前样本的数据添加到最终数据集中
finally_label = cat(1, finally_label, label1); % 将当前样本的标签添加到最终标签集中
end
% 将最终的数据集和标签集赋值给"data"和"label"变量
data = finally_data;
label = finally_label;
%保存数据与标签
save pre_A01T data label
通过运行代码之后我们得到2个变量,data和label。
代码程序解释
- for循环为什么要4到9?因为前三个为EOG测试,不需要,所以从第4个进行循环。
- 为什么要+500 +1499 ?因为我们是从2秒开始进行运动想象的,采样频率为250hz,采取4秒的数据。
- 网上大多数的数据是选取1000采样点数,当然,为了更加精准,选取750采样点也是可以的。
验证处理数据的准确率
我们发现FBCSP算法处理A01T这名被试者的准确率为77.43%
对比论文 Transformer-based Spatial-Temporal Feature Learning for EEG Decoding 上面所提及的FBCSP对比算法准确率相差不大,事实证明咱们提取的数据没有问题。
[1] Song Y , Jia X , Yang L ,et al.Transformer-based Spatial-Temporal Feature Learning for EEG Decoding[J]. 2021.DOI:10.48550/arXiv.2106.11170.
致谢
本人基础不牢固,行文之处有些许的错误请大家指正,相互交流,相互学习。
特别感谢下面博主的博客让我受益匪浅。有些代码是参考Github上进行书写的,如有利益冲突请联系我。相关代码已上传至我的资源,包括处理好的数据集.mat格式的,如果需要可直接下载。
骖络逝水桓
袋装猫
Dancingharbor
脑机接口社区
是馒头阿
感想
研究学术一定要多交流,闭门造车只会固步自封。
点个赞在走呗!,未来的各位教授!