* 查询了一些脑电信号空间域的特征提取内容,发现还是要自己动手尝试复现一遍,才能更好地理解含义。
* 文章中数据下载链接:https://download.csdn.net/download/qq_41958946/86976371
* 共空间模式(CSP)算法: 采用监督(已知标签类别)的方法创建一个最优的公共空间滤波器(本质为空间滤波器);最大化一类方差的同时最小化另一类方差,采用同时对角化两类任务协方差矩阵的方式,得到可区分程度最大的特征向量。
* 关于CSP的使用已经从二分类拓展至多分类;并且针对CSP本身存在的一些问题,进行了一些改进,来提升算法本身的抗噪性、泛化能力等。
* 这里以两个不同类别Class1和Class2的数据为例 (通道数6*样本数据点4096)(二分类);
(各类仅取了一次实验的数据,排除多次实验需要循环项的干扰,关注于特征提取本身)
⭐ 参考:【协方差】【相关系数】【协方差矩阵】【散度矩阵】_梁小憨憨的博客-CSDN博客
* 协方差:主要用于表示两者间的相关性,如正负相关,相关系数等概念;
* 计算如下:
* 式中T表示矩阵的转置,trace表示矩阵对角线上元素的和。
(1) 计算Class1和Class2两类任务数据的协方差:
#1.协方差矩阵计算
Class1_Cov = Class1'*Class1./trace(Class1'*Class1);
Class2_Cov = Class2'*Class2./trace(Class2'*Class2);
* 运算结果:
(2) 计算两类数据空间协方差之和:
(2)
* 式中和分别表示两个任务的平均协方差矩阵(由于仅分别使用任务1和2的各一个数据,因此求任务1和2分别的平均协方差矩阵是为其本身)。
# 计算两类数据空间协方差之和
Cov_Sum = Class1_Cov + Class2_Cov;
* 白化:让特征之间尽可能不相关。
(1) 计算两类数据协方差之和Cov_Sum的特征矩阵Uc和特征向量λ(Dc):
(3)
# 计算两类数据协方差之和Cov_Sum的特征矩阵Uc和特征向量λ(Dc)
[Uc,Dc] = eig(Cov_Sum);
* eig函数:计算矩阵的特征向量和特征矩阵
* 运算结果:
(2) 提取特征向量λ(Dc)的对角元素,并将其按降序排列,得到白化矩阵P:
(4)
# 提取特征向量λ(Dc)的对角元素,并将其按降序排列,得到白化矩阵P
Eigenvalues = diag(Dc);
[Eigenvalues,egIndex] = sort(Eigenvalues, 'descend');# 降序
P = diag(sqrt(1./Eigenvalues))*Uc';
* diag函数:用于提取,替换矩阵的对角元素,或构造对角矩阵
* sort函数:排序
* 运算结果:
(1) 利用白化后的矩阵求两类任务的公共特征矩阵:
(5)
# 利用白化后的矩阵求两类任务的公共特征矩阵
transformedCov1 = P*Class1_Cov*P';
(2) 计算公共特征矩阵的特征向量和特征矩阵:
(6)
# 计算公共特征矩阵的特征向量和特征矩阵:
[U1,D1] = eig(transformedCov1);
Eigenvalues = diag(D1);
[Eigenvalues,egIndex] = sort(Eigenvalues, 'descend');# 降序排列
U1 = U1(:, egIndex);
(3) 计算投影矩阵:
(7)
# 计算投影矩阵
CSPMatrix = U1' * P;
(1) 将数据Class1和Class2据分别经过构建的滤波器Filter,滤波得到的特征为:
(8)
(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) 将特征生成为投影信号的对数方差:
# 确定特征向量
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特征。
参考资料:平台内资源。