用Python玩转DEAP情感数据集:从数据加载到EEG信号可视化(保姆级教程)
用Python玩转DEAP情感数据集:从数据加载到EEG信号可视化实战指南
1. 初识DEAP数据集:多模态情感分析的黄金标准
DEAP(Database for Emotion Analysis using Physiological Signals)是情感计算领域最具影响力的开源数据集之一。这个由伦敦玛丽女王大学团队构建的资源,记录了32名参与者在观看40段音乐视频时的多维度生理反应,包括:
- 32通道EEG信号(采样率512Hz)
- 外周生理指标(皮肤电导、肌电图等)
- 面部表情视频(22名参与者)
- 主观情感评分(愉悦度、唤醒度、支配度)
不同于常见的静态图像数据集,DEAP的创新性在于:
- 采用音乐视频作为情感诱发素材
- 同步采集多种生理信号
- 使用标准化的情感评估模型(SAM量表)
- 提供原始数据与预处理版本
# 典型DEAP数据结构示例 import numpy as np data = np.zeros((40, 40, 8064)) # 40个试验×40个通道×8064数据点 labels = np.zeros((40, 4)) # 情感评分(愉悦,唤醒,支配,喜好)数据集核心价值:
- 验证情感识别算法
- 研究多模态信号融合
- 探索生理-心理关联机制
- 开发新型人机交互系统
2. 环境配置与数据获取
2.1 搭建Python分析环境
推荐使用Anaconda创建独立环境:
conda create -n deap python=3.8 conda activate deap pip install numpy pandas matplotlib mne scikit-learn关键工具包:
| 工具包 | 用途 | 版本要求 |
|---|---|---|
| MNE-Python | EEG处理 | ≥0.23 |
| NumPy | 数值计算 | ≥1.20 |
| Matplotlib | 可视化 | ≥3.4 |
| Pandas | 元数据处理 | ≥1.2 |
2.2 申请数据集访问权限
- 访问 DEAP官网
- 填写机构邮箱的学术用途申请
- 获取登录凭证后下载:
data_preprocessed_python.zip(2.7GB)participant_ratings.csv(评分数据)video_list.csv(刺激材料信息)
提示:预处理版本已包含降采样(128Hz)、滤波(4-45Hz)和伪迹去除的数据,适合快速分析
3. 数据加载与初步探索
3.1 加载预处理数据
import pickle import numpy as np def load_participant_data(subject_id): """加载单个参与者的数据""" with open(f's{subject_id:02d}.dat', 'rb') as f: data = pickle.load(f, encoding='latin1') return data['data'], data['labels'] # 示例:加载1号参与者的第5个试验数据 eeg_data, ratings = load_participant_data(1) trial_idx = 4 # 第5个试验(0-based) print(f"EEG数据形状: {eeg_data[trial_idx].shape}") print(f"情感评分: 愉悦度={ratings[trial_idx,0]:.1f}, 唤醒度={ratings[trial_idx,1]:.1f}")3.2 理解数据结构
EEG数据维度解析:
- 40个试验 × 40个通道 × 8064数据点
- 每个试验对应60秒数据(128Hz采样率)
- 通道顺序遵循国际10-20系统
情感评分范围:
- 愉悦度(Valence): 1(负面) ~ 9(正面)
- 唤醒度(Arousal): 1(平静) ~ 9(兴奋)
- 支配度(Dominance): 1(顺从) ~ 9(主导)
- 喜好度(Liking): 1(讨厌) ~ 9(喜欢)
3.3 元数据关联分析
import pandas as pd # 加载评分和视频信息 ratings_df = pd.read_csv('participant_ratings.csv') videos_df = pd.read_csv('video_list.csv') # 关联试验与音乐视频特征 merged_df = pd.merge(ratings_df, videos_df, left_on='Experiment_id', right_on='Experiment_id') print(merged_df[['Artist', 'Title', 'Valence', 'Arousal']].head())4. EEG信号可视化实战
4.1 单通道时域分析
import matplotlib.pyplot as plt def plot_eeg_timeseries(data, channel_idx, fs=128): """绘制单通道EEG时域波形""" time = np.arange(data.shape[1]) / fs plt.figure(figsize=(12, 4)) plt.plot(time, data[channel_idx], linewidth=0.5) plt.xlabel('时间 (秒)') plt.ylabel('幅值 (μV)') plt.title(f'通道{channel_idx+1} EEG信号') plt.grid(True) # 绘制Fp1通道(前额叶)数据 plot_eeg_timeseries(eeg_data[trial_idx], channel_idx=0)4.2 多通道拓扑图展示
import mne def create_mne_raw(data, sfreq=128): """创建MNE-Python的Raw对象""" ch_names = [f'EEG{i+1}' for i in range(32)] + ['hEOG', 'vEOG', 'zEMG', 'tEMG', 'GSR', 'Resp', 'Plet', 'Temp'] info = mne.create_info(ch_names, sfreq, ch_types='eeg') return mne.io.RawArray(data, info) # 生成拓扑图 raw = create_mne_raw(eeg_data[trial_idx]) raw.plot_sensors(show_names=True) mne.viz.plot_topomap(raw.get_data()[0, :1000], raw.info)4.3 频域能量分析
def plot_spectral_power(data, channel_idx, fs=128): """计算并绘制功率谱密度""" from scipy import signal f, Pxx = signal.welch(data[channel_idx], fs=fs, nperseg=256) plt.figure(figsize=(10, 4)) plt.semilogy(f, Pxx) plt.xlabel('频率 (Hz)') plt.ylabel('PSD (V²/Hz)') plt.xlim([0, 45]) plt.axvspan(8, 13, color='green', alpha=0.3, label='Alpha波') plt.legend() plot_spectral_power(eeg_data[trial_idx], 0)典型脑电波频段:
| 波段 | 频率范围 | 相关心理状态 |
|---|---|---|
| Delta | 0.5-4Hz | 深度睡眠 |
| Theta | 4-8Hz | 创造性思维 |
| Alpha | 8-13Hz | 放松状态 |
| Beta | 13-30Hz | 专注思考 |
| Gamma | >30Hz | 高阶认知 |
5. 情感维度关联分析
5.1 情感象限可视化
def plot_affective_space(ratings): """绘制情感二维空间分布""" plt.figure(figsize=(8, 8)) plt.scatter(ratings[:,0], ratings[:,1], alpha=0.6) plt.axhline(5, color='k', linestyle='--') plt.axvline(5, color='k', linestyle='--') plt.xlabel('愉悦度 (1=负面, 9=正面)') plt.ylabel('唤醒度 (1=平静, 9=兴奋)') plt.xlim([1, 9]) plt.ylim([1, 9]) plot_affective_space(ratings)5.2 生理信号与情感评分关联
# 计算Alpha波能量与愉悦度的相关性 alpha_power = [] for trial in eeg_data: psd = np.abs(np.fft.fft(trial[0]))**2 # Fp1通道 alpha_power.append(np.mean(psd[8*2:13*2])) # 8-13Hz对应索引 plt.scatter(ratings[:,0], alpha_power) plt.xlabel('愉悦度评分') plt.ylabel('Fp1通道Alpha波能量')5.3 多模态信号融合分析
# 同时分析EEG和皮肤电导(GSR) gsr_channel = 36 # GSR通道索引 gsr_data = eeg_data[:, gsr_channel].mean(axis=1) fig, ax1 = plt.subplots(figsize=(10, 6)) ax1.scatter(ratings[:,0], alpha_power, color='b') ax1.set_xlabel('愉悦度评分') ax1.set_ylabel('Alpha波能量', color='b') ax2 = ax1.twinx() ax2.scatter(ratings[:,0], gsr_data, color='r') ax2.set_ylabel('GSR响应', color='r')6. 高级分析技巧
6.1 跨被试数据标准化
from sklearn.preprocessing import StandardScaler def normalize_across_subjects(all_data): """跨参与者数据标准化""" scaler = StandardScaler() n_subjects = len(all_data) original_shape = all_data[0].shape # 展平数据 (n_samples × n_features) data_2d = np.vstack([d.reshape(-1, original_shape[-1]) for d in all_data]) # 标准化并恢复原始形状 normalized = scaler.fit_transform(data_2d) return [normalized[i*original_shape[0]:(i+1)*original_shape[0]].reshape(original_shape) for i in range(n_subjects)]6.2 基于深度学习的特征提取
import torch import torch.nn as nn class EEGFeatureExtractor(nn.Module): """简单的CNN特征提取器""" def __init__(self, n_channels=32): super().__init__() self.conv1 = nn.Conv1d(n_channels, 64, kernel_size=3) self.conv2 = nn.Conv1d(64, 128, kernel_size=3) self.pool = nn.MaxPool1d(2) def forward(self, x): x = torch.relu(self.conv1(x)) x = self.pool(x) x = torch.relu(self.conv2(x)) x = self.pool(x) return x.flatten(1) # 示例用法 model = EEGFeatureExtractor() sample_input = torch.randn(1, 32, 8064) # (batch, channels, timepoints) features = model(sample_input) print(f"提取特征维度: {features.shape[1]}")6.3 实时情感识别原型
from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split # 准备训练数据 (简化示例) X = np.array([trial.mean(axis=1) for trial in eeg_data]) # 各通道均值作为特征 y = (ratings[:,0] > 5).astype(int) # 二分类:正面/负面情感 # 划分训练测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 训练分类器 clf = RandomForestClassifier(n_estimators=100) clf.fit(X_train, y_train) print(f"测试集准确率: {clf.score(X_test, y_test):.2f}")7. 实际应用与扩展方向
7.1 音乐推荐系统增强
通过分析用户听歌时的生理反应(如GSR、EEG),可以:
- 建立个性化的情感音乐图谱
- 发现潜在的情绪调节曲目
- 优化推荐算法的情感匹配度
# 示例:寻找最具情感唤醒力的音乐片段 video_arousal = ratings_df.groupby('Experiment_id')['Arousal'].mean() top_videos = videos_df.loc[videos_df['Experiment_id'].isin( video_arousal.nlargest(5).index)] print(top_videos[['Artist', 'Title']])7.2 神经反馈训练应用
利用实时EEG数据分析:
- Alpha波增强训练(提升放松能力)
- Theta波调节训练(改善创造力)
- 情绪自我调节能力开发
7.3 多模态融合研究前沿
- 跨模态对齐:精确同步EEG与面部表情的时间戳
- 特征级融合:结合EEG频段能量与表情动作单元(AU)
- 决策级融合:集成多模态的预测结果
# 多模态特征融合示例 eeg_features = np.array([trial[:32].std(axis=1) for trial in eeg_data]) # 各通道标准差 physio_features = np.array([trial[32:].mean(axis=1) for trial in eeg_data]) # 外周生理均值 combined_features = np.hstack([eeg_features, physio_features])8. 最佳实践与疑难解答
8.1 数据预处理关键步骤
- 重参考:转换为平均参考或乳突参考
raw.set_eeg_reference(ref_channels='average') - 带通滤波:保留4-45Hz有效频段
raw.filter(4, 45, fir_design='firwin') - 伪迹去除:
- ICA去除眼电伪迹
- 阈值法去除肌电噪声
8.2 常见问题解决方案
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 数据加载错误 | Python版本不兼容 | 使用Python 3.6-3.8 |
| 频谱泄露 | 未加窗处理 | 应用汉宁窗 |
| 分类性能差 | 特征选择不当 | 尝试时频联合特征 |
8.3 计算性能优化技巧
- 数据分块处理:
for i in range(0, len(data), chunk_size): process_chunk(data[i:i+chunk_size]) - 使用Dask加速:
import dask.array as da dask_data = da.from_array(eeg_data, chunks=(10, 40, 1024)) - GPU加速:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model.to(device)
9. 资源扩展与社区生态
9.1 相关工具推荐
- EEGLAB:MATLAB环境下的EEG分析工具箱
- BCILAB:脑机接口专用框架
- NeuroKit2:Python生理信号分析库
- PyEEG:特征提取专用包
9.2 延伸数据集
- MAHNOB-HCI:多媒体情感数据集
- SEED:上海交大情感EEG数据集
- AMIGOS:多人交互场景数据集
9.3 学术研究热点
- 跨文化情感识别
- 小样本情感建模
- 自监督特征学习
- 可解释神经网络
注意:使用DEAP数据发表研究成果时,请务必引用原始论文: Koelstra et al., "DEAP: A Database for Emotion Analysis using Physiological Signals", IEEE TAC 2012
10. 从实验到产品:实用建议
- 原型设计:先用预处理数据验证概念
- 硬件选型:商业EEG设备如Emotiv、NeuroSky
- 用户体验:简化电极佩戴流程
- 实时性优化:采用滑动窗口分析
- 隐私保护:匿名化处理生理数据
# 实时处理示例(简化版) def real_time_analysis(raw_buffer, model, window_size=128*3): """模拟实时处理流程""" features = extract_features(raw_buffer[-window_size:]) emotion = model.predict([features])[0] return ["平静", "中性", "兴奋"][emotion]在实际项目中,我们发现前额叶(Fp1/Fp2)通道对情绪变化的敏感性最高,而GSR信号对音乐高潮段的响应最为明显。建议初学者先从这两个信号入手,逐步扩展到全通道分析。
