最近在研究运动想象算法,其中CSP来提取特征用的比较多,尤为是在二分类的问题中,以前写过一篇如何在MNE库中实现CSP算法的博客,用的是MNE库中已经写好的算法,如今想本身实现该算法,研究了几天发现坑仍是比较多的。。。先列出一些参考的博客文章,里面有对应的算法在matlab中的实现,后面主要是解释算法中的一些细节以及本身对该算法的理解。强烈建议下载本博客的资源包对照着看,里面是整理好的博客中用到的资料。html
CSP原理:算法
CSP在Python MNE库中的实现编程
matlab代码实现:函数
上面既然都有实现好的版本了,本着拿来主义的思想原本不打算本身开发的,可是考虑到后面须要支持多种编程语言的实现,以及验证算法的准确性,我在python中也实现了一遍,并尝试理解每一条语句的意义,及其对应的原理。不弄不知道啊,一弄发现了不少有趣的细节。3d
一句话总结CSP算法:共空间模式算法的基本原理是利用矩阵的对角化。找到一组最优空间滤波器进行投影,使两类信号的方差差别化最大,从而获得具备较高区分度的特征向量。
上面所说的特征向量也就至关于滤波器,输入数据通过和特征向量的运算就会获得最大差别化方差的信号,这个信号我理解为是“原始波形”,测量结果=原始波形 * 电极位置,这一点在后面会详细解释。
算法的实现原理在前面的博客中都有所介绍,但愿你们能对照着看,公式的推导这里就再也不赘述,下面主要说一下对应的代码实现中遇到的问题。
问题1 求协方差矩阵
全部的资料第一步都是求对应数据的协方差矩阵,其对应的计算公式为
不知道你们有没有注意到这根本不是协方差矩阵的标准形式,协方差矩阵的计算方法见:https://blog.csdn.net/Mr_HHH/article/details/78490576。协方差的计算应该是去均值后的数据,而且是对列的运算,矩阵X的协方差计算公式为:
那为何在这里会这么计算呢?对行计算这个问题好解释,由于脑波数据通常都是按行存储的,这就是转置的问题。但是为何它不用减去均值,而且也没有求平均。这个问题困扰了我很久,最后在一篇文献中找到了想要的答案。
《Designing optimal spatial filters for single-trial EEG classification in a movement task》文章的796页有以下两段话。
第一段话主要的意思是说,EEG数据是滤波后的,均值为零,看到这恍然大悟,滤波后的数据没有直频份量,均值那可不就是零么,那也就不用减均值了。