当前位置: 首页 > news >正文

用Python玩转WESAD和DREAMER:手把手教你读取ECG情绪识别数据集(附完整代码)

用Python玩转WESAD和DREAMER手把手教你读取ECG情绪识别数据集附完整代码情绪识别技术正逐渐从实验室走向实际应用而ECG心电图信号因其客观性和连续性成为研究热点。WESAD和DREAMER作为两个重要的多模态情绪识别数据集为研究者提供了丰富的生理信号数据。本文将带你从零开始掌握这两个数据集的Python处理技巧。1. 环境准备与数据获取在开始处理数据前我们需要搭建合适的Python环境。推荐使用Anaconda创建独立环境conda create -n emotion_recognition python3.8 conda activate emotion_recognition pip install numpy pandas matplotlib scipy seabornWESAD数据集可直接从官网下载而DREAMER需要提交申请。下载后建议按以下结构组织文件情绪识别项目/ ├── data/ │ ├── WESAD/ │ │ ├── S1.pkl │ │ ├── S2.pkl │ │ └── ... │ └── DREAMER.mat ├── scripts/ │ └── data_processing.py └── outputs/ └── figures/提示处理生理信号数据时保持文件路径的规范性非常重要可以避免许多不必要的错误。2. WESAD数据集深度解析WESAD数据集包含15名受试者的多模态生理信号采样频率为700Hz。其数据结构采用Python字典形式存储主要包含三个关键部分subject: 受试者标识符如S1, S2等signal: 原始生理信号数据分为chest和wrist两组label: 情绪状态标签0-72.1 数据加载与探索让我们创建一个专门处理WESAD数据的Python类import pickle import numpy as np import matplotlib.pyplot as plt class WESADLoader: def __init__(self, data_path, subject_id): self.data_path data_path self.subject_id subject_id self.data self._load_data() def _load_data(self): with open(f{self.data_path}/{self.subject_id}.pkl, rb) as f: return pickle.load(f, encodinglatin1) def get_chest_signals(self): return self.data[signal][chest] def get_labels(self): return self.data[label] def plot_ecg_segment(self, start0, end5000): ecg self.get_chest_signals()[ECG][start:end] plt.figure(figsize(15, 4)) plt.plot(ecg) plt.title(fECG Segment (Subject {self.subject_id})) plt.xlabel(Samples) plt.ylabel(Amplitude) plt.grid() plt.show()使用示例loader WESADLoader(data/WESAD, S3) chest_data loader.get_chest_signals() print(fAvailable chest signals: {list(chest_data.keys())}) # 输出各信号长度 for signal, values in chest_data.items(): print(f{signal}: {len(values)} samples) # 可视化ECG片段 loader.plot_ecg_segment(10000, 15000)2.2 情绪片段提取与分析WESAD数据集包含多种情绪状态我们可以按标签提取特定情绪的数据def extract_emotion_segments(loader, emotion_code): labels loader.get_labels() indices np.where(labels emotion_code)[0] chest_data loader.get_chest_signals() segments {} for signal in chest_data: segments[signal] chest_data[signal][indices] return segments # 提取基线状态数据label1 baseline_data extract_emotion_segments(loader, 1) # 提取压力状态数据label2 stress_data extract_emotion_segments(loader, 2)3. DREAMER数据集实战指南DREAMER数据集记录了23名受试者在观看情绪诱发视频时的ECG和EEG信号其数据结构更为复杂采用MATLAB的.mat格式存储。3.1 数据加载与结构解析使用scipy.io加载.mat文件import scipy.io as sio def load_dreamer(data_path): data sio.loadmat(data_path, simplify_cellsTrue) return data[DREAMER] dreamer_data load_dreamer(data/DREAMER.mat) print(f数据集包含 {dreamer_data[noOfSubjects]} 名受试者) print(f每个受试者有 {dreamer_data[noOfVideoSequences]} 个视频片段)DREAMER数据结构关键字段字段描述数据类型Data主体数据包含23个受试者数据的列表ECG_SamplingRateECG采样率256 HzScoreValence效价评分18×1数组ScoreArousal唤醒评分18×1数组3.2 ECG信号提取与处理提取特定受试者的ECG数据def get_ecg_data(dreamer_data, subject_idx): subject_data dreamer_data[Data][subject_idx] return { baseline: subject_data[ECG][baseline], stimuli: subject_data[ECG][stimuli], valence: subject_data[ScoreValence], arousal: subject_data[ScoreArousal] } # 获取第一个受试者的ECG数据 subject_ecg get_ecg_data(dreamer_data, 0) # 可视化第一个视频片段的ECG plt.figure(figsize(15, 4)) plt.plot(subject_ecg[stimuli][0]) plt.title(ECG during Emotion Induction (First Video)) plt.xlabel(Samples) plt.ylabel(Amplitude) plt.grid() plt.show()4. 高级分析与可视化技巧掌握了基础数据读取后我们可以进行更深入的分析。4.1 心率变异性HRV分析HRV是情绪识别中的重要特征我们可以从ECG信号中提取from scipy.signal import find_peaks def compute_hrv(ecg_signal, fs700): # 检测R波峰值 peaks, _ find_peaks(ecg_signal, heightnp.mean(ecg_signal)*1.5, distancefs*0.6) # 计算RR间期毫秒 rr_intervals np.diff(peaks) * (1000/fs) # 计算SDNNHRV常用指标 sdnn np.std(rr_intervals) return { peaks: peaks, rr_intervals: rr_intervals, sdnn: sdnn } # 计算基线状态的HRV baseline_ecg loader.get_chest_signals()[ECG] hrv_results compute_hrv(baseline_ecg[:20000]) # 使用前20秒数据 plt.figure(figsize(15, 4)) plt.plot(baseline_ecg[:20000]) plt.plot(hrv_results[peaks], baseline_ecg[hrv_results[peaks]], rx) plt.title(R Peak Detection) plt.show() print(fHRV (SDNN): {hrv_results[sdnn]:.2f} ms)4.2 多受试者数据整合对于需要同时分析多个受试者的情况我们可以构建统一的数据结构def process_multiple_subjects(data_path, subject_ids): all_data {} for subject in subject_ids: loader WESADLoader(data_path, subject) signals loader.get_chest_signals() labels loader.get_labels() # 提取各情绪状态的平均ECG幅值 emotions { 1: baseline, 2: stress, 3: amusement } subject_results {} for code, name in emotions.items(): segments extract_emotion_segments(loader, code) subject_results[name] np.mean(np.abs(segments[ECG])) all_data[subject] subject_results return pd.DataFrame(all_data).T # 处理前5名受试者 results_df process_multiple_subjects(data/WESAD, [fS{i} for i in range(1, 6)]) print(results_df)这将输出一个DataFrame显示各受试者在不同情绪状态下的ECG平均幅值baselinestressamusementS10.1520.1780.161S20.1460.1850.158............5. 常见问题与调试技巧在实际操作中你可能会遇到以下问题数据加载错误确保文件路径正确检查Python版本与pickle协议兼容性对于.mat文件尝试不同的simplify_cells参数信号显示异常# 检查数据范围 print(fECG range: {np.min(ecg)} to {np.max(ecg)}) # 标准化显示 ecg_normalized (ecg - np.mean(ecg)) / np.std(ecg)内存不足处理对于大型.mat文件考虑分块加载使用memory_map选项data sio.loadmat(large_file.mat, mat_dtypeTrue, matlab_compatibleFalse)跨平台兼容性路径处理使用os.path.joinimport os file_path os.path.join(data, WESAD, S1.pkl)注意生理信号数据通常包含高频噪声在实际分析前应考虑适当的滤波处理。一个简单的带通滤波示例from scipy.signal import butter, filtfilt def bandpass_filter(data, lowcut1.0, highcut35.0, fs700, order4): nyq 0.5 * fs low lowcut / nyq high highcut / nyq b, a butter(order, [low, high], btypeband) return filtfilt(b, a, data) # 应用滤波器 filtered_ecg bandpass_filter(chest_data[ECG])
http://www.gsyq.cn/news/1364403.html

相关文章:

  • 大数据机器学习基准测试实战:TPCx-BB扩展与多库性能对比
  • C#直连Tesseract C++原生API实战指南
  • 别再只盯着深度学习!用OpenCV+Python实战传统分水岭算法,5分钟搞定细胞图像分割
  • 基于SpringBoot的工业设备远程运维台账毕业设计
  • 从Python课设到CTF利器:JWT_GUI工具开发复盘与使用避坑全指南
  • C#中协变逆变的实现
  • 从ODE到SDE:随机微分方程建模、时间反转与边界值问题求解
  • 高能物理数据分析:从蒙特卡洛模拟到DataFrame的粒子物理解码
  • 2026年4月有名的光伏电站运维口碑推荐,光伏电站投资/储能电站安装/光伏电站运维/重卡充电桩安装,光伏电站运维推荐 - 品牌推荐师
  • 量子机器学习分类器性能杀手:数据诱导随机性与类间隔理论解析
  • DML1与DML2在LATE估计中的性能差异与选择指南
  • 从随机X自由度视角解析模型复杂度:偏置如何膨胀有效复杂度
  • 美团mtgsig签名环境模拟:三层解耦与原生依赖重建
  • 数据增强的样本复杂度理论:从VC维边界到算法选择
  • Meta-ANOVA:基于方差分析与统计交互的黑盒模型可解释性方法
  • 语音识别持续学习:基于机器语音链与梯度情景记忆的半监督方案
  • Burp Suite JS-RPC:将前端加密变为可调用测试探针
  • 多模态SLU数据集评估:从任务对话到协作问题解决的演进与挑战
  • kNN×KDE算法:为缺失数据插补提供概率分布,提升天文数据分析可靠性
  • 几何量子机器学习:利用对称性原理破解贫瘠高原与设计高效算法
  • 2026中山市黄金回收门店指南:黄金 白银 铂金 彩金回收五家门店实测及联系方式推荐 - 盛世金银回收
  • 连续处理效应下的双重差分:从二元到连续的范式演进与DML应用
  • 基于图神经网络与LLM的Java空安全注解自动化推断技术解析
  • 别再手动开便签了!Win11开机启动文件夹的‘隐藏’用法与权限绕过实战
  • FreeRADIUS部署实战:从环境准备到动态VLAN分配
  • 2026中卫市黄金回收门店指南:黄金 白银 铂金 彩金回收五家门店实测及联系方式推荐 - 盛世金银回收
  • 量子软件不稳定测试检测:基于机器学习的自动化解决方案
  • 机器学习赋能密度泛函理论:构建半局域交换关联泛函攻克强关联体系
  • 量子机器学习在基因组分类中的实践:特征映射与模型选择指南