基于CSP的运动想象EEG分类任务实战

news2024/11/22 10:38:43

基于运动想象的公开数据集:Data set IVa (BCI Competition III)1
数据描述参考前文:https://blog.csdn.net/qq_43811536/article/details/134224005?spm=1001.2014.3001.5501
EEG 信号时频空域分析参考前文:https://blog.csdn.net/qq_43811536/article/details/134273470?spm=1001.2014.3001.5501
基于CSP的运动想象 EEG 特征提取和可视化参考前文:https://blog.csdn.net/qq_43811536/article/details/134296308?spm=1001.2014.3001.5501
CSP(Common Spatial Patterns)——EEG特征提取方法详解参考前文:https://blog.csdn.net/qq_43811536/article/details/134296840?spm=1001.2014.3001.5501

本文使用公开数据集 Data set IVa 中的部分被试数据,数据已公开可以从网盘获取:
链接:https://pan.quark.cn/s/5425ee5918f4
提取码:hJFz


目录

  • 1. 实验介绍
  • 2. 运动想象分类
    • 2.1 分类性能
    • 2.2 结论
  • 3. 核心Python代码


1. 实验介绍

本任务的实验数据来自一名健康受试者,代号al。受试者在视觉提示出现后3.5s内完成以下3个运动想象中的一个:(L)左手,(R)右手,(F)右脚。分类任务中的数据只包括了右手和右脚两类,共280个试次。实验过程中使用脑电帽记录了118个通道的EEG信号,电极位置如图1所示。采集到的EEG信号首先经过带通滤波(0.05-200Hz),再经过数字化和下采样,得到采样率为100Hz的信号。

在这里插入图片描述

图1 电极位置

2. 运动想象分类

基于CSP特征,我们使用LDA分类器进行分类,并进行十折交叉验证以评估性能。评价指标为测试集准确率,即分类正确的试次占总试次的比例。

2.1 分类性能

我们比较了不同的带通滤波器和时间窗的结果。

  • 图1中,横轴为时间窗相较于提示出现的起始时间。不同的折线代表了不同窗长。我们发现在3s的窗长能获得更高的分类准确率,时间窗从提示出现后0.5s开始效果更好,分类准确率达到1。
  • 图2展示了滤波器截止频率对于准确率的影响,可以看到低频截止频率在10-12Hz时准确率能达到1。
  • 我们还比较了LDA分类器与线性回归(LR)和随机森林(RF)方法的性能,结果如表1所示。LDA分类器的准确率高于LR和RF,但分类性能都较高。
  • 最后我们去掉提取CSP特征的模块,直接对原始信号使用LDA分类器,结果如图3所示。去除掉提取CSP模块后,分类准确率由1下降至0.6左右。

在这里插入图片描述

图1 时间窗搜索结果。横轴为时间窗相较于提示出现的起始时间。不同的折线代表了不同窗长。

在这里插入图片描述

图2 滤波器参数搜索结果。横轴为低频截止频率,带宽固定为16Hz。

表1 不同分类器的分类结果
方法准确率
LDA1
LR0.99±0.01
RF0.99±0.01

在这里插入图片描述

图3 消融实验。直接对原始信号使用LDA性能较差。

2.2 结论

实验表明,右手和右脚运动想象的EEG差异集中于μ节律信号(8-15Hz)和β节律(18-24Hz),体现在C3和C4通道,即感觉运动区。使用CSP算法提取到的特征具有较高的线性可分性,使用LDA分类器可以实现准确率为1,能有效区分这两类运动想象。实验发现用于分类任务的时间窗范围和带通滤波范围对分类准确率具有较大影响,最优时间窗为提示出现后0.5s-3.5s,最优频带为12Hz-28Hz。


3. 核心Python代码

  • 部分变量说明:
    • raw:由 mne.io.RawArray() 函数创建,代表原始EEG数据
    • epochs:由 mne.Epochs() 函数创建,代表一个事件(event)对应的所有数据,在该数据集中一个事件即 “右手”或者“脚”的想象运动
# BP Filter
l_fr, h_fr = 12.0, 28.0
tMin, tMax = 0.5, 3.5

# MNE object
info = mne.create_info(
    ch_names=[i[0] for i in ch_name],
    sfreq=eeg_fs,
    ch_types='eeg')
pos_dic = dict(zip(info.ch_names, ch_pos))
montage = mne.channels.make_dig_montage(pos_dic)

info.set_montage(montage)
raw = mne.io.RawArray(eeg_data.T, info)
# Apply band-pass filter
raw.filter(l_fr, h_fr, fir_design="firwin", skip_by_annotation="edge")

# Decoding


events = np.vstack((cues_pos, np.zeros(len(cues_pos)), target_label[0, :])).T.astype(int)
picks = mne.pick_types(raw.info, meg=False, eeg=True, stim=False, eog=False, exclude="bads")

# Epochs
epochs = mne.Epochs(
    raw,
    events,
    events_id,
    tMin,
    tMax,
    proj=True,
    picks=picks,
    baseline=None,
    preload=True,
)

# Prepare data for training
x = epochs.get_data()
y = target_label[0, :]

# ten-fold cross-validation
cv = ShuffleSplit(10, test_size=test_r, random_state=42)

# Classification with LDA on CSP features
lda = LinearDiscriminantAnalysis()
csp = CSP(n_components=10, reg=None, log=True, norm_trace=False)
clf = Pipeline([("CSP", csp), ("LDA", lda)])

from sklearn.metrics import accuracy_score

train_x, test_x = x[:224], x[224:]
train_y, test_y = y[:224], y[224:]

clf.fit(train_x,train_y)

pred1 = clf.predict(train_x)
accuracy1 = accuracy_score(train_y,pred1)
print('在训练集上的精确度: %.4f'%accuracy1)

pred2 = clf.predict(test_x)
accuracy2 = accuracy_score(test_y,pred2)
print('在测试集上的精确度: %.4f'%accuracy2)
# 模型比较
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier

lda = LinearDiscriminantAnalysis()
csp = CSP(n_components=10, reg=None, log=True, norm_trace=False)
clf_lda = Pipeline([("CSP", csp), ("LDA", lda)])
scores_lda = cross_val_score(clf_lda, x, y, cv=cv, n_jobs=None)

lr = LogisticRegression()
csp = CSP(n_components=10, reg=None, log=True, norm_trace=False)
clf_lr = Pipeline([("CSP", csp), ("LR", lr)])
scores_lr = cross_val_score(clf_lr, x, y, cv=cv, n_jobs=None)

rfc = RandomForestClassifier()
csp = CSP(n_components=10, reg=None, log=True, norm_trace=False)
clf_rfc = Pipeline([("CSP", csp), ("RFC", rfc)])
scores_rfc = cross_val_score(clf_rfc, x, y, cv=cv, n_jobs=None)
print(scores_lda, scores_lr, 'scores_svc', scores_rfc)
# Without CSP
lda = LinearDiscriminantAnalysis()
scores_lda_only = cross_val_score(lda, x.reshape(-1,118*301), y, cv=cv, n_jobs=None)
print(scores_lda_only)

plt.plot(scores_lda,'-o',linewidth=2)
plt.plot(scores_lda_only,'-d',linewidth=2)
plt.xlabel('Folds',fontsize=16)
plt.ylabel('Accuracy',fontsize=16)
plt.legend(['CSP+LDA','LDA'],fontsize=16)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.ylim([0,1.1])
plt.show()


  1. https://bbci.de/competition/iii/desc_IVa.html ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法竞赛——数论(一),数论内容的介绍,基础数论

文章目录 一, 数论学习路线的介绍和相关建议1,建议学习人群 :2,建议学习时长3,学习路线的介绍1,基础数论2,组合数学3,计算几何 二,基础数论第一部分 —— 快速幂和快速幂…

2023年十大最佳 iPhone 恢复软件

您的 iPhone 存储了大量有价值的数据,包括照片和视频。但是,即使使用高度安全的 Apple 设备,数据丢失也可能随时发生。从众多可用工具中选择最适合 iPhone 的数据恢复软件可能是一项艰巨的任务。因此,我们测试了性能并审查了 2023…

使用Hypothesis生成测试数据

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

[vue-router]vue3.x Hash路由前缀问题

[vue-router]vue3.x Hash路由前缀问题 问题描述问题分析 问题描述 是在本地开发时,使用的HASH路由,然后在偶然的情况下在/#/前添加了前缀,发现不影响本地的路由的使用???!!&#xf…

rviz中引入SW的模型

一、SW装配图转urdf 参考链接:https://blog.csdn.net/weixin_45168199/article/details/105755388 这部分直接看参考链接就可以,主要思路如下 1、把sw中的零散零件按照机器人中连杆的分类整合成几个大零件 2、把几个大零件整合成装配体,并…

如何在Jetpack Compose中显示PDF?

当读取和显示 PDF 的组件缺失时该怎么办? 声明式编程可以拯救你. Jetpack Compose已经存在好几年了, 但_在某些方面它的使用仍然面临挑战_. 例如, 缺少用于查看PDF的官方组件, 而为数不多的第三方库通常也是有代价的. 在我们的应用中, 我们会遇到在许多场景中显示 PDF 的需求…

跨境电商源码独立开发:一次购买,终生使用

随着全球电子商务的快速发展,越来越多的企业开始涉足跨境电商领域。为了在这个竞争激烈的市场中脱颖而出,您需要一个专业的跨境电商解决方案。我们的团队为您提供最优质的源码独立开发服务,让您拥有一个功能强大、安全稳定的跨境电商平台。 一…

腾讯觅影数智医疗影像平台获颁世界互联网领先科技成果大奖

11月8日,2023年世界互联网大会乌镇峰会在乌镇举行,腾讯再度获颁“世界互联网领先科技成果”大奖。腾讯健康总裁吴文达在世界互联网领先科技成果发布活动中介绍,“腾讯觅影数智医疗影像平台”已全面开放20多个医疗AI引擎助力科研创新&#xff…

2007-2022年全国各地级市金融机构网点数据

2007-2022年地级市金融机构网点数据 1、时间:2007-2022年 2、指标:行政区划代码、年份、城市名称、所属省份、银行网点数量、其中-政策性银行及国家开发银行营业网点占比、其中-商业银行营业网点数量占比、其中-农村金融机构营业网点数量占比 3、范围…

P3379 【模板】最近公共祖先(LCA)

洛谷里面8页题解千篇一律,就没有用线段树求解的,这下不得不由本蒟蒻来生啃又臭又硬,代码又多的线段树了。 样例的欧拉序列:4 2 4 1 3 1 5 1 4 记录每个节点最早在欧拉序列中的时间,任意两个节点的LCA就是他们两个节点…

Python 实现动态动画心形图

在抖音上刷到其他人用 matlab 实现的一个动态心形图,就想也用 Python 实现,摸索了两种实现方式,效果如下: 方法一: 利用循环,结合 pyplot 的 pause 与 clf 参数实现图像的动态刷新 import matplotlib.p…

MATLAB绘图中文显示为方框

MATLAB绘图中文显示为方框 MATLAB显示英文和字母没有问题,但是当显示中文时会显示乱码,中文显示为方框,如下图: 可以在绘图命令中添加如下代码: set(gca,Fontname,Monospaced); 例如: % 滤波器系数%低通…

Kafka入门

kafka无疑是当今互联网公司使用最广泛的分布式实时消息流系统,它的高吞吐量,高可靠等特点为并发下的大批量实时请求处理提供了可靠保障。很多同学在项目中都用到过kafka,但是对kafka的设计原理以及处理机制并不是十分清楚。为了知其然知其所以…

vue项目代码防止被调试-打开控制台直接跳空白页面

vue项目代码防止被调试-打开控制台直接跳空白页面 前端代码上线后,代码会暴露,或者接口暴露,会被有心之人研究代码逻辑,找到项目bug漏洞! 项目背景 被安全测试针对了,总是调试我这不太安全的代码。前端代码…

用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识

写这个博客的目的就是我在网上看了半天,发现没有这方面的知识,也许是老手认为这个太简单了,不过我还是告诉新人使用dbeaver来创建一个enum类型的方法: 就是enum("a","b","name") 第一步用dbeaver…

搜索引擎Elasticsearch基础与实践

倒排索引 将文档中的内容分词,然后形成词条。记录每条词条与数据的唯一表示如id的对应关系,形成的产物就是倒排索引,如下图: ElasticSearch数据的存储和搜索原理 这里的索引库相当于mysql中的database。一个文档(do…

大语言模型(LLM)综述(七):大语言模型设计应用与未来方向

A Survey of Large Language Models 前言8 A PRACTICAL GUIDEBOOK OF PROMPT DESIGN8.1 提示创建8.2 结果与分析 9 APPLICATIONS10 CONCLUSION AND FUTURE DIRECTIONS 前言 随着人工智能和机器学习领域的迅速发展,语言模型已经从简单的词袋模型(Bag-of-…

Mabitys总结

一、ORM ORM(Object/Relation Mapping),中文名称:对象/关系 映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。 使用JDBC技术时,手动实现ORM映射: 使用ORM时,自动关系映射: &am…

【JavaEE】HTTP协议(什么是HTTP?、HTTP格式、form表单和ajax构造HTTP)

一、什么是HTTP协议? 1.1 HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议 1.2 理解HTTP协议的工作过程 当我们在浏览器中输入一个 “网址”, 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就…

FMCW雷达论文速览 | TRS 2023, 基于FMCW雷达的多天线高精度测距算法及性能分析

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 TRS 2023 | High Accuracy Multi-antenna Ranging Algorithm and Performance Analysis for FMCW Radar 论文原文:https://ieeexplore.ieee.org/document/10309162 Z. Xu, S. Qi and P. Zh…