Python中MNE库的EEG数据(PCA和ICA)预处理

PCA/ICA是脑电数据预处理的一个步骤,一般放在带通滤波处理之后,个人理解PCA和ICA的作用基本一致,用于去除心电和眼电的影响。不过PCA是提取主要成分,相当于降维提取特征,ICA是分离独立成分,目前PCA和白化已经是ICA的标准化的预处理步骤了(用于降低计算量)。所以说只做ICA就可以了,因为这个过程也包括PCA了。

(有关PCA和ICA的关系:https://www.zhihu.com/question/28845451

 

MNE库中的PCA和ICA

MNE的官方给出了两个ICA的例子,以Compute ICA components on epochs为例打开看看咋用的。

看起来还比较简单,一句话就搞定了。

可是将该算法应用到自己数据集的时候遇到了一个问题,可能是由于ICA技术太成熟了,其fit函数入参只支持Raw、Epoch或者Evoked类型的。然鹅我们自己数据集很少会有电极的位置信息,会导致程序报错。

有没有函数能满足入参为纯数据的要求呢?这样我们就能分析不同的数据集了,MNE库中还真有这种用法。搜索ICA会找到一个相关的函数应用例子,在这个例子中有介绍另一种方法可以实现入参为纯数据的ICA。

本以为不会支持这种计算方式,打开后发现这里的使用方法还是比较高级的,虽然使用了sklearn库中的函数,不过好处是不用考虑数太多据格式方面的问题。

PCA的相关计算

ICA的相关计算

 

示例

https://mne.tools/stable/auto_examples/decoding/plot_decoding_unsupervised_spatial_filter.html?highlight=pca

上面链接的例子中有对应的完整源码,就不详细解释了,以BCI运动想象的公开数据集为例,尝试处理了下得到如下结果,对应的部分中间处理过程打包到了资料包中,这里采用pkl保存中间处理结果的方式,pkl中的数据是经过挑选后的,如果需要原始的数据集参考:https://blog.csdn.net/zhoudapeng01/article/details/103822321

文章中用到的资料包:https://download.csdn.net/download/zhoudapeng01/12287679

 

代码片段:

import mne
import pickle
from mne.decoding import UnsupervisedSpatialFilter
import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA, FastICA

# 设置log输出等级
mne.set_log_level(False)

# 加载训练数据
with open(r'F:\BaiduNetdiskDownload\BCICompetition\BCICIV_2b_gdf\Train\CueLeftRight\trainData.pkl','rb') as f:
    epochsTrain = pickle.load(f)

# 绘制原始数据的epochs均值,也就是evoked
epochsTrain.average().plot()

# 获取训练数据(纯数据非epoch格式)
trainData = epochsTrain.get_data(['EEG:Cz', 'EEG:C3', 'EEG:C4'])

# 创建PCA的计算模型
pca = UnsupervisedSpatialFilter(PCA(3), average=False)
# 进行PCA处理
pca_data = pca.fit_transform(trainData)
# 将其转换为evoked类型并绘图
ev1 = mne.EvokedArray(np.mean(pca_data, axis=0),mne.create_info(3, 250, ch_types='eeg'), tmin=-0.2)
ev1.plot(show=False, window_title='ICA', time_unit='s')
plt.show()

# 创建FastICA的计算模型
ica = UnsupervisedSpatialFilter(FastICA(3), average=False)
# 进行ICA处理
ica_data = ica.fit_transform(trainData)

# 将其转换为evoked类型并绘图
ev2 = mne.EvokedArray(np.mean(ica_data, axis=0),mne.create_info(3,250, ch_types='eeg'), tmin=-0.2)
ev2.plot(show=False, window_title='ICA', time_unit='s')
plt.show()

 

从下图中可以看出PCA和ICA还是有很大差别的,很明显PCA后的各成分的幅值是由大到小的,有一种主次关系在里面。而ICA后的数据相对来说各成分的主次关系并不明显,体现的是独立成分的关系。

其中3个channel的数据

PCA的结果

ICA的结果

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值