我正在尝试将电信号(特别是脑电图信号)映射到动作上。我从脑电图设备中获取了原始数据,共有14个通道,因此对于每个训练数据实例,我得到一个14×128的矩阵(14个通道,每个通道128个样本,1秒窗口)。目前我的做法是,对每个通道应用汉明窗,然后应用快速傅里叶变换(FFT)来进行频率分类。我无法理解的是,SVM(或其他分类算法)期望的矩阵形式如下:
特征1 | 特征2 | 特征3 | …. | 特征N | 类别
但在脑电图的情况下,每个通道都是一个特征,但每个通道不是单一值,而是一个包含128个值的向量。将这个矩阵转换成SVM可以理解的形式的最佳方法是什么?比如,我是否只需修改14×128的矩阵,添加新的列作为类别,然后将它们一个接一个地附加起来?这样,对于脑电图信号的1秒记录,我最终会得到128个正/负类别吗?
回答:
在将原始数据传递给SVM之前,你几乎肯定需要进行一些特征提取。对于这种时间序列数据,重要的特征通常不是由单个点读数很好地表示的。相反,它们是由时间上的关系捕获的。
大约十年前,我曾使用SVM对脑电图数据进行过研究[1],当时我们所做的是将数据分成窗口,然后为每个窗口构建自回归模型。我们的分类器特征不是原始传感器读数,而是每个通道的AR系数。这为分类器提供了更有用的信息。
我已经不再在这个领域工作了,我不能确定现在10年后人们在做什么,但可以肯定的是,我预计最先进的技术仍然会涉及某种形式的特征提取。
[1] http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=1214704(可从我的个人页面获取pdf http://www.ru.is/kennarar/deong/pubs/ieee_eeg_final.pdf)
编辑:鉴于评论中的讨论,我编辑了答案以提供更多细节。信号处理不是我的强项,所以如果我完全误解了你所描述的内容,请随意忽略。
是的,你问的问题的答案是,当你有多个通道的数据,你的实例是一个矩阵时,你只需将行连接成一个行向量。因此,如果对于每个训练实例,你得到一个14×128的矩阵,你只需将其转换为一个1×1792的向量,然后在末尾加上类别标签。比如
c1x1 | c1x2 | c1x3 | ... | c1x128 | c2x1 | c2x2 | ... | c14x127 | c14x128 | class
其中cNxM = 第N个通道,第M个样本。这是从一种特征矩阵中制作单一特征向量的标准方法。
但是…继续阅读以了解为什么我认为这不是你真正想做的。
我仍然不清楚你描述的是什么。特别是,128这个数字从何而来?我在这里看到两种可能性。(A)是你对14个电极中的每一个采样128次,用于每个你想要分类的项目。这是我所说的原始数据。(B)是你已经运行了DFT,并且每个通道最终得到128个系数。我认为你指的是(A),这是我在这里假设的,但这并不完全清楚。
对于分类,你需要有意义的特征。特征只是你决定的任何东西。你可以对14个传感器中的每一个计算128个点的均值和方差,并将这些作为你的特征。在这种情况下,你的训练实例看起来像
mean_ch1 | var_ch1 | mean_ch2 | var_ch2 | ... | mean_ch14 | var_ch14 | class
然而,对于脑电图分类,均值和方差不会很好——它们不太可能提供足够有用的信息来区分类别。这就是我所说的有意义的特征。如果你想预测例如一种入侵物种是否会在湖中繁殖,你可能需要知道温度。你可以将湖中每个水分子的估计速度单独传递给分类器,但这完全是错误的细节级别,分类器不太可能学到任何东西。你需要给它已经计算好的温度。
所以在你的情况下,你可以对每个128点的窗口进行FFT。这将为每个通道提供一些非零系数。然后你的训练数据看起来像
dft_coeff1_ch1 | cft_coeff2_ch1 | dft_coeff3_ch1 | dft_coeff1_ch2 | dft_coeff2_ch2 | ... | class
你也可以直接将每个通道的128个值未经修改地放入特征向量中,这样每个输入就有14*128=1792个特征,但这些特征可能非常无用——你再次给它的是分子的速度而不是温度。原则上,大多数学习算法都能够学习目标概念,但对训练数据量和所需时间的要求可能非常大。
特征应该捕捉分类器可以使用的细节级别。对于大多数时间序列数据,这通常意味着高层次的概念性事物,如“向上倾斜”、“V形”、“一段时间平稳,然后下降”、“以这些频率振荡”等。任何你作为人类认为可能相关的东西。这真的是使用像傅里叶变换这样的东西的原因——频域为你提供了更高层次的,可能更有用的信号描述,自由度比时域少得多。