基于CSP的运动想象 EEG 特征提取和可视化参考前文:https://blog.csdn.net/qq_43811536/article/details/134273470?spm=1001.2014.3001.5501
目录
1. CSP是什么?
1.1 CSP的含义
CSP(Common Spatial Patterns)是一种常用于脑电图(Electroencephalogram,EEG)信号处理和特征提取的方法。CSP特征是通过CSP算法从EEG信号中提取得到的一组特征。
CSP特征在EEG信号处理中被广泛应用于脑机接口(Brain-Computer Interface,BCI)和脑电信号分类任务中。通过提取CSP特征,可以从原始EEG信号中提取出具有区分不同类别的脑电活动特征,为后续的模式识别和分类算法提供有价值的输入。
1.2 CSP算法
CSP算法的目标是找到一组空间滤波器,能够最大程度地增大不同类别之间的方差差异,从而使得不同类别的EEG信号在特定空间上呈现明显的差异。这些空间滤波器被称为CSP滤波器或CSP模式。
1.3 CSP特征的特点
- 刻画类别差异: CSP特征通过优化空间滤波器,使得不同类别的EEG信号在特定的空间维度上呈现出明显的差异。这样做的目的是为了提取和刻画不同类别(如不同的脑电活动状态或任务)之间的差异特征。
- 降低维度: CSP特征在提取过程中通常会将高维的EEG信号降低到较低的特征维度。通过CSP算法提取到的特征维度通常是原始EEG信号维度的一小部分,从而减少了特征的维度,方便后续的分类和识别任务。
- 数据解释性: CSP特征在一定程度上可以提供对EEG信号的解释性。通过CSP滤波器,可以观察到在特定空间上EEG信号的变化模式和脑区活动的差异,有助于理解不同类别之间的脑电活动特征。
2. CSP特征在EEG信号分类任务中的应用
2.1 任务说明
假设我们要设计一个BCI系统,用于识别脑电信号中特定的意图,比如左手运动和右手运动的意图。我们可以收集一组被试者进行实验,让他们在不同时间内执行左手和右手的动作任务,并记录相应的脑电信号。
2.2 数据预处理与特征提取
-
首先,我们需要对采集到的脑电信号进行预处理,比如滤波、去除噪声等。然后,我们将采集到的脑电信号分为左手运动和右手运动两个类别。
-
接下来,利用CSP算法,我们可以提取出一组CSP特征。CSP特征是一组空间滤波器,使得左手和右手运动的脑电信号在特定的空间维度上呈现出明显的差异。这些特征可以通过计算脑电信号的协方差矩阵和特征值分解来获取。
2.3 应用分类算法
- 我们可以使用提取到的CSP特征作为输入,结合分类算法(如支持向量机、k近邻等)进行训练和分类。将脑电信号的CSP特征作为输入,分类算法可以学习并建立一个模型,用于区分左手和右手运动的脑电信号。
- 在实时应用中,我们可以采集实时的脑电信号,并提取相应的CSP特征。然后,利用已经训练好的分类模型,将CSP特征输入到模型中进行预测和分类,从而实现对意图的识别和控制。
通过CSP特征的提取和分类模型的建立,BCI系统可以实现将脑电信号转化为对应动作意图的控制命令,例如实现实时控制外部设备或假肢的运动。这展示了CSP特征在脑电信号分类任务中的应用,帮助识别和解码脑电信号中的特定意图。
3. CSP算法的简单Python实现
3.1 Python代码
-
首先定义了一个CSP函数,该函数接受EEG信号矩阵X、对应的类别标签labels和要提取的CSP滤波器数量n_filters作为输入。在函数内部,根据类别计算协方差矩阵,然后进行广义特征值分解,选择前n_filters个特征向量作为CSP滤波器。最后,将滤波后的EEG信号返回。
-
在示例用法中,我们将EEG信号矩阵X展开成二维形式,然后将展开后的信号作为输入调用CSP函数来提取CSP特征。最后,使用线性判别分析(LDA)进行分类,预测类别标签。
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
def CSP(X, labels, n_filters):
# X: EEG信号矩阵,每行代表一个时间点的EEG信号
# labels: 对应每个时间点的类别标签
# n_filters: CSP滤波器的数量
# 分别计算类别之间的协方差矩阵
cov1 = np.cov(X[labels == 0].T)
cov2 = np.cov(X[labels == 1].T)
# 计算广义特征值分解,得到投影矩阵
eigvals, eigvecs = np.linalg.eig(np.dot(np.linalg.inv(cov1 + cov2), cov1))
# 对特征值进行排序
idx = np.argsort(eigvals)
idx = idx[::-1] # 降序排列
# 选择前n_filters个特征向量
W = eigvecs[:, idx[:n_filters]]
# 对EEG信号进行CSP滤波
X_csp = np.dot(W.T, X)
return X_csp
# 示例用法
# 假设有一组EEG信号矩阵X,形状为(epochs, channels, time_points)
# 假设有对应的类别标签labels,形状为(epochs,)
# 假设要提取的CSP滤波器数量为n_filters
# 将EEG信号矩阵展开成二维形式,每行代表一个时间点的EEG信号
X_flat = X.reshape(X.shape[0], -1)
# 应用CSP算法提取特征
X_csp = CSP(X_flat, labels, n_filters)
# 使用线性判别分析(LDA)进行分类
lda = LinearDiscriminantAnalysis()
lda.fit(X_csp, labels)
predicted_labels = lda.predict(X_csp)
3.2 CSP算法的输入数据说明
CSP算法的输入数据需要满足以下条件:
-
数据格式: 输入数据通常是一个二维矩阵,其中每行代表一个时间点的EEG信号。每列代表不同的电极通道或空间位置。因此,数据的维度应为
(时间点数, 通道数)
。 -
类别标签: 对应于每个时间点的类别标签应该与输入数据对应。标签的形状应为
(时间点数,)
,其中每个元素表示相应时间点的类别。 -
类别数量: CSP算法通常用于处理二分类问题,即将EEG信号分为两个不同的类别。因此,输入数据应包含至少两个不同的类别。如果有多于两个类别,通常需要将其转化为二分类问题,例如通过对每个类别进行一对一的多类别判别。
-
样本平衡: 在使用CSP算法时,最好确保各个类别的样本数量相对均衡。如果某个类别的样本数量远远超过其他类别,可能会导致算法偏向于该类别,影响分类性能。
参考
ChatGPT-3.5-Turbo