前一篇分享(脑电分析系列)[MNE-Python-10]| 投影信号空间SSP根据数学原理),投影矩阵会根据你试图投射的噪声类型而变化。投影信号空间(SSP)投影矩阵应该是通过比较是否有兴趣信号的测量值来估算的。例如,当没有对象存在时,可以测量其他空间来记录传感器上的活动。通过查看空间测量MEG传感器的活动空间模式可以创建一个或多个ND向量来给出传感器空间中环境噪声的方向(类似于上述示例中触发器的影响的向量)。SSP它通常用于消除心跳和眼睛运动伪影。在消除心跳和眼睛运动伪影的情况下,不是通过空房间录制,而是通过检测伪影来提取伪影周围的时间段(epochs)并寻求平均值来估计噪声的方向。请参见相关示例的使用SSP修复工件。
一旦知道了噪声向量,就可以创建一个与它正交的超平面,并在超平面上投影实验记录。这样,测量中与环境噪声相关的部分就可以被移除。同样,应该清楚的是,投影降低了数据的维度——你仍然有相同数量的传感器信号,但它们不是线性独立的——但通常有数十或数百个传感器,你想消除的噪声子空间只有3-5维,所以自由度的损失通常没有问题。
在示例数据中,空间记录已被用于执行SSP,但投影与原始数据一起存储,并且尚未应用(或投影尚未激活)。
在这里,我将加载示例数据并将其切割成60秒;
可以在以下read_raw_fif()投影可以在输出中看到:
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
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-v这样的名字。(顺便说一句,由于执行主成分分析的过程在幕后使用了奇异值分解,在发表的论文中经常看到类似的投影仪使用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
在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"投影信息可以在红框中找到。
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) idle ECG-planar-999--0.200-0.400-PCA-02 ( x 203) idle
ECG-axial-999--0.200-0.400-PCA-01 (1 x 102) idle
ECG-axial-999--0.200-0.400-PCA-02 (1 x 102) idle
ECG-eeg-999--0.200-0.400-PCA-01 (1 x 59) idle
ECG-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)
上面,当我们打印从文件加载的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
你的每一次在看,我都很在意!