信号空间投影(SSP)

在前面一篇分享(脑电分析系列[MNE-Python-10]| 信号空间投影SSP数学原理)中提到,投影矩阵将根据您试图投射出的噪声种类而变化。信号空间投影(SSP)是一种通过比较有无感兴趣信号的测量值来估算投影矩阵应该是什么的方法。例如,您可以进行其他“空房间”测量,以记录没有对象存在时传感器上的活动。通过查看空房间测量中各MEG传感器的活动空间模式,可以创建一个或多个N维向量,以给出传感器空间中环境噪声的“方向”(类似于上面示例中“触发器的影响”的向量)。SSP通常也用于消除心跳和眼睛运动伪影,在用于消除心跳和眼睛运动伪影的案例中,就不是通过空房间录制,而是通过检测伪影,提取伪影周围的时间段(epochs)并求平均值来估计噪声的方向。有关示例,请参见使用SSP修复工件。

一旦知道了噪声向量,就可以创建一个与其正交的超平面,并构造一个投影矩阵,将实验记录投影到该超平面上。这样,测量中与环境噪声相关的部分就可以被移除。同样,应该清楚的是,投影降低了数据的维数-你仍然会有相同数量的传感器信号,但它们不会都是线性独立的-但通常有数十或数百个传感器,而你要消除的噪声子空间只有3-5维,因此自由度的损失通常是没有问题的。

MNE Python中的投影(projector)

在示例数据中,已经使用空房间记录执行了SSP,但是投影与原始数据一起存储,并且尚未应用(或者说,投影尚未激活)。

在这里,我将加载示例数据并将其裁剪为60秒;

可以在以下read_raw_fif()的输出中看到投影:

1.导入工具库

import os
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  # noqa
from scipy.linalg import svd
import mne

2.加载数据

sample_data_folder = mne.datasets.sample.data_path()
sample_data_raw_file = os.path.join(sample_data_folder, 'MEG', 'sample','sample_audvis_raw.fif')
raw = mne.io.read_raw_fif(sample_data_raw_file)
raw.crop(tmax=60).load_data()

在MNE-Python中,环境噪声矢量是通过主成分分析(通常缩写为PCA)来计算的,这就是为什么SSP投影仪通常有“PCA-v1”这样的名称。(顺便说一句,由于执行主成分分析的过程在幕后使用了奇异值分解,因此在已发表的论文中也经常看到类似“投影仪是使用SVD计算的”这样的短语。)投影仪存储在raw.info的projs字段中:

在MNE-Python中,使用主成分分析(通常缩写为"PCA")来计算环境噪声向量,这就是SSP投影通常使用"PCA-v1"之类的名称的原因。

(顺便说一下,由于执行PCA的过程在后台使用了奇异值分解,所以在已发表的论文中经常会看到类似"使用SVD计算投影"之类的短语。)

投影(projector)存储在raw.info的projs字段中:

print(raw.info['projs'])

[<Projection  |  PCA-v1, active : False, n_channels : 102>,

<Projection  |  PCA-v2, active : False, n_channels : 102>,

<Projection  |  PCA-v3, active : False, n_channels : 102>]

raw.info['projs']是投影对象的普通Python列表,可以通过索引来访问各个投影。投影对象(Projection object)本身类似于Python dict,

因此可以使用其.keys()方法查看它包含哪些字段(通常不需要直接访问其属性,但如有必要,可以这样做):

first_projector = raw.info['projs'][0]
print(first_projector)
print(first_projector.keys())
<Projection  |  PCA-v1, active : False, n_channels : 102>
dict_keys(['kind', 'active', 'desc', 'data', 'explained_var'])

Raw,Epoch和Evoked对象都有一个布尔类型的 proj属性,该属性指示对象中是否存储有任何未应用/不活动的投影。换句话说,如果至少有一个投影并且所有投影都处于活动状态,则proj属性为True。此外,每个投影还具有一个布尔活动字段:

print(raw.proj)
print(first_projector['active'])
False
False

3.计算投影

在MNE Python中,SSP向量可以使用以下通用函数计算:

`mne.compute_proj_raw`;

`mne.compute_proj_epochs`;

`mne.compute_proj_evoked`。

这些函数所做的一般假设是,传递的数据包含要通过投影修复的工件的原始数据、时间段或平均值。

在实践中,这通常涉及空房间记录或平均ECG或EOG伪影的连续原始数据。

"""
通过比较使用和不使用投影的曲线图,可以看到投影仪对测量信号的影响。
默认情况下,`raw.plot()`将在绘图前在后台应用投影仪(不修改:class:`mne.io.Raw`对象);
可以通过如下所示的布尔``proj``参数来控制它,
也可以通过绘图窗口右下角的:kbd:`Proj`按钮访问投影界面,
以交互方式打开和关闭它们.
这里我们只看磁力计,还有一个文件开头的2秒样本。
"""
mags = raw.copy().crop(tmax=2).pick_types(meg='mag')
for proj in (False, True):fig = mags.plot(butterfly=True, proj=proj)fig.subplots_adjust(top=0.9)fig.suptitle('proj={}'.format(proj), size='xx-large', weight='bold')

如上图,未进行投影的数据proj=Flase的效果展示,点击"proj"红框弹出SSP projectors vectors可以发现都未选中激活;进行了投影的数据图为proj=True点击"proj"红框可以发现投影的信息。

4.加载和保存投影

SSP除了可以减少环境噪声外,还可以用于其他类型的信号清洗。可以发现在上一个图中的磁力计信号中有两个较大的偏移,这些偏移没有被空房间的投影消除,这是受试者心跳的伪影。SSP也可以用于移除这些工件。样本数据包括用于降低心跳噪声的投影,这些投影与原始数据保存在单独的文件中,可以使用mne.read_proj()函数加载该文件:

ecg_proj_file = os.path.join(sample_data_folder, 'MEG', 'sample','sample_audvis_ecg-proj.fif')
ecg_projs = mne.read_proj(ecg_proj_file)
print(ecg_projs)
Read a total of 6 projection items:ECG-planar-999--0.200-0.400-PCA-01 (1 x 203)  idleECG-planar-999--0.200-0.400-PCA-02 (1 x 203)  idleECG-axial-999--0.200-0.400-PCA-01 (1 x 102)  idleECG-axial-999--0.200-0.400-PCA-02 (1 x 102)  idleECG-eeg-999--0.200-0.400-PCA-01 (1 x 59)  idleECG-eeg-999--0.200-0.400-PCA-02 (1 x 59)  idle
[<Projection|ECG-planar-999--0.200-0.400-PCA-01,active: False,n_channels: 203>,
<Projection|ECG-planar-999--0.200-0.400-PCA-02,active:False, n_channels : 203>,
<Projection|ECG-axial-999--0.200-0.400-PCA-01, active:False, n_channels : 102>,
<Projection|ECG-axial-999--0.200-0.400-PCA-02, active : False, n_channels : 102>, <Projection|ECG-eeg-999--0.200-0.400-PCA-01, active : False, n_channels : 59>,
<Projection|ECG-eeg-999--0.200-0.400-PCA-02, active : False, n_channels : 59>]
"""
利用mne.write_proj()函数,可用于将投影数据以.fif格式保存到磁盘:MNE Python推荐使用以-proj.fif(或-proj.fif.gz)来保存投影数据
"""
mne.write_proj('heartbeat-proj.fif', ecg_projs)

5.添加和移除投影

上面,当我们打印从文件加载的ecg_projs列表时,它显示了两台用于梯度计的投影(前两台,标为"planar"),两台用于磁力计的投影(中两台,标为"axial"),两台用于EEG 传感器(最后两个,标记为"eeg")。我们可以使用add_proj()方法将它们添加到Raw对象:

raw.add_proj(ecg_projs)

要删除投影,可以利用del_proj()方法,它是根据raw.info['projs']列表中的索引删除投影。

如果想要用新的投影替换现有投影,可以使用raw.add_proj(ecg_projs,remove_existing = True)来实现。

想要了解心电图(ECG)投影仪如何影响测量的信号,我们可以再次对使用投影和不使用投影的数据进行绘图(注:plot()方法只能临时应用投影进行可视化,而不会永久更改基础数据)。我们将上面创建的mags变量(只有空房间SSP投影)与空房间和ECG投影仪的数据进行比较:

mags_ecg = raw.copy().crop(tmax=2).pick_types(meg='mag')
for data, title in zip([mags, mags_ecg], ['Without', 'With']):fig = data.plot(butterfly=True, proj=True)fig.subplots_adjust(top=0.9)fig.suptitle('{} ECG projector'.format(title), size='xx-large',weight='bold')

在without ECG projector中,meg数据中的ECG部分没有进行projector,而在with ECG projector中,meg数据中ECG部分进行了projector,结果要平滑一些。

参考

Uusitalo MA and Ilmoniemi RJ. (1997). Signal-space projection method for separating MEG or EEG into components. Med Biol Eng Comput 35(2), 135–140. doi:10.1007/BF02534144

不用于商业行为,转载请联系后台

若有侵权,请后台留言,管理员即时删侵!

更多阅读

脑疾病的“希望之光”,中国脑机接口技术将有新突破

MNE-Python详细安装与使用

MNE中数据结构Raw及其用法简介

MNE中数据结构Epoch及其创建方法

机器学习算法随机森林判断睡眠类型

上海独创柔性脑机接口何以上榜年度AI“奥斯卡”大奖

利用脑机接口从鸟的脑电波中重现鸟唱歌声

投稿通道

如何让你的工作让更多人知晓和受益?

脑机接口社区就是这样一个连接学界、

企业界和爱好者的平台渠道。

社区鼓励高校实验室、企业或个人在我们平台上分享优质内容。

稿件要求

稿件系个人原创作品,若已在其他平台发表,请明确标注。

稿件一经录取,便提供稿费!

投稿通道

微信扫码,备注:投稿+姓名+单位

微信交流群,请扫码上方微信

(备注:姓名+单位+专业/领域行业)

QQ交流群:913607986

你的每一次在看,我都很在意!

脑电分析系列[MNE-Python-11]| 信号空间投影SSP 应用相关推荐

  1. 脑电分析系列[MNE-Python-5]| Python机器学习算法随机森林判断睡眠类型

    案例介绍 本案例通过对多导睡眠图(Polysomnography,PSG)数据进行睡眠阶段的分类来判断睡眠类型. 训练:对Alice的睡眠数据进行训练: 测试:利用训练结果对Bob的睡眠数据进行测试, ...

  2. 脑电分析系列[MNE-Python-21]| Python协方差矩阵处理脑电数据

    今天主要介绍一下MNE中如何用协方差矩阵来处理脑电数据的. MNE中的许多方法,包括源估计和一些分类算法,都需要根据记录进行协方差估计. 在本教程中,我们将介绍传感器协方差计算的基础知识,并构建一个噪 ...

  3. 脑电分析系列[MNE-Python-6]| Python读取.set文件和.locs文件

    本案例主要介绍如何读取eeglab示例文件.set以及.locs文件. .set文件记录的是采集的信息,主要内容包括通道数,事件数,开始时间与结束时间等. .locs文件记录的是电极位置信息. 知识点 ...

  4. 脑电分析系列[MNE-Python-2]| MNE中数据结构Raw及其用法简介(更新)

    Raw对象主要用来存储连续型数据,核心数据为n_channels和times,也包含Info对象. 下面可以通过几个案例来说明Raw对象和相关用法. Raw结构查看: # 引入python库 impo ...

  5. 脑电分析系列 | MNE-Python汇总

    1 脑电分析系列MNE-Python教程 [MNE-1]| MNE-Python详细安装与使用(更新) [MNE-2]| MNE中数据结构Raw及其用法简介(更新) [MNE-3]| MNE中数据结构 ...

  6. 脑电分析系列[MNE-Python-19]| 可视化Evoked数据

    在前面我们介绍过Evoked的数据结构以及如何创建Evoked对象: 脑电分析系列[MNE-Python-4]| MNE中数据结构Evoked及其对象创建 Evoked potential(EP)诱发 ...

  7. 脑电分析工具MNE教程

    资料来源:脑电分析系列 | MNE-Python汇总 目录 1.安装与使用 2.数据结构Raw 3.Epoch 4.Evoked 5.案例 (1)导入工具库 (2)加载数据 (3)测试数据 (4)提取 ...

  8. 脑电分析系列 | eeglab汇总

    1 脑电分析系列eeglab教程 eeglab教程系列(1)-安装教程 eeglab教程系列(2)-加载.显示数据 eeglab教程系列(3)-绘制脑电头皮图 eeglab教程系列(4)-绘制通道光谱 ...

  9. Python-EEG工具库MNE中文教程(10)-信号空间投影SSP数学原理

    目录 projector(投影)和投影背景 案例解释投影原理 导入工具库 什么是projector(投影)? 计算正交平面 使用SVD计算投影矩阵 本分享为脑机学习者Rose整理发表于公众号:脑机接口 ...

最新文章

  1. 计算机软件ds,[计算机软件及应用]dsjs.ppt
  2. rabbitmq延迟队列实现
  3. java 获取键盘事件,java获取键盘事件
  4. servlet运行原理和生命周期
  5. MTK驱动(53)---平台DTS文件匹配过程
  6. c 子类对象 访问父类对象受保护成员_面向对象的三大特征
  7. DOM 提供了一些滚动页面设置指定可见
  8. GDAL 2.0版本RPC校正速度测试
  9. 关于音频通信引擎接口便宜性的实验
  10. 【万里征程——Windows App开发】如何使用粘贴板
  11. postSQL hash分表
  12. android dts播放器下载,安卓dts音效apk安装包
  13. 详解 Elasticsearch refresh 机制
  14. 知到网课中国戏曲剧种鉴赏考试试题|真题演练|题库(含答案)
  15. Scheduling
  16. CPU个数、内核数、线程数
  17. 计算机技术发展作文,【推荐】科技发展作文三篇
  18. c语言求三个数最值非函数,C语言编程:从键盘任意输入三个数,编写求其最大值、最小值的函数,用指针作函数参数实现。...
  19. 正则表达式nbsp;特殊用法
  20. Arduino开发实例-DIY风速测量及显示

热门文章

  1. 带管理职位面试中遇到的常见经典问题的回答!!!
  2. python stmp 定时发送邮件
  3. Untiy截图更新,及截取透明图片签字
  4. 普通人在互联网上还有哪些赚钱的机会?
  5. C++语言程序设计【1】
  6. 51单片机入坑仪式 芯片STC89C52RC-40I LQFP-44启动学习项目
  7. JavaScript前端批量下载图片文件打包下载
  8. TensorFlow与Flask结合打造手写体数字识别
  9. NoSQL :一个帝国的崛起
  10. 两台电脑组件局域网,一方访问对方mysql数据库;一方充当服务器,对方充当客户端