简介:本资源是一套面向脑机接口与情感计算方向研究者的完整论文+代码实现方案,聚焦DEAP数据集上的四分类情绪识别任务(效价与唤醒双维度),适用于具备MATLAB基础的机器学习初学者及生物医学信号处理进阶学习者。压缩包共16个文件(488KB),含10个核心MATLAB脚本(如频带滤波、DWT特征提取、SVM分类主流程)、3个Jupyter Notebook(含KNN对比实验与可视化分析)、1篇PDF论文、1份Markdown说明文档及1个README文本,覆盖从原始信号预处理、时频域特征工程(α/β/θ频段统计特征+波熵/偏度/峰度)、箱线图特征筛选到SVM建模与评估的全流程。已有3636人学习下载,提供可直接运行的模块化代码结构、清晰的函数分工与实验结果复现支持,特别适合用于课程设计、科研复现或竞赛基线模型构建。
1. 项目概述:从脑电信号到情感解码
如果你对脑电信号(EEG)分析或者情感计算感兴趣,那么“基于时频域特征分析和SVM分类器的DEAP脑电信号情感状态识别”这个项目,绝对是一个经典且极具实践价值的入门与进阶案例。简单来说,这个项目的目标就是教会计算机“读懂”人的情绪。我们不是通过表情或语言,而是直接分析大脑活动产生的微弱电信号——脑电波,来判断一个人当前是高兴、悲伤、平静还是兴奋。
这个项目的核心流程非常清晰:首先,我们需要一个高质量的“教材”,也就是DEAP数据集,这是一个在国际上被广泛使用、包含了音乐视频诱发下多种情感状态的标准化脑电数据集。拿到数据后,原始的信号就像一团乱麻,我们需要从中提取出能够表征不同情绪的关键“指纹”,这就是时频域特征分析要做的事。最后,我们把这些“指纹”喂给一个聪明的“裁判”——SVM(支持向量机)分类器,让它学习并最终能够准确地将新的脑电信号归类到对应的情感类别中,实现四分类(例如:愉悦、唤醒、支配感等维度的组合或特定情感标签)。
我之所以花大量时间研究并复现这个流程,是因为它在脑机接口、心理健康监测、用户体验评估乃至游戏交互等领域都有着巨大的潜力。整个过程涉及信号处理、特征工程和机器学习多个环节,用Matlab来实现尤其合适,因为其强大的信号处理工具箱和简洁的矩阵操作,能让研究者更专注于算法逻辑本身。接下来,我将拆解每一个步骤,分享从数据预处理到模型评估全流程的实战细节与避坑指南。
2. 核心思路与方案设计:为什么是“时频域+SVM”?
在动手写代码之前,理解整个方案的设计逻辑至关重要。为什么选择时频域分析?为什么用SVM而不是其他分类器?这背后是脑电信号的特性和分类任务的需求共同决定的。
2.1 脑电信号特性与特征选择逻辑
脑电信号是一种典型的非平稳、非线性时间序列。所谓“非平稳”,意味着信号的统计特性(如均值、方差)会随时间变化,这与情绪本身的动态变化是吻合的。传统的时域特征(如均值、方差、峰值)虽然计算简单,但丢失了频率信息。而情绪活动与大脑特定频段的节律紧密相关,例如:
- Alpha波 (8-13 Hz):通常与放松、静息状态相关。
- Beta波 (13-30 Hz):与专注、活跃的思考相关。
- Gamma波 (>30 Hz):与高阶认知处理、感官绑定相关,也可能在强烈情绪体验中出现。
因此,单纯的时域或频域分析都不够。时频域分析(如小波变换、短时傅里叶变换)能够同时在时间和频率维度上刻画信号的局部特性,正好捕捉情绪诱发过程中脑电节律的动态变化。例如,一段令人愉悦的视频可能在前额叶区域诱发持续的Alpha波增强,而令人恐惧的视频可能瞬间引起广泛的Gamma波爆发。时频分析能把这些瞬态或持续的模式提取出来,形成高维度的特征向量。
2.2 SVM分类器的优势与适用性
提取出的时频特征往往是成百上千维的。对于这样的高维、可能线性不可分的数据,SVM(支持向量机)展现出了其经典而强大的优势:
- 高维空间有效性:SVM通过核函数(如线性核、RBF核)将数据映射到更高维甚至无限维的空间,从而找到一个最优的超平面来分隔不同类别的样本。这对于脑电特征这种复杂分布的数据非常有效。
- 泛化能力强:SVM的核心思想是最大化分类间隔,这本质上是一种结构风险最小化,有助于提高模型在未知数据上的泛化能力,避免过拟合。
- 小样本表现好:相对于深度神经网络,SVM在训练样本量不是特别巨大的情况下(如DEAP数据集每个被试约40个试次),往往能取得更稳定、更优的性能。
选择“时频域+SVM”这个组合,是一个在计算复杂度、特征表征能力和分类性能之间取得的经典平衡。它比单纯的时域/频域方法更精细,又比一些复杂的深度学习模型更轻量、更易解释,非常适合作为该领域的研究起点和基准模型。
2.3 整体技术路线图
基于以上分析,项目的完整技术路线可以概括为以下四个阶段:
- 数据准备与预处理:加载DEAP数据集,进行必要的重参考、滤波、去伪迹(如眼电、肌电)等操作,为特征提取准备“干净”的信号。
- 时频域特征提取:对每个试次(trial)的每个通道(channel)的脑电信号段,应用时频分析方法,并从中计算统计特征(如各频段能量、能量比、熵值等),构建特征向量。
- 特征处理与数据集构建:对提取的高维特征进行标准化、降维(如PCA)或特征选择,然后按被试划分训练集和测试集。
- SVM模型训练与评估:使用训练集数据训练SVM分类器,通过交叉验证优化超参数(如惩罚系数C、核函数参数gamma),最后在独立的测试集上评估模型的分类准确率、混淆矩阵等指标。
3. 实战第一步:DEAP数据集处理与信号预处理
理论清晰后,我们进入实战环节。一切始于数据,DEAP数据集的处理是项目的地基,处理不当,后续所有工作都可能徒劳。
3.1 DEAP数据集解析与加载
DEAP数据集是一个多模态数据集,我们主要关注其EEG部分。它通常以.mat文件或.dat文件格式提供。每个文件对应一个被试,包含了32通道(或40通道,包含8个外周生理信号)的EEG数据、视频标签、被试自我评估的情感维度评分(效价、唤醒度、支配度、喜爱度)等。
Matlab加载示例:
% 假设数据文件为 's01.mat' data_struct = load('s01.mat'); % 通常数据被存储在名为 'data' 的变量中 eeg_data = data_struct.data; % 维度可能是:trials x channels x data_points % 例如:40 trials x 32 channels x 8064 data points (63秒,128Hz采样率) labels = data_struct.labels; % 情感维度评分关键注意事项:
- 数据维度确认:首先使用
size()函数仔细检查加载后数据的维度顺序。不同版本或预处理过的数据集维度可能不同(通道x时间点x试次,或试次x通道x时间点)。这直接影响后续切片操作。 - 采样率与时长:DEAP原始采样率为512Hz,但官方也提供了下采样到128Hz的版本。务必确认你使用的版本。128Hz版本下,每个试次约63秒,共8064个数据点(3秒基线+60秒视频刺激)。
- 标签理解:情感标签通常是连续值(1-9)。我们需要将其离散化为四分类。常见做法是基于效价(Valence)和唤醒度(Arousal)的二维空间进行划分,例如:
- 高唤醒高效价 (HAHV)
- 高唤醒低效价 (HALV)
- 低唤醒高效价 (LAHV)
- 低唤醒低效价 (LALV) 划分的阈值可以选择中位数(5分)或经过标准化后的均值。
3.2 关键的信号预处理流程
原始脑电信号含有大量噪声,预处理的目标是保真地去伪存真。
- 重参考:将原始的采集参考(如Cz、平均乳突参考)转换为更通用的平均参考或全脑平均参考。这有助于减少参考电极位置带来的偏差。
% 平均参考示例:从每个通道的信号中减去所有通道的平均值 avg_ref = mean(eeg_data, 2); % 假设eeg_data维度为 [channels, samples] eeg_data_reref = eeg_data - avg_ref; - 带通滤波:保留与情感相关的生理节律,通常滤除低频漂移和高频噪声。一个典型的设置是0.5Hz高通滤波(去除直流偏移和慢漂移)和45Hz低通滤波(去除工频干扰和高频肌电)。Matlab的
eegfilt或pop_eegfiltnew(如果使用EEGLAB) 函数非常方便。注意:滤波器的阶数和类型(如FIR、IIR)会影响相位延迟。对于后续的时频分析,建议使用线性相位的FIR滤波器,或对数据进行零相位滤波(
filtfilt函数)。 - 去伪迹:这是预处理中最具挑战性的一步。眼电(EOG)和肌电(EMG)伪迹幅度远大于脑电信号。
- 独立成分分析(ICA):这是目前最主流的方法。通过ICA将多通道信号分解为统计上独立的成分,然后根据成分的拓扑图、时间序列和频谱特征,人工或半自动地识别并剔除与眼动、眨眼、肌肉活动相关的成分。
- 实操心得:对于DEAP数据,我强烈建议结合使用EEGLAB工具箱进行ICA分析。虽然计算量稍大,但去伪迹效果远好于简单的阈值法。一个技巧是,在ICA之前先进行高通滤波(如1Hz),可以改善ICA的分解效果。剔除成分时要谨慎,最好同时观察剔除前后单个试次波形的变化,避免误删脑电成分。
预处理后的数据应该被分割成一个个独立的“试次”(trial),每个试次对应一段视频刺激期间的脑电数据,并关联上处理好的情感类别标签。至此,我们得到了干净的、标注好的脑电片段,可以送入特征提取引擎。
4. 核心环节:时频域特征提取的实战详解
特征提取是连接原始信号和分类器的桥梁,也是本项目技术含量的核心体现。我们将采用连续小波变换(CWT)作为时频分析的工具,因为它能提供比短时傅里叶变换(STFT)更好的时频分辨率平衡。
4.1 连续小波变换(CWT)的原理与Matlab实现
小波变换通过一个可伸缩、平移的母小波函数来分析信号。对于脑电信号,复Morlet小波是一个常用选择,因为它能提供良好的时频局部化,并且其解析形式便于提取瞬时振幅和相位。
Matlab中CWT的基本步骤:
% 假设 sig 是一个试次中单个通道的预处理后EEG信号(1 x N向量) fs = 128; % 采样率 frequencies = 1:0.5:45; % 定义感兴趣的频率范围,以0.5Hz为步进 % 设置Morlet小波参数(中心频率fc,带宽参数fb) fc = 1; % 中心频率 fb = 2; % 带宽参数,控制小波的形状,值越大频率分辨率越高,时间分辨率越低 % 执行连续小波变换 [cwt_coefs, period] = cwt(sig, frequencies, 'amor', fs); % 使用'amor'(Morlet)小波 % cwt_coefs 是一个复数矩阵,维度为 [length(frequencies), length(sig)] % 计算时频能量(功率) tf_power = abs(cwt_coefs).^2;这段代码会对信号sig在1Hz到45Hz范围内,以0.5Hz为间隔,计算每个频率点上的小波系数,进而得到时频能量图。
参数选择经验:
- 频率范围:1-45Hz基本覆盖了Delta, Theta, Alpha, Beta, Gamma等主要脑电节律。步长越小,频率分辨率越高,但计算量越大。0.5Hz或1Hz的步长是常见选择。
- 小波参数:
fb参数是关键。fb越大,小波在频率域越窄(频率分辨率高),在时间域越宽(时间分辨率低)。对于脑电,fb通常在1到5之间。我个人的经验是,对于分析相对较慢的Alpha/Beta节律,fb=2或3是一个不错的起点。你可以通过绘制几个不同频率的小波函数来直观感受其时间支撑范围。
4.2 从时频图中抽取统计特征
得到时频能量矩阵(tf_power)后,它是一个二维矩阵(频率×时间)。我们需要将其压缩成一个一维的特征向量。常见的做法是,将频率划分为几个经典的频带,然后在每个频带内,沿时间轴计算一些统计量。
特征计算示例:
% 定义频带边界 (Hz) band_defs = { 'Delta', [1, 4]; 'Theta', [4, 8]; 'Alpha', [8, 13]; 'Beta', [13, 30]; 'Gamma', [30, 45] }; features = []; % 初始化特征向量 for iBand = 1:size(band_defs, 1) band_name = band_defs{iBand, 1}; f_low = band_defs{iBand, 2}(1); f_high = band_defs{iBand, 2}(2); % 找到对应频率索引 freq_idx = (frequencies >= f_low) & (frequencies <= f_high); % 提取该频带内的时频能量子矩阵 band_power = tf_power(freq_idx, :); % 计算该频带的统计特征 band_mean_power = mean(band_power, 'all'); % 频带平均功率 band_power_std = std(band_power, 0, 'all'); % 频带功率标准差 band_power_max = max(band_power, [], 'all'); % 频带最大功率 % 计算该频带功率占总功率的比例 total_power = sum(tf_power, 'all'); band_power_ratio = sum(band_power, 'all') / total_power; % 计算该频带内的时间序列的香农熵(表征复杂度) band_time_series = mean(band_power, 1); % 对频率维求平均,得到该频带的功率时间序列 band_entropy = wentropy(band_time_series, 'shannon'); % 将特征追加到向量中 features = [features, band_mean_power, band_power_std, band_power_max, band_power_ratio, band_entropy]; end通过以上循环,对于单个通道的一个试次,我们可以提取出 5个频带 × 5个统计量 = 25个特征。如果你有32个通道,那么一个试次的总特征数将达到 32 × 25 = 800维。这就是我们构建的高维特征空间。
特征工程技巧:
- 差异化特征:除了绝对功率,不同频带之间的功率比(如Theta/Beta比率)通常与注意力、焦虑等状态相关,可能具有更好的判别性。
- 不对称性特征:计算大脑左右半球对称电极(如F3-F4, C3-C4, P3-P4)在特定频带(如Alpha)的功率差值或比值,这被称为脑电不对称性,是情感神经科学中的一个重要指标。
- 时间窗划分:情绪是动态的。可以将60秒的刺激期划分为几个子时间窗(如前10秒、中间40秒、后10秒),分别计算特征,以捕捉情绪诱发的时间动态模式。这虽然会进一步增加特征维度,但可能提升模型性能。
5. 构建分类模型:SVM的训练、优化与评估
拥有了上千维的特征向量后,我们进入机器学习环节。目标是训练一个SVM模型,学习从特征空间到四类情感标签的映射。
5.1 特征后处理与数据集划分
在喂给SVM之前,特征必须经过处理:
标准化:由于各特征量纲和范围差异巨大(如功率值可能很大,熵值较小),必须进行标准化,通常采用Z-score标准化,使每个特征均值为0,标准差为1。这能防止某些特征因其数值大而主导模型训练。
[train_features_scaled, mu, sigma] = zscore(train_features); test_features_scaled = (test_features - mu) ./ sigma; % 使用训练集的均值和标准差标准化测试集降维与特征选择(可选但推荐):800维特征可能存在大量冗余或噪声。直接使用可能导致“维数灾难”和过拟合。
- 主成分分析(PCA):一种无监督降维方法,将数据投影到方差最大的几个主成分上。可以保留95%或99%的方差。
[coeff, score, latent, ~, explained] = pca(train_features_scaled); cum_var = cumsum(explained); n_components = find(cum_var >= 95, 1); % 保留95%方差的成分数 train_features_pca = score(:, 1:n_components); - 特征选择:使用过滤法(如基于F值、互信息)或包裹法(如递归特征消除RFE)选择与情感标签最相关的特征子集。对于初学者,PCA是一个稳定且易于实现的选择。
- 主成分分析(PCA):一种无监督降维方法,将数据投影到方差最大的几个主成分上。可以保留95%或99%的方差。
数据集划分:务必按被试划分训练集和测试集。即,一部分被试的所有数据用于训练,另一部分完全未参与训练的被试数据用于测试。这称为“被试独立”评估,比随机划分所有试次更能反映模型的泛化能力,因为脑电模式具有强烈的个体差异性。
5.2 SVM模型训练与超参数调优
Matlab的统计与机器学习工具箱提供了完整的SVM实现 (fitcsvm)。这里的关键是核函数选择和超参数优化。
核函数选择:最常用的是线性核和高斯径向基(RBF)核。
- 线性核:
K(x, y) = x^T * y。假设数据是近似线性可分的。参数少,训练快,不易过拟合,但模型能力有限。 - RBF核:
K(x, y) = exp(-gamma * ||x - y||^2)。能够处理高度非线性的决策边界。性能强大,但需要调整两个超参数:C(惩罚系数)和gamma(核函数宽度)。建议:可以先从RBF核开始,因为它更灵活。如果特征经过PCA降维后线性可分性增强,也可以尝试线性核对比效果。
- 线性核:
超参数优化:使用交叉验证(如5折或10折)在训练集上寻找最优的
(C, gamma)组合。% 定义参数网格 C_values = [0.01, 0.1, 1, 10, 100]; gamma_values = [0.001, 0.01, 0.1, 1, 10]; bestAccuracy = 0; bestParams = struct('C', 1, 'Gamma', 0.1); for C = C_values for gamma = gamma_values % 使用5折交叉验证 template = templateSVM('KernelFunction', 'rbf', 'BoxConstraint', C, 'KernelScale', 1/sqrt(gamma)); model = fitcecoc(train_features_pca, train_labels, 'Learners', template, 'Coding', 'onevsone'); cv_model = crossval(model, 'KFold', 5); cv_accuracy = 1 - kfoldLoss(cv_model, 'LossFun', 'ClassifError'); if cv_accuracy > bestAccuracy bestAccuracy = cv_accuracy; bestParams.C = C; bestParams.Gamma = gamma; end end end % 使用最优参数训练最终模型 optimal_template = templateSVM('KernelFunction', 'rbf', 'BoxConstraint', bestParams.C, 'KernelScale', 1/sqrt(bestParams.Gamma)); final_model = fitcecoc(train_features_pca, train_labels, 'Learners', optimal_template, 'Coding', 'onevsone');注意:
KernelScale参数是fitcsvm中对应于gamma的参数,关系为KernelScale = 1/sqrt(gamma)。fitcecoc用于多分类,内部采用一对一策略训练多个二分类SVM。
5.3 模型评估与结果分析
在独立的测试集上评估最终模型。
% 对测试集进行相同的PCA变换(使用训练集得到的coeff) test_features_pca = test_features_scaled * coeff(:, 1:n_components); % 预测 predicted_labels = predict(final_model, test_features_pca); % 计算准确率 accuracy = sum(predicted_labels == test_labels) / numel(test_labels); fprintf('测试集准确率: %.2f%%\n', accuracy * 100); % 绘制混淆矩阵 figure; confusionchart(test_labels, predicted_labels); title('情感四分类混淆矩阵');结果解读与提升方向:
- 基准:对于四分类随机猜测的准确率是25%。一个有效的模型应该显著高于此值。在DEAP数据集上,使用本文所述流程,被试独立的分类准确率通常在 55% - 75% 之间,具体取决于特征设计、被试选择和分类任务定义。
- 混淆矩阵分析:仔细观察混淆矩阵,看哪些情感类别容易被混淆。例如,“高唤醒高效价”和“高唤醒低效价”可能因为唤醒度相近而容易分错。这可以指导你后续的特征设计,例如引入更多能区分效价的特征。
- 性能提升思路:
- 特征层面:尝试更多类型的时频特征(如Hjorth参数、微分熵)、跨通道连接特征(如相干性、相位锁定值)。
- 模型层面:可以尝试其他分类器对比,如随机森林、LightGBM或简单的深度学习网络(如1D-CNN)。SVM作为强基准。
- 被试特异性:由于个体差异大,可以考虑加入被试校准(如迁移学习)来提升对新被试的识别率。
6. 常见问题、调试技巧与避坑指南
在实际复现过程中,你几乎一定会遇到各种问题。下面是我踩过坑后总结的一些核心排查点。
6.1 数据与预处理相关问题
问题1:加载数据后维度混乱,导致后续处理报错。
- 排查:第一时间使用
size()、whos命令查看加载变量的维度和类型。仔细阅读你所使用的DEAP数据集版本的说明文档。 - 解决:使用
permute函数调整维度顺序。例如,将[channels, samples, trials]转换为[trials, channels, samples]以适应你的处理循环。
问题2:滤波后信号出现严重畸变或延迟。
- 排查:检查滤波器参数。过低的截止频率或过高的滤波器阶数会导致振铃效应。使用
freqz函数绘制滤波器的频率响应。 - 解决:
- 使用
filtfilt函数进行零相位滤波,消除延迟,但注意这会改变滤波器的瞬态响应。 - 对于FIR滤波器,适当降低阶数,或使用窗函数法设计。
- 考虑在数据两端添加镜像扩展后再滤波,以降低边界效应。
- 使用
问题3:ICA去伪迹后,感觉有效信号也被削弱了。
- 排查:检查被剔除的独立成分。除了看拓扑图,务必查看该成分的时间过程。一个典型的眼电成分会在眨眼时刻出现陡峭的高幅值脉冲。肌电成分则表现为高频“毛刺”状活动。
- 解决:不要盲目剔除所有非“脑状”拓扑的成分。可以尝试只剔除相关性最高的1-2个成分,然后对比剔除前后数据在眨眼事件附近的波形。也可以考虑使用更高级的半自动方法(如ICLabel插件)来辅助判断。
6.2 特征提取与模型训练问题
问题4:时频特征提取速度极慢,尤其是对全数据集。
- 排查:CWT计算复杂度高。循环每个试次、每个通道、每个频率点进行计算是主要瓶颈。
- 解决:
- 向量化/并行化:尝试使用
parfor循环替代for循环,利用多核加速。确保你的Matlab版本支持并行计算工具箱。 - 降低分辨率:增大频率步长(如从0.5Hz到1Hz),或减少时间点数(如下采样信号)。
- 使用更高效的工具:探索
cwtfilterbank对象或第三方优化的小波工具箱。 - 分步处理:将特征提取过程脚本化,并分批次运行,保存中间结果(
.mat文件),避免因程序中断而重头再来。
- 向量化/并行化:尝试使用
问题5:SVM训练时间过长或内存不足。
- 排查:特征维度(800+)和样本数(数十个被试×40试次)可能导致核矩阵非常大。
- 解决:
- 必须降维:PCA降至50-200维通常能在保留大部分信息的同时大幅提升训练速度。
- 使用线性核:线性SVM (
fitclinear) 的训练复杂度与特征维度呈线性关系,速度极快,是处理高维数据的第一选择。可以先试线性核,如果效果尚可,则无需使用RBF核。 - 调整求解器:对于线性SVM,尝试
'SGD'或'LBFGS'求解器,它们对大数据集更友好。
问题6:模型在训练集上准确率很高(>90%),但在测试集上很低(~30%),严重过拟合。
- 排查:
- 数据泄露:这是最常见的原因!检查是否在标准化或PCA时,错误地使用了测试集的信息(如全局均值和方差)。必须仅用训练集计算标准化参数和PCA变换矩阵,再应用到测试集。
- 特征过多:相对于样本数,特征维度过高。
- SVM参数过拟合:
C值或gamma值设置过大,导致模型过于复杂。
- 解决:
- 严格检查数据预处理和特征后处理的流程,确保训练/测试集完全独立。
- 增加PCA保留的方差阈值(如99%),或进行特征选择,减少特征数量。
- 在更宽的范围内进行网格搜索交叉验证,并加入正则化。可以尝试较小的
C值和gamma值。
6.3 结果分析与改进方向
问题7:分类准确率始终徘徊在随机水平(25%-35%)附近。
- 排查:
- 标签定义是否合理?检查你将连续的情感维度分数离散化为四分类的逻辑。阈值选取是否恰当?不同被试的情感评分分布可能不同,考虑使用被试内标准化(如基于每个被试自身评分的中位数)后再划分。
- 特征是否具有判别力?可视化不同情感类别下,某个通道某个频带平均功率的分布图。如果分布高度重叠,说明当前特征区分度不够。
- 模型是否学到了东西?查看SVM的权重向量(对于线性核)或支持向量。如果权重几乎为零,说明模型没学到有效模式。
- 解决:
- 重新审视标签:尝试不同的情感模型,例如只做效价或唤醒度的二分类,或者使用基于三维空间(效价、唤醒、支配)的聚类来定义类别。
- 深化特征工程:引入更高级的特征,如前文提到的差分不对称性、跨频段耦合、功能连接特征等。也可以尝试深度学习进行端到端特征学习。
- 检查预处理:可能预处理不够充分,噪声淹没了信号。回头仔细检查ICA去伪迹和滤波的效果。
整个项目从数据到结果,是一个环环相扣的链条。我的体会是,耐心和细致比追求复杂的模型更重要。确保每一步都理解透彻、操作正确,往往比堆砌算法更能带来稳定的性能提升。这个基于时频特征和SVM的框架,为你提供了一个坚实可靠的基线,在此之上,你可以尽情探索脑电情感识别的更多可能性。
本文还有配套的精品资源,点击获取