🌟 引言:当深度学习遇见"大脑电流"
在人工智能的众多分支中,情感计算(Affective Computing) 始终是最具挑战性的领域之一。不同于通过面部表情或语音来识别情绪(这些行为可以被人类刻意伪装),脑电信号(EEG) 直接来源于中枢神经系统,被认为是捕捉人类真实情感的"黄金标准"。
本系列博客将带你走进 脑机接口(BCI) 的世界。我们将基于经典的 DEAP 数据集 ,从零开始构建一个能够"读懂人心"的情绪分类器。作为系列的第一篇,我们将完成最基础但也最关键的任务:理解脑电频率理论、解析 DEAP 数据架构、搭建开发环境,并绘制出属于你的第一行脑波图。
1. 脑电理论:解码大脑的"五重奏"
脑电信号(EEG)本质上是大脑皮层神经元群同步放电产生的电位总和。在情绪识别中,我们并不直接分析杂乱的波形,而是将其拆解为五个核心频带:
| 频带名称 | 频率范围 (Hz) | 生理状态与情感关联 |
|---|---|---|
| Delta ( \\delta) | 0.5 - 4 | 深度睡眠状态。在清醒情绪识别中通常被视为伪影噪声。 |
| Theta (\\theta) | 4 - 8 | 深度冥想、创造力。关联挫败感、失望或注意力分散。 |
| Alpha (\\alpha) | 8 - 13 | 放松、闭目养神。左侧额叶 Alpha 波减弱通常意味着积极情绪。 |
| Beta (\\beta) | 13 - 30 | 逻辑思考、高度警觉。关联焦虑、压力、兴奋。 |
| Gamma (\\gamma) | > 30 | 高级认知、多感官整合。关联极端情绪爆发或心流状态。 |
2. DEAP 数据集深度拆解:情绪研究的"ImageNet"
DEAP (Database for Emotion Analysis using Physiological signals) 是全球研究者公认的标准库。
2.1 数据采集协议
-
被试者:32名健康成年人。
-
刺激物:40段经过预选的音乐视频(Music Video),每段 60 秒。
-
多模态:除了 32 通道的 EEG,还记录了皮肤电导(GSR)、心电(ECG)、呼吸等外围生理信号。
2.2 数据格式 (The .dat Structure)
当你下载 DEAP 预处理版后,你会得到 32 个 .dat 文件(s01.dat - s32.dat)。每个文件是一个 Python 字典,结构如下:
-
data: 形状为(40, 40, 8064)-
40:试验次数 (Videos) -
40:通道数(前 32 个是 EEG,后 8 个是外围信号) -
8064:采样点(63秒 \\times 128Hz 采样率)
-
-
labels: 形状为(40, 4)- 四个维度分别是:Valence (效价) , Arousal (唤醒度), Dominance, Liking。
3. 数学模型:Russell 的情绪坐标系
我们如何定义"快乐"或"愤怒"?本项目采用 Russell 环状模型(Circumplex Model)。
3.1 坐标定义
情绪被映射到一个二维直角坐标系中:
-
Valence (效价):描述情绪的"正负"。
-
V \> 5:愉快、积极。
-
V \< 5:痛苦、消极。
-
-
Arousal (唤醒度):描述情绪的"强弱"。
-
A \> 5:兴奋、紧张、激活。
-
A \< 5:平静、疲惫、去激活。
-
3.2 离散化映射
在后续的 KNN 分类中,我们会将坐标划分为四个象限:
-
HVHA (高唤醒高效价):快乐 (Happy) / 兴奋 (Excited)
-
LVHA (高唤醒低效价):愤怒 (Angry) / 紧张 (Nervous)
-
LVLA (低唤醒低效价):悲伤 (Sad) / 忧郁 (Depressed)
-
HVLA (低唤醒高效价):放松 (Relaxed) / 平静 (Calm)
4. 环境搭建与依赖配置
在开始编码前,请确保你的 Python 环境已经安装了以下核心库:
Bash
# 核心计算与处理库
pip install numpy scipy pandas pickle-mixin
# 绘图与可视化
pip install matplotlib seaborn opencv-python
# 脑电专业库 (强烈建议安装)
pip install mne
5. 实战代码:读取数据并可视化脑电波
下面这段代码演示了如何解析 DEAP 的原始文件,并提取第 1 个被试(s01)观看第 1 个视频时的 Fp1(前额极) 通道信号。
Python
import pickle
import numpy as np
import matplotlib.pyplot as plt
def load_deap_file(file_path):
"""
读取DEAP数据文件
"""
with open(file_path, 'rb') as f:
# Python 3 必须指定 encoding='latin1'
data_dict = pickle.load(f, encoding='latin1')
return data_dict['data'], data_dict['labels']
# 1. 加载第一个受试者数据
file_path = 's01.dat' # 请确保文件在当前目录下
data, labels = load_deap_file(file_path)
# 2. 提取数据
# 形状: (40试验, 40通道, 8064采样点)
# 我们取: 第1个视频, 第1个通道(Fp1), 全部时间点
trial_idx = 0
channel_idx = 0
signal = data[trial_idx, channel_idx, :]
label = labels[trial_idx]
# 3. 绘制波形图
fs = 128 # 采样率
time = np.arange(len(signal)) / fs
plt.figure(figsize=(15, 5))
plt.plot(time, signal, color='#1f77b4', lw=0.8)
plt.title(f'Subject 01 - Trial {trial_idx+1} - Channel Fp1\n'
f'Valence: {label[0]:.2f}, Arousal: {label[1]:.2f}')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude ($\mu$V)')
plt.grid(alpha=0.3)
plt.show()
print(f"该试验的情绪标签: Valence={label[0]}, Arousal={label[1]}")
💡 核心逻辑解析:
-
前 3 秒去基线:你会发现信号的前 384 个点(3秒 \\times 128Hz)波形可能比较特殊,那是基线测量期。在后续特征提取中,我们通常需要将其减去。
-
单位:DEAP 数据通常已经过微伏(\\muV)单位缩放和 0.4-45Hz 的带通滤波,可以直接进行频域分析。
6. 深度前瞻:为什么选择 KNN 分类?
在本项目的后续环节,我们将面临特征工程。原始数据维度太高(8064点),直接分类会遭遇"维度灾难"。
我们将采用以下策略:
-
FFT 转换:将 1D 时域信号转为频域。
-
特征压缩:计算 5 个频带的标准差(Standard Deviation),将 8064 个点降维成 5 个核心特征。
-
KNN 分类器:
-
Canberra 距离:相较于欧氏距离,它对特征值之间的比例变化更敏感,非常适合处理 EEG 这种个体差异巨大的数据。
-
参数 K 的选择:我们将通过实验证明,当 K=3 时,模型在 DEAP 数据集上的表现最为稳健。
-
7. 结语与下一步
本篇文章我们完成了脑电情绪识别的"理论筑基"。你已经了解了大脑如何通过电磁波表达情感,并亲手绘制出了大脑的原始信号。
下一篇预告:
我们将深入探讨 《脑电信号预处理:FFT 频域转换与特征提取实战》。届时,我们将把这些杂乱的波形转化为 160 维的特征向量,真正开始机器学习的训练。
动手挑战:
尝试修改代码,循环打印出 40 个视频的标签,看看受试者 s01 观看哪一个视频时 Valence(效价)最高?欢迎在评论区贴出你的发现!
关注专栏,第一时间获取代码更新!