用Python从零处理SEED脑电数据集:一份给深度学习新手的保姆级数据加载与特征解析指南
用Python从零处理SEED脑电数据集一份给深度学习新手的保姆级数据加载与特征解析指南当你第一次拿到SEED脑电数据集时那些.mat文件、复杂的特征文件夹和陌生的术语可能会让你感到无从下手。作为EEG情感识别领域最常用的基准数据集之一SEED包含了15名受试者的脑电信号和眼动数据是学习脑电处理的绝佳起点。本文将带你用Python一步步解开这个数据集的神秘面纱。1. 环境准备与数据概览在开始之前确保你的Python环境已经安装了以下核心库pip install numpy pandas matplotlib scipy scikit-learnSEED数据集主要包含两部分SEED_EEG15名受试者的预处理脑电数据SEED_Multimodal12名受试者的多模态数据脑电眼动数据集的文件结构通常如下SEED/ ├── Preprocessed_EEG/ # 预处理后的原始EEG信号(.mat) ├── Extracted_Features/ # 提取好的特征(DE, DASM, RASM) └── SEED_Multimodal/ ├── Chinese/ # 中文实验数据 │ ├── 01-EEG-raw/ # 原始EEG信号(.cnt) │ ├── 02-EEG-DE-feature/ # DE特征 │ └── 03-Eye-tracking/ # 眼动数据 └── code/ # 示例代码提示下载数据集后建议先用文本编辑器查看README文件了解数据集的版本和基本结构。2. 加载预处理EEG数据SEED的预处理数据存储在MATLAB的.mat文件中我们可以使用scipy.io模块来加载import scipy.io as sio # 加载单个受试者的数据 eeg_data sio.loadmat(Preprocessed_EEG/1_20131027.mat) # 查看文件中的变量 print(eeg_data.keys()) # 通常包含eeg_1到eeg_15和对应标签每个.mat文件包含16个数组15个EEG片段eeg_1到eeg_151个标签数组labelsEEG数据的典型维度是[通道数×时间点]。SEED使用62个电极通道采样率为200Hz因此4分钟的电影片段大约有48,000个时间点。数据结构解析表变量名数据类型维度描述eeg_1float3262×N第一个片段的EEG数据............eeg_15float3262×N第15个片段的EEG数据labelsint815情感标签(-1,0,1)3. 理解与处理提取的特征SEED提供了三种预提取的特征DE微分熵反映脑电信号在不同频带的能量分布DASM微分不对称左右半球对应通道DE的差值RASM有理不对称左右半球DE的比值加载特征数据的Python示例import numpy as np # 加载DE特征 de_features sio.loadmat(Extracted_Features/1_20131027.mat) print(de_features.keys()) # 通常包含de_1到de_15 # 查看单个片段的DE特征 de_sample de_features[de_1] print(fDE特征形状{de_sample.shape}) # 通常为[5频带×62通道]特征维度详解DE特征通常包含5个频带Delta (1-3Hz)Theta (4-7Hz)Alpha (8-13Hz)Beta (14-30Hz)Gamma (31-50Hz)对于DASM和RASM特征数据集已经计算了27对半球不对称电极4. 数据可视化与验证加载数据后验证数据是否正确非常重要。我们可以绘制一些基本图形import matplotlib.pyplot as plt # 绘制原始EEG信号第一个通道 plt.figure(figsize(12,4)) plt.plot(eeg_data[eeg_1][0,:500]) # 只绘制前500个采样点 plt.title(原始EEG信号通道1) plt.xlabel(时间点) plt.ylabel(幅值(μV)) plt.show() # 绘制DE特征热图 plt.figure(figsize(10,6)) plt.imshow(de_features[de_1], aspectauto, cmapjet) plt.colorbar(labelDE值) plt.title(DE特征5频带×62通道) plt.xlabel(通道编号) plt.ylabel(频带) plt.show()注意在绘制原始EEG时由于数据量很大建议只绘制部分时间段否则图形会过于密集难以观察。5. 构建基础数据处理管道为了便于后续的深度学习建模我们可以创建一个简单的数据处理类class SEEDLoader: def __init__(self, data_path): self.data_path data_path self.channels 62 self.bands [delta, theta, alpha, beta, gamma] def load_subject(self, subject_id): 加载单个受试者的所有数据 eeg_file f{self.data_path}/Preprocessed_EEG/{subject_id}_*.mat de_file f{self.data_path}/Extracted_Features/{subject_id}_*.mat # 实际实现中需要处理文件匹配和错误检查 eeg_data sio.loadmat(eeg_file) de_data sio.loadmat(de_file) return { raw_eeg: [eeg_data[feeg_{i}] for i in range(1,16)], de_features: [de_data[fde_{i}] for i in range(1,16)], labels: eeg_data[labels].flatten() } def get_feature_matrix(self, subject_data, feature_typede): 将特征转换为机器学习友好的矩阵 if feature_type de: features subject_data[de_features] # 将15个试次的5×62特征展平为15×(5×62) return np.array([f.flatten() for f in features]) # 可以扩展其他特征类型...6. 处理多模态数据EEG眼动对于SEED_Multimodal部分眼动数据通常以Excel或pickle格式存储import pandas as pd # 加载眼动数据Excel格式 eye_data pd.read_excel(SEED_Multimodal/Chinese/03-Eye-tracking/1.xlsx) # 眼动数据通常包含以下列 # Timestamp, GazeX, GazeY, PupilSize, Fixation等 print(eye_data.head()) # 时间对齐是关键 - EEG和眼动的采样率不同 eeg_rate 200 # Hz eye_rate 60 # Hz (典型值)多模态数据同步策略时间戳对齐两种数据源都有时间戳时可以精确匹配降采样对齐将高采样率数据降采样到低采样率事件标记对齐利用实验中的事件标记如电影开始/结束7. 特征工程与数据增强虽然SEED已经提供了很好的特征但你还可以进一步处理from sklearn.preprocessing import StandardScaler # 特征标准化 scaler StandardScaler() de_features loader.get_feature_matrix(subject_data) scaled_features scaler.fit_transform(de_features) # 时频特征增强 def extract_time_freq_features(eeg_signal, fs200): 从原始EEG中提取时频特征 import pywt # 需要安装PyWavelets # 小波变换示例 coeffs pywt.wavedec(eeg_signal, db4, level6) # 可以计算各层的统计量作为特征... return features # 滑动窗口处理 def sliding_window(features, window_size10, step5): 将长序列分割为多个窗口 windows [] for i in range(0, len(features)-window_size, step): windows.append(features[i:iwindow_size]) return np.array(windows)8. 构建完整的数据加载流程将以上步骤整合为一个完整的数据加载流程数据检查验证文件完整性和基本统计特征选择决定使用原始EEG还是预提取特征数据分割按受试者或试次划分训练/测试集批处理为深度学习准备数据生成器# 示例批处理生成器 def data_generator(subject_ids, batch_size32, shuffleTrue): while True: if shuffle: np.random.shuffle(subject_ids) for i in range(0, len(subject_ids), batch_size): batch_ids subject_ids[i:ibatch_size] X, y [], [] for sid in batch_ids: data loader.load_subject(sid) features loader.get_feature_matrix(data) X.append(features) y.append(data[labels]) yield np.concatenate(X), np.concatenate(y)在实际项目中你可能需要处理不同受试者之间的数据差异、平衡不同类别的样本数量或者实现更复杂的数据增强策略。记住脑电数据通常噪声较多因此鲁棒的数据处理流程比复杂的模型架构更重要。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2441783.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!