admin管理员组

文章数量:1529464

MATLAB 处理BCI Competition IV 2a数据集

  • 前言
    • BCI Competition IV 2a数据集介绍
    • BCI Competition IV 2a数据集处理
      • 下载数据集
      • matlab 处理数据
        • 数据介绍
        • 代码详情
        • 代码程序解释
      • 验证处理数据的准确率
  • 致谢
  • 感想

前言

对于入门脑机接口(Brain-computer interface,BCI)同学来说,这一篇博客可以很直观的帮了解到公共数据集的详细处理,对于大佬而言,这篇文章其实没啥用,帮您巩固一下所学知识,如果有错误向往您不要吝啬自己的建议。本人BCI领域小白一名,希望可以相互学习相互交流。

这篇文章的参考许多GitHub与CSDN上的文章与代码,在后续的致谢中给出详细资料。

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的格式。
链接:袋装猫的博客
我在这里再给一遍连接,以防止连接失效。

  1. BCI竞赛官方链接:BCI Competition IV— .GDF
  2. BNCI Horizon 2020官方链接:BNCI Horizon—.mat

对于BCI Competition IV 2a的详细介绍我就不在这里多说了,我把几位博主的博客链接放在下面:

  1. 脑机接口社区的文章
  2. 袋装猫博主的文章
  3. Dancingharbor博主的文章
  4. 是馒头阿博主的文章

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个变量,datalabel

代码程序解释
  1. for循环为什么要4到9?因为前三个为EOG测试,不需要,所以从第4个进行循环。
  2. 为什么要+500 +1499 ?因为我们是从2秒开始进行运动想象的,采样频率为250hz,采取4秒的数据。
  3. 网上大多数的数据是选取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
脑机接口社区
是馒头阿

感想

研究学术一定要多交流,闭门造车只会固步自封。
点个赞在走呗!,未来的各位教授!

本文标签: 数据BCImatlabivcompetition