FEATURED · 精选文章

基于DEAP数据集与SVM的脑电情感识别:从预处理到模型调优全流程实践

发布时间 / 2026/8/30 0:23:44
来源 / 创域科博编辑部
栏目 / 资讯中心
基于DEAP数据集与SVM的脑电情感识别:从预处理到模型调优全流程实践 简介本资源是一套面向脑机接口与情感计算方向研究者的完整论文代码实现方案聚焦DEAP数据集上的四分类情绪识别任务效价-唤醒二维象限划分适用于具备MATLAB基础与机器学习入门知识的研究生及科研人员。资源包含16个文件以10个核心MATLAB脚本如频带滤波、DWT特征提取、SVM训练等、3个Jupyter Notebook含KNN对比实验、1篇PDF论文、1份README说明及辅助文本文件为主总大小仅488KB结构紧凑、模块清晰便于复现实验流程与特征工程细节。已有3636人学习下载读者可直接运行代码完成从原始EEG信号预处理、α/β/θ频带分离、箱线图特征筛选、统计特征偏度、峰度、波熵构建到SVM四分类建模的全流程并获得92.36%测试准确率结果显著优于现有主流方法附带可视化脚本支持特征分布与分类效果分析。1. 项目背景与核心目标最近在整理过往的研究项目翻到了一个基于DEAP数据集做情感识别的老项目感觉挺有意思的。这个项目说白了就是通过分析人的脑电信号来判断他/她当前是高兴、悲伤、平静还是兴奋。听起来有点科幻但其实背后的技术路径已经相当成熟。当时我用的是经典的机器学习方法核心流程就是从原始的脑电信号里提取特征然后用支持向量机SVM去训练一个分类器。整个过程在MATLAB里实现从数据预处理、特征工程到模型训练和评估一条龙搞定。今天这篇文章我就把这个项目的完整实现思路、关键代码和踩过的坑系统地梳理一遍希望能给对脑机接口、情感计算或者信号处理感兴趣的朋友提供一个清晰的参考模板。无论你是刚入门的研究生还是想快速复现一个baseline的工程师这篇内容应该都能帮到你。DEAP数据集在情感计算领域算是“明星数据集”了它包含了32位被试者在观看音乐视频时的脑电EEG和外围生理信号如肌电、皮电等并且对每段视频都进行了效价Valence、唤醒度Arousal、支配度Dominance和喜爱度Liking的评分。我们通常取效价和唤醒度这两个维度将它们划分为高/低两类然后组合成四个象限就对应了四种情感状态高唤醒高效价HAHV可理解为兴奋/高兴、高唤醒低效价HALV可理解为焦虑/愤怒、低唤醒高效价LAHV可理解为平静/放松、低唤醒低效价LALV可理解为悲伤/低落。我们的任务就是让机器通过脑电信号认出这四种状态。2. DEAP数据集预处理与关键理解拿到DEAP数据集后第一步不是急着跑代码而是先理解它的数据结构。DEAP数据以MAT文件.mat格式提供通常包含两个关键变量data和labels。data是一个4维数组维度通常是参与者 × 视频片段 × 通道 × 数据点例如 32 x 40 x 32 x 8064。这里8064对应的是63秒的视频片段采样频率是128Hz所以63*1288064个数据点。labels则包含了每个视频片段对应的效价、唤醒度等评分。预处理的目标是把原始的、充满噪声的脑电信号变成干净、可用于特征提取的信号。这个过程至关重要直接决定了后续特征的质量和模型的性能上限。2.1 数据加载与维度重塑首先我们需要把数据加载进来并转换成更易于处理的格式。原始的四维数组在操作时不太方便我们通常会把数据重塑成二维矩阵样本 × 特征但这里先按被试和试验进行分割。% 假设数据文件为 DEAP_data.mat load(DEAP_data.mat); % 这会加载变量 data 和 labels % 查看数据维度 [num_participants, num_trials, num_channels, num_samples] size(data); disp([数据维度: , num2str(num_participants), 参与者, , ... num2str(num_trials), 试验, , num2str(num_channels), 通道, , ... num2str(num_samples), 采样点]); % 提取标签这里以效价和唤醒度为例假设它们是labels的前两列 valence_labels labels(:, 1); % 效价维度 arousal_labels labels(:, 2); % 唤醒度维度2.2 脑电信号预处理流程详解脑电信号非常微弱容易受到眼电EOG、肌电EMG、工频干扰50Hz等噪声污染。标准的预处理流程包括以下几步重参考原始脑电记录通常是单极导联需要一个参考点。DEAP数据已使用平均参考这一步通常可以跳过但了解其概念很重要。平均参考是假设所有电极电位的平均值为零将每个通道的信号减去所有通道的平均值有助于减少共同噪声。带通滤波保留有用的脑电节律成分。一般认为与情感相关的脑电成分分布在Delta(1-4Hz), Theta(4-8Hz), Alpha(8-13Hz), Beta(13-30Hz), Gamma(30-45Hz)等频段。我们通常用一个较宽的带通滤波器比如0.5Hz到45Hz以保留大部分有效信息同时滤除极低频的漂移和高频的肌电噪声。陷波滤波去除工频干扰50Hz或60Hz取决于地区。在中国是50Hz。分段与基线校正DEAP数据已经是观看视频期间的63秒连续数据。有时我们需要进行更短时间窗的分析如分析事件相关电位ERP但在这个项目中我们直接使用整个63秒的片段作为一个样本。基线校正通常指减去一段“静息”或“刺激前”时期的平均幅值以消除个体直流偏移。DEAP数据在提供前可能已做过处理但为了严谨我们可以计算每个试验最开始一小段如前1秒数据的均值然后从整个试验数据中减去它。下面是用MATLAB实现滤波的示例代码。我强烈推荐使用EEGLAB或FieldTrip这些专业的脑电处理工具箱它们功能强大且稳定。但为了理解原理这里用MATLAB内置函数演示% 定义采样频率和滤波器参数 Fs 128; % DEAP采样率 low_cutoff 0.5; % 高通截止频率 (Hz) high_cutoff 45.0; % 低通截止频率 (Hz) notch_freq 50; % 陷波频率 (Hz) % 设计一个带通滤波器例如使用巴特沃斯滤波器 order 4; % 滤波器阶数 [b_band, a_band] butter(order, [low_cutoff, high_cutoff]/(Fs/2), bandpass); % 设计一个陷波滤波器 wo notch_freq/(Fs/2); % 归一化频率 bw wo/35; % 带宽 [b_notch, a_notch] iirnotch(wo, bw); % 假设我们处理一个被试一个试验的一个通道数据 trial_eeg (1 x 8064) % 1. 带通滤波 filtered_eeg filtfilt(b_band, a_band, trial_eeg); % 使用filtfilt实现零相位滤波 % 2. 陷波滤波 filtered_eeg filtfilt(b_notch, a_notch, filtered_eeg); % 注意对多通道数据需要循环处理每个通道。 % 更高效的做法是使用eeglab的pop_eegfiltnew函数 % EEG pop_eegfiltnew(EEG, low_cutoff, high_cutoff); % EEG pop_eegfiltnew(EEG, notch_freq-1, notch_freq1, [], 1); % 陷波注意filtfilt函数执行的是零相位滤波它通过对数据正向和反向各滤波一次消除了滤波器带来的相位延迟这对于后续的时频分析非常重要。但它的计算量是普通滤波的两倍。2.3 标签生成从维度到四分类DEAP的原始标签是连续的效价和唤醒度评分1-9分。我们需要将其离散化为高/低两类通常以中值5为界。% 假设valence_labels和arousal_labels是来自所有试验的向量 valence_threshold 5; arousal_threshold 5; % 生成二值标签 valence_binary valence_labels valence_threshold; % 1高效价0低效价 arousal_binary arousal_labels arousal_threshold; % 1高唤醒0低唤醒 % 组合成四分类标签 (1: LALV, 2: LAHV, 3: HALV, 4: HAHV) % 注意这里的映射关系可以根据你的情感模型定义调整 four_class_labels zeros(size(valence_labels)); four_class_labels(~arousal_binary ~valence_binary) 1; % 低唤醒低效价 four_class_labels(~arousal_binary valence_binary) 2; % 低唤醒高效价 four_class_labels(arousal_binary ~valence_binary) 3; % 高唤醒低效价 four_class_labels(arousal_binary valence_binary) 4; % 高唤醒高效价 % 检查类别分布 tabulate(four_class_labels)类别不平衡是情感识别中常见的问题。DEAP数据集的四个类别分布可能不是完全均匀的。如果差异较大在后续训练模型时需要考虑采用加权SVM、过采样如SMOTE或欠采样等策略。3. 时频域特征提取从信号到信息特征提取是情感识别的核心。脑电信号在时域上看就是一条随时间变化的电压曲线信息隐藏很深。时频分析能告诉我们信号的能量在不同频率成分上是如何随时间变化的这比单纯的时域或频域特征更能捕捉情感的动态特性。3.1 为何选择时频域特征情感变化不是瞬间切换的而是一个动态过程。例如从平静到兴奋大脑中Alpha波8-13Hz的能量可能会降低去同步化而Beta波13-30Hz的能量可能会增加。单纯的频域特征如整个片段的功率谱会丢失时间信息而单纯的时域特征如均值、方差对频率不敏感。时频分析如小波变换、短时傅里叶变换提供了“时间-频率”二维平面上的能量分布让我们能够提取诸如“在视频播放的第20秒到30秒前额叶Theta波能量上升”这样的动态特征这对情感识别至关重要。3.2 基于短时傅里叶变换STFT的特征提取实践STFT是理解时频分析最直观的工具。它的思想很简单把长信号分成许多短的、重叠的片段对每个片段做傅里叶变换从而得到每个时间点附近的频率成分。% 假设 filtered_eeg 是一个预处理后的单通道脑电信号 (1 x N) signal filtered_eeg; N length(signal); Fs 128; % 设置STFT参数 window_length 256; % 窗长对应2秒 (256/1282)。窗越长频率分辨率越高时间分辨率越低。 noverlap 128; % 重叠点数通常为窗长的一半。重叠越多时频图越平滑。 nfft 512; % FFT点数通常大于等于窗长。决定频率轴的精细度。 % 计算STFT [S, F, T] spectrogram(signal, window_length, noverlap, nfft, Fs); % S是复数矩阵维度为 (nfft/21) x 时间窗数 % F是频率向量 % T是时间向量每个窗的中心时间 % 计算功率谱密度 (PSD) P abs(S).^2; % 现在P就是一个时频能量矩阵。我们可以从中提取各种特征。从时频矩阵P中我们可以提取多种特征特定频带功率这是最常用的特征。先定义频带范围然后对P矩阵中对应频率区间的功率进行求和或平均。% 定义经典频带边界 (Hz) band_defs { Delta, 1, 4; Theta, 4, 8; Alpha, 8, 13; Beta, 13, 30; Gamma, 30, 45; }; % 初始化特征向量 band_powers []; for i 1:size(band_defs, 1) band_name band_defs{i, 1}; f_low band_defs{i, 2}; f_high band_defs{i, 3}; % 找到频率向量F中在频带内的索引 freq_indices (F f_low) (F f_high); % 计算该频带在所有时间窗上的总功率然后对所有时间窗取平均 % 也可以考虑取对数(log)使分布更接近正态 band_power_total sum(P(freq_indices, :), 1); % 对频率维求和得到每个时间窗的该频带功率 band_power_mean mean(band_power_total); % 对所有时间窗求平均得到一个标量特征 % band_power_log log(band_power_mean eps); % 取对数加eps防止为0 band_powers [band_powers, band_power_mean]; end % 现在 band_powers 是一个1x5的向量包含5个频带的平均功率时频统计特征我们可以把时频矩阵P看作一幅图像计算其统计特性。平均功率mean(P(:))功率标准差std(P(:))功率偏度/峰度skewness(P(:)),kurtosis(P(:))描述功率分布的形态。谱熵将每个时间点的功率谱归一化为概率分布计算其香农熵反映频谱的复杂度或平坦度。% 计算谱熵 (Spectral Entropy) % 对每个时间窗的功率谱进行归一化 P_norm zeros(size(P)); for t 1:size(P, 2) p_slice P(:, t); p_slice p_slice / sum(p_slice); % 归一化为概率分布 P_norm(:, t) p_slice; end % 计算每个时间窗的谱熵 spectral_entropy_per_window -sum(P_norm .* log2(P_norm eps), 1); % 取所有时间窗谱熵的平均值作为特征 mean_spectral_entropy mean(spectral_entropy_per_window);微分熵特征在脑电分析中微分熵Differential Entropy, DE被证明是有效的特征特别是在基于频带的特征提取中。对于一段服从高斯分布N(μ, σ^2)的信号其微分熵计算公式为0.5 * log(2πeσ^2)。在实际操作中我们通常假设每个频带内的信号近似服从高斯分布因此可以用该频带功率的对数变换来近似微分熵。许多研究直接使用log(频带功率)作为特征效果很好。% 基于之前计算的 band_power_total (每个时间窗的频带功率) de_features []; for i 1:size(band_defs, 1) % 假设 band_power_total 是之前计算好的第i个频带的功率时间序列 % 这里需要重新计算每个频带每个时间窗的功率 freq_indices (F band_defs{i, 2}) (F band_defs{i, 3}); band_power_per_window sum(P(freq_indices, :), 1); % 1 x 时间窗数 % 计算该频带功率的微分熵近似为对数功率 % 可以对每个时间窗取对数后平均也可以先平均再取对数效果略有不同 de_per_window log(band_power_per_window eps); mean_de mean(de_per_window); de_features [de_features, mean_de]; end3.3 多通道特征融合与特征向量构建上面我们只针对一个通道进行了特征提取。DEAP有32个通道或64个我们需要对所有通道重复上述过程然后将所有特征拼接成一个长向量代表一个试验样本。% 假设我们有一个函数 extract_features_from_channel(eeg_signal, Fs) % 它输入一个通道的信号输出一个特征向量 (例如 5个频带功率 1个谱熵 6维) num_channels 32; features_per_trial []; for ch 1:num_channels single_channel_signal squeeze(data(participant_idx, trial_idx, ch, :)); % 获取指定被试、试验、通道的数据 single_channel_signal preprocess_eeg(single_channel_signal, Fs); % 预处理函数 ch_features extract_features_from_channel(single_channel_signal, Fs); features_per_trial [features_per_trial, ch_features]; end % 最终features_per_trial 是一个 1 x (6 * 32) 1 x 192 维的特征向量。这就是一个样本的特征向量。对数据集中的所有试验和所有被试重复此操作注意要按被试划分训练测试集避免数据泄露我们就能得到特征矩阵X(样本数 x 特征数) 和标签向量y。实操心得特征维度会爆炸式增长通道数 x 每通道特征数。32个通道每个通道提取6个特征就是192维。如果使用更复杂的时频特征如Hjorth参数、分形维数等维度会更高。高维特征容易导致“维数灾难”并且包含大量冗余信息。因此特征选择是必不可少的后续步骤。我们可以使用方差阈值、相关系数、递归特征消除RFE或基于模型如L1正则化的方法来筛选出最具有判别力的特征子集。在项目初期为了快速验证流程可以先用所有特征但最终一定要做特征选择来优化模型。4. 支持向量机分类器的构建与调优特征准备好之后就进入了建模阶段。支持向量机SVM在小样本、高维度的分类问题上表现优异并且可以通过核函数处理非线性问题非常适合作为脑电情感识别的基线分类器。4.1 SVM原理简述与核函数选择SVM的核心思想是寻找一个最优超平面使得两类样本到这个超平面的“间隔”最大化。对于线性不可分的数据SVM通过“核技巧”将数据映射到高维空间使其在高维空间中线性可分。常用的核函数有线性核K(x, z) x^T * z。参数少速度快可解释性强。如果特征已经足够好或者特征维度很高线性核往往就能取得不错的效果并且不容易过拟合。径向基函数核K(x, z) exp(-γ * ||x - z||^2)。也叫高斯核是最常用的非线性核。它能够处理非常复杂的非线性关系但需要调节两个超参数惩罚系数C和核系数γ。γ定义了单个样本的影响范围γ越大影响范围越小决策边界越复杂容易过拟合γ越小决策边界越平滑容易欠拟合。对于脑电情感识别由于特征与情感状态之间的关系可能是非线性的RBF核通常是首选。但我的经验是先用线性核试一下。如果线性核的准确率已经接近或达到你的预期那么就用它因为模型更简单、更快、更不容易过拟合。如果线性核效果不佳再切换到RBF核进行精细调参。4.2 MATLAB中SVM的实现与关键步骤MATLAB的统计和机器学习工具箱Statistics and Machine Learning Toolbox提供了fitcsvm函数用于训练SVM分类器。对于多分类问题MATLAB默认使用“一对一”策略。% 假设我们已经准备好了特征矩阵 X (n_samples x n_features) 和标签 y (n_samples x 1) % 1. 数据标准化 (非常重要) % SVM对特征的尺度敏感特别是使用RBF核时。必须标准化。 [X_train_scaled, mu, sigma] zscore(X_train); % 训练集标准化 X_test_scaled (X_test - mu) ./ sigma; % 测试集使用训练集的均值和标准差标准化 % 2. 训练一个简单的线性SVM作为基线 linear_svm_model fitcsvm(X_train_scaled, y_train, ... KernelFunction, linear, ... Standardize, false, ... % 我们已经手动标准化了所以这里设为false BoxConstraint, 1, ... % 惩罚系数 C默认是1 ClassNames, unique(y_train), ... Verbose, 1); % 3. 在测试集上预测 [y_pred_linear, score_linear] predict(linear_svm_model, X_test_scaled); accuracy_linear sum(y_pred_linear y_test) / numel(y_test); fprintf(线性SVM准确率: %.2f%%\n, accuracy_linear * 100);如果线性SVM效果不理想我们转向RBF核并需要进行超参数调优。最常用的方法是网格搜索交叉验证。4.3 超参数网格搜索与交叉验证C和γ的最佳值需要通过交叉验证来寻找。C控制误分类的惩罚力度C越大模型越不允许犯错决策边界越复杂γ控制RBF核的宽度。% 定义参数网格 C_values [0.001, 0.01, 0.1, 1, 10, 100, 1000]; gamma_values [0.001, 0.01, 0.1, 1, 10, 100]; % 注意gamma 1/(2*sigma^2)有些定义不同 % 初始化最佳参数和准确率 best_accuracy 0; best_C 1; best_gamma 1; % 创建交叉验证分区 (例如5折) cv cvpartition(y_train, KFold, 5); % 网格搜索 for C C_values for gamma gamma_values fprintf(正在尝试 C%.3f, gamma%.3f...\n, C, gamma); % 初始化本轮交叉验证的准确率列表 fold_accuracies zeros(cv.NumTestSets, 1); for fold 1:cv.NumTestSets % 获取当前折的训练/验证索引 trainIdx cv.training(fold); testIdx cv.test(fold); % 划分数据 X_fold_train X_train_scaled(trainIdx, :); y_fold_train y_train(trainIdx); X_fold_val X_train_scaled(testIdx, :); y_fold_val y_train(testIdx); % 训练SVM svm_model fitcsvm(X_fold_train, y_fold_train, ... KernelFunction, rbf, ... KernelScale, 1/sqrt(gamma), ... % MATLAB的KernelScale参数是sigmagamma1/(2*sigma^2) BoxConstraint, C, ... Standardize, false); % 验证 y_fold_pred predict(svm_model, X_fold_val); fold_accuracies(fold) sum(y_fold_pred y_fold_val) / numel(y_fold_val); end % 计算平均交叉验证准确率 mean_cv_accuracy mean(fold_accuracies); fprintf( 平均CV准确率: %.4f\n, mean_cv_accuracy); % 更新最佳参数 if mean_cv_accuracy best_accuracy best_accuracy mean_cv_accuracy; best_C C; best_gamma gamma; end end end fprintf(\n最佳参数: C %.3f, gamma %.3f, 最佳CV准确率: %.4f\n, best_C, best_gamma, best_accuracy); % 使用最佳参数在整个训练集上训练最终模型 final_svm_model fitcsvm(X_train_scaled, y_train, ... KernelFunction, rbf, ... KernelScale, 1/sqrt(best_gamma), ... BoxConstraint, best_C, ... Standardize, false); % 在独立测试集上评估最终模型 [y_pred_final, score_final] predict(final_svm_model, X_test_scaled); test_accuracy sum(y_pred_final y_test) / numel(y_test); fprintf(最终模型在测试集上的准确率: %.2f%%\n, test_accuracy * 100);踩坑提醒数据泄露标准化zscore必须在划分训练集和测试集之后分别进行。必须用训练集的均值和标准差去标准化测试集绝对不能用整个数据集计算均值和标准差然后统一标准化否则测试集信息就“泄露”到训练过程了会严重高估模型性能。类别不平衡如果四个情感类别样本数差异很大需要在fitcsvm中设置Prior参数为empirical让模型根据训练数据自动调整先验概率或者设置Weights参数给少数类更高的权重。网格搜索的代价参数网格C_values和gamma_values的乘积乘以交叉验证折数就是需要训练模型的次数。如果数据量大、特征多这个过程会非常耗时。可以从粗网格开始如[0.01, 0.1, 1, 10, 100]找到大致范围后再在附近进行精细搜索。也可以使用更高效的优化算法如贝叶斯优化bayesopt函数。MATLAB的KernelScale注意fitcsvm的KernelScale参数对应的是RBF核公式中的sigma而通常我们说的gamma参数是1/(2*sigma^2)。所以代码中我们用1/sqrt(gamma)来转换。务必理清你所用工具包对核参数的定义。5. 模型评估、结果分析与可视化得到一个准确率数字只是开始更重要的是理解模型在哪里做得好在哪里做得不好。5.1 超越准确率全面的评估指标对于四分类问题混淆矩阵Confusion Matrix是最直观的工具。% 计算混淆矩阵 C confusionmat(y_test, y_pred_final); % 使用内置函数绘图更美观 figure; confusionchart(C, {LALV, LAHV, HALV, HAHV}); % 按你的标签顺序 title(SVM分类器混淆矩阵);从混淆矩阵中我们可以计算每个类别的精确率Precision、召回率Recall和F1分数。% 计算每类的性能指标 num_classes 4; precision zeros(num_classes, 1); recall zeros(num_classes, 1); f1_score zeros(num_classes, 1); for i 1:num_classes TP C(i, i); FP sum(C(:, i)) - TP; FN sum(C(i, :)) - TP; precision(i) TP / (TP FP eps); recall(i) TP / (TP FN eps); f1_score(i) 2 * (precision(i) * recall(i)) / (precision(i) recall(i) eps); end % 显示结果 class_names {LALV, LAHV, HALV, HAHV}; for i 1:num_classes fprintf(类别 %s: 精确率%.3f, 召回率%.3f, F1%.3f\n, ... class_names{i}, precision(i), recall(i), f1_score(i)); end % 计算宏平均F1 macro_f1 mean(f1_score); fprintf(宏平均F1分数: %.3f\n, macro_f1);为什么F1分数很重要在类别不平衡的情况下准确率可能会被大类别主导而虚高。比如90%的样本都是“平静”模型只要全部预测“平静”就能得到90%的准确率但这毫无意义。F1分数是精确率和召回率的调和平均能更好地衡量模型对每个类别的识别能力宏平均F1对所有类别一视同仁。5.2 结果可视化与解读特征重要性分析对于线性SVM可以通过检查权重向量w的绝对值大小来估计特征的重要性。权重绝对值越大说明该特征对决策的影响越大。if strcmp(final_svm_model.KernelParameters.Function, linear) w final_svm_model.Beta; % 权重系数 [sorted_w, idx] sort(abs(w), descend); top_n 20; fprintf(重要性排名前%d的特征索引:\n, top_n); disp(idx(1:top_n)); % 你可以将这些索引映射回具体的通道和特征类型如“F3通道的Alpha功率” end决策边界可视化降维后对于高维数据我们可以使用t-SNE或PCA将其降到2维或3维然后画出样本点和SVM的决策边界需要训练一个在降维空间上的新SVM这有助于直观感受数据的可分性。% 使用PCA降维到2维 [coeff, score, latent] pca(X_train_scaled); X_train_2d score(:, 1:2); % 在2维数据上重新训练一个SVM仅用于可视化 svm_2d fitcsvm(X_train_2d, y_train, KernelFunction, rbf, Standardize, false); % 创建网格用于绘制决策区域 x1range min(X_train_2d(:,1))-1 : 0.1 : max(X_train_2d(:,1))1; x2range min(X_train_2d(:,2))-1 : 0.1 : max(X_train_2d(:,2))1; [xx1, xx2] meshgrid(x1range, x2range); XGrid [xx1(:), xx2(:)]; % 预测网格点的类别 [~, scores] predict(svm_2d, XGrid); % 绘制决策区域和样本点 figure; h gscatter(X_train_2d(:,1), X_train_2d(:,2), y_train, brgk, o*^v); hold on; contour(xx1, xx2, reshape(scores(:,4), size(xx1)), [0 0], k-, LineWidth, 2); % 绘制第4类HAHV的决策边界 xlabel(PCA主成分1); ylabel(PCA主成分2); title(PCA降维后的数据分布与SVM决策边界示例); legend(LALV,LAHV,HALV,HAHV, Decision Boundary); hold off;5.3 与基线模型和现有研究的对比为了评估你的SVM模型是否有效需要设立基线进行比较。随机猜测基线四分类问题的随机猜测准确率是25%。多数类基线预测为训练集中样本数最多的类别计算其在测试集上的准确率。简单分类器基线如最近邻分类器KNNK1或决策树最大深度5。% 多数类基线 majority_class mode(y_train); y_pred_majority repmat(majority_class, size(y_test)); accuracy_majority sum(y_pred_majority y_test) / numel(y_test); fprintf(多数类基线准确率: %.2f%%\n, accuracy_majority * 100); % 1-NN基线 knn_model fitcknn(X_train_scaled, y_train, NumNeighbors, 1, Standardize, false); y_pred_knn predict(knn_model, X_test_scaled); accuracy_knn sum(y_pred_knn y_test) / numel(y_test); fprintf(1-NN基线准确率: %.2f%%\n, accuracy_knn * 100);如果你的SVM模型显著优于这些基线例如准确率超过40%F1分数超过0.4并且与相关论文中报告的基于DEAP的SVM性能通常在55%-70%之间取决于特征、通道选择和分类任务处于同一量级那么你的工作就是有效的。6. 项目总结、局限性与进阶方向走完整个流程从数据预处理、特征提取到模型训练评估一个完整的基于SVM的脑电情感识别项目就完成了。回顾整个过程有几个关键点值得再次强调预处理是基石滤波和去噪的质量直接决定了特征提取的上限。务必根据脑电信号的特性选择合适的滤波参数。特征工程是核心时频域特征特别是频带功率、微分熵对情感识别非常有效。尝试组合不同类型的特征时域、频域、非线性特征有时能提升性能但要注意维度控制。模型调优是艺术SVM的性能对超参数和特征尺度敏感。网格搜索交叉验证是标准做法但计算成本高。务必做好数据标准化防止泄露。评估要全面不要只看准确率混淆矩阵和F1分数能揭示模型在各类别上的具体表现尤其是在数据不平衡时。本项目的局限性特征手工设计我们提取的时频特征是手工设计的依赖于领域知识。这可能不是最优的表示。通道选择我们使用了所有通道但有些通道可能对情感识别贡献很小甚至引入噪声。通道选择是一个重要的优化方向。个体差异脑电信号存在巨大的个体差异。在一个被试上训练好的模型在另一个被试上可能效果很差。这就是“被试独立”评估的挑战。SVM的局限性SVM虽然强大但对于非常复杂的非线性关系其表现可能不如深度神经网络。进阶方向深度学习端到端学习使用卷积神经网络直接从原始脑电信号或时频图中学习特征避免手工特征工程。例如EEGNet、DeepConvNet等网络结构在此任务上表现出色。跨被试学习与域自适应研究如何让模型更好地泛化到新被试。可以使用域自适应、迁移学习或元学习等方法。多模态融合DEAP数据集除了EEG还有外周生理信号GSR, RESP, EMG等。融合多模态信息可以显著提升情感识别的鲁棒性和准确性。时序建模情感是动态变化的使用循环神经网络或Transformer对脑电信号的时间序列进行建模可以捕捉其动态演化模式。更精细的情感模型除了四分类也可以尝试回归任务直接预测效价和唤醒度的连续值或者探索更复杂的情感模型。这个项目提供了一个坚实的起点。你可以基于这个代码框架尝试不同的特征、不同的分类器、不同的预处理方法逐步深入脑电情感识别这个有趣且充满挑战的领域。代码的模块化设计使得替换特征提取模块或分类器模块变得非常容易祝你实验顺利。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻