手把手教你用Python处理DREAMER数据集:从MATLAB文件读取到EEG/ECG信号可视化

张开发
2026/4/14 19:49:58 15 分钟阅读

分享文章

手把手教你用Python处理DREAMER数据集:从MATLAB文件读取到EEG/ECG信号可视化
手把手教你用Python处理DREAMER数据集从MATLAB文件读取到EEG/ECG信号可视化在情感计算研究领域DREAMER数据集因其便携式设备采集的EEG脑电图和ECG心电图信号而备受关注。传统上许多研究者使用MATLAB处理这类数据但随着Python在科学计算领域的崛起越来越多的工程师和研究者希望迁移到更开放、生态更丰富的Python平台。本文将带你用Python完整实现从MATLAB文件解析到信号可视化的全流程特别适合那些正在寻找MATLAB替代方案的研究团队。1. 环境准备与数据获取处理DREAMER数据集需要配置合适的Python环境。推荐使用Anaconda创建独立环境以避免依赖冲突conda create -n dreamer python3.9 conda activate dreamer pip install numpy scipy matplotlib pandas plotly数据集获取流程如下访问DREAMER官网提交申请通常使用学术邮箱更易通过下载包含DREAMER.mat和说明文档的压缩包解压后仔细阅读DREAMER.pdf了解数据结构细节注意数据集使用需遵守相关协议发表研究成果时请务必引用原始论文2. MATLAB文件解析与数据结构转换Python通过scipy.io模块可以无缝读取MATLAB的.mat文件。我们先加载文件并探索数据结构import scipy.io data scipy.io.loadmat(DREAMER.mat, simplify_cellsTrue) dreamer data[DREAMER] print(f数据集包含{dreamer[noOfSubjects]}名被试{dreamer[noOfVideoSequences]}段刺激视频)关键数据结构说明字段类型描述Datalist包含23个被试数据的列表EEG_SamplingRateintEEG采样率(128Hz)ECG_SamplingRateintECG采样率(256Hz)EEG_Electrodeslist14个EEG电极名称提取特定被试数据的示例subject_idx 0 # 第一个被试 subject_data dreamer[Data][subject_idx] print(f被试信息年龄{subject_data[Age]}性别{subject_data[Gender]}) print(f效价评分维度{subject_data[ScoreValence].shape})3. 信号提取与预处理DREAMER数据集中的生理信号存储方式有其特殊性。每个被试的EEG和ECG数据都分为baseline基线和stimuli刺激两部分。3.1 EEG信号提取EEG数据是14通道的时间序列我们可以这样提取import numpy as np # 提取第一个被试对第一个视频的EEG刺激数据 eeg_stimuli subject_data[EEG][stimuli][0] # 形状为(N,14) # 创建EEG通道名称映射 channels dreamer[EEG_Electrodes] channel_map {i: name for i, name in enumerate(channels)} # 计算各通道均值 channel_means np.mean(eeg_stimuli, axis0) for idx, mean_val in enumerate(channel_means): print(f{channel_map[idx]}通道均值{mean_val:.2f}μV)3.2 ECG信号处理ECG数据包含两个导联采样率更高# 提取ECG数据 ecg_stimuli subject_data[ECG][stimuli][0] # 形状为(M,2) sampling_rate dreamer[ECG_SamplingRate] # 计算时长(秒) duration ecg_stimuli.shape[0] / sampling_rate print(fECG记录时长{duration:.2f}秒)4. 信号可视化实战Python的可视化库比MATLAB更加灵活多样。我们使用Matplotlib进行基础绘图Plotly实现交互式可视化。4.1 使用Matplotlib绘制EEG时序图import matplotlib.pyplot as plt # 设置绘图参数 plt.figure(figsize(12, 8)) time np.arange(eeg_stimuli.shape[0]) / dreamer[EEG_SamplingRate] # 绘制前5个通道 for i in range(5): plt.plot(time, eeg_stimuli[:, i] i*100, labelchannel_map[i]) plt.xlabel(时间(s)) plt.ylabel(幅值(μV)) plt.title(EEG信号时序图(前5通道)) plt.legend() plt.grid(True) plt.tight_layout() plt.show()4.2 使用Plotly创建交互式ECG可视化import plotly.graph_objects as go # 创建ECG交互图表 fig go.Figure() # 添加两个导联数据 for lead in [0, 1]: fig.add_trace(go.Scatter( xnp.arange(ecg_stimuli.shape[0]) / sampling_rate, yecg_stimuli[:, lead], namef导联{lead1}, visible(lead 0) # 默认只显示第一个导联 )) # 添加导联选择按钮 fig.update_layout( updatemenus[{ buttons: [ {method: update, args: [{visible: [True, False]}], label: 导联1}, {method: update, args: [{visible: [False, True]}], label: 导联2}, {method: update, args: [{visible: [True, True]}], label: 全部}, ], direction: down, showactive: True, }], titleECG信号交互式可视化, xaxis_title时间(s), yaxis_title幅值(mV) ) fig.show()5. 高级分析与实用技巧5.1 信号频谱分析了解信号的频域特征对情感计算至关重要from scipy.fft import fft, fftfreq # 计算EEG频谱 n eeg_stimuli.shape[0] yf fft(eeg_stimuli[:, 0]) # 取第一个通道 xf fftfreq(n, 1/dreamer[EEG_SamplingRate]) # 绘制单边频谱 plt.figure(figsize(10, 4)) plt.plot(xf[:n//2], np.abs(yf[:n//2])) plt.xlabel(频率(Hz)) plt.ylabel(幅值) plt.title(EEG通道AF3的频谱分析) plt.grid(True) plt.show()5.2 数据批处理方法处理多个被试数据时建议使用生成器节省内存def batch_process(data, process_func, batch_size5): 批处理生成器 for i in range(0, len(data), batch_size): batch data[i:ibatch_size] yield [process_func(item) for item in batch] # 示例处理函数 def extract_valence_scores(subject): return subject[ScoreValence] # 使用示例 for batch in batch_process(dreamer[Data], extract_valence_scores): print(f处理批次包含{len(batch)}个被试的效价评分)5.3 性能优化建议处理大规模生理信号数据时考虑以下优化手段使用dask库进行延迟加载和并行计算将MATLAB数据转换为HDF5格式长期存储对重复计算的结果进行缓存from joblib import Memory # 设置缓存 memory Memory(./cache_dir, verbose0) memory.cache def compute_power_spectrum(signal, fs): 带缓存的功率谱计算 n len(signal) yf fft(signal) xf fftfreq(n, 1/fs) return xf[:n//2], np.abs(yf[:n//2])**2在实际项目中我发现将原始MATLAB数据转换为Pandas DataFrame可以大幅提升后续分析效率。特别是当需要将生理信号与评分数据关联时DataFrame的合并操作比直接操作MATLAB结构更方便。例如可以创建一个包含所有被试评分和信号特征的DataFrame便于后续的机器学习建模。

更多文章