草庐IT

脑电信号分类问题的数据预处理方法

拉姆哥的小屋 2023-04-11 原文

脑电波介绍

脑电波(Electroencephalogram, EEG)是应用电生理指标来记录大脑活动的方法。大脑在活动时,神经元同步发生突触后电位反应在了头皮表面,研究者将电机放置在被试者的头皮上检测脑电波信号。电机位置大概如下:

实际而言,收集到的数据就是多个通道的时间序列数据:

之前有幸参加了学院路内的一个脑电实验,签了保密协议就不谈实验内容了。抛开内容不谈,这次实验让我觉得虽然脑电的理论基础很好,但是实际上执行的可能并不是很理想。电极位置、实验流程等都可能影响数据的质量。

信号预处理

在进行模型构建前,主要有三个步骤:信号预处理、数据增强和特征提取

1

伪影处理

脑电信号会受到眼部伪影和肌电信号的影响。眼部伪影(EOG)是在受试者眼球或眼皮改变眼向或眨眼时,在EEG信号中产生的扰动。肌电信号(EMG)则是由吞咽或咬合时引起的,分布范围为0-200Hz。

对于伪影的处理,约四分之一的研究者忽视了伪影,四分之一手工进行去除。其余进行去除伪影的算法最主要的为ICA与DWT,还有其他的一些名字特别长的算法。

独立成分分析 

ICA(Independent Component Analysis)

数据有可能是多个独立分量的组合时(盲源分离),应用ICA可以将其提取出来。声音数据是线性叠加的,电信号数据我简单搜了一下没有搜到,之后再补充吧。

ICA之前往往对数据进行PCA和白化处理,以提取源信号中的信息。例如图中是PCA提取特征后的声音信号,这些信号都由三种简单的波形组成。

ICA算法进行多步迭代寻优,将信号解混为以下三种波形:

离散小波变换 

DWT(Discrete Wavelet Transformation)

小波也就是wavelet是一种均值为零,快速衰减的波浪状震荡,存在时间有限:

离散小波变换主要用于信号的去噪,主要流程如下:

在这个变换中,可以捕获几个幅值较大的DWT系数的重要信号,信号中的噪声则会生成较小的DWT系数。DWT有助于分析不同分辨率下逐渐变窄的子带上的信号,以及帮助去噪和压缩信号。

2

滤波处理

在一篇综述中收集的文献中,各类问题滤波处理方法如下,大部分都使用了带通滤波,取1-40hz的信号

数据增强

有很多研究将眨眼、肌肉活动和高斯噪声加入到了原数据集中,以生成新的样本。高斯噪声是概率密度函数服从高斯分布(即正态分布)的一类噪声。如果它的功率谱密度又是均匀分布的,则称为高斯白噪声。

同时也有将高斯噪声添加到输入的特征向量中,而非原始的数据中的增强方法。

重叠窗口以增加数据。对于分类问题一般我们都在一段脑电序列的信号中依次截取几秒作为窗口,然后对于每个窗口进行分类。那么如果将窗口重叠截取,就会有更多的样本了。

交换左右侧电极数据,使样本翻倍。这个方法对于大脑对称的活动来说有效,但是可能泛用性不是很高的样子。

将预处理时下采样丢弃的数据作为新样本。这个思路我没有太理解,生成的样本不会与原样本差距过大吗,可能需要仔细读一下文献再说。

以及应用cDCGAN生成人工脑电图信号。就是在GAN的基础上在生成模型的随机噪声处合并一个标签,以作为条件约束生成特定标签的模型。

生成原始EEG数据的傅里叶变换替代物。将EEG数据进行傅里叶变换为频域数据后,直接生成频域的数据而不是原始的数据。

特征提取

之后就是输入进深度学习模型的特征的问题了,综述中共分为三个大类,计算特征、图像特征、以及信号值

1

计算特征

最多的计算特征是PSD(Power Spectral Density),也即功率谱密度。其定义了信号或者时间序列的功率如何随频率分布。

其次的是wavelet decomposition,指的可能是DWT等小波变换等操作。

之后占比较多的是statistical measures,包括信号的平均值和标准差等。

2

图像特征

在一些CNN架构的网络中,会用到eeg生成的频谱图作为输入。

以及Fourier feature maps 

以及堆叠信号生成的2D、3D结构

3

信号值

信号值大多数是raw,也就是直接输入不经处理的信号。不过aaai的一篇文章(2021)中提到,目前来说CNN、RNN和attention机制之类的很难提取出EEG中的隐藏信息。所以根据道听途说来的消息,raw数据直接输入的可靠性还有待商榷。

Averaged方法综述中没有提到,推断应该是指signal averaging,将多个相同类别的片段求平均并输入。

CVT指Complex Value Transformation,应该是某篇文章中作者拍脑袋想出来的算法。

结语

之前写稿的时候姜学姐问我是不是在写专设的内容,我一想这个确实值得一写。

树莓派这个板子可以写python和c,能实现很多复杂的功能,在我们这届的专设中用的很广泛。不过大多数人又不会写代码,又不会搞硬件,只能在组里当个挂件并度过相对失败的专业设计课程。于是我准备之后科普一下从零开始使用树莓派,以防学弟学妹们以后像我的队友一样一边摆烂一边说我干的不够多。专设真是令人愉悦的小组合作呢 : )

有关脑电信号分类问题的数据预处理方法的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  6. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  7. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  8. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  9. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  10. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

随机推荐