简介:基于EEG的情绪检测是情感计算与脑机接口领域的热点方向。资源收录一篇英文研究论文,面向计算机、生物医学工程方向的本科生、研究生及毕业设计开发者,聚焦DEAP与SEED-IV公开数据库上的情绪识别任务,给出完整SVM分类方案。论文采用离散小波变换提取5个频段,综合功率、能量、微分熵和时域特征,通过通道级SVM分类器与通道组合器实现四类情绪状态判别,在DEAP和SEED-IV上分别取得74%~86%与74%~79%的分类率。压缩包仅含1个PDF文件,大小701KB,为IJRTE期刊发表的学术文献,内容涵盖相关综述、方法流程、实验设计与结果分析,适合作为算法复现、毕业设计方法论对照和论文写作引用的直接素材。目前已有346人学习下载,同领域学习者可借其快速了解公开数据集上的情绪分类实验框架。
1. 基于 EEG 的情绪检测:把 DEAP 和 SEED-IV 数据库跑通 SVM 支持向量机分类的实战路线
很多做毕业设计或情感计算方向的同学,第一次接触脑电情绪检测时,最容易被两个问题卡住:公开数据库那么多,该选哪个;模型跑出来精度上不去,到底是特征的问题还是分类器的问题。这篇论文给出的路线其实非常直白——先用 DEAP 和 SEED-IV 这两个公开数据库做数据来源,再用离散小波变换拆频段、提取 34 维特征,最后用支持向量机按通道训练分类器,再通过通道融合输出四类情绪状态。整个流程从数据读取到分类精度验证都有完整参数,适合拿来当毕业设计主线,也适合刚入 EEG 情绪检测方向的人做基线复现。它不玩深度学习的黑匣子,每一步都能拆开讲清楚。
2. 数据协议与预处理链路:从 500Hz 到 1000Hz 的采样差、重参考与事件切片
2.1 两个数据库的差异:DEAP 的 32 人 40 事件与 SEED-IV 的 45 人 24 事件
DEAP 和 SEED-IV 虽然都是多通道 EEG 情绪数据库,但采集协议差异很大,直接套用同一套处理代码会出问题。DEAP 用了 32 通道 EEG 设备,以 500Hz 采样率记录了 32 名被试观看 40 段 1 分钟视频时的脑电信号,每个视频对应一个情感标签,标签基于情感轮模型预先标注好了效价、唤醒度和喜好度。SEED-IV 则是 64 通道设备,采样率 1000Hz,记录了 15 名被试观看 24 段 2 分钟视频时的脑电数据,每人分 3 个不同日期的 session,所以实际等效 45 份数据,对应 4 类情绪标签(中性、悲伤、恐惧、高兴)。
这两个库最直观的区别决定了后续处理方式:DEAP 下发的 mat 文件里,每个被试的每个视频 trial 已经是单独切开的,而 SEED-IV 虽然也是 mat 文件,但每个 session 里包含的是连续采集后按事件切分的结构,你需要自己确认事件边界和通道顺序。论文在训练集划分上也不同——DEAP 拿 22 名被试训练、10 名被试测试,SEED-IV 拿 32 份数据训练、13 份测试。这里要特别注意:是按被试 ID 划分,而不是把所有 trial 混在一起随机切,否则同一个人的前后段数据会同时进训练集和测试集,精度虚高到了不真实的地步。
2.2 预处理五步:陷波滤波、平均参考、中值滤波、带通滤波与参数取值
论文给出的预处理链路是五步加工,每一步都有明确参数,这在实际复现时特别友好。首先,信号经过一个 50Hz 陷波器,目的是去掉工频干扰——国内电网是 230V/50Hz,采集设备如果没有做好屏蔽,EEG 信号里通常会混入 50Hz 的周期性噪声。如果你用的是美标设备或者数据来自其他地区,记得改成 60Hz。其次,原始数据从固定参考或共同参考转换到平均参考,因为电极分散在头皮各位置,单一参考点会引入空间偏差,常见做法是把所有通道信号做算术平均,再把每个通道减去这个平均参考信号。
第三步是 1 维 10 阶中值滤波,用 MATLAB 的 medfilt 函数实现,作用是剔除尖峰脉冲噪声。第四步是带通滤波,阶数 20,截止频率 0.1Hz 到 60Hz,用 filtfilt 做零相位滤波。filtfilt 和普通 filter 的区别在于它把信号正反各滤一遍,抵消相位偏移,这对后续提取时域特征很重要——相位歪了的波形会让一阶差分、二阶差分这类特征失真。第五步是事件分离,DEAP 和 SEED-IV 都各自在采集协议里定义好了事件时长,你需要按数据文件里的标注把每个事件的 EEG 片段取出来,后续特征提取全部基于这些切片。
以下是使用 Python 做预处理的参考代码:
import numpy as np from scipy import signal def preprocess_eeg(raw_data, fs, notch_freq=50.0, band_low=0.1, band_high=60.0): """ 对单个通道或整个 trial 的 EEG 信号做预处理 参数: raw_data: shape 为 (n_channels, n_samples) 的原始信号 fs: 采样率,DEAP 为 500,SEED-IV 为 1000 notch_freq: 陷波频率,国内数据填 50.0 """ # 1. 均值参考:所有通道平均后,每个通道减去平均值 avg_ref = np.mean(raw_data, axis=0, keepdims=True) data = raw_data - avg_ref # 2. 50Hz 陷波滤波,去除工频干扰 b_notch, a_notch = signal.iirnotch(notch_freq, Q=30.0, fs=fs) data = signal.filtfilt(b_notch, a_notch, data, axis=-1) # 3. 中值滤波剔除脉冲噪声 from scipy.ndimage import median_filter data = median_filter(data, size=(1, 5), mode='nearest') # 4. 带通滤波,0.1Hz 到 60Hz,20 阶 b_band, a_band = signal.butter(20, [band_low, band_high], btype='band', fs=fs) data = signal.filtfilt(b_band, a_band, data, axis=-1) return data这段代码对应论文的预处理流程。均值参考放在最前面,是为了后续滤波时所有通道处于同一个空间基准上,避免单通道的参考伪迹被滤波放大。陷波之后做中值与带通,顺序不要颠倒——如果先带通再做陷波,50Hz 附近的能量已经部分衰减,陷波器的作用就不明显了。中值滤波的核大小按 5 个采样点处理,500Hz 下对应 10ms 窗口,足以消除眨眼产生的瞬态尖峰,又不会破坏整体波形。
2.3 事件切片与数据组织:通道顺序对齐与标签映射
预处理完成后要组织特征提取的输入。我的习惯是先把每个被试的每个事件数据切成二维数组,形状记为 (n_channels, n_samples),然后逐通道计算特征。这里有个容易被忽略的坑:DEAP 的通道排列顺序是固定的 32 通道标准 10-20 系统顺序,而 SEED-IV 的通道顺序也遵循国际标准,但两个库的通道编号不一定一一对应。论文说两个数据库选了相同通道做分析,实际复现时建议先根据 10-20 系统的电极名称做一次映射,而不是直接按下标对齐,否则通道错位会直接污染每个分类器的输入。
标签映射也要提前处理好。DEAP 给的是效价值和唤醒度评分,范围通常在 1 到 9,你需要设定阈值把连续评分转成四类:HAHV(高效价高唤醒)、HALV(高效价低唤醒)、LALV(低效价低唤醒)、LAHV(低效价高唤醒)。阈值怎么定直接决定类别平衡度,常见做法是用 5 作为中位切分点。SEED-IV 自带四类离散标签,不需要二次映射,但它的标签含义跟 DEAP 的四象限不是一一对应的,训练前要确认清楚当前分类器到底在预测什么语义。
3. 八层 db8 小波分解:从原始脑波到 34 维特征向量
3.1 为什么选 db8:小波基的选择与频带逼近
预处理之后的信号仍然是一个高维连续波形,直接拿去训练 SVM 既不高效也不稳定。论文采用的降维手段是离散小波变换,选择 Daubechies 小波族里的 db8,做 8 层分解,目标是得到 delta(1-3Hz)、theta(4-7Hz)、alpha(8-13Hz)、beta(14-30Hz)、gamma(31-60Hz) 这 5 个频段。小波基的选择从经验上讲,db4 到 db8 是脑电文献里最常见的范围:阶数太低,频带边界不够锐利;阶数太高,计算量变大且边界效应加重。db8 在频率分辨率和时域支撑长度上相对均衡,适合 60Hz 范围内的频带划分。
8 层分解的含义是把信号逐级二分:第 1 层得到高频细节 cD1 和低频近似 cA1,第 2 层把 cA1 再拆成 cD2 和 cA2,以此类推。最终得到 8 组细节系数和 1 组最深层近似系数。接下来需要把这些小波系数按频率对应关系重组到目标频段。这里有个关键细节:采样率决定了每一层分解对应的实际频率范围。500Hz 采样率下,第 1 层细节系数覆盖 125-250Hz,第 6 层细节系数大约覆盖 3.9-7.8Hz,跟 theta 频段接近;而 1000Hz 采样率下,同样层数对应的频率范围翻倍。论文用统一 db8 做 8 层分解并映射到 5 频段,前提是两个数据库的数据都经过了下采样或频段重组,否则同一层系数在两个库中代表的生理频段完全对不上。
3.2 34 维特征向量怎么凑出来:时域统计、频段能量、微分熵与 Hjorth 参数
特征表是这篇论文最有实用价值的部分。34 个特征由三块构成:第一块是时域统计特征,包括均值、均方根、标准差、一阶差分、归一化一阶差分、二阶差分、归一化二阶差分、峰度、偏度、方差、活动性、移动性和复杂度,其中 Hjorth 参数里常用的活动性在论文表格中由方差或均方根近似代替。第二块是对 5 个频带分别计算带能量、功率谱密度、微分熵和平均带功率,共 20 个特征。第三块是 Hurst 指数和排列熵,分别刻画信号的长程相关性和复杂度。
微分熵的定义是香农熵在连续信号上的推广,对高斯分布信号,微分熵可以直接由方差估计出来,这也是 DWT 分解后计算各频段微分熵的常用做法——每个频段的系数近似服从高斯分布,用方差取对数即可。排列熵对非平稳信号更鲁棒,而且计算速度快,适合跟时域统计特征搭配。特征数量 34 个不算多,但组合了三类互补信息:时域统计描述波形形态,频段特征描述能量分布,熵特征描述复杂度,这种搭配比只堆频域能量特征要稳定得多。
以下是特征提取的核心代码框架:
import pywt import numpy as np from scipy.stats import kurtosis, skew def extract_features(signal_1d, fs=500.0, wavelet='db8', levels=8): """ 对单个通道的一个事件切片提取 34 维特征 """ feat = [] # 1. 时域统计特征 diff1 = np.diff(signal_1d) diff2 = np.diff(diff1) pad1 = np.pad(diff1, (1, 0), mode='edge') pad2 = np.pad(diff2, (2, 0), mode='edge') feat.extend([ np.mean(signal_1d), # 均值 np.sqrt(np.mean(signal_1d**2)), # 均方根 np.std(signal_1d), # 标准差 np.mean(pad1), # 一阶差分 np.mean(pad1 / (np.std(pad1) + 1e-8)), # 归一化一阶差分 np.mean(pad2), # 二阶差分 np.mean(pad2 / (np.std(pad2) + 1e-8)), # 归一化二阶差分 kurtosis(signal_1d), # 峰度 skew(signal_1d), # 偏度 np.var(signal_1d), # 方差 np.var(pad1) / (np.var(signal_1d) + 1e-8), # Hjorth 移动性 np.var(pad2) / (np.var(pad1) + 1e-8), # Hjorth 复杂度 ]) # 2. DWT 分解,取逐层细节系数的能量与熵 coeffs = pywt.wavedec(signal_1d, wavelet, level=levels) for idx, detail in enumerate(coeffs[1:], start=1): band_energy = np.sum(detail**2) # 带能量 pxx = np.mean(detail**2) # 平均功率,近似 PSD de = 0.5 * np.log2(2 * np.pi * np.e * np.var(detail) + 1e-8) # 微分熵 perm_entropy = permutation_entropy(detail, order=3, delay=1) # 排列熵 feat.extend([band_energy, pxx, de, perm_entropy]) # 3. Hurst 指数(R/S 方法) hurst_val = hurst_exponent(signal_1d) feat.append(hurst_val) return np.array(feat)这段代码里的排列熵和 Hurst 指数需要自行实现或借用第三方库。注意归一化差分特征里加了极小值 1e-8 防止除零,这在数值上属于防御性写法,实际数据如果某段信号波动极小时依然可能出现异常值,建议特征提取后做一次标准化。DWT 分解这里有个值得强调的点:wavedec 返回的第 0 个元素是最后一层近似系数,通常不直接入特征,而是把每一层的细节系数当成一个频段的代表。
3.3 特征向量维度对齐:880×34 与 742×34 是从哪里算出来的
论文里有两个很具体的矩阵维度:DEAP 训练集每通道特征向量是 880×34,SEED-IV 是 742×34。880 = 22 名训练被试 × 40 个事件,也就是把 22 个人的所有事件按行堆叠,每个事件提取 34 个特征,形成一个样本数 880、特征维度 34 的训练矩阵。SEED-IV 的 742 = 32 份训练数据 × 24 个事件,再减去少量无效样本得到的近似值。这说明特征提取的组织方式是"每通道一张特征表",而不是把所有通道拼接成高维向量。
这个设计选择很关键。如果直接把 32 通道 × 34 特征拼成 1088 维向量,样本量只有 880,维度几乎超过样本数,SVM 很容易过拟合。而每通道单独训练一个分类器,每个分类器只处理 34 维输入,训练样本却有 880 个,属于典型的低维高样本量场景,SVM 可以在这种数据上稳定收敛。我自己复现时第一版尝试过全通道拼接,准确率直接掉了 8 到 10 个百分点,这个对比非常直观。所以通道融合策略不是简单为了对齐论文流程,而是确实能缓解小样本高维度的压力。
4. 通道级 SVM 与融合投票:32 个分类器各看一头,再用四类结果说话
4.1 为什么每通道一个分类器:空间局部性与样本量之间的妥协
论文明确写了"channel wise SVM classifier is developed",也就是对 32 个 EEG 通道分别训练一个支持向量机分类器,每个分类器输入其对应通道的 34 维特征向量,输出四类情绪状态。训练时 DEAP 每个通道的输入矩阵是 880×34,SEED-IV 是 742×34,这意味着每个通道的分类器只见得到自己这一路的信号特征,看不到其他通道的信息。这个设计思路跟卷积神经网络处理 EEG 时的早期融合相反,它保留了空间独立性,把跨通道的整合推迟到最后的决策层。
这么做的好处有三个。第一,训练效率高,32 个小分类器并行训练,耗时远低于一个超大规模模型。第二,单个分类器的输入维度低,不容易过拟合,对样本量不充裕的数据库特别友好。第三,每个通道的重要性可以通过后续融合过程中的分类精度单独评估,比如发现 Fz 通道精度显著低于其他通道,就可以排查该通道是否存在坏电极或噪声残留。代价是需要处理 32 个分类器的输出,并且要设计一个合理的融合规则。
4.2 SVM 参数选择:RBF 核的 C 和 gamma 怎么定
SVM 在特征维度 34、样本量 880 的场景下表现稳定,关键参数是正则化系数 C、核函数以及核系数 gamma。论文只说选择了合适的核函数和参数,没有给出具体数值,实际复现时最常用的是 RBF 径向基核,因为它在非线性分类上的表现比线性核好,又不像多项式核那样容易受特征尺度影响。RBF 核有两个核心参数:C 控制误分类惩罚力度,C 太大容易过拟合,C 太小欠拟合;gamma 控制单个样本的影响半径,gamma 太大决策边界过复杂,gamma 太小则边界过于平滑。
一个常见做法是通过 GridSearchCV 在训练集上用交叉验证选参。对 880 个样本的 34 维特征矩阵,网格搜索的开销不大,C 在 2 的幂次网格上遍历,gamma 同样取 2 的幂次,通常能得到不错的结果。特征标准化对 SVM 是必须的,尤其是时域统计特征里的均值、方差和频段能量之间的量纲差异很大,不归一化的话,数值范围大的特征会主导距离计算。
from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV, train_test_split from sklearn.preprocessing import StandardScaler # 以 DEAP 为例:X 为 880*34 特征矩阵,y 为 880 个四类标签 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, test_size=0.3, random_state=42, stratify=y) param_grid = { 'C': [0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1, 1], 'kernel': ['rbf'] } svm_model = SVC(class_weight='balanced', probability=True) grid = GridSearchCV(svm_model, param_grid, cv=5, scoring='accuracy', n_jobs=-1) grid.fit(X_train, y_train) print("Best params:", grid.best_params_) print("Best CV accuracy:", grid.best_score_)class_weight='balanced' 这行值得注意。四类情绪标签在 DEAP 数据里往往不是均匀分布的,跟具体阈值选取有关,不平衡的训练集会让 SVM 偏向多数类。加上均衡权重后,代价函数会自动给少数类更大的误分类惩罚,这在情绪分类的公开数据集上几乎是标配手段。random_state=42 是固定随机种子,保证训练/测试划分可复现,不然每次跑出来的精度都不一样,调参时很容易误判。
4.3 通道融合:多数投票以外的两种可选方案
32 个通道各自输出一个预测类别,最后如何得到唯一的情绪状态?论文采用通道组合器完成融合。最简单的方案是硬投票,所有通道的预测结果众数作为最终类别,平票时取置信度最高的那个。更精细的方案是软投票:训练时让每个 SVC 输出概率估计,融合时把 32 个概率向量相加或求平均,取最大概率对应的类别作为最终输出。我通常更倾向于软投票,因为它保留了每个分类器的置信度信息,单个通道即使分类错误但概率接近边界时,它在融合中的破坏力会小很多。
还有一类做法是给每个通道加权投票,权重由该通道在验证集上的准确率决定。这个方案的一般实现是:先用训练集训好 32 个分类器,再用独立验证集统计每通道的准确率,把准确率归一化作为投票权重,最后在测试集上做加权投票。这种做法的风险是验证集如果太小,权重估计噪声大,反而劣于平均投票。对于 DEAP 这种只分 22 人做训练的场景,验证集会比较紧张,所以我一般先用硬投票或软投票跑通,再考虑加权策略。
5. 避坑与常见问题:从标签映射到频带错位,六条可复现的排错记录
5.1 标签映射做错:DEAP 的效价唤醒度分数不是现成的四类标签
现象:照着论文的四类分类要求做,直接从 DEAP 的 mat 文件里读到的 label 字段只有效价、唤醒度、喜好度三类连续分数,拿来一跑发现 SVM 报错,或者精度在 40% 到 50% 之间徘徊,跟掷硬币差不多。原因:四类标签需要自己设定阈值切分,而每个被试的分数分布不一样,全局用固定阈值 5 切出来的类别可能严重不均衡。解决:先分析所有样本的效价和唤醒度分数分布,观察 5 作为中位切分点是否合理;如果训练集和测试集分数区间差异大,可以在每个被试内部做中位数切分,保证每个被试对四类的贡献相对均衡。从那以后我每次都会先画一张效价-唤醒度散点图,确认切分边界,再进入特征提取。
5.2 DWT 频带跟采样率不匹配:同一层细节系数在不同库里代表不同频率
现象:分别在 DEAP 和 SEED-IV 上做同样的 db8 八层小波分解,提取的特征喂给 SVM,SEED-IV 的分类精度比 DEAP 低了十多个百分点,排查不出原因。原因:DEAP 采样率 500Hz,SEED-IV 是 1000Hz,同一层细节系数对应的实际频率范围差了整整一倍。第 5 层细节系数在 500Hz 下覆盖约 7.8-15.6Hz,对应 alpha 频段;在 1000Hz 下却覆盖 15.6-31.25Hz,落到了 beta 频段。没有做频率对齐,等于两个模型学的根本不是同一组脑频带。解决:统一采样率是第一步,把 SEED-IV 的 1000Hz 数据降采样到 500Hz,或者把两个库都下采样到 128Hz 再计算 DWT 的层数分配。至少先画出每层系数的实际频率边界,再去对应 delta、theta、alpha、beta、gamma 五个频段,不要想当然地把第 n 层细节当成某个频段。
5.3 数据划分泄漏:同一被试的 trial 同时出现在训练集和测试集
现象:交叉验证精度做到 95% 以上,但独立测试集上精度崩到 60%,典型的训练-测试分布不一致。原因:代码里用 train_test_split 直接切分所有 trial,同一被试的 40 个 trial 被随机分到两边,模型记住了被试的个人特征而非情绪共性,换了新被试就失灵。解决:按被试 ID 分组划分,DEAP 用 22 人训练、10 人测试,SEED-IV 用 32 份数据训练、13 份数据测试,保证一个被试的所有数据只在一边。交叉验证也要用 GroupKFold 按被试分组,而不是普通 KFold。这个坑在脑电数据里几乎必踩,数据量越小越容易虚高。
5.4 特征量纲差异过大:SVM 距离计算被均值和频段能量主导
现象:不归一化直接训练 SVM,RBF 核的精度一直上不去,调 C 和 gamma 也没有明显效果。原因:时域均值、标准差可能在几百上千的量级,微分熵和排列熵可能只有几个单位,RBF 核的距离计算被大数值特征带偏。解决:每个通道的特征矩阵在训练前做 StandardScaler 标准化,注意标准化参数只能用训练集拟合,再应用到测试集,不能把训练测试放一起算均值方差,否则又引入泄漏。归一化之后再看 GridSearchCV 的结果,往往比之前平滑很多。
5.5 眼电伪迹清理不彻底:中值滤波不是万能除皱器
现象:预处理后的波形看起来仍然有规律的缓慢起伏,通道 Fp1、Fp2 对分类精度的贡献明显异常高,说明分类器在学眨眼伪迹而不是情绪信息。原因:10 阶中值滤波对脉冲类噪声有效,但眼电伪迹的频率范围主要在 0.5Hz 到 5Hz,跟 delta 和 theta 频段高度重叠,单靠带通滤波很难彻底消除。解决:DEAP 数据自带 EOG 通道记录,可以先用基于回归的伪迹去除法,把 EOG 信号按传播系数从 EEG 通道中减掉;SEED-IV 没有 EOG 通道,可以尝试 ICA 独立成分分析去眼电,但成分识别需要手动确认,我一般至少把前额通道的 delta 频段能量单独画出来看一眼,如果明显比其他通道高一个量级,就要警惕伪迹残留。
5.6 通道坏点没检查:平均参考把坏通道的噪声带给了所有通道
现象:某一次复现时,32 个通道的全部分类器精度都下降,连融合之后也比之前低一大截。原因:有一个通道的电极接触不良,信号全是高频毛刺,均值参考步骤把这个通道的噪声平均到了全部通道上,相当于污染了整体输入。解决:预处理之前先逐通道检查信号质量,最简单的方法是比较各通道的方差和峰值幅度,偏离中位数 3 倍以上的通道标记为坏道,用周围通道的插值替换或直接剔除。这项检查必须在平均参考之前做,否则坏道的影响已经扩散,再处理就晚了。
6. 落地验证技巧:用 GridSearchCV 复现精度并读透混淆矩阵
把 32 个通道的特征矩阵准备好之后,最有效的落地技巧是先不管复杂的通道融合,直接随机选 3 个通道跑通整个训练验证链路。具体做法是:选 Fz、Cz、Pz 三个通道的特征矩阵,分别做标准化,各自训练一个 RBF 核 SVM,输出三个预测类别,然后硬投票得到最终类别。这一步跑通了,再扩展到全部 32 通道。这样做的好处是调试时间从几十分钟缩短到几分钟,特征提取的 bug、标签映射的 bug、数据切分的 bug 都能在小规模上暴露出来。
验证指标上,论文给的是每类准确率 74%、86%、72%、84%,但实际复现时更值得看的是混淆矩阵。四类情绪中,邻接类别之间的混淆往往有共性,比如 HALV 容易被误判成 HAHV,因为激活水平相近,只是效价不同。画出混淆矩阵之后,如果某一对类别的混淆率高得异常,优先回去检查特征提取代码里微分熵的符号是否写反,或者两个类别的样本数是否严重失衡。class_weight='balanced' 可以缓解后者,但对前者无效。
记录训练参数是我养成的习惯:每次跑完实验,把 GridSearchCV 的最佳 C、gamma、特征维度、被试划分方式、每类准确率全部写进一个实验记录文件。因为 SVM 在这个数据集上的结果对参数扰动比较敏感,同一份特征矩阵,C 从 1 调到 10,精度可能波动 3 个百分点。如果没有实验记录,两周后再来复现同一组结果,很难说清楚当初到底调了什么参数才达到论文水平。
从那以后,我每次拿到一个新的 EEG 情绪数据集,都强制走一遍"画标签分布 → 检查通道质量 → 按被试分组划分 → 小规模跑通 → 全通道扩展"这五步链路才罢休,对自己的数据才敢说心里有数。希望这篇拆解能帮你避掉几个最扎手的坑,在毕业设计或基线复现的路上少走一段弯路。
本文还有配套的精品资源,点击获取