EEG 情绪识别论文复现:我把 3s sliding、VMD、RF 都做了,结果还是很真实
1. 这次为什么选 GU EEG 这条线
这次我没有继续沿用图像数据集,而是换到了一条更小、更贴论文任务本身的数据线:
- 数据集:
EEG Emotion Recognition Dataset_GU - 论文时间:
2025 - 任务:三分类情绪识别
- 情绪类别:
happiness、sadness、fear
这条线适合做复现,有几个很现实的原因:
- 论文和数据集之间是直接对应关系
- 原始数据已经在本地,不需要重新找数据源
- 任务规模不大,适合快速固定协议
- 即使最终没复现到论文数值,也能形成一篇高质量复现实录
2. 论文原文到底要求怎么做
这篇论文真正做的不是“原始 EEG 直接上深度学习”,而是下面这套流程:
- 数据采集与情绪诱发
0.5–45 Hz带通Savitzky-Golay去趋势ICA去眼动伪迹VMD分解成5个IMF- 使用
3s sliding window,而且是50% overlap - 计算频带功率特征
- 用
KNN / SVM / DT / RF做分类
其中几个非常关键的论文参数,原文是明确写出来的:
5-IMF decomposition3s窗口50% overlap80/20 train-test split- 训练集上再做
6-fold cross-validation
更重要的是,论文 SHAP 段落明确写到最终模型解释的是 25 个特征。这个信号很关键,因为它几乎等价于:
5 个 IMF5 个频带5 × 5 = 25维输入
也就是说,如果复现时还是把通道维直接展开,那和论文最优模型的输入口径大概率就不一致了。
3. 我先把本地数据协议固定了
在本地这套工程里,我先做的是把“实验口径”固定下来,而不是一上来盲目追分。
当前本地数据事实是:
- 原始记录数:
10 - 通道数:
32 - 采样率:
128 Hz
我先按论文描述的刺激时间切 trial:
10-25s:happiness phase 130-45s:sadness phase 150-65s:fear phase 175-90s:happiness phase 295-110s:sadness phase 2115-130s:fear phase 2
这样得到:
60个 trial-level 样本30个训练 trial30个测试 trial
这一步的意义不是“先刷高分”,而是先保证后续每一轮实验都能在同一套协议上比较。
图 1 项目逻辑图

4. 第一阶段:先把基础 baseline 跑通
我最开始先不碰论文主线里的 VMD,而是先做一个比较稳的频域 baseline:
Bandpower + SVM- accuracy:
0.5000 - macro-F1:
0.4682
- accuracy:
Bandpower + RF- accuracy:
0.4333 - macro-F1:
0.4202
- accuracy:
CNN1D- accuracy:
0.3929 - macro-F1:
0.3379
- accuracy:
这组结果不算高,但它说明了一件更重要的事:
数据读取、标签映射、特征抽取、训练和评估链路已经真正闭合了。
图 2 baseline

5. 第二阶段:把论文主线里的 VMD 补进来
跑通 baseline 之后,我开始往论文口径靠:
VMD-IMF53s窗口- 后来补上
bandpass + Savitzky-Golay + z-score
先看一版更贴论文的主线结果:
VMD-IMF5 + RF- accuracy:
0.3400 - macro-F1:
0.3211
- accuracy:
VMD-IMF5 + SVM- accuracy:
0.3667 - macro-F1:
0.3511
- accuracy:
补完更像论文的前处理之后:
Preprocess + VMD-IMF5 + RF- accuracy:
0.3533 - macro-F1:
0.3512
- accuracy:
Preprocess + VMD-IMF5 + SVM- accuracy:
0.4133 - macro-F1:
0.4084
- accuracy:
这里有一个很明确的结论:
低准确率不是随便换个分类器就能救起来的,前处理链本身就很重要。
6. 第三阶段:我把论文里最关键的 25 维特征也重做了
论文原文里有一个很容易被忽视、但非常关键的信号:
SHAP 分析对象是 25 个特征。
这让我意识到,论文最优结果的输入很可能不是高维通道展开,而是:
5 IMF × 5 band = 25维特征
所以我又单独实现了一版更像论文的 25 维特征输入:
3s窗口50% overlap5 IMF5 band- 跨通道做聚合
然后把论文里明确提到的四个分类器全部跑了一遍:
KNN:accuracy0.4148SVM:accuracy0.4148RF:accuracy0.3593DT:accuracy0.3407
这一步特别重要,因为它说明:
即使把输入特征口径也往论文靠,结果依然没有复现出论文里的 RF 优势。
7. 第四阶段:把论文的评估协议也补进来了
论文正文里明写的是:
80/20 train-test split- 训练集上做
6-fold CV
所以我后来把训练脚本扩成了论文式评估模式,然后用这套协议重跑了同一版 25 维特征。
这一轮结果依然是:
KNN最好,test accuracy0.4352RF只有0.3611
也就是说:
把评估协议对齐之后,结果依然没有往论文的 99% 靠拢。
图 3 当前结果总览

8. 论文和本地结果差得有多大
我把论文报告值和本地最好结果画成了一张很直接的图。
论文公开报告值:
RF validation accuracy = 0.9957RF testing accuracy = 0.9936
而我这边目前比较稳的本地结果,大致在:
0.41 ~ 0.50
这说明这次复现不是“少调一点参数就能对齐”的量级差异,而是:
公开论文里一定还有一些没有在正文里写清楚的关键实现细节。
图 4 论文结果与本地复现差距图

9. 我还验证了哪些可疑点
为了尽量把“是不是我自己实现错了”这件事排干净,我又补做了几轮验证:
- 更密的 overlap
CNN1DCNN-BiLSTM-AttentionSTFT + CNN2DICA两种版本- 不同
VMD参数 25维特征的不同跨通道聚合方式
这些验证最后给出的共同结论是:
- 不是轮数问题
- 不只是窗口 overlap 问题
- 不只是评估协议问题
- 不只是“通道均值聚合”问题
真正没对齐的,最可能还是:
- 作者内部未公开的特征构造细节
RF / KNN / SVM / DT的具体超参数- 人工
ICA成分剔除规则 - 数据清洗与样本筛选的隐含规则
图 5 论文 Table 1 热力图

10. 那这次复现算不算成立
我现在对这条线的判断很明确:
成立,但不是“论文数值复现成功”,而是“高保真复现尝试成立”。
也就是说,这次最有价值的不是某一个分数,而是把下面这些事情真的做出来了:
- 论文任务定义被翻译成了本地工程
- 论文主线方法被逐段实现和核验
- 多种潜在差异被逐个排查
- 最终把“为什么没能对齐结果”这件事讲清楚了
这比只写一句“我没复现出来”有价值多了。
11. 这条线对后续写作有什么价值
如果你把这条线当成一篇 CSDN 文章,它的亮点不在于“我也做到了 99%”,而在于:
- 你不是停留在摘要复述
- 你真的把论文拆开重做了
- 你做了多轮排查
- 最后给出了一个有根据的复现结论
这种文章比单纯贴代码和结果更有说服力,因为它更像真实科研工程,而不是结果导向展示。
12. 当前结论
一句话总结这次 GU EEG + 2025 复现:
这不是一篇“我成功复现到了 99%”的文章,而是一篇“我把一篇近两年 EEG 论文拆开做完,最后确认公开细节不足导致结果无法对齐”的高保真复现实录。
这次复现最让我感受到的一点是,真正难的从来不是“把代码跑起来”,而是把论文里那些默认被略过的实现细节一点点补齐。GU EEG 这条线最后没有把 99% 复现出来,但它让我更清楚地看到了高分论文和可复现工程之间到底隔着什么。对我来说,这样的复现实验不是失败,反而更接近真实。
需要资料私信我哟
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)