当前位置:   article > 正文

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

mne pca

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

 

代码片段:

  1. import mne
  2. import pickle
  3. from mne.decoding import UnsupervisedSpatialFilter
  4. import matplotlib.pyplot as plt
  5. import numpy as np
  6. from sklearn.decomposition import PCA, FastICA
  7. # 设置log输出等级
  8. mne.set_log_level(False)
  9. # 加载训练数据
  10. with open(r'F:\BaiduNetdiskDownload\BCICompetition\BCICIV_2b_gdf\Train\CueLeftRight\trainData.pkl','rb') as f:
  11. epochsTrain = pickle.load(f)
  12. # 绘制原始数据的epochs均值,也就是evoked
  13. epochsTrain.average().plot()
  14. # 获取训练数据(纯数据非epoch格式)
  15. trainData = epochsTrain.get_data(['EEG:Cz', 'EEG:C3', 'EEG:C4'])
  16. # 创建PCA的计算模型
  17. pca = UnsupervisedSpatialFilter(PCA(3), average=False)
  18. # 进行PCA处理
  19. pca_data = pca.fit_transform(trainData)
  20. # 将其转换为evoked类型并绘图
  21. ev1 = mne.EvokedArray(np.mean(pca_data, axis=0),mne.create_info(3, 250, ch_types='eeg'), tmin=-0.2)
  22. ev1.plot(show=False, window_title='ICA', time_unit='s')
  23. plt.show()
  24. # 创建FastICA的计算模型
  25. ica = UnsupervisedSpatialFilter(FastICA(3), average=False)
  26. # 进行ICA处理
  27. ica_data = ica.fit_transform(trainData)
  28. # 将其转换为evoked类型并绘图
  29. ev2 = mne.EvokedArray(np.mean(ica_data, axis=0),mne.create_info(3,250, ch_types='eeg'), tmin=-0.2)
  30. ev2.plot(show=False, window_title='ICA', time_unit='s')
  31. plt.show()

 

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

其中3个channel的数据

PCA的结果

ICA的结果

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/261811
推荐阅读
相关标签
  

闽ICP备14008679号