在脑电图(EEG)数据分析中,我们常常面对高维度的挑战:数十甚至数百个电极通道,每个通道都包含成千上万个时间点。此外,原始信号中还混杂着各种高振幅伪迹,如眼动(EOG)、心电(ECG)和肌肉活动(EMG),这些伪迹会严重影响后续的分析。
主成分分析(Principal Component Analysis, PCA)是一种强大的线性代数技术,它在EEG预处理中扮演着双重角色:既可以作为一种有效的伪迹去除工具,也能实现数据降维,从而简化后续的计算和分析。
本文将深入探讨PCA的核心原理、在EEG预处理中的应用,并结合 MNE-Python 库提供完整的代码实现,旨在帮助你掌握这一高效且通用的数据处理技术。
PCA 的核心原理
PCA 的核心思想是将数据从一个高维空间投影到一个新的、低维度的正交空间。在这个新空间中,数据的方差被最大化地保留在少数几个**主成分(Principal Components, PCs)**上。
如何工作:PCA通过计算数据的协方差矩阵,找到一组新的正交基向量,这些基向量就是主成分。第一个主成分代表数据中方差最大的方向,第二个主成分代表与第一个正交且方差次大的方向,以此类推。
伪迹与主成分:在EEG数据中,高振幅的伪迹(如眨眼)通常会引起通道间信号的剧烈变化,因此它们往往是数据中方差最大的成分之一。通过识别和移除这些对应于伪迹的主成分,我们就可以实现伪迹的去除。
降维:当我们保留前几个主成分(它们包含了数据中绝大部分的方差)而忽略其余的主成分时,就实现了数据的降维。
PCA 的双重应用
1. 伪迹去除
原理:由于高振幅伪迹(如EOG)通常是数据中方差最大的来源,它们会在PCA分解后被捕获为前几个主成分。
操作流程:
对EEG数据进行PCA分解。
通过检查每个主成分的方差贡献率和头皮图,识别出与伪迹相关的主成分(通常是贡献率最高的那几个)。
将这些伪迹主成分从数据中移除。
使用剩余的主成分,将数据重新投影回原始通道空间。
优点:能够自动识别和移除高振幅伪迹,尤其适用于眼动等伪迹。
局限性:无法区分方差相似的伪迹和脑电信号。对于复杂的、非线性的伪迹,效果不如ICA。
2. 数据降维
原理:EEG数据的维度非常高,但很多通道的信号是高度相关的。PCA可以识别出数据中真正的独立变异性,用少数几个主成分来代表整个数据集。
操作流程:
对EEG数据进行PCA分解。
保留包含大部分信息的前几个主成分(例如,保留累积方差贡献率达到95%的主成分)。
将数据投影到这个低维子空间,用于后续的分析或机器学习。
优点:
提高计算效率:减少了数据的维度,加快了后续算法的计算速度。
减少过拟合:在高维数据上训练机器学习模型容易过拟合,降维可以缓解这一问题。
去除冗余信息:移除了通道间的高度相关性。
Python实现:基于MNE-Python
MNE-Python 提供了 mne.preprocessing.compute_pca
和 mne.cov.compute_whitener
等函数,可以方便地实现PCA伪迹去除和降维。
1. 环境准备与数据加载
首先,确保你已经安装了所需的库。
Bash
pip install mne
Python
import mne
import numpy as np
import matplotlib.pyplot as plt
from mne.datasets import sample
# 1. 加载MNE示例数据
data_path = sample.data_path()
raw_fname = data_path / 'MEG' / 'sample' / 'sample_audvis_raw.fif'
raw = mne.io.read_raw_fif(raw_fname, preload=True)
raw.pick_types(eeg=True)
raw.set_eeg_reference('average', projection=True)
raw.filter(1., 40., fir_design='firwin')
2. 应用PCA进行降维和伪迹去除
我们将使用 mne
的函数,通过主成分投影实现伪迹去除和降维。
Python
# 2. 伪迹去除和降维
# 假设我们想要去除前3个主成分,这些成分很可能代表眼动伪迹
# (在实际应用中,你需要通过可视化来确定)
n_components_to_remove = 3
# 计算并应用PCA投影
# 该投影器将从数据中移除前n_components_to_remove个主成分
pca = mne.preprocessing.compute_pca(raw, n_components=raw.info['n_channels'],
n_pca_components=raw.info['n_channels'],
return_info=False)
raw.add_proj(pca[:n_components_to_remove])
raw_pca_cleaned = raw.copy().apply_proj()
3. 可视化效果对比
通过绘制原始数据和处理后数据的功率谱密度(PSD)图以及时域波形图,我们可以直观地看到PCA的清理效果。
Python
# 3. 可视化效果对比
# 绘制功率谱密度(PSD)对比
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
raw.plot_psd(ax=axes[0], picks='eeg', fmax=40, show=False)
axes[0].set_title('原始数据PSD')
raw_pca_cleaned.plot_psd(ax=axes[1], picks='eeg', fmax=40, show=False)
axes[1].set_title(f'PCA去噪后PSD (移除前{n_components_to_remove}个PC)')
plt.tight_layout()
plt.show()
# 绘制时域波形图对比
# 选取一段包含显著伪迹的时间段进行对比
start_time = 120 # 可视化数据的起始时间
duration = 5 # 可视化持续时间
ch_names = ['EEG 001', 'EEG 002', 'EEG 003']
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True, sharey=True)
raw.plot(ax=ax1, start=start_time, duration=duration, n_channels=len(ch_names),
scalings={'eeg': 100e-6}, title='原始数据 (Raw)', show=False)
raw_pca_cleaned.plot(ax=ax2, start=start_time, duration=duration, n_channels=len(ch_names),
scalings={'eeg': 100e-6}, title=f'PCA去噪后 (移除前{n_components_to_remove}个PC)', show=False)
plt.tight_layout()
plt.show()
总结与应用场景
**主成分分析(PCA)**是EEG预处理中的一个基础且多功能的工具。它既可以作为一种降维技术,简化数据,提高计算效率,也可以通过移除高方差的主成分,实现伪迹的去除。
降维:当处理高通道数数据或为机器学习模型准备输入特征时,PCA是首选。
伪迹去除:对于高振幅、线性相关的伪迹(如眨眼),PCA是一种简单有效的去除方法。
尽管 ICA 在伪迹去除方面通常被认为更强大(因为它基于独立性假设),但 PCA 算法更简单、计算更快,且能够提供对数据方差结构的直观理解,使其成为EEG分析流程中一个不可或缺的工具。