DEAP数据集下的情绪识别分类

针对DEAP数据集的情绪识别分类任务,以下是完整的解决方案步骤:

1. 数据预处理

  • 加载数据:使用scipy.io加载.mat文件,提取EEG信号(32通道)和标签(效价、唤醒度)。
  • 数据分段:将每个试次的EEG信号分割为4秒的窗口(无重叠或50%重叠),每个窗口对应一个样本。
  • 标签处理:根据中位数将效价和唤醒度分为高/低两类,生成二分类标签。

2. 特征提取

对每个窗口的每个EEG通道提取以下特征:

  • 频域特征:使用Welch方法计算5个频段(delta、theta、alpha、beta、gamma)的功率谱密度。
  • 时域特征:均值、方差、Hjorth参数(活动性、移动性、复杂性)。
  • 非线性特征:样本熵(复杂度衡量)。

3. 特征处理

  • 标准化:使用Z-score标准化所有特征。
  • 降维:应用PCA保留95%的方差,减少特征维度。

4. 分类模型

  • 模型选择:使用支持向量机(SVM)和随机森林进行对比,采用网格搜索优化超参数。
  • 数据划分:按试次划分训练集和测试集,避免同一试次的数据泄漏。
  • 交叉验证:分层K折交叉验证(如10折)确保评估的稳健性。

5. 评估指标

计算准确率、F1分数、AUC等指标,对比不同特征组合和模型的性能。

DEAP数据集下的情绪识别分类

示例代码

import scipy.io
import numpy as np
from sklearn.model_selection import train_test_split, StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, f1_score
from sklearn.decomposition import PCA
from scipy.signal import welch
import antropy as ant  # 用于样本熵计算

# 加载数据
mat = scipy.io.loadmat('data/s01.mat')
data = mat['data'][:, :32, :]  # EEG通道
labels = mat['labels'][:, :2]  # 效价和唤醒度

# 生成二分类标签
valence_labels = (labels[:, 0] > np.median(labels[:, 0])).astype(int)
arousal_labels = (labels[:, 1] > np.median(labels[:, 1])).astype(int)

# 分割窗口
window_size = 4 * 128  # 4秒
n_windows = data.shape[2] // window_size
windows = data[:, :, :n_windows * window_size].reshape(40, 32, n_windows, window_size)

# 特征提取
def extract_features(window):
    fs = 128
    freq_bands = {'delta': (0.5, 4), 'theta': (4, 8), 'alpha': (8, 12),
                  'beta': (12, 30), 'gamma': (30, 64)}
    features = []
    # 频域特征
    freqs, psd = welch(window, fs=fs, nperseg=256)
    for band in freq_bands.values():
        idx = np.where((freqs >= band[0]) & (freqs <= band[1]))[0]
        features.append(np.sum(psd[idx]) if len(idx) > 0 else 0)
    # 时域特征
    features.extend([np.mean(window), np.var(window), 
                     ant.hjorth_params(window)[1], ant.hjorth_params(window)[2]])
    # 样本熵
    features.append(ant.sample_entropy(window.reshape(-1, 1)))
    return features

# 构建特征矩阵和标签
X, y = [], []
for trial in range(40):
    for w in range(n_windows):
        trial_features = []
        for channel in range(32):
            window = windows[trial, channel, w]
            trial_features.extend(extract_features(window))
        X.append(trial_features)
        y.append(valence_labels[trial])  # 以效价为例

X = np.array(X)
y = np.array(y)

# 标准化和PCA
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
pca = PCA(n_components=0.95)
X_pca = pca.fit_transform(X_scaled)

# 划分训练集和测试集(按试次划分)
train_trials, test_trials = train_test_split(np.arange(40), test_size=0.2, stratify=valence_labels)
train_indices = [i for i, trial in enumerate(range(40)) for w in range(n_windows) if trial in train_trials]
test_indices = [i for i, trial in enumerate(range(40)) for w in range(n_windows) if trial in test_trials]

X_train, X_test = X_pca[train_indices], X_pca[test_indices]
y_train, y_test = y[train_indices], y[test_indices]

# 训练SVM
svm = SVC(kernel='rbf', C=1.0, gamma='scale')
svm.fit(X_train, y_train)
y_pred = svm.predict(X_test)
print(f"SVM Accuracy: {accuracy_score(y_test, y_pred):.2f}, F1: {f1_score(y_test, y_pred):.2f}")

# 随机森林
rf = RandomForestClassifier(n_estimators=100)
rf.fit(X_train, y_train)
y_pred_rf = rf.predict(X_test)
print(f"RF Accuracy: {accuracy_score(y_test, y_pred_rf):.2f}, F1: {f1_score(y_test, y_pred_rf):.2f}")

关键优化点

  • 特征多样性:结合频域、时域和非线性特征,全面捕捉信号特性。
  • 数据划分策略:按试次划分避免数据泄漏,确保模型泛化能力。
  • 降维处理:PCA保留主要信息,提升计算效率和模型性能。

通过上述步骤,可有效实现DEAP数据集的情绪分类,根据实际需求调整特征组合和模型参数以优化结果。

### DEAP 数据集概述 DEAP数据集是一个专门设计用于情绪分析的研究资源,包含了来自32名参与者的多模态记录[^3]。每位参与者观看了40段各一分钟长度的音乐视频片段,并在此过程中通过脑电图(EEG)、面部表情以及外周生理信号进行了同步监测。 #### 数据集结构与内容 - **EEG信号**: 记录了64通道的脑电信号。 - **外围生理参数**: 包括皮肤电反应(GSR),血容量脉搏(BVP),呼吸率(RESP), 和体温(SKINTEMP)[^3]。 - **自我评估量表**: 参与者基于SAM(Self-Assessment Manikin)对每一段视频的情绪体验进行了评价,主要围绕愉悦度(valence)和唤起程度(arousal)两个维度打分[^4]。 #### 获取途径 为了方便研究人员获取并利用这一宝贵资料库开展工作,官方提供了详细的下载指南[^2]: 访问GitHub仓库页面 `https://github.com/CodeStoreHub/EEG-datasets` 即可找到链接指向原始发布网站上的具体文件位置。按照指示完成注册流程后便能合法获得完整的实验材料副本。 #### 应用实例 下面给出了一段Python代码作为示范,展示如何加载部分预处理后的EEG数据样本: ```python import numpy as np from scipy.io import loadmat def load_deap_data(file_path, subject_id=1): """ 加载指定ID受试者的DEAP EEG数据 参数: file_path -- 文件路径字符串 subject_id -- 整数型个体编号,默认为第一个测试对象 返回值: eeg_signals -- NumPy数组形式存储的时间序列矩阵 """ data = loadmat(file_path)['data'] eeg_signals = data[subject_id - 1][0]['trial'][0] return eeg_signals if __name__ == "__main__": sample_eeg = load_deap_data('path_to_DEAP_dataset/s01.mat') print(f"Loaded EEG signal shape: {sample_eeg.shape}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值