如何绘制从 EEG 信号中提取的 ICA 分量?

How to plot ICA components extracted from EEG signal?

我正在按照 and this scikit-learn tutorial 去除 EEG 信号中的伪影。它们看起来很简单,我肯定在这里遗漏了一些明显的东西。

提取的分量与我的信号的长度不同。我有几个小时录音的 88 个通道,所以我的信号矩阵的形状是 (88, 8088516)。然而 ICA 的输出是 (88, 88)。除了如此短之外,每个组件似乎都捕获了非常大的、看起来很嘈杂的偏转(所以在 88 个组件中,只有几个实际上看起来像信号,其余的看起来像噪声)。我还预计只有少数组件看起来很嘈杂。我怀疑我在这里做错了什么?

(通道 x 样本)的矩阵具有形状 (88, 8088516)。

示例代码(仅使用随机矩阵来实现最低限度的工作目的):

import numpy as np
from sklearn.decomposition import FastICA
import matplotlib.pyplot as plt

samples_matrix = np.random.random((88, 8088516))

# Compute ICA
ica = FastICA(n_components=samples_matrix.shape[0])  # Extracting as many components as there are channels, i.e. 88
components = ica.fit_transform(samples_matrix)  # Reconstruct signals
A_ = ica.mixing_  # Get estimated mixing matrix

组件的形状是(88, 88)。绘制的一张看起来像这样:

plt.plot(components[1])

我原以为这些组件是与我的原始组件长度相同的时间序列,。我真的不确定此时如何继续进行组件移除和信号重建。

您需要 运行 fit_transform 转置 samples_matrix 而不是 samples_matrix 本身(因此提供 8088516 x 88 矩阵而不是 88x8088516到方法)。

ica.fit_transform(samples_matrix.transpose())

或更简单地说

ica.fit_transform(samples_matrix.T)

这将为您提供一组 8088516 x 88 信号(88 个分量,每个信号与原始信号一样长)用于绘图。正如我在下面的评论中提到的,由于矩阵求逆等原因,我的设置建议不超过 64 个组件。

为了支持这个建议,我正在查看 your tutorial,他们按如下方式设置了他们的玩具问题:

n_samples = 2000
time = np.linspace(0, 8, n_samples)

s1 = np.sin(2 * time)  # Signal 1 : sinusoidal signal
s2 = np.sign(np.sin(3 * time))  # Signal 2 : square signal
s3 = signal.sawtooth(2 * np.pi * time)  # Signal 3: saw tooth signal

S = np.c_[s1, s2, s3]
S += 0.2 * np.random.normal(size=S.shape)  # Add noise

S /= S.std(axis=0)  # Standardize data
# Mix data
A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]])  # Mixing matrix
X = np.dot(S, A.T)  # Generate observations

它给出了 (2000,3)X.shape 来分隔 3 个分量,表明这是 FastICA 方法的首选矩阵格式。