脑机接口:基于 EEG 信号的情绪识别算法实践
·
脑机接口:基于EEG信号的情绪识别算法实践
EEG(脑电图)情绪识别是脑机接口的核心应用之一,通过分析大脑电信号识别喜悦、悲伤、愤怒等情绪状态。以下是完整的技术流程和算法实践指南:
一、技术流程
-
数据采集
- 设备:使用EEG帽(如NeuroScan, Emotiv)采集原始信号
- 通道:常用64/128通道,采样率≥256Hz
- 实验范式:
- 被试者观看情绪诱发视频/图片(如IAPS数据集)
- 同步记录情绪标签(离散:喜/怒/哀;连续:效价-唤醒度)
-
信号预处理
import numpy as np import mne # EEG处理库 # 1. 降噪 raw = mne.io.read_raw_edf("eeg_data.edf", preload=True) raw.filter(1, 40) # 带通滤波(1-40Hz) raw.notch_filter(50) # 工频噪声滤除(50/60Hz) # 2. 伪迹去除 ica = mne.preprocessing.ICA(n_components=20) ica.fit(raw) ica.exclude = [0, 1] # 标记眼电/肌电成分 raw_clean = ica.apply(raw) -
特征提取
特征类型 计算方法 情绪关联性 功率谱密度(PSD) Welch方法计算频带能量 δ/θ波与消极情绪相关 微分熵(DE) $$ DE = \frac{1}{2}\log(2\pi e\sigma^2) $$ 表征脑电复杂度 功能连接 PLV/相干性计算脑区耦合 跨脑区情绪网络 -
特征选择
- 递归特征消除(RFE)
- 互信息(MI)筛选Top-k特征
from sklearn.feature_selection import mutual_info_classif mi_scores = mutual_info_classif(X, y) selected_idx = np.argsort(mi_scores)[-30:] # 选择Top30特征
二、核心算法实践
-
传统机器学习
from sklearn.svm import SVC from sklearn.model_selection import cross_val_score # SVM分类器 model = SVC(kernel='rbf', C=1.0, gamma='scale') scores = cross_val_score(model, X_features, y_labels, cv=5) print(f"准确率: {np.mean(scores):.2f}±{np.std(scores):.2f}")- 常用模型:SVM、随机森林、LDA
- DEAP数据集典型准确率:65-75%
-
深度学习模型
- EEGNet(轻量化CNN):
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation model = Sequential([ Conv2D(8, (1, 64), input_shape=(64, 256, 1)), # 通道×时间点 BatchNormalization(), Activation('elu'), # 深度可分离卷积(省略详细结构) ]) model.compile(loss='categorical_crossentropy', optimizer='adam') - Transformer时序建模:
$$ \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$- 优势:捕捉长时程EEG依赖关系
- EEGNet(轻量化CNN):
三、挑战与优化
-
个体差异问题
- 解决方案:迁移学习(Domain Adaptation)
- 损失函数:$$ \mathcal{L} = \mathcal{L}{cls} + \lambda \mathcal{L}{MMD} $$
- MMD(最大均值差异)减小源域与目标域分布差异
- 解决方案:迁移学习(Domain Adaptation)
-
实时性优化
- 滑动窗口分割:窗口长度1-2s,重叠率50%
- 轻量化模型:MobileNet-EEG参数量<100KB
-
多模态融合
- EEG + 生理信号(心率/皮电)
- 特征级融合:早期拼接(Early Fusion)
- 决策级融合:加权投票(Late Fusion)
四、完整代码示例
# 基于PyTorch的LSTM情绪识别
import torch
import torch.nn as nn
class EmotionLSTM(nn.Module):
def __init__(self, input_dim, hidden_dim):
super().__init__()
self.lstm = nn.LSTM(input_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, 4) # 4类情绪
def forward(self, x):
x, _ = self.lstm(x) # x: [batch, seq_len, features]
x = x[:, -1, :] # 取最后时间步
return self.fc(x)
# 训练循环
model = EmotionLSTM(input_dim=64, hidden_dim=128)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
五、应用场景
- 精神疾病诊断:抑郁症情绪模式识别
- 智能交互:VR场景中的实时情绪反馈
- 神经营销:广告效果脑电评估
关键资源:
- 数据集:DEAP, SEED
- 工具库:MNE-Python, Braindecode
注:实验需遵守伦理审查,原始EEG数据需脱敏处理
更多推荐
所有评论(0)