信号处理--基于FBCSP滤波方法的运动想象分类

news2024/11/17 11:44:39

目录

理论

工具

方法

代码获取


理论

通用空间模式 (CSP) 算法可以用来有效构建最佳空间滤波器区分,然后实现运动想象的数据中的脑电信号的区分。然而,空间滤波器性能的好坏主要取决于其工作频带。如果脑电信号没有经过滤波或者滤波的频带范围不合适,都会导致经过CSP空间滤波器提取的特征,在后续分类任务中,有一个比较差的表现。因此,在使用CSP算法时候,我们常常需要选择一个比较大的信号频带或者是根据被试挑选一个比较好的频带的频带范围。这个导致了阻碍了CSP方法的广泛应用。为了解决这样的问题,滤波器组CSP分类算法被提出来。

滤波器组 filter-bank CSP 分类算法 (FBCSP), 实现共分为4步:

将脑电信号划分为若干个频带的子信号;
分别提取不同频带的信号的CSP特征;
使用特征筛选算法,得到相对优化的频带CSP特征组;
使用分类模型实现脑电信号的分类。


工具

python 3.8

BCI dataset IV-1 数据集

方法

定义滤波器组,实现信号的频带分解

#acquire and combine features of different fequency bands
features_train=[]
features_test=[]
freq=[8,12,16,20,24,28,32]
for freq_count in range(len(freq)):
#loop for freqency
    lower=freq[freq_count]
    if lower==freq[-1]:
        break
    higher=freq[freq_count+1]
    X_train_filt=butter_bandpass_filter(X_train,lowcut=lower,highcut=higher,fs=128,order=8)
    X_test_filt=butter_bandpass_filter(X_test,lowcut=lower,highcut=higher,fs=128,order=8)
    tmp_train=csp.fit_transform(X_train_filt,y_train)
    tmp_test=csp.transform(X_test_filt)
    if freq_count==0:
        features_train=tmp_train
        features_test=tmp_test
    else:
        features_train=np.concatenate((features_train,tmp_train),axis=1)
        features_test=np.concatenate((features_test,tmp_test),axis=1)

 使用MIBIF算法实现提取的特征的选择

select_K=sklearn.feature_selection.SelectKBest(mutual_info_classif,k=10).fit(features_train,y_train)
New_train=select_K.transform(features_train)
#np.random.shuffle(New_train)
New_test=select_K.transform(features_test)
#np.random.shuffle(New_test)
print(New_train.shape)
print(New_test.shape)
ss = preprocessing.StandardScaler()
X_select_train = ss.fit_transform(New_train,y_train)
X_select_test = ss.fit_transform(New_test)

 使用支持向量机实现最后的分类和测试

#calssify
from sklearn.svm import SVC
clf=svm.SVC(C=0.8,kernel='rbf')
clf.fit(X_select_train,y_train)
y_pred=clf.predict(X_select_test)
print(y_test)
print(y_pred)
acc=accuracy_score(y_test,y_pred)
print(acc)

使用不同的特征提取算法和分类器在同一个数据集上面的性能比较结果:

在5个不同被试上面采用不同的CSP及变体方法的结果比较:

代码获取

信号处理-基于FBCSP滤波方法的运动想象分类 python代码icon-default.png?t=N7T8https://download.csdn.net/download/YINTENAXIONGNAIER/89021756

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

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

相关文章

贝尔曼最优方程【BOE】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程,个人觉得赵老师的课件深入浅出,很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 文章目录 强化学习笔记一、最优策略二、贝尔曼最优方程(BOE)三…

边缘计算【智能+安全检测】系列教程-- Jeton Agx Orin 基础环境搭建

1 .前期准备 Jetson Agx Orin 比Jetson Agx Orin Xavier的算力要高,性能要好通常用来做自动驾驶的AI推理,具体外观如下图 1.刷机软件sdkmanager:下载链接 NVIDIA账号需要注册,正常一步一步往下走就行。在ubuntu18以上的系统安…

每日一题 --- 两两交换链表中的节点[力扣][Go]

两两交换链表中的节点 题目:24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1&a…

图解Kafka架构学习笔记(三)

准备Kafka环境 这里推荐使用Docker Compose快速搭建一套本地开发环境。 以下docker-compose.yml文件用来搭建一套单节点zookeeper和单节点kafka环境,并且在8080端口提供kafka-ui管理界面。 version: 2.1services:zoo1:image: confluentinc/cp-zookeeper:7.3.2hos…

ARMday7作业

实现三个按键的中断,现象和代码 do_ipr.c #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取要处理的中断的中断号unsigned int irqnoGI…

抽取CLOB字段中XML的特定元素的VALUE值

在ORACLE数据库中,有时XML文件会被保存在CLOB字段中。 这时候,若是我们要获取此字段XML中特定元素的VALUE值,就需要用到xmltype 这个函数。 如下面的 XML文件,保存在 TABLE_A 的CLOB_K 字段,若是我们要获取其中的 Y…

Windows11 安装VitrulBox Ubuntu20 虚拟机启动后卡在“Freeing initrd memory: 131304K”

步骤:点击启动Ubuntu后,一直起不来?没办法正常关机,选择重启又一直卡在这里,原来是同样的错误 Freeing initrd memory: 131304K 原因:本机联想小新14Pro,AMD 7840HS,锐龙版。而Ryze…

OpenCV4.9.0开源计算机视觉库核心功能(核心模块)

转到:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 介绍使用 下一篇:如何使用OpenCV扫描图像、查找表和时间测量 ​ OpenCV核心功能主要有以下各个:本文将开始介绍下列内容: Mat - 基…

深度学习pytorch——可视化visdom(持续更新)

安装可看:e: Error while finding module specification for ‘visdom.server‘ (ModuleNotFoundError: No module name-CSDN博客 在命令行窗口使用python -m visdom.server,会出现一个web地址,在浏览器中访问,即可看见在python中…

nvm更换node.js的版本

自行下载nvm 打开cmd 1. nvm ls 列出目前已经下载的node版本,和正在使用的node版本 2. nvm install v版本号 下载某个版本 3. nvm uninstall v版本号 卸载某个版本 4. nvm use 版本号 切换到某个版本

树状数组原理和代码

树状数组 求下标的对应 求i管着的下标的范围 方法:拆掉最右侧的1然后1 到你自己 query sum 1-i的和 拆掉最右侧的1 再把下一个数值吸收到sum 重复这个过程直到全变0为止 add 方法:加上最右侧的1 到上限为止 lowbit方法 单点增加范围查询模板 #inc…

[leetcode] 240. 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,…

从抛硬币试验看概率论的基本内容及统计方法

一般说到概率,就喜欢拿抛硬币做例子。大多数时候,会简单认为硬币正背面的概率各为二分之一,其实事情远没有这么简单。这篇文章会以抛硬币试验为例子并贯穿全文,引出一系列概率论和数理统计的基本内容。这篇文章会涉及的有古典概型…

Java实现JDBC编程

1 数据库编程的必备条件 编程语言,如Java,C、C、Python等 数据库,如Oracle,MySQL,SQL Server等 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如&#x…

【Linux】对进程地址空间的理解

一、关于进程地址空间的简单理解 进程地址空间其实是分了很多个区域的,区域划分的本质就是区域内的各个地址都是可以使用的。如同下面这个图所示: 无论是环境变量的地址还是环境变量表的地址,所存放的地址都在栈的上部。这里的已初始化数据和…

java多线程编程面试题总结

一些最基本的基础知识就不总结了,参考之前写的如下几篇博客,阅读顺序从上到下,依次递进。 java 多线程 多线程概述及其三种创建方式 线程的常用方法 java 线程安全问题 三种线程同步方案 线程通信(了解) java 线程池…

JavaEE企业级分布式高级架构师课程

教程介绍 本课程主要面向1-5年及以上工作经验的Java工程师,大纲由IT界知名大牛 — 廖雪峰老师亲自打造,由来自一线大型互联网公司架构师、技术总监授课,内容涵盖深入spring5设计模式/高级web MVC开发/高级数据库设计与开发/高级响应式web开发…

arm作业3

key_inc.c #include"key_inc.h"void key1_it_config(){//使能GPIOF外设时钟RCC->MP_AHB4ENSETR | (0x1<<5);//将PF9设置为输入模式GPIOF->MODER & (~(0x3<<18));//设置由PF9管脚产生EXTI9事件EXTI->EXTICR3 & (~(0XFF<<8));EXTI-…

微服务(基础篇-002-Ribbon)

目录 Ribbon负载均衡&#xff08;1&#xff09; 负载均衡的原理&#xff08;1.1&#xff09; 负载均衡策略&#xff08;1.2&#xff09; Ribbon-IRule(1.2.1) 修改负载均衡的方法&#xff08;1.2.2&#xff09; 懒加载&#xff08;1.3&#xff09; 饥饿加载&#xff08;1…

【Linux】模拟实现shell(bash)

目录 常见的与shell互动场景 实现代码 全部代码 homepath()接口 const char *getUsername()接口 const char *getHostname()接口 const char *getCwd()接口 int getUserCommand(char *command, int num)接口 void commandSplit(char *in, char *out[])接口 int execut…