二、生理信号处理(脑电信号) ——共空间模式算法(common spatial patterns, CSP)(含Matlab代码及分析)

        * 查询了一些脑电信号空间域的特征提取内容,发现还是要自己动手尝试复现一遍,才能更好地理解含义。

        * 文章中数据下载链接:https://download.csdn.net/download/qq_41958946/86976371


        * 共空间模式(CSP)算法: 采用监督(已知标签类别)的方法创建一个最优的公共空间滤波器(本质为空间滤波器);最大化一类方差的同时最小化另一类方差,采用同时对角化两类任务协方差矩阵的方式,得到可区分程度最大的特征向量。

        * 关于CSP的使用已经从二分类拓展至多分类;并且针对CSP本身存在的一些问题,进行了一些改进,来提升算法本身的抗噪性、泛化能力等。


        * 这里以两个不同类别Class1Class2的数据为例 (通道数6*样本数据点4096)(二分类)

        (各类仅取了一次实验的数据,排除多次实验需要循环项的干扰,关注于特征提取本身)

                               


1. 求两类数据的混合空间协方差矩阵

 ⭐ 参考:【协方差】【相关系数】【协方差矩阵】【散度矩阵】_梁小憨憨的博客-CSDN博客

        * 协方差:主要用于表示两者间的相关性,如正负相关,相关系数等概念;

        * 计算如下:

R1 = \frac{X_{1}X_{1}^{T}}{trace(X_{1}X_{1}^{T}))},R2 = \frac{X_{2}X_{2}^{T}}{trace(X_{2}X_{2}^{T}))}                                        (1)

        * 式中T表示矩阵的转置,trace表示矩阵对角线上元素的和。

        (1) 计算Class1和Class2两类任务数据的协方差:

#1.协方差矩阵计算
Class1_Cov = Class1'*Class1./trace(Class1'*Class1);
Class2_Cov = Class2'*Class2./trace(Class2'*Class2);

        * 运算结果:

     

        (2) 计算两类数据空间协方差之和:

R = \bar{R_{1}} + \bar{R_{2}}                                                                  (2)

        * 式中\bar{R_{1}}\bar{R_{2}}分别表示两个任务的平均协方差矩阵(由于仅分别使用任务1和2的各一个数据,因此求任务1和2分别的平均协方差矩阵是为其本身)

# 计算两类数据空间协方差之和
Cov_Sum = Class1_Cov + Class2_Cov;

2. 求出白化特征值矩阵P

        * 白化:让特征之间尽可能不相关。

        (1) 计算两类数据协方差之和Cov_Sum的特征矩阵Uc和特征向量λ(Dc):

R=U_{c}\lambda U_{c}^{T}                                                                  (3)

# 计算两类数据协方差之和Cov_Sum的特征矩阵Uc和特征向量λ(Dc)
[Uc,Dc] = eig(Cov_Sum);

        * eig函数:计算矩阵的特征向量和特征矩阵

        * 运算结果: 

           

           (2) 提取特征向量λ(Dc)的对角元素,并将其按降序排列,得到白化矩阵P:

P=\sqrt{\lambda^{-1}}U^{T}                                                                 (4)

# 提取特征向量λ(Dc)的对角元素,并将其按降序排列,得到白化矩阵P
Eigenvalues = diag(Dc);
[Eigenvalues,egIndex] = sort(Eigenvalues, 'descend');# 降序
P = diag(sqrt(1./Eigenvalues))*Uc';

        * diag函数:用于提取,替换矩阵的对角元素,或构造对角矩阵

        * sort函数:排序        

        * 运算结果:

           

3. 构建空间滤波器       

        (1) 利用白化后的矩阵求两类任务的公共特征矩阵:

S_{1}=PR_{1}P^{T},S_{2}=PR_{2}P^{T}                                                  (5)

# 利用白化后的矩阵求两类任务的公共特征矩阵
transformedCov1 = P*Class1_Cov*P';

        (2) 计算公共特征矩阵的特征向量和特征矩阵:

S_{1}=B_{1}\lambda_{1} B_{1}^{T} , S_{2}=B_{2}\lambda_{2} B_{2}^{T}                                                 (6)

# 计算公共特征矩阵的特征向量和特征矩阵:
[U1,D1] = eig(transformedCov1);
Eigenvalues = diag(D1);
[Eigenvalues,egIndex] = sort(Eigenvalues, 'descend');# 降序排列
U1 = U1(:, egIndex);

        (3) 计算投影矩阵:

W= B^{T}P                                                                   (7)

# 计算投影矩阵
CSPMatrix = U1' * P;

4. 特征提取

        (1) 将数据Class1和Class2据分别经过构建的滤波器Filter,滤波得到的特征为:

Z_{Class1} = W\times X _{Class1}                                                       (8)

Z_{Class2} = W\times X _{Class2}                                                       (9)

# CSP特征选择参数m
# CSP特征为2*m个   
FilterPairs = 2;       
features = zeros(1, 2.*FilterPairs+1);

        * 取CSPMatrix的前FilterPairs行和后FilterPairs行构建Filter,是因为两端更能表现特征。

# 取了CSPMatrix的前FilterPairs行和后FilterPairs行
Filter = CSPMatrix([1:FilterPairs (end-FilterPairs+1):end],:);
projected_Class1 = Filter * Class1';

        * 运算结果:对于Class1的一次实验数据,得到6个通道中每个通道的4个值表示特征。

        (2) 将特征生成为投影信号的对数方差:

f_{Class1} = \frac{VAR(Z_{Class1}))}{sum(VAR(Z_{Class1}))))}                                              (10)

f_{Class2} = \frac{VAR(Z_{Class2}))}{sum(VAR(Z_{Class2}))))}                                              (11)

# 确定特征向量
variances_train = var(projected_Class1,0,2);  
for f=1:length(variances_train)
    features(f) = log(variances_train(f));
end
CSP_Class1_feature = features(1:4);

        * 运算结果:

        * 最终结果:CSP_Class1_feature即为任务1的特征,同理可求任务2特征。


 参考资料:平台内资源。

猜你喜欢

转载自blog.csdn.net/qq_41958946/article/details/127691341