用ICA去除脑电信号中的眼球链接

2024-10-01 02:18:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我是scikit学习的新手,但我正在尝试去除单个EEG通道中的眨眼(噪声峰值)。 我在互联网上搜索过,但只看到一些更复杂的阅读材料,包括MNE、PyEEG或其他Python模块。我只想要一些简单的,只依赖sklearn的东西。这是我的代码:

#The channel containing some eye-blinks
X = f1ep1_data[:,[4]]

#run ICA on signal
ica = FastICA(n_components=2)
ica.fit(X)

#reconstruct signal with independent components
components = ica.fit_transform(X)
X_restored = ica.inverse_transform(components)

fig1 = plt.figure()
plt.subplot(3,1,1)
plt.title("Original signal")
plt.plot(f1ep1_timescale, X)

plt.subplot(3,1,2)
plt.title("Components")
plt.plot(f1ep1_timescale, components)

plt.subplot(3,1,3)
plt.title("Signal Reconstructed")
plt.plot(f1ep1_timescale, X_restored)
plt.draw()

Here is the result of the code

我所期待的是分离成两个部分,更清晰的脑电图信号和眨眼。我想不出是什么问题。有人能帮忙吗?在


Tags: signalplottitlecomponentstransformpltscikitfit
2条回答

你有没有注意到你的“组件”完全是原始信号的比例和颠倒?这是因为你不能得到比信号更多的成分。在

您需要执行以下步骤:

  1. 将所有EEG通道输入ICA
  2. 手动移除包含眨眼或其他伪影的组件
  3. 用反变换重构

让我们详细了解第2步:为什么要手动删除组件? 伊卡对眨眼一无所知。它根据统计测量将信号分成不同的分量。如果幸运的话,这些部件中的一些看起来像是眨眼。在

到目前为止还可以,但真正的问题是没有定义组件的顺序。运行ICA,您可能会发现组件1包含眨眼。再次运行它,它们在组件3中。同样,它们都在第2和第5部分中。。。在

没有办法预先知道要移除哪些组件和多少个组件。这就是为什么每次运行时都需要手动告诉算法。在

在类似这样的代码中:

# Use all channels - they will contain eye blinks to varying degrees
X = f1ep1_data[:, :]

# run ICA on signal
ica = FastICA(n_components=x.shape[1])  # we want *all* the components
ica.fit(X)

# decompose signal into components
components = ica.fit_transform(X)

# plot components and ask user which components to remove
# ...
remove_indices = [0, 1, 3]  # pretend the user selected components 0, 1, and 3

# "remove" unwanted components by setting them to 0 - simplistic but gets the job done
components[:, remove_indices] = 0

#reconstruct signal
X_restored = ica.inverse_transform(components)

很可能你对手动步骤不满意。不幸的是:)2013年还没有一个健壮的自动算法来标记眨眼成分。我不认为这已经改变,但如果有什么东西你会发现它是一个领域特定的包,如MNE或PyEEG。在


不过,如果你碰巧有EOG录音,还是有希望的!存在A fully automated correction method of EOG artifacts in EEG recordings。这种方法基于典型相关或回归(我不记得细节),但是你需要在脑电图的同时记录EOG信号。在


我用模拟的“脑电图”数据创建了一个工作示例。 数据包括三个通道:额叶、中央和顶叶。10赫兹的阿尔法活动在后面最强,一些眨眼样的尖峰在前面最强。在

希望这个例子能更好地说明如何从多通道数据中删除组件。在

^{pr2}$

enter image description here

如果您正在处理单通道EEG,以下是一种易于实现的方法:

1)使用简单的基于阈值的峰值检测来检测信号x中的闪烁(您可能需要通过查看信号中的几个闪烁实例来确定)。Neurosky、Muse等公司的设备都配有API来检测眨眼。如果需要,你可以用它。在

2)拍摄与闪烁对应的帧(xb)。在上面画一条平滑的线(xbs)。在

3)从闪烁(xb)中减去平滑线(xbs),并将信号的平均值相加。我们称之为xbc。在

4)将原始信号中的xbc替换为xb。在

相关问题 更多 >