☰
基于脑电信号的情绪识别:从DEAP与SEED-IV到通道级SVM四分类实战
2026/10/17 16:42:29 网站建设 项目流程

简介:这份资源是一篇基于脑电信号开展情绪检测的研究论文,面向情感计算、脑机接口方向的学习者与毕业设计选题者,尤其适合需要复现经典实验或撰写相关论文的高年级本科生与研究生。论文围绕DEAP与SEED-IV两个公开数据库展开,采用离散小波变换提取5个频段,并计算功率、能量、微分熵与时域等特征,进而构建通道级SVM分类器与通道组合器,识别二维模型下的人类内在情绪状态,DEAP四类分类率分别为74%、86%、72%、84%,SEED-IV为79%、76%、77%、74%。资源包内共1个PDF文件,约701KB,完整呈现论文的摘要、引言、方法、实验与结论等章节,便于读者系统了解EEG情绪检测的完整技术路线与实验设计。目前已有346人学习,可作为毕业设计选题参考、算法复现依据或论文写作素材,帮助读者快速掌握从信号预处理、特征提取到分类器设计的整体流程。

1. 情绪识别为什么不能只靠“看表情”:从脑电信号到四象限分类的底层逻辑

情绪识别这件事,很多人第一反应是摄像头拍脸、麦克风听声音。但真正做过就知道,表情可以伪装,语音可以控制,唯独脑电信号很难“演”出来。问题在于,脑电信号极其微弱,还混着眼电、肌电、工频干扰,直接拿原始波形去分类,基本等于在噪声里找规律。更麻烦的是,情绪本身没有统一标签——同一段视频,有人觉得兴奋,有人觉得烦躁。所以这套基于 DEAP 和 SEED-IV 数据库、用 SVM 做四分类的方案,核心要解决的不是“怎么分类”,而是“怎么把连续、含噪、个体差异极大的脑电信号,变成一组可判别、可复现的特征向量”。它用离散小波变换拆频段,用通道级 SVM 加融合策略做决策,最终在 DEAP 上拿到 74% 到 86% 的分类率。这个数字不算惊艳,但它的价值在于把整条链路讲清楚了:从事件切分、滤波、特征提取到分类器设计,每一步都有明确的工程取舍。搞懂这条链路,比单纯追一个高准确率更有意义。

2. 数据到手之前:DEAP 与 SEED-IV 的采集协议差异如何影响后续建模

2.1 两个数据库的通道数、采样率与事件结构

DEAP 和 SEED-IV 虽然都是公开脑电情绪数据库,但采集协议完全不同,这直接决定了预处理和特征提取不能一套代码硬套。DEAP 用 32 通道设备,采样率 500Hz,32 名被试,每人看 40 段 1 分钟视频,原始数据是连续记录后按事件切分成 mat 文件。SEED-IV 用 64 通道设备,采样率 1000Hz,15 名被试,每人 3 个 session,每个 session 看 24 段 2 分钟视频,数据已经是预切分好的 mat 文件。注意这里有个容易翻车的点:SEED-IV 的 45 个“被试”其实是 15 人乘 3 次 session,如果按人头随机划分训练测试集,同一个人不同 session 的数据会同时出现在训练和测试里,准确率会被严重高估。论文里写的是“32 名被试训练,13 名测试”,实际对应的是 session 级划分,不是人头级。做毕业设计时如果忽略这一点,答辩时被问“你怎么保证被试独立”会很难解释。

2.2 事件切分与标签体系:四象限怎么来的

情绪状态用二维模型表示:效价(Valence)和唤醒度(Arousal),各分高低,组合成四个象限——高唤醒高效价(HAHV)、高唤醒低效价(HALV)、低唤醒低效价(LALV)、低唤醒高效价(LAHV)。DEAP 原始标签是连续值,需要按阈值离散化;SEED-IV 本身是离散情绪标签,但论文把它映射到四象限。这里的关键是:标签质量直接决定分类上限。如果阈值选得不好,边界样本会让 SVM 学到一个模糊的超平面。常见的做法是对每个被试单独做标签归一化,而不是全局统一阈值,因为不同人对“高唤醒”的主观感受差异很大。论文没有展开这一点,但从它 70% 训练、30% 测试的划分来看,应该是做了被试内或 session 内的相对标准化。

2.3 采样率不一致带来的重采样问题

DEAP 是 500Hz,SEED-IV 是 1000Hz,而脑电有效频段集中在 0.1 到 60Hz。根据奈奎斯特采样定理,500Hz 已经远远够用。但两个数据库混用时,必须统一到同一采样率,否则 DWT 分解出的频段边界会对不上。论文里 SEED-IV 用的是降采样后的数据,具体降到多少没有明说,但从后续 8 层 db8 小波分解来看,大概率降到了 500Hz 或 256Hz。这里有个工程细节:降采样之前必须先做抗混叠滤波,否则高频噪声会折叠到低频段,污染 delta 和 theta 频段。很多开源代码直接调resample而不做抗混叠,结果分类器在 gamma 段的表现异常差,就是因为这个。

3. 预处理链路:为什么 50Hz 陷波、中值滤波和 0.1–60Hz 带通一个都不能少

3.1 工频干扰与陷波滤波器的选择

脑电信号幅度通常在微伏级,而市电是 50Hz(论文明确写了使用 50Hz、230V 交流电源),工频干扰可以直接淹没信号。所以第一步是 50Hz 陷波。但陷波滤波器有个副作用:它会在 50Hz 附近引入相位失真,如果后续做时域特征(比如一阶差分、Hjorth 参数),这个失真会影响结果。常见的改进是用自适应陷波或者谱插值,但论文用的是固定陷波,说明它更看重实现简单和可复现。对于毕业设计级别的项目,固定陷波够用,但如果要做实时系统,建议换成自适应方案。

3.2 平均参考与中值滤波:去除脉冲噪声

脑电采集时通常用某个电极做参考(比如耳垂或乳突),但参考电极本身也有噪声。论文把数据从固定参考转为平均参考,用的是移动平均重参考。这一步的本质是:把所有电极的均值当作动态参考,抵消掉共同噪声。接着用 10 阶一维中值滤波(MATLAB 的medfilt)去除脉冲噪声。中值滤波对尖峰特别有效,比如被试眨眼或肌肉抽动产生的瞬态。但要注意,中值滤波窗口不能太长,否则会平滑掉脑电的瞬态特征,比如 ERP 成分。论文用 10 阶,在 500Hz 采样率下对应 20ms 窗口,这个尺度刚好能压住脉冲又不至于过度平滑。

3.3 带通滤波的边界为什么是 0.1Hz 和 60Hz

带通滤波用 20 阶、0.1–60Hz,通过 MATLAB 的filtfilt实现。filtfilt是零相位滤波,它先正向滤一遍再反向滤一遍,抵消相位延迟。这对后续提取时域特征很重要,因为相位失真会让一阶差分和二阶差分失去物理意义。0.1Hz 的下限是为了保留极低频成分,但也要注意,0.1Hz 以下的漂移通常来自电极极化或出汗,如果不滤掉,DWT 分解时 delta 段会被漂移主导。60Hz 的上限则是因为脑电有效成分很少超过 60Hz,而且 50Hz 工频已经被陷波压过一次,带通再压一次是双重保险。

import numpy as np from scipy.signal import iirnotch, filtfilt, medfilt, butter # 假设 raw_eeg 形状为 (channels, samples),采样率 500Hz fs = 500 # 50Hz 陷波 b_notch, a_notch = iirnotch(50, Q=30, fs=fs) eeg_notched = filtfilt(b_notch, a_notch, raw_eeg, axis=-1) # 中值滤波去脉冲,窗口 10 个采样点 eeg_median = np.apply_along_axis(lambda x: medfilt(x, kernel_size=11), -1, eeg_notched) # 0.1-60Hz 带通,20 阶 b_band, a_band = butter(20, [0.1, 60], btype='band', fs=fs) eeg_filtered = filtfilt(b_band, a_band, eeg_median, axis=-1)

这段代码对应论文预处理三步。iirnotch的 Q 值控制陷波带宽,Q 越大带宽越窄,对 50Hz 附近有用信号的损伤越小。medfilt的 kernel_size 取 11 是为了保证奇数窗口,对应约 22ms。butter的 20 阶在filtfilt下等效 40 阶,过渡带足够陡。注意filtfilt要求信号长度至少是滤波器阶数的 3 倍,否则会报错,这是实际跑代码时最常见的翻车点。

4. 特征提取:DWT 八层分解与 34 维特征向量的构造逻辑

4.1 db8 小波八层分解如何对应五个频段

离散小波变换用 db8 做 8 层分解,得到 5 个频段:delta(1–3Hz)、theta(4–7Hz)、alpha(8–13Hz)、beta(14–30Hz)、gamma(31–60Hz)。这里有个细节:DWT 分解出的频段边界是二分的,不是直接按生理频段划分。以 500Hz 采样率为例,第 1 层细节系数对应 125–250Hz,第 2 层 62.5–125Hz,第 3 层 31.25–62.5Hz,第 4 层 15.6–31.25Hz,第 5 层 7.8–15.6Hz,第 6 层 3.9–7.8Hz,第 7 层 1.95–3.9Hz,第 8 层 0.98–1.95Hz。论文说的五个频段是把相邻层合并或取近似,比如 gamma 取第 3 层细节,beta 取第 4 层,alpha 取第 5 层,theta 取第 6 层,delta 取第 7+8 层。这种映射不是严格的生理频段,但工程上够用。如果要做更精确的频段划分,可以用小波包分解,但计算量会大很多。

4.2 时域、频域和其他特征:34 维怎么凑出来的

论文列出的特征分三类。时域统计特征包括均值、均方根、标准差、一阶差分、归一化一阶差分、二阶差分、归一化二阶差分、峰度、偏度、方差、Hjorth 参数的 mobility 和 complexity,共 12 个。频域特征对 5 个频段各算 4 个:频带能量、功率谱密度、微分熵、平均频带功率,共 20 个。其他特征 2 个:Hurst 指数和排列熵。12+20+2=34,正好对应论文说的 34 维特征向量。注意微分熵在脑电情绪识别里很常用,它等价于高斯假设下的对数能量,计算比功率谱密度快,适合实时场景。Hurst 指数衡量信号的长程相关性,排列熵衡量复杂度,这两个对情绪状态的变化比较敏感,但计算量也更大。

4.3 通道级特征向量的组织方式

论文对每个通道单独算 34 维特征,32 个通道就是 32 组特征向量。DEAP 训练集是 22 个被试乘 40 个事件,共 880 个样本,每个样本 34 维,所以特征矩阵是 880×34。SEED-IV 训练集是 32 个 session 乘 24 个事件,共 768 个样本,论文写的是 742×34,可能有部分样本被剔除。这里的关键是:通道级建模意味着每个通道独立训练一个 SVM,最后再融合。这样做的好处是保留了空间信息,坏处是计算量大——32 个通道就要训 32 个分类器。如果通道之间有强相关,其实可以先做通道选择或降维,但论文没有做,说明它更看重可解释性。

import pywt # 对单通道信号做 8 层 db8 小波分解 coeffs = pywt.wavedec(eeg_filtered_channel, 'db8', level=8) # coeffs[0] 是近似系数,coeffs[1] 到 coeffs[8] 是各层细节系数 # 按论文映射:gamma 取 coeffs[3],beta 取 coeffs[4],alpha 取 coeffs[5] # theta 取 coeffs[6],delta 取 coeffs[7] + coeffs[8] bands = { 'gamma': coeffs[3], 'beta': coeffs[4], 'alpha': coeffs[5], 'theta': coeffs[6], 'delta': coeffs[7] + coeffs[8] } # 对每个频段算能量、微分熵等 def band_energy(coeff): return np.sum(np.square(coeff)) def diff_entropy(coeff): # 高斯假设下微分熵与 log(方差) 成正比 var = np.var(coeff) return 0.5 * np.log(2 * np.pi * np.e * var + 1e-12)

这段代码展示了 DWT 分解和频段映射。pywt.wavedec返回的系数长度逐层减半,coeffs[7] + coeffs[8]需要先对齐长度,实际实现时通常取coeffs[7]或做上采样。微分熵用方差的对数近似,这是脑电情绪识别里的标准做法,因为脑电在小波域近似高斯分布。注意1e-12是防止方差为零时 log 报错,实际数据里很少出现,但代码健壮性要有。

5. 通道级 SVM 与融合策略:32 个分类器怎么投票出一个情绪标签

5.1 SVM 核函数与参数选择

论文提到 SVM 用了正则化、gamma 和核函数等参数,通过选择合适参数实现非线性分类。虽然没有明说核函数类型,但从“非线性分类”和脑电特征的非线性特性来看,大概率是 RBF 核。RBF 核有两个关键参数:C 和 gamma。C 控制惩罚力度,C 越大越容易过拟合;gamma 控制核的宽度,gamma 越大决策边界越复杂。论文没有给具体数值,这是很多毕业设计论文的通病——参数不写清楚,别人复现不了。常见的做法是用网格搜索加交叉验证,在训练集上找最优 C 和 gamma。对于 880×34 的特征矩阵,RBF 核 SVM 的训练时间可以接受,但如果通道数增加到 64,计算量会翻倍。

5.2 通道融合:为什么不能简单取平均

32 个通道各有一个 SVM,每个输出一个四分类结果。最简单的融合是多数投票,但脑电通道的空间分布不均匀——额叶和颞叶对情绪更敏感,枕叶主要处理视觉信息。如果等权投票,枕叶的噪声会拉低整体准确率。论文说的“通道组合器”没有展开细节,但常见的实现思路是加权投票,权重可以用通道的验证集准确率或互信息来定。另一种做法是堆叠:把 32 个 SVM 的输出概率作为新特征,再训一个元分类器。论文的准确率在 DEAP 上从 72% 到 86% 不等,说明不同类别的融合效果差异很大,可能就是因为某些通道对特定情绪象限更敏感。

5.3 训练测试划分与过拟合风险

DEAP 用 22 个被试训练、10 个测试,SEED-IV 用 32 个 session 训练、13 个测试。这种划分方式保证了被试独立,但有个问题:如果训练集和测试集的被试在情绪表达上差异很大,模型泛化会变差。论文没有报告交叉验证结果,只给了单次划分的准确率,这在统计上不够稳健。更严格的做法是留一被试交叉验证(LOSO),但计算量会大 32 倍。对于毕业设计,单次划分可以接受,但答辩时如果被问“你怎么证明不是运气好”,最好补一个 5 折交叉验证的结果。

from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV # 单通道 SVM 训练,X_train 形状 (n_samples, 34),y_train 形状 (n_samples,) param_grid = { 'C': [0.1, 1, 10, 100], 'gamma': ['scale', 0.01, 0.001, 0.0001], 'kernel': ['rbf'] } svm = SVC(probability=True) grid = GridSearchCV(svm, param_grid, cv=5, scoring='accuracy', n_jobs=-1) grid.fit(X_train, y_train) best_svm = grid.best_estimator_ # 32 个通道各训一个,预测时收集概率 channel_probs = [] for ch in range(32): prob = best_svm.predict_proba(X_test_channel[ch]) channel_probs.append(prob) # 加权投票:权重用验证集准确率 weights = np.array([ch_acc[ch] for ch in range(32)]) weights = weights / weights.sum() final_prob = np.average(channel_probs, axis=0, weights=weights) final_label = np.argmax(final_prob, axis=1)

这段代码展示了通道级 SVM 训练和加权融合。GridSearchCV用 5 折交叉验证找最优参数,probability=True让 SVM 输出概率而不是硬标签。加权投票的权重来自各通道的验证集准确率,这比等权投票更合理。注意n_jobs=-1会占满所有 CPU 核心,如果数据量大,内存可能不够,需要分批训练。

6. 避坑与排查:复现这套流程时最容易翻车的五个地方

6.1 现象:准确率远低于论文,只有 50% 左右

原因:标签映射错了。DEAP 的效价和唤醒度是连续值,阈值选 5 还是中位数,结果差别很大。如果阈值选错,四类样本严重不均衡,SVM 会偏向多数类。 解决:先画标签分布直方图,确认四类样本量大致均衡。如果不均衡,用类权重class_weight='balanced'或对少数类过采样。

6.2 现象:训练集准确率 95%,测试集只有 60%

原因:被试内数据泄漏。如果随机划分样本而不是按被试划分,同一个人的数据同时出现在训练和测试里,模型记住了这个人的特征,换人就崩。 解决:严格按被试或 session 划分,训练集和测试集的被试 ID 不能有交集。用GroupKFold而不是普通KFold。

6.3 现象:DWT 分解后频段能量全是 NaN 或零

原因:信号长度不够。8 层 db8 分解要求信号长度至少是滤波器长度的 2^8 倍,db8 滤波器长度是 16,所以至少需要 4096 个采样点。如果事件切分太短,分解会失败。 解决:检查每个事件的长度,DEAP 的 1 分钟视频在 500Hz 下有 30000 个点,够用;但如果做了降采样或切分窗口,要确保长度足够。不够就减少分解层数或补零。

6.4 现象:融合后准确率反而比单通道低

原因:通道权重没选好,或者某些通道全是噪声。如果某个通道的验证集准确率接近随机(25%),它的投票会拖后腿。 解决:设一个准确率阈值,低于阈值的通道直接剔除。或者用互信息、递归特征消除做通道选择,只保留对情绪敏感的通道。

6.5 现象:SEED-IV 上表现比 DEAP 差很多

原因:SEED-IV 是 64 通道,论文只用了 32 通道,如果通道选择不对应,空间信息丢失。另外 SEED-IV 的 session 间差异大,不同天采集的信号分布可能漂移。 解决:对 SEED-IV 做 session 内标准化,每个 session 单独减均值除标准差。通道选择参考论文用的 32 通道位置,不要随便取前 32 个。

7. 从 74% 到更高:这套通道级 SVM 方案的设计取舍与进阶方向

这套方案最值得琢磨的地方,是它选择了“通道级独立建模 + 后期融合”,而不是“多通道联合特征 + 单分类器”。前者保留了空间可解释性——你能知道哪个通道对哪类情绪贡献大,后者虽然可能准确率更高,但变成了黑匣子。论文在 DEAP 上四类准确率分别是 74%、86%、72%、84%,波动很大,说明某些情绪象限(比如 HALV 和 LAHV)在特征空间里重叠严重。如果换成多通道联合特征,比如把 32 通道的 34 维特征拼接成 1088 维,再用 PCA 降维后训一个 SVM,可能会更稳,但计算量和过拟合风险都会上升。

另一个取舍是 DWT 的 db8 小波。db8 的消失矩是 8,适合分析平滑信号,但脑电里的瞬态成分(比如 ERP)可能被平滑掉。如果换成 db4 或 sym8,频段划分会更细,但计算量增加。论文没有做小波基的对比实验,这是一个可以深挖的点。我一般会建议先跑一遍 db4、db8、sym8 的对比,看哪个在验证集上更稳,再定下来。

特征方面,34 维里时域特征占了 12 维,但脑电情绪识别里频域特征通常更关键。如果做消融实验,可能会发现去掉时域特征后准确率只掉 2 到 3 个百分点,但计算量减少三分之一。微分熵和频带能量高度相关,两者留一个就够。Hurst 指数和排列熵计算慢,如果做实时系统,可以考虑用近似熵或样本熵替代,速度更快。

最后说验证方法。论文只用了单次划分,没有交叉验证,也没有报告混淆矩阵。如果我要复现这套流程,会强制走一遍 5 折被试独立交叉验证,并且画出混淆矩阵,看哪两类最容易混。通常 LALV 和 LAHV 容易混,因为低唤醒状态下效价区分度低。知道这一点后,可以针对这两类单独设计特征或调整阈值。从那以后我每次做脑电分类,都先把混淆矩阵画出来,再决定往哪个方向优化。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询