MNE-Python | 使用 ICLabel 模型进行 ICA 并自动修复样本

article/2025/11/3 15:14:20

        本文涵盖了使用 ICA 和 ICLabel 模型 1 自动修复信号,该模型源自 EEGLab。 有关 ICA 的概念背景,请参阅此 scikit-learn 教程。 有关如何使用 ICA 删除工件的基本了解,请参阅 MNE-Python 中的教程。

        ICLabel 旨在对配备最大信号 ICA 分解算法的独立成分(IC)进行分类,该算法需要 EEG 数据集采用平均值作为重参考并在 [1,100] Hz 之间进行滤波处理。 也可以在不符合这些规范的数据集上运行 ICLabel,但分类性能可能会受到负面影响。 此外,ICLabel 论文没有研究这些预处理步骤的影响。

        同样的我们需要导入必要的 Python 模块并加载一些示例数据。 因为 ICA 的计算量很大,可以将数据裁剪为 60 秒; 为了避免重复预处理(mne.preprocessing),我们将直接从该子模块导入一些函数和类。

import mne
from mne.preprocessing import ICAfrom mne_icalabel import label_componentssample_data_folder = mne.datasets.sample.data_path() / "MEG" / "sample"
sample_data_raw_file = sample_data_folder / "sample_audvis_raw.fif"
raw = mne.io.read_raw_fif(sample_data_raw_file)# 我们裁剪 60 秒的信号段,并删除 MEG 通道
raw.crop(tmax=60.0).pick_types(eeg=True, stim=True, eog=True)
raw.load_data()

输出为:

Opening raw data file C:\Users\Mathieu\mne_data\MNE-sample-data\MEG\sample\sample_audvis_raw.fif...Read a total of 3 projection items:PCA-v1 (1 x 102)  idlePCA-v2 (1 x 102)  idlePCA-v3 (1 x 102)  idleRange : 25800 ... 192599 =     42.956 ...   320.670 secs
Ready.
Removing projector <Projection | PCA-v1, active : False, n_channels : 102>
Removing projector <Projection | PCA-v2, active : False, n_channels : 102>
Removing projector <Projection | PCA-v3, active : False, n_channels : 102>
Reading 0 ... 36037  =      0.000 ...    60.000 secs...
Measurement dateDecember 03, 2002 19:01:10 GMT
ExperimenterMEG
ParticipantUnknown
Digitized points146 points
Good channels9 Stimulus, 59 EEG, 1 EOG
Bad channelsNone
EOG channelsEOG 061
ECG channelsNot available
Sampling frequency600.61 Hz
Highpass0.10 Hz
Lowpass172.18 Hz
Filenamessample_audvis_raw.fif
Duration00:01:00 (HH:MM:SS)

滤波去除缓慢低频漂移

在运行 ICA 之前,一个重要的步骤是对数据的低频漂移进行过滤,低频漂移会对 ICA 拟合的质量产生负面影响。 缓慢漂移的问题在于它们降低了假定为独立来源相互之间的独立性(例如,在缓慢向上漂移期间,神经、心跳、眨眼和其他肌电信号都会呈现出更高的值),使得算法更难找到准确的解。所以建议使用截止频率为 1 Hz 的高通滤波器。 但是,由于滤波是线性操作,从滤波后的信号中找到的 ICA 解可以应用于未滤波的信号,参考以下文献:

Irene Winkler, Stefan Debener, Klaus-Robert Müller, and Michael Tangermann. On the influence of high-pass filtering on ICA-based artifact reduction in EEG-ERP. In Proceedings of EMBC-2015, 4101–4105. Milan, 2015. IEEE. doi:10.1109/EMBC.2015.7319296.

因此我们将保留未滤波的原始对象的副本,以便我们可以将 ICA 的解作用与原始数据。

filt_raw = raw.copy().filter(l_freq=1.0, h_freq=100.0)

输出为:

Filtering raw data in 1 contiguous segment
Setting up band-pass filter from 1 - 1e+02 HzFIR filter parameters
---------------------
Designing a one-pass, zero-phase, non-causal bandpass filter:
- Windowed time-domain design (firwin) method
- Hamming window with 0.0194 passband ripple and 53 dB stopband attenuation
- Lower passband edge: 1.00
- Lower transition bandwidth: 1.00 Hz (-6 dB cutoff frequency: 0.50 Hz)
- Upper passband edge: 100.00 Hz
- Upper transition bandwidth: 25.00 Hz (-6 dB cutoff frequency: 112.50 Hz)
- Filter length: 1983 samples (3.302 sec)[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.0s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   2 out of   2 | elapsed:    0.0s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   3 out of   3 | elapsed:    0.0s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   4 out of   4 | elapsed:    0.0s remaining:    0.0s
[Parallel(n_jobs=1)]: Done  59 out of  59 | elapsed:    0.0s finished

拟合并绘制ICA解

现在即可准备开始建立并拟合ICA。通过观察原始数据可以知道 EOG 和 ECG 的伪影影响很强,所以我们预计这些伪影将在 ICA 之前发生的 PCA 分解的前几个维度中被捕获。因此可能不需要大量的成分来区分数据(尽管有时需要更多的成分来获得更准确的解)。首先可以做尝试,我们将使用n_components=15 运行 ICA(仅使用前 15 个 PCA 成分来计算 ICA 分解)——考虑到我们的数据有 59 个良好的 EEG 通道,成分数量相对较小,但其优势在于它可以快速运行,我们将能够轻松判断它是否有效(因为我们已经知道 EOG / ECG 伪影应该是什么样子)。

ICA 拟合具有不确定性(例如,提取出的成分可能会在不同的计算中出现符号翻转,或者可能并不总是以相同的顺序返回),因此我们还将指定一个随机种子,以便每次本教程都获得相同的结果由我们的网络服务器构建。

在拟合 ICA 之前,我们将应用一个共同的平均重参考,以符合 ICLabel 的要求。

filt_raw = filt_raw.set_eeg_reference("average")

输出为:

EEG channel type selected for re-referencing
Applying average reference.
Applying a custom ('EEG',) reference.

我们将使用 “extended infomax” 方法来拟合 ICA,以符合 ICLabel 要求。 ICLabel 未与其他 ICA 分解算法进行测试,但其性能和准确性不应受算法影响。

ica = ICA(n_components=15,max_iter="auto",method="infomax",random_state=97,fit_params=dict(extended=True),
)
ica.fit(filt_raw)
ica

输出为

Fitting ICA to data using 59 channels (please be patient, this may take a while)
Selecting by number: 15 components
Computing Extended Infomax ICA
Fitting ICA took 3.3s.
Methodinfomax
Fit500 iterations on raw data (36038 samples)
ICA components15
Explained variance91.0 %
Available PCA components59
Channel typeseeg
ICA components marked for exclusion

我们可以传递给 fit函数 方法的一些可选参数包括 decim(在计算 IC 时仅使用每第 N 个样本,可提升快速性)和reject(拒绝每种通道类型提供最大可接受幅值范围的区间)。

现在我们可以查看 IC 以查看它们捕获的内容。 plot_sources 将显示 IC 的时间序列。 请注意,在我们对 plot_sources 的调用中,我们可以使用原始的、未过滤的 Raw 对象:

raw.load_data()
ica.plot_sources(raw, show_scrollbars=False, show=True)

输出为:

Creating RawArray with float64 data, n_channels=16, n_times=36038Range : 25800 ... 61837 =     42.956 ...   102.956 secs
Ready.

我们可以很清楚地看到第一个成分 (ICA000) 捕获了 EOG 信号。 我们可以用plot_components 可视化每个组件的头皮场分布。 这些是基于 ICA 混合矩阵中的值进行插值的:

ica.plot_components()# blinks
ica.plot_overlay(raw, exclude=[0], picks="eeg")

 输出为:

Applying ICA to Raw instanceTransforming to ICA space (15 components)Zeroing out 1 ICA componentProjecting back using 59 PCA components

 我们还可以使用 plot_properties 单独绘制 IC 图:

ica.plot_properties(raw, picks=[0])

 输出为:

    Using multitaper spectrum estimation with 7 DPSS windows
Not setting metadata
30 matching events found
No baseline correction applied
0 projection items activated

自动选择 ICA 成分

我们可以应用自动 ICA 标记算法,该算法将输出以下七个成分的概率值:

  • brain

  • muscle artifact

  • eye blink

  • heart beat

  • line noise

  • channel noise

  • other

ICLabel label_components 函数的输出按顺序为这些类中的每一个生成预测概率值。详见文献:

Luca Pion-Tonachini, Ken Kreutz-Delgado, and Scott Makeig. Iclabel: an automated electroencephalographic independent component classifier, dataset, and website. NeuroImage, 198:181–197, 2019. URL: https://www.sciencedirect.com/science/article/pii/S1053811919304185, doi:https://doi.org/10.1016/j.neuroimage.2019.05.026.

ic_labels = label_components(filt_raw, ica, method="iclabel")# 例如:ICA0 可以准确地识别为眨眼,ICA12 被归为肌肉伪影。
print(ic_labels["labels"])
ica.plot_properties(raw, picks=[0, 12], verbose=False)

 print输出结果:

['eye blink', 'brain', 'brain', 'brain', 'brain', 'brain', 'muscle artifact', 'muscle artifact', 'other', 'brain', 'muscle artifact', 'muscle artifact', 'muscle artifact', 'muscle artifact', 'eye blink']

 提取标签并重构原始数据

我们可以提取出所有不属于大脑的成分,保留“大脑”和“其他”。 “其他”是不可分类的成分。 保险起见,并假设我们不能盲目地删除这些成分。

labels = ic_labels["labels"]
exclude_idx = [idx for idx, label in enumerate(labels) if label not in ["brain", "other"]]
print(f"Excluding these ICA components: {exclude_idx}")

输出为:

Excluding these ICA components: [0, 6, 7, 10, 11, 12, 13, 14]

现在我们有了需要被剔除的成分,可以用 mne.apply 去除每个通道上信号的伪影,需要注意的是,我们要将对于过滤后的数据得到的 ICA 解决方案作用于原始未滤波的信号。将原始的数据与重构后的数据一同绘制,心跳和眨眼的伪影已得到修复。

# ica.apply() changes the Raw object in-place, so let's make a copy first:
reconst_raw = raw.copy()
ica.apply(reconst_raw, exclude=exclude_idx)raw.plot(order=artifact_picks, n_channels=len(artifact_picks), show_scrollbars=False)
reconst_raw.plot(order=artifact_picks, n_channels=len(artifact_picks), show_scrollbars=False)
del reconst_raw

 输出为:

Applying ICA to Raw instanceTransforming to ICA space (15 components)Zeroing out 8 ICA componentsProjecting back using 59 PCA components

 


http://chatgpt.dhexx.cn/article/kB4uUvvP.shtml

相关文章

PCA与ICA的介绍

Background 做一个数据分析业务之前&#xff0c;往往需要对反映事物的多个特征变量进行大量的观测&#xff0c;收集大量数据以便进行分析寻找规律。多个特征变量确实会提供丰富的信息&#xff0c;但是很多情况下变量之间可能会存在相关性&#xff0c;如果用全部特征变量去拟合…

ICA算法处理后,ICA成分识别

今天Rose分享一篇关于脑电成分、眼电成分等判断。 当Run ICA结束后&#xff0c;我们一般会判断ICA成分对应的是什么成分&#xff0c;是眨眼成分还是水平眼动成分或是线路噪声成分。 眼电判断的时候&#xff0c;可以结合头皮地形图、ERP图、每个成分功率谱图&#xff0c;以及矫正…

ICA算法简介

ICA算法的研究可分为基于信息论准则的迭代估计方法和基于统计学的代数方法两大类,从原理上来说,它们都是利用了源信号的独立性和非高斯性。基于信息论的方法研究中,各国学者从最大熵、最小互信息、最大似然和负熵最大化等角度提出了一系列估计算法。如FastICA算法, Infomax算…

ICA: 1 靶场详细教学

目录 简介 信息收集 0x01 主机发现 0x02 端口扫描 0x03 目录爆破 漏洞利用 0x04 查找poc 0x05 进入数据库 提权 0x06 内网信息收集 0x07 提权 总结 简介 该靶场前期考验的是我们的信息收集能力&#xff0c;通过信息收集找到一个框架的漏洞&#xff0c;再通过该漏…

如何识别ICA成分

目录 查看ICA成分识别ICA成分 本分享为脑机学习者Rose整理发表于公众号&#xff1a;脑机接口社区 .QQ交流群&#xff1a;941473018 感谢简书ID:亚内士多德授权分享 查看ICA成分 在计算完ICA之后&#xff0c;有几种方法可以查看ICA成分。 1.Tools >> reject data usi…

【机器学习】ICA算法简介

ICA算法的研究可分为基于信息论准则的迭代估计方法和基于统计学的代数方法两大类&#xff0c;从原理上来说&#xff0c;它们都是利用了源信号的独立性和非高斯性。基于信息论的方法研究中&#xff0c;各国学者从最大熵、最小互信息、最大似然和负熵最大化等角度提出了一系列估计…

机器学习入门之PCA与ICA

文章目录 主成分分析 PCA什么是降维PCA (Principal Component Analysis)算法流程 独立成分分析 ICA问题引入算法基于最大似然估计 ICA的经典假设与不确定性经典假设不确定性ICA无法确定的因素 小结 本文为吴恩达机器学习课程的笔记系列第六篇&#xff0c;主要关于数据降维时常用…

ICA文件打开方式

ICA文件打开方式 1、点击连接桌面 如图1&#xff0c;载ICA文件会自动调用本地receiver客户端打开 2、手动打开ICA文件 如图2&#xff0c;可单击ICA文件-右键-打开方式选择-wfcrun32.exe程序打开&#xff08;wfcrun32.exe程序路径 C:\Program Files\Citrix\ICA Client或C:\Prog…

ICA与PCA的区别

关注“心仪脑”查看更多脑科学知识的分享。 独立成分分析&#xff08;ICA&#xff0c;Independent Component Analysis&#xff09; ICA又称盲源分离(Blind source separation, BSS)。用 “鸡尾酒会模型”来做比喻&#xff0c;假设我们在一个音乐厅或者是一个舞会&#xff0c…

EEGLAB系列教程5:数据预处理2(ICA去伪迹)

EEGLAB系列教程5&#xff1a;数据预处理2&#xff08;ICA去伪迹&#xff09; 今天介绍EEG数据处理系列教程5&#xff0c;在前面的几期中&#xff0c;已经介绍了数据基本处理过程&#xff0c;可以参见以下链接: EEGLAB系列教程1&#xff1a;安装和启动 EEGLAB EEGLAB系列教程…

无法识别ICA文件

问题&#xff1a;无法识别ICA文件怎么办&#xff1f; 场景&#xff1a;该问题常发生在Windows系统&#xff0c;由于软件关联异常&#xff0c;无法打开云桌面的ICA文件&#xff0c;导致无法调用云桌面客户端。 【方案1】导入注册表项 步骤一、点击下载 ICA文件打开方式修复 …

ICA算法

一、盲信号处理(blind signal processing) 在系统的传输特性未知条件下&#xff0c;从系统的输出信号估计系统的输入信号和系统的传输特性 基本问题表述&#xff1a;已知多输入多输出的非线性动态系统的输出信号x(t),要找到一个稳定的逆系统&#xff08;重构系统&#xff09;&…

史上最直白的ICA教程之一

前言 独立成分分析ICA是一个在多领域被应用的基础算法。ICA是一个不定问题&#xff0c;没有确定解&#xff0c;所以存在各种不同先验假定下的求解算法。相比其他技术&#xff0c;ICA的开源代码不是很多&#xff0c;且存在黑魔法–有些步骤并没有在论文里提到&#xff0c;但没有…

ICA简介:独立成分分析

1. 简介 您是否曾经遇到过这样一种情况&#xff1a;您试图分析一个复杂且高度相关的数据集&#xff0c;却对信息量感到不知所措&#xff1f;这就是独立成分分析 (ICA) 的用武之地。ICA 是数据分析领域的一项强大技术&#xff0c;可让您分离和识别多元数据集中的底层独立来源。 …

尝试理解ICA(Independent Component Analysis)独立成分分析

1.从鸡尾酒会问题&#xff08;cocktail party problem&#xff09;说起 ICA最早是从神经网络领域开始研究的&#xff0c;应用于信号分离、特征提取。为了简单&#xff0c;我们这里从一个经典的例子开始——盲源信号分离&#xff08;blind signal separation&#xff09;。 假…

Linux reboot全过程

原文&#xff1a;https://blog.csdn.net/davion_zhang/article/details/52233043 一、版本说明 嵌入式Linux 下面的reboot命令看似简单&#xff0c;但出问题时定位起来发现别有洞天。 下面就按在shell下执行reboot命令之后程序的执行过程进行解析。 Busybox&#xff1a;1.23…

linux嵌入式reboot不生效,Embeded linux之reboot

reboot命令 //kernel\sys.c magic1、magic2&#xff0c;两个int类型的“魔力数”&#xff0c;用于防止误操作。具体在“include/uapi/linux/reboot.h”中定义。 cmd&#xff0c;reboot方式。 //include\linux\reboot.h #define LINUX_REBOOT_CMD_RESTART 0x01234567 #define LI…

reboot 流程

前言 对于生在智能时代的我们&#xff0c;对关机和重启这两个概念肯定不会陌生&#xff0c;尤其经历早期Android智能机的人们&#xff0c;印象最深恐怕就是重启&#xff0c;当然现在不会了&#xff0c;还没有改过来的都被淘汰了。在Linux系统中我们使用reboot完成这个动作,下面…

Vue路由和路由器简介

前言 路由(route)是vue中非常重要的技术&#xff0c;几乎每一个用vue所写的项目都会用到路由&#xff0c;它是一个vue的插件库&#xff0c;专门实现SPA应用 路由(route)的简介 说到路由&#xff0c;大多数人会想到路由器(router),可以这么说&#xff0c;路由器上的每一个口都…

路由传递数据

1.路由可以传递query和params参数。路由组件可以通过$route获取query和params参数。 2.路由传递params参数 &#xff08;1&#xff09;当to为字符串形式时。直接在路径后边添加数据 但是在路由中&#xff0c;path属性必须给数据占位。 &#xff08;2&#xff09;当to为对象形…