Python-For-EEG基础代码讲解(1)

这篇具有很好参考价值的文章主要介绍了Python-For-EEG基础代码讲解(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python-For-EEG

我要演示脑电图信号的基本分析。

主题

1、基于时域分析,P300信号数据集

  1. Event-related potentials and 1-dimensional convolution(ERP,CNN)
  2. Long short-term memory(LSTM)

2、基于频域分析,DEAP和SSVEP数据集

  1. Spectral analysis and alpha asymmetry
  2. Canonical correlation analysis(CCA)

3、基于成分分析,运动想象数据集

  1. Event-related desynchronization(ERD)

数据集

所有数据集准备好

1. P300数据集
这是我个人的P300信号,我通过我的OpenBCI耳机在视觉上关注36个字母顺序的目标时获得的。当闪光灯在我所看的目标上闪烁时,在刺激开始后300ms会有一个信号上升。在数据集中,列是时间戳(128 samples per second), 16 channels of ‘Fp1’, ‘Fp2’, ‘F7’, ‘F3’, ‘F4’, ‘F8’, ‘C3’, ‘Cz’, ‘C4’, ‘T5’, ‘P3’, ‘P4’, ‘T6’, ‘POz’, ‘O1’, ‘O2’, 标记表示事件。标记格式将在笔记本中详细说明。

文件:p300-6trials-12rep-chaky.csv

2、DEAP和SSVEP数据集
ssvep数据集

在这里,我们记录了用户分别观看以6,10和15Hz闪烁的三个不同的圆圈。我们将使用滤波器组典型相关分析对信号进行分类。
文件:ssvep-10trials-3s-chaky-bigsquare.csv

DEAP 数据集

它基本上是一个数据集,关于参与者观看一些1分钟的情感视频,同时佩戴32个EEG通道。欲了解更多详情,请访问https://www.eecs.qmul.ac.uk/mmv/datasets/deap/

经过处理python版本DEAP数据
Python-For-EEG基础代码讲解(1)

3、运动想象数据集

在这里,我们记录一个用户做想象中的左右运动。我们将探索与事件相关的去同步以解码类。
Python-For-EEG基础代码讲解(1)

这里我们将演示处理脑电图信号的基本过程。为了简单起见,我们将处理一个相当简单的P300数据集。

我们还将访问事件相关电位和长短期记忆来解码信号。
注意:我们假设你对神经网络非常熟悉,所以我们将主要使用它,而不会有太多杂乱的解释。

导入基础包

import mne
from mne import create_info
from mne.io import RawArray

import numpy as np
import pandas as pd
import torch
import torch.nn as nn
from torch.utils.data import TensorDataset, WeightedRandomSampler

cuda加速

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(device)

加载数据

df = pd.read_csv("../data/p300-6trials-12rep-chaky.csv")
df.head()
#we don't need timestamps for modeling
df = df.drop(["timestamps"], axis=1)
df.columns = ['P4', 'Pz', 'P3', 'PO4', 'POz', 'PO3', 'O2', 'O1', 'Marker']   #channels named according to how we plug our eeg device
df.head()

让我们看看这个标记是如何生成的。格式如下:

  • 0:不发生任何事情
    — 1:表示非目标闪烁
  • 2:闪光到目标
print(df['Marker'].unique())

基础背景

如果你对数据不了解,首先,你需要了解脑电图实验。

在类似脑电图的实验中,你通常有一个会话(session)。(a record)

您通常拥有的数据以(通道,样本)(channels, samples)的形式存在。

例如,如果你用16个通道记录脑电图,采样率为128赫兹,5秒长,那么你最终会得到一个(16,128 x 5)的会话,因为1秒将有128个样本,即根据定义。

我们记录的一个附加通道是“marker”。

“marker”是一种记录中的映射器,用于以后识别某些事情发生的时间。

具有3个EEG通道+标记的数据可能看起来像这样

[
 .
 .
 .
 [eeg_1, eeg_2, eeg_3, 0],
 [eeg_1, eeg_2, eeg_3, 0],
 [eeg_1, eeg_2, eeg_3, 0],
 [eeg_1, eeg_2, eeg_3, 1], <----- Some event1, like flashes or images happen here:
 [eeg_1, eeg_2, eeg_3, 0],
 [eeg_1, eeg_2, eeg_3, 0],
 [eeg_1, eeg_2, eeg_3, 0],
 [eeg_1, eeg_2, eeg_3, 0],
 [eeg_1, eeg_2, eeg_3, 0],
 [eeg_1, eeg_2, eeg_3, 2], <----- Some event2 again but another target happen here:
 [eeg_1, eeg_2, eeg_3, 0],
 [eeg_1, eeg_2, eeg_3, 0],
 [eeg_1, eeg_2, eeg_3, 0],
 .
 .
 .
]

因此,我们感兴趣的是在事件显示一段时间后(可能在event1显示后3秒)检索所有样本,这个过程称为“epoching”。

数据转换为原始MNE对象

First we gonna use Python MNE as it provides many useful methods for achieving these tasks. So first, we gonna transform our pandas to mne type. Here is the function transforming df to raw mne.
首先,我们将使用Python MNE库,因为它为实现这些任务提供了许多有用的方法。首先,我们要把 pandas类型 数据 转换成 mne 类型。这是将df转换成raw的函数。

raw = df_to_raw(df)

Python-For-EEG基础代码讲解(1)

以下是一些关于我的数据结构的简短总结:
https://mne.tools/stable/most_used_classes.html

  1. MNE.io.Raw
  • MNE.io.Raw 是你的整个session。在这个类中,您可以为整个session执行预处理,如’ filter '。
  1. MNE.Epochs
  • epoch是一个将整个session分割为较小窗口的方法。你可以按你喜欢的方式来epoching你的session。最常见的epoch是遵循marker/event通道

3.MNE.Evoked

  • Evoked是你从每个epochs得到的数据。你可以把epochs想象成 一系列的Evoked。

伪影移除

伪影是需要消除的噪音。频率受限伪影的两个例子是缓慢漂移和电源线噪声。下面我们将说明如何通过过滤来修复这些缺陷。

def df_to_raw(df):
    sfreq = 125  #our OpenBCI headset sampling rate
    ch_names = list(df.columns)
    ch_types = ['eeg'] * (len(df.columns) - 1) + ['stim']
    ten_twenty_montage = mne.channels.make_standard_montage('standard_1020')

    df = df.T  #mne looks at the tranpose() format
    df[:-1] *= 1e-6  #convert from uVolts to Volts (mne assumes Volts data)

    info = create_info(ch_names=ch_names, ch_types=ch_types, sfreq=sfreq)

    raw = mne.io.RawArray(df, info)
    raw.set_montage(ten_twenty_montage)

    #try plotting the raw data of its power spectral density
    raw.compute_psd().plot()

    return raw

电源噪声

电源噪声是由电网产生的噪声。它由50Hz(或60Hz,取决于你的地理位置)的尖峰组成。一些峰值也可能出现在谐波频率,即电力线频率的整数倍,例如100Hz, 150Hz,…(或120Hz, 180Hz,…)。

去除220V交流电50Hz电源噪声。我们还将去除它的谐波,即100Hz, 150Hz等。由于我们的信号是62.5Hz(根据奈奎斯特定理是125Hz / 2),我们不需要运行谐波,而只需截取50Hz信号。

raw.notch_filter(50) #250/2 based on Nyquist Theorem

设置从49 - 51赫兹的带阻滤波器

FIR滤波器参数

设计一种单通、零相位、无因果带阻滤波器
-有窗时域设计(firwin)方法
-汉明窗口0.0194通带纹波和53 dB阻带衰减
—下带边缘:49.38
-低转换带宽:0.50 Hz (- 6db截止频率:49.12 Hz)
—上通带边缘:50.62 Hz
—上转换带宽:0.50 Hz (- 6db截止频率:50.88 Hz)
-过滤器长度:825个样本(6.600秒)

#可以看到50Hz噪声被移除了, yay!
raw.compute_psd().plot()

Python-For-EEG基础代码讲解(1)

漂移移除

低频漂移通常在1Hz以下。此外,由于P300,可以安全地假设没有有用的数据超过40Hz。

raw.filter(1, 40)
raw.compute_psd().plot();

过滤1个连续段的原始数据
设置从1 - 40赫兹的带通滤波器

FIR滤波器参数

设计一种单通、零相位、非因果带通滤波器
-有窗时域设计(firwin)方法
-汉明窗口0.0194通带纹波和53 dB阻带衰减
—下通带边缘:1.00
-低转换带宽:1.00 Hz (- 6db截止频率:0.50 Hz)
—上通带边缘:40.00 Hz
—转换带宽上限:10.00 Hz (- 6db截止频率:45.00 Hz)
-过滤器长度:413个样本(3.304秒)

Epoching

epoch是在事件发生时只提取相关脑电数据的过程。在这里,我们将在事件开始前-0.1秒提取到事件开始后0.6秒。这里我们选择0.6秒,因为我们知道P300发生在300毫秒左右,所以它是一个很好的中间值。

from mne import Epochs, find_events

def getEpochs(raw, event_id, tmin, tmax, picks):

    #epoching
    events = find_events(raw)
    epochs = Epochs(raw, events=events, event_id=event_id, 
                    tmin=tmin, tmax=tmax, baseline=None, preload=True,verbose=False, picks=picks)  #8 channels
    print('sample drop %: ', (1 - len(epochs.events)/len(events)) * 100)

    return epochs
    
#this one requires expertise to specify the right tmin, tmax
event_id = {'Non-Target': 1, 'Target' : 2}
tmin = -0.1
tmax = 0.6
eeg_channels = mne.pick_types(raw.info, eeg=True)
picks= eeg_channels
epochs = getEpochs(raw, event_id, tmin, tmax, picks)   
    

今天先到这,下一集继续讲!好的话给个赞,所有资料在这里
https://download.csdn.net/download/fzf1996/87860291文章来源地址https://www.toymoban.com/news/detail-470696.html

到了这里,关于Python-For-EEG基础代码讲解(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java基础阶段项目 ---- 拼图游戏(含讲解以及源代码)

    此项目为java基础的阶段项目,此项目涉及了基础语法,面向对象等知识,具体像语法基础如判断,循环,数组,字符串,集合等…; 面向对象如封装,继承,多态,抽象类,接口,内部类等等…都有涉及。此项目涉及的内容比较多,作为初学者可以很好的将前面的知识串起来。此项目拿来练手以

    2024年02月09日
    浏览(33)
  • Python基础(20)——Python函数讲解二

    变量作用域 多函数程序执行流程 函数的返回值 函数的参数 拆包和交换两个变量的值 引用 可变和不可变类型 变量作用域指的是变量生效的范围,主要分为两类: 局部变量 和 全局变量 。 局部变量 所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效。 变量a是

    2024年02月09日
    浏览(29)
  • 一朵玫瑰花的python代码,python玫瑰花代码讲解

    大家好,本文将围绕用python画玫瑰花代码 祝福生日快乐展开说明,一朵玫瑰花的python代码是一个很多人都想弄明白的事情,想搞清楚python绘制玫瑰花代码需要先了解以下几个事情。 一朵玫瑰花的python代码 download 运行结果: 需要提前安装windrose模块 from windrose import Windrose

    2024年02月09日
    浏览(29)
  • Python实现贪吃蛇【含代码和讲解】

    Python实现贪吃蛇:打造属于自己的经典游戏 在程序开发中,一些简单有趣的小游戏是最受欢迎的。其中,贪吃蛇游戏是一款经典且受欢迎的小游戏,许多人喜欢玩这个游戏。Python 语言可以帮助我们轻松实现贪吃蛇游戏,本文将介绍如何使用 Python 语言实现这个小游戏。 首先

    2024年02月16日
    浏览(28)
  • python爬取网站数据(含代码和讲解)

    提示:本次爬取是利用xpath进行,按文章的顺序走就OK的; 文章目录 前言 一、数据采集的准备 1.观察url规律 2.设定爬取位置和路径(xpath) 二、数据采集 1. 建立存放数据的dataframe 2. 开始爬取 3. 把数据导出成csv表格 总结 这次爬取的网站是房天下网站; 其中包含很多楼盘信息

    2024年01月20日
    浏览(34)
  • 【JaveWeb教程】(26) Mybatis基础操作(新增、修改、查询、删除) 详细代码示例讲解(最全面)

    学习完mybatis入门后,我们继续学习mybatis基础操作。 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除

    2024年01月17日
    浏览(30)
  • python实现俄罗斯方块【含代码和讲解】

    Python实现俄罗斯方块:打造经典游戏的代码实现教程 俄罗斯方块是世界上最受欢迎的电子游戏之一,源自俄罗斯。这是一个简单却富有挑战和乐趣的游戏,让玩家必须思考如何将各种形状的积木放入底部的平面上,以便完整地填满一行或多行,每填满一行就会消失并获得分数

    2024年02月11日
    浏览(39)
  • 4.Python从入门到精通—Python 基础语法详细讲解-下

    Python中的输入输出和文件操作是编程中非常常见和重要的部分。下面我会详细讲解Python中的输入输出和文件操作。 Python中的输入输出通常使用input()和print()函数。 输入 input()函数用于从控制台获取用户输入的数据。它的基本用法如下: 其中,prompt是可选的字符串参数,用于向

    2024年03月16日
    浏览(37)
  • 【爬虫】python爬虫爬取网站页面(基础讲解)

    👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化【获取源码+商业合作】 👉荣__誉👈:阿里云博客专家博主、51CTO技术博主 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 1. 导入必要的库 requests 库用于发送HTTP请

    2024年02月08日
    浏览(30)
  • 【python基础】循环语句-for循环

    for循环可以遍历任何可迭代对象,如一个列表或者一个字符串。这里可迭代对象的概念我们后期介绍,先知道这个名词就好了。 其语法格式之一: 比如我们遍历学员名单,编写程序如下所示: for循环如果放在生产生活中的话,也类似于循环处理,但较while循环有区别,其区

    2024年02月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包