共空间模式(Common Spatial Pattern, CSP)是一种对两分类任务下的空域滤波特征提取算法,能够从多通道的脑机接口数据里面提取出每一类的空间分布成分。公共空间模式算法的基本原理是利用矩阵的对角化,找到一组最优空间滤波器进行投影,使得两类信号的方差值差异最大化,从而得到具有较高区分度的特征向量。
假设 X 1 X_1 X1和 X 2 X_2 X2分别为两分类想象运动任务下的多通道诱发响应时-空信号矩阵,他们的维数均为 N ∗ T N*T N∗T, N N N为脑电通道数, T T T为每个通道所采集的样本数。为了计算其协方差矩阵,现在假设 N < T N
X i = [ C i C M ] [ S i S M ] , ( i = 1 , 2 ) (1) X_i=\left[C_{i}C_{M} \right]\begin{bmatrix} {S_{i}}\\ {S_{M}} \end{bmatrix} ,(i=1,2) \tag{1} Xi=[CiCM][SiSM],(i=1,2)(1)
上式(1)中, S 1 S_1 S1和 S 2 S_2 S2分别代表两种类型任务。假设两种信号源是相互线性独立的; S M S_M SM代表两种类型任务下所共同拥有的源信号,假设 S 1 S_1 S1是由 m 1 m_1 m1个源所构成的, S 1 S_1 S1是由 m 2 m_2 m2个源所构成,则 C 1 C_1 C1和 C 2 C_2 C2便是由 S 1 S_1 S1和 S 2 S_2 S2相关的 m 1 m_1 m1和 m 2 m_2 m2个共同空间模式组成的。由于每个空间模式都是一个 N ∗ 1 N∗1 N∗1维的向量,现在用该向量来表示单个的源信号所引起的信号在 N N N个导联上的分布权重。 C M C_M CM表示的是与 S M S_M SM相应的共有的空间模式。CSP算法的目标就是要设计空间滤波器 F 1 F_1 F1和 F 2 F_2 F2得到空间因子 W W W。
时空信号矩阵 X 1 X_1 X1和 X 2 X_2 X2归一化的协方差矩阵 R 1 R_1 R1和 R 2 R_2 R2:
R i = X i X i T t r a c e ( X i X i T ) ( i = 1 , 2 ) (2) R_i=\frac{X_{i}X_{i}^{T}}{trace\left(X_{i}X_{i}^{T}\right)} (i=1,2) \tag{2} Ri=trace(XiXiT)XiXiT(i=1,2)(2)
上式(2)中, X T X^{T} XT表示矩阵 X X X的转置, t r a c e ( X ) trace(X) trace(X)表示对矩阵对角线上元素求和。之后求解混合空间的协方差矩阵 R R R:
R = R 1 ‾ + R 2 ‾ (3) R=\overline{R_1}+\overline{R_2} \tag{3} R=R1+R2(3)
上式中, R i ‾ ( i = 1 , 2 ) \overline{R_i}(i=1,2) Ri(i=1,2)分别为任务1,2的平均协方差矩阵。
由于混合空间协方差矩阵 R R R是正定矩阵,由奇异值分解定理进行特征分解:
R = U λ U T (4) R=U\lambda U^{T} \tag{4} R=UλUT(4)
上式中, U U U是特征向量矩阵, λ \lambda λ为对应的特征值的对角阵,按特征值按降序排列,白化转换 U U U可得:
P = 1 λ U T (5) P=\frac{1}{\sqrt{\lambda}}U^{T} \tag{5} P=λ1UT(5)
将矩阵 P P P作用于 C 1 C_1 C1和 C 2 C_2 C2可得:
S 1 = P R 1 P T , S 2 = P R 2 P T (6) S_1=PR_{1}P^{T},S_2=PR_{2}P^{T} \tag{6} S1=PR1PT,S2=PR2PT(6)
S 1 S_1 S1、 S 2 S_2 S2具有公共特征向量,且存在两个对角矩阵 λ 1 \lambda_{1} λ1、 λ 2 \lambda_{2} λ2和相同的特征向量矩阵 B B B, 对 S 1 S_1 S1、 S 2 S_2 S2进行主分量分解,可得:
S 1 = B λ 1 B T S_1=B \lambda_{1}B^{T} S1=Bλ1BT
S 2 = B λ 2 B T (7) S_2=B \lambda_{2}B^{T} \tag{7} S2=Bλ2BT(7)
且两个特征值的对角阵 λ 1 \lambda_{1} λ1和 λ 2 \lambda_{2} λ2之和为单位矩阵:
λ 1 + λ 2 = I (8) \lambda_{1}+\lambda_{2}=I \tag{8} λ1+λ2=I(8)
由上式(8)可知,若 λ 1 \lambda_{1} λ1中的特征值按照降序排列,则 λ 2 \lambda_{2} λ2中对应的特征值按升序排列。由于 λ 1 \lambda_{1} λ1、 λ 2 \lambda_{2} λ2为 S 1 S_1 S1、 S 2 S_2 S2的对角矩阵,所以对于特征向量矩阵 B B B,当 S 1 S_1 S1有最大的特征值时, S 2 S_2 S2具有最小的特征值。因此可以利用矩阵 B B B实现两类问题的分类,由此得到投影矩阵 W W W:
W = B T P (9) W=B^{T}P \tag{9} W=BTP(9)
投影矩阵 W W W就是对应的空间滤波器。
将训练集的运动想象矩阵 X L X_{L} XL和 X R X_{R} XR经过滤波器 W W W滤波可得特征 Z L Z_{L} ZL和 Z R Z_{R} ZR:
Z L = W × X L Z_{L}=W \times X_{L} ZL=W×XL
Z R = W × X R (10) Z_{R}=W \times X_{R} \tag{10} ZR=W×XR(10)
对于测试数据 X i X_i Xi,其特征向量 f i f_i fi提取方式如下,
{ Z i = W × X i f i = v a r ( Z i ) ∑ ( v a r ( Z i ) ) \begin{cases} Z_i=W \times X_i \\ f_i=\frac{var(Z_i)}{\sum(var(Z_i))}\end{cases} { Zi=W×Xifi=∑(var(Zi))var(Zi)
将 f i f_i fi与 f L f_{L} fL和 f R f_{R} fR进行比较以确定第 i i i次想象为想象左还是想象右。根据CSP算法在多电极采集脑电信号特征提取的定义,其中 f L f_{L} fL和 f R f_{R} fR的定义如下:
f L = v a r ( Z L ) ∑ ( v a r ( Z L ) ) f_L=\frac{var(Z_L)}{\sum(var(Z_L))} fL=∑(var(ZL))var(ZL)
f R = v a r ( Z R ) ∑ ( v a r ( Z R ) ) f_R=\frac{var(Z_R)}{\sum(var(Z_R))} fR=∑(var(ZR))var(ZR)
clc;
clear;
EEGSignals = load('graz_data/CSP_train.mat'); % 加载带通滤波后的脑电数据
%check and initializations
EEG_Channels = size(EEGSignals.x_train,2);
EEG_Trials = size(EEGSignals.x_train,3);
classLabels = unique(EEGSignals.y_train);% Return non-repeating values
EEG_Classes = length(classLabels);
covMatrix = cell(EEG_Classes,1); % 协方差矩阵
% Computing the normalized covariance matrices for each trial
trialCov = zeros(EEG_Channels,EEG_Channels,EEG_Trials);
for i = 1:EEG_Trials
E = EEGSignals.x_train(:,:,i)';
EE = E*E';
trialCov(:,:,i) = EE./trace(EE); % 计算协方差矩阵
end
clear E;
clear EE;
% 计算每一类样本数据的空间协方差之和
for i = 1:EEG_Classes
covMatrix{i} = mean(trialCov(:,:,EEGSignals.y_train == classLabels(i)),3);
end
% 计算两类数据的空间协方差之和
covTotal = covMatrix{1} + covMatrix{2};
% 计算特征向量和特征矩阵
[Uc,Dt] = eig(covTotal);
% 特征值要降序排列
eigenvalues = diag(Dt);
[eigenvalues,egIndex] = sort(eigenvalues, 'descend');% 降序
Ut = Uc(:,egIndex);
% 矩阵白化
P = diag(sqrt(1./eigenvalues))*Ut';
% 矩阵P作用求公共特征向量transformedCov1
transformedCov1 = P*covMatrix{1}*P';
%计算公共特征向量transformedCov1的特征向量和特征矩阵
[U1,D1] = eig(transformedCov1);
eigenvalues = diag(D1);
[eigenvalues,egIndex] = sort(eigenvalues, 'descend');% 降序排列
U1 = U1(:, egIndex);
% 计算投影矩阵W
CSPMatrix = U1' * P;
% 计算特征矩阵
FilterPairs = 2; % CSP特征选择参数m CSP特征为2*m个
features_train = zeros(EEG_Trials, 2*FilterPairs+1);
features_test = zeros(EEG_Trials, 2*FilterPairs+1);
Filter = CSPMatrix([1:FilterPairs (end-FilterPairs+1):end],:);
%extracting the CSP features from each trial
for t=1:EEG_Trials
%projecting the data onto the CSP filters
projectedTrial_train = Filter * EEGSignals.x_train(:,:,t)';
projectedTrial_test = Filter * EEGSignals.x_test(:,:,t)';
%generating the features as the log variance of the projected signals
variances_train = var(projectedTrial_train,0,2);
variances_test = var(projectedTrial_test,0,2);
for f=1:length(variances_train)
features_train(t,f) = log(variances_train(f));
% features_train(t,f) = log(variances_train(f)/sum(variances_train)); %修改后对应公式
end
for f=1:length(variances_test)
features_test(t,f) = log(variances_test(f));
%features_test(t,f) = log(variances_test(f)/sum(variances_test)); % 修改后对应公式
end
end
CSP_Train_feature = features_train(:,1:4);
CSP_Test_feature = features_test(:,1:4);
save('CSP_feature.mat','CSP_Train_feature','CSP_Test_feature');
代码来源于网络
脑际爱好者笔QQ交流群:903290195
更多分享,请关注公众号: