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的相关计算
示例
上面链接的例子中有对应的完整源码,就不详细解释了,以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的结果