本文是在阅读博主zhoudapeng01的文章Python 中MNE库去伪迹(ICA)_zhoudapeng01的博客-CSDN博客_ica mne后做的一个翻译工作。
主要介绍的还是ICA,需要了解的前置知识为MNE库和PCA(实际上知道概念就行)
# -*- coding: utf-8 -*-
"""
.. _tut-artifact-ica:
利用ICA去除伪迹
============================
本教程涵盖了独立分量分析 (ICA) 的基础知识,并展示了如何使用 ICA 进行去除伪迹;
一个扩展示例说明了眼部和心跳伪影的修复。 有关 ICA 的概念背景,请参阅 scikit-learn 教程。
.. contents:: Page contents
:local:
:depth: 2
我们一如既往地导入必要的 Python 模块并加载一些“示例数据 <sample-dataset>”。
由于 ICA 的计算量很大,我们还将数据裁剪为 60 秒;
为了避免重复导入 mne.preprocessing ,我们将直接从该子模块导入一些函数和类:
"""
import os
import mne
from mne.preprocessing import (ICA, create_eog_epochs, create_ecg_epochs,
corrmap)
# 获取data数据的文件夹名
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对象
raw = mne.io.read_raw_fif(sample_data_raw_file)
# 数据裁剪为60s
raw.crop(tmax=60.)
###############################################################################
# .. note::
# 在应用 ICA(或其他任何去除伪迹策略)之前,请务必观察数据中的伪迹,以确保选择正确的去除工具。
# 有时,正确的方法就是不用这些工具——如果伪迹足够小,您甚至可能不需要修复它们以获得良好的分析结果
# 因为此时已经可以直接在源数据上获得良好的分析结果了
# 有关检测和可视化各种类型的伪迹的指南,请参阅 :ref:`tut-artifact-overview`。
#
# 什么是ICA ?
# ^^^^^^^^^^^^
#
# 独立分量(或者叫成分)分析 (ICA) 是一种从一组记录中估计独立源信号的技术,其中源信号以未知的比率混合在一起。
# 一个常见的例子是“盲源分离”的问题:
# 3 个乐器在同一个房间里演奏,3 个麦克风记录表演(每个麦克风拾取所有 3 个乐器,但电平不同)
# 你能以某种方式“解混”由 3 个麦克风记录的信号,
# 以便最终得到一个单独的“录音”,录音中每个乐器的声音被分隔起来
#
# 不难看出这种类比如何适用于 EEG/MEG 分析:
# 有许多“麦克风”(传感器通道)同时记录许多“乐器”(眨眼、心跳、大脑不同区域的活动、咬紧下巴的肌肉活动) 或吞咽等)。
# 只要这些各种源信号在统计上是独立且非高斯分布的,通常可以使用 ICA 分离源,然后在排除不需要的源后重新构建传感器信号。
#
#
# ICA in MNE-Python
# ~~~~~~~~~~~~~~~~~
#
# .. sidebar:: ICA and 降维
#
# 如果你想执行 ICA 时 *不要* 降维(除了 n_components 中给出的独立成分(IC)的数量,以及你在
# ICA.exclude 中指定的任何后续排除 IC),
# 通过设置``max_pca_components=None`` 和 ``n_pca_components=None``(这些是默认值)来实现。
#
# 但是,如果您 *要* 降低维度,请考虑以下示例:
# 如果您有 300 个传感器通道并且设置了“max_pca_components=200”、“n_components=50”和
# “n_pca_components=None”,
# 那么 PCA 步骤产生 200 个 PC,前 50 个 PC 被发送到 ICA 算法(产生 50 个 IC),
# 在重建期间:方法:`~mne.preprocessing.ICA.apply` 将使用 50 个 IC 加上编号为 51-200 的 PC
# (完整的 PCA 残差)。
# 如果改为指定 ``n_pca_components=120``,则 :方法:`~mne.preprocessing.ICA.apply`
# 将使用 50 个 IC 加上 PCA 残差中的前 70 个 PC(编号 51-120)进行重构。
#
# **如果您以前一直在使用 EEGLAB** 的 ``runica()`` 并且正在寻找其
# ``'pca', n`` 选项的等效项以在 ICA 步骤之前通过 PCA 降低维度,
# 请设置 ` `max_pca_components=n`,同时将 ``n_components`` 和 ``n_pca_components``
# 保留为默认值(即 ``None``)。
#
# MNE-Python 实现了三种不同的 ICA 算法:“fastica”(默认)、“picard”和“infomax”。
# FastICA 和 Infomax 都得到了相当广泛的使用;
# Picard 是一种较新的(2017 年)算法,预计收敛速度比 FastICA 和 Infomax 更快,
# 并且在源不完全独立的情况下比其他算法更稳健,这通常发生在真实的 EEG/MEG 数据中。
# 有关详细信息,请参阅 [1]_。
#
# MNE-Python中的ICA接口类似于
# `scikit-learn`_: 一些通用参数在创建如下类时被指定
# :class:`~mne.preprocessing.ICA` object, 然后
# :class:`~mne.preprocessing.ICA` object 使用其自身的如下方法来拟合数据
# :meth:`~mne.preprocessing.ICA.fit` method. 拟合的结果被添加到如下
# :class:`~mne.preprocessing.ICA` object 作为属性, 使用一个下划线作为结尾 (``_``),
# 比如 ``ica.mixing_matrix_`` 和``ica.unmixing_matrix_``.
# 拟合后,你想要移除的ICA component(s)必须被选中, 然后ICA拟合必须被应用到如下
# :class:`~mne.io.Raw` or :class:`~mne.Epochs` object 通过使用
# :class:`~mne.preprocessing.ICA` object的 :方法:`~mne.preprocessing.ICA.apply`
# 方法。
#
# 正如通常使用 ICA 所做的那样,在执行 ICA 分解之前,首先将数据缩放到单位方差并使用主成分分析 (PCA) 进行白化。
# 您可以在这一步通过指定“max_pca_components”来强制进行可选的降维。
# 从保留的主成分 (PC) 中,第一个“n_components”然后被传递给 ICA 算法
# (“n_components”可能是要使用的整数个成分,或者使用的成分应该捕获的解释方差的一部分 )。
#
# 在可视化独立组件 (IC) 并排除任何要修复的捕获伪迹后,可以使用
# ~mne.preprocessing.ICA 对象的:meth:`~mne.preprocessing.ICA.apply` 方法重建传感器信号。
# 默认情况下,信号重建使用所有 IC(减去 ``ICA.exclude`` 中列出的任何 IC)
# 加上所有未包含在 ICA 分