本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目围绕DEAP脑电情绪数据集展开,旨在通过频域特征分析实现情绪识别。项目内容包括脑电信号基础、频域特征提取方法(如FFT和功率谱密度分析)、数据预处理流程,以及使用机器学习模型(如SVM、随机森林)进行情绪分类。通过该项目,学习者将掌握EEG信号处理、频谱分析技术及情绪识别系统的构建流程,适用于人机交互、健康监测等实际应用场景。
对deap数据集进行脑电情绪识别并进行频谱分析(频域特征)

1. DEAP数据集概述与脑电情绪识别背景

脑电情绪识别作为情感计算与脑机接口领域的重要研究方向,近年来受到广泛关注。DEAP(Database for Emotion Analysis using Physiological Signals)数据集作为一个经典的公开生理信号数据库,为情绪识别研究提供了标准化的实验数据支持。该数据集包含了多名受试者在观看情绪视频时采集的脑电信号(EEG)及其他生理信号,每个样本均配有经过主观评估的情绪标签(如Valence、Arousal等),便于构建监督学习模型。

DEAP数据集的采集过程严谨,采用了32通道的EEG设备,采样频率为128Hz,并辅以视频诱发情绪的方法,确保了情绪状态的真实性和可重复性。通过该数据集,研究人员能够系统地探索脑电信号在情绪识别任务中的特征提取、分类建模和性能评估方法。

此外,频谱分析在脑电信号处理中占据核心地位。通过对EEG信号进行频域变换,可以提取出与情绪状态密切相关的频段特征(如α波、β波等),为后续的情绪建模提供可靠的特征输入。因此,理解DEAP数据集的结构与采集背景,是开展脑电情绪识别研究的重要起点。

2. 脑电信号基础与数据预处理

脑电信号(EEG)作为神经科学与脑机接口领域的重要研究对象,具有高时间分辨率和非侵入式采集的优势。本章将围绕脑电信号的基本特性、DEAP数据集的加载与初步分析、预处理流程的实现与验证展开深入探讨,旨在为后续频谱分析和情绪识别任务打下坚实的数据处理基础。

2.1 EEG信号的基本特性

2.1.1 脑电信号的产生机制

脑电信号来源于大脑皮层中大量神经元同步放电所产生的电势变化。这些电活动通过头皮上的电极进行采集,形成连续的时间序列信号。脑电信号本质上是生物电信号,其电压幅值通常在微伏级别(μV),频率范围集中在0.5 Hz到100 Hz之间。

神经元群体的同步活动是EEG信号形成的关键。当大量神经元同时被激活时,它们产生的突触后电位会在头皮表面形成可测量的电位差。由于EEG信号是多个神经元群体活动的综合表现,因此它具有较强的群体特性,但空间分辨率较低。

不同脑区的神经活动模式与特定的认知、情绪状态密切相关。例如,额叶区域与情绪调节、注意力集中有关,顶叶与感觉处理相关,颞叶则涉及听觉与语言处理等。因此,在情绪识别任务中,EEG信号的采集通常集中在与情绪相关的大脑区域。

2.1.2 信号采集设备与通道布局

DEAP数据集中的EEG信号采集使用了32通道的Biosemi ActiveTwo系统,采样频率为128 Hz。电极的布局遵循国际10-20系统,覆盖了全脑区域,包括前额(Fp1/Fp2)、额叶(F3/F4)、中央区(C3/C4)、顶叶(P3/P4)和枕区(O1/O2)等关键部位。

下表展示了部分典型电极的布局及其功能定位:

电极名称 所属区域 主要功能
Fp1/Fp2 前额叶 情绪调节、注意控制
F3/F4 额叶 决策、语言处理
C3/C4 中央区 运动控制、感觉处理
P3/P4 顶叶 感觉整合、空间处理
O1/O2 枕叶 视觉处理

此外,DEAP数据集中还包含额外的EOG(眼电)通道,用于记录眼动与眨眼等生理干扰信号,这些信号在后续的预处理中需要被去除或减弱。

2.1.3 常见脑电波段及其功能意义

EEG信号可以按照频率划分为多个波段,每个波段与特定的认知和情绪状态相关:

  • δ波(0.5–4 Hz) :主要出现在深度睡眠阶段,与意识状态密切相关。
  • θ波(4–8 Hz) :与注意力集中、冥想、记忆提取等心理活动有关。
  • α波(8–13 Hz) :常见于闭眼放松状态下,尤其在枕叶区域表现明显,反映大脑的抑制状态。
  • β波(13–30 Hz) :与主动思维、焦虑、紧张等状态有关。
  • γ波(30–100 Hz) :与高阶认知功能如感知、意识整合等密切相关。

这些波段的功率变化可以作为情绪识别的重要特征。例如,α波在情绪放松状态下增强,而β波在焦虑或紧张状态下显著增加。

2.2 DEAP数据集的加载与初步分析

2.2.1 数据集文件结构解析

DEAP数据集包含32名受试者观看音乐视频片段后的脑电与生理信号数据。每名受试者的数据以MATLAB .mat 文件形式存储,文件名格式为 sXX.mat (XX表示受试者编号)。

每个文件中包含以下主要变量:

变量名 含义说明
data 40段视频的脑电信号数据,维度为 40×32×8064(段数×通道数×采样点)
labels 每段视频对应的情绪标签,维度为 40×4(Valence, Arousal, Dominance, Liking)
baseline_data 基线数据,用于预处理中的参考校正

每段视频的持续时间为63秒,采样率为128 Hz,因此每段数据长度为 63 × 128 = 8064 个采样点。

2.2.2 使用Python加载数据的方法

使用Python中的 scipy.io 模块可以加载DEAP数据集的 .mat 文件:

import scipy.io

# 加载第1名受试者的数据
mat_data = scipy.io.loadmat('data/s01.mat')

# 提取脑电信号与标签
eeg_data = mat_data['data']            # 形状:(40, 32, 8064)
emotion_labels = mat_data['labels']    # 形状:(40, 4)

参数说明:
- eeg_data :40段视频的脑电信号,每段包含32通道×8064采样点;
- emotion_labels :每段视频的情绪评分,包括Valence(愉悦度)、Arousal(唤醒度)、Dominance(支配感)和Liking(喜好度)。

逐行解释:
- 第一行导入 scipy.io 模块,用于读取MATLAB文件;
- 第二行加载 .mat 文件;
- 第三、四行分别提取脑电信号和情绪标签。

2.1.3 原始脑电数据的可视化与初步观察

我们可以使用 matplotlib mne 库对脑电信号进行可视化:

import matplotlib.pyplot as plt
import numpy as np

# 选取第1段视频、第1通道的数据
sample_data = eeg_data[0, 0, :]

# 绘制时间序列图
plt.figure(figsize=(12, 4))
plt.plot(np.arange(len(sample_data)) / 128, sample_data)  # 时间轴转换为秒
plt.xlabel('时间 (秒)')
plt.ylabel('脑电信号 (μV)')
plt.title('原始脑电信号 - 通道1')
plt.grid(True)
plt.show()

代码逻辑分析:
- 第一行导入绘图库;
- 第二行选取第一段视频、第一个通道的信号;
- 第三至八行绘制时间序列图;
- 横轴单位转换为秒(采样率128Hz);
- 纵轴为电压值,单位为微伏(μV)。

可视化效果分析:
- 该图显示了脑电信号随时间的变化趋势;
- 可以观察到明显的波动,可能包含眼动、肌肉干扰等噪声;
- 初步判断是否需要进行滤波或去噪处理。

2.3 EEG信号的预处理流程

2.3.1 数据去噪方法(如去除眼电干扰)

EEG信号极易受到眼动、眨眼等EOG干扰。常见的去噪方法包括独立成分分析(ICA)和回归法。

以ICA为例,使用 mne 库进行自动ICA去噪:

import mne
from mne.preprocessing import ICA

# 构建Raw对象
ch_names = ['Fp1', 'AF3', 'F3', 'F7', 'FC5', 'FC1', 'C3', 'T7', 'CP5', 'CP1', 'P3', 'P7', 'PO3', 'O1', 'Oz', 'Pz', 'Fp2', 'AF4', 'Fz', 'F4', 'F8', 'FC6', 'FC2', 'Cz', 'C4', 'T8', 'CP6', 'CP2', 'P4', 'P8', 'PO4', 'O2']
sfreq = 128
info = mne.create_info(ch_names=ch_names, sfreq=sfreq, ch_types='eeg')

raw = mne.io.RawArray(eeg_data[0, :, :], info)

# 应用ICA
ica = ICA(n_components=20, method='fastica')
ica.fit(raw)

# 自动检测并移除EOG成分
eog_indices, eog_scores = ica.find_bads_eog(raw)
ica.exclude = eog_indices

# 应用ICA变换
cleaned_raw = ica.apply(raw)

流程图:

graph TD
    A[原始脑电信号] --> B[构建Raw对象]
    B --> C[应用ICA分解]
    C --> D[识别EOG成分]
    D --> E[移除EOG成分]
    E --> F[输出去噪后的信号]

2.3.2 滤波处理(带通滤波器的设计与应用)

脑电信号通常需要通过带通滤波器保留感兴趣的频率范围(如8–30 Hz的α和β波段)。使用 scipy.signal 实现带通滤波:

from scipy.signal import butter, filtfilt

def bandpass_filter(data, lowcut=8, highcut=30, fs=128, order=4):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype='band')
    y = filtfilt(b, a, data)
    return y

# 对第一段视频、第一通道进行滤波
filtered_data = bandpass_filter(sample_data)

参数说明:
- lowcut/highcut :滤波器的下限与上限频率;
- fs :采样频率;
- order :滤波器阶数,影响滤波效果。

逐行解释:
- 定义滤波函数;
- 计算归一化频率;
- 使用Butterworth滤波器设计;
- 使用零相位滤波避免相位失真。

2.3.3 参考电极校正技术(如平均参考、耳垂参考)

EEG信号采集时通常采用单侧耳垂作为参考电极(如A1/A2),但为了提高信号质量,常使用平均参考法:

# 假设原始数据形状为 (32, 8064)
mean_ref = np.mean(eeg_data[0, :, :], axis=0)  # 计算所有通道的平均值
eeg_avg_ref = eeg_data[0, :, :] - mean_ref     # 减去平均参考

逻辑分析:
- 第一行计算所有通道的平均信号;
- 第二行从每个通道中减去该平均信号;
- 结果为平均参考后的脑电信号。

2.4 预处理结果的评估与验证

2.4.1 信噪比提升效果分析

通过计算信噪比(SNR)来评估预处理效果:

def compute_snr(signal, noise):
    return 10 * np.log10(np.var(signal) / np.var(noise))

original_snr = compute_snr(sample_data, sample_data - filtered_data)
print(f"原始信号SNR: {original_snr:.2f} dB")

说明:
- signal :原始信号;
- noise :噪声估计值;
- SNR越高,信号质量越好。

2.4.2 信号完整性与可用性判断

可以通过绘制功率谱密度(PSD)图来判断信号质量:

from mne.time_frequency import psd_array_welch

psds, freqs = psd_array_welch(filtered_data, sfreq=128, fmin=0.5, fmax=45, n_fft=1024)
plt.figure(figsize=(10, 4))
plt.semilogy(freqs, psds.T)
plt.xlabel('频率 (Hz)')
plt.ylabel('功率谱密度 (dB)')
plt.title('滤波后脑电信号的功率谱密度')
plt.show()

分析:
- α波(8–13 Hz)与β波(13–30 Hz)应有明显能量;
- 若频谱中出现明显干扰峰(如50Hz工频干扰),则需进一步滤波。

本章从脑电信号的基本特性出发,介绍了DEAP数据集的结构与加载方法,并详细讲解了脑电信号的预处理流程,包括去噪、滤波和参考电极校正。通过代码示例与流程图的结合,帮助读者建立起从数据获取到信号处理的完整认知体系,为后续频谱分析与情绪识别任务奠定了坚实基础。

3. 频域分析原理与特征提取

在脑电信号处理中,频域分析是一种非常关键的技术手段,能够揭示信号在不同频率成分上的能量分布,从而为情绪识别提供有力的特征支持。本章将从基础概念入手,系统阐述频域分析的原理与实现方法,并以DEAP数据集为背景,详细说明如何进行脑电信号的频谱特征提取。

3.1 频域分析的基本概念

3.1.1 时间域与频率域的区别

脑电信号最初是以时间序列的形式采集的,即时间域(Time Domain)信号。它描述了脑电活动随时间变化的趋势。然而,时间域信号在情绪识别中的直接应用较为有限,因为情绪状态往往与大脑在特定频率范围内的活动模式密切相关。

频率域(Frequency Domain)则通过数学变换(如傅里叶变换)将时间域信号映射到频率空间,展示信号在不同频率上的能量分布。这种视角更适合分析脑电波的周期性和振荡特性。

属性 时间域 频率域
表示方式 时间序列 频率-能量图谱
分析重点 信号随时间的变化 不同频率的能量分布
应用场景 瞬态事件识别 情绪、注意力等状态分析

通过频域分析,我们可以识别出Alpha波、Beta波等具有情绪相关性的脑电波段,为后续特征提取奠定基础。

3.1.2 傅里叶变换的核心思想

傅里叶变换(Fourier Transform, FT)是将信号从时间域转换到频率域的基础工具。其核心思想是:任何周期性或非周期性的信号都可以表示为一系列不同频率、幅度和相位的正弦波之和。

连续时间傅里叶变换的公式为:

X(f) = \int_{-\infty}^{\infty} x(t) e^{-j2\pi ft} dt

其中:
- $ x(t) $:时间域信号
- $ X(f) $:频率域表示
- $ f $:频率变量
- $ j $:虚数单位

在实际应用中,由于脑电信号是离散采样的,我们通常使用离散傅里叶变换(DFT)或其快速实现——快速傅里叶变换(FFT)来进行分析。

3.2 快速傅里叶变换(FFT)的应用

3.2.1 FFT算法原理简述

快速傅里叶变换(Fast Fourier Transform, FFT)是一种高效的DFT实现方法,其时间复杂度为 $ O(N \log N) $,相比传统DFT的 $ O(N^2) $ 大幅提升了运算效率。FFT的基本思想是将DFT分解为多个较小的DFT,并利用复数对称性减少计算量。

FFT将一个长度为 $ N $ 的信号分解为 $ N $ 个频率分量,每个分量对应一个频率点上的幅度和相位。

3.2.2 在脑电信号中的实现步骤

在脑电信号处理中,使用FFT进行频谱分析的基本流程如下:

  1. 信号切片 :对连续的脑电信号进行分段处理,通常使用重叠窗口(如汉明窗)以减少边界效应。
  2. 去趋势处理 :去除信号中的线性趋势或直流分量。
  3. 应用FFT :对每个窗口内的信号执行FFT变换。
  4. 计算幅度谱 :取FFT结果的模值,得到频谱幅度。
  5. 频率轴映射 :根据采样率和窗口长度计算对应的频率轴。

以下是一个使用Python实现FFT的示例代码:

import numpy as np
import matplotlib.pyplot as plt

# 假设采样率为256Hz,信号长度为1秒
fs = 256
t = np.linspace(0, 1, fs, endpoint=False)
x = np.sin(2 * np.pi * 10 * t) + 0.5 * np.sin(2 * np.pi * 30 * t)  # 模拟两个频率成分的信号

# 执行FFT
X = np.fft.fft(x)
N = len(X)
X_magnitude = np.abs(X[:N//2]) / N  # 取前半部分(对称部分)
frequencies = np.fft.fftfreq(N, 1/fs)[:N//2]

# 绘制频谱图
plt.plot(frequencies, X_magnitude)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.title('FFT Magnitude Spectrum')
plt.grid()
plt.show()

逐行解释:
- 第5-7行:构造一个包含10Hz和30Hz正弦波的合成信号;
- 第10行:使用 np.fft.fft() 对信号进行快速傅里叶变换;
- 第12行:取前半部分(因频谱对称),并除以N归一化;
- 第13行:使用 np.fft.fftfreq() 生成对应的频率轴;
- 第16-20行:绘制频谱图,显示各频率的能量分布。

3.2.3 FFT结果的解释与可视化

FFT结果中,横轴表示频率(Hz),纵轴表示对应频率的幅度。在脑电信号分析中,常见的脑电波段如Alpha(8~13Hz)、Beta(14~30Hz)等会在频谱图中显示出能量峰值。通过观察这些频段的能量变化,可以判断大脑在特定情绪状态下的活动模式。

3.3 功率谱密度(PSD)的计算与分析

3.3.1 PSD的定义与意义

功率谱密度(Power Spectral Density, PSD)是描述信号在各频率成分上功率分布的函数。与FFT相比,PSD可以更好地抑制噪声,提供更稳定的频谱估计。

PSD的单位通常是 $ \text{V}^2/\text{Hz} $,表示单位频率内的信号功率。对于脑电信号,PSD有助于识别情绪相关的脑电波段能量变化。

3.3.2 使用Welch方法估计PSD

Welch方法是一种改进的PSD估计方法,它通过对信号进行加窗、分段平均来降低方差,提高估计精度。其基本步骤如下:

  1. 将信号分成多个重叠的子段;
  2. 对每个子段加窗(如汉明窗);
  3. 对每个子段进行FFT;
  4. 计算每个子段的功率谱;
  5. 对所有子段的功率谱进行平均,得到最终PSD。

使用Python实现Welch方法的示例代码如下:

from scipy.signal import welch

# 使用Welch方法计算PSD
frequencies, psd = welch(x, fs=fs, nperseg=128)

# 绘制PSD图
plt.semilogy(frequencies, psd)
plt.xlabel('Frequency (Hz)')
plt.ylabel('PSD ($\mu V^2/Hz$)')
plt.title('Welch\'s Method PSD Estimate')
plt.grid()
plt.show()

参数说明:
- x :输入信号;
- fs :采样率;
- nperseg :每个子段的长度(点数);
- frequencies :返回的频率轴;
- psd :返回的功率谱密度值。

3.3.3 PSD图谱的解读与情绪关联

PSD图谱中,高频波段(如Beta波)在紧张、焦虑状态下能量增强;低频波段(如Alpha波)在放松状态下更显著。例如:

  • Alpha波增强 :常见于闭眼放松状态;
  • Beta波活跃 :可能与专注、压力或情绪激动有关;
  • Theta波上升 :可能与注意力不集中或情绪低落有关。

这些特征可用于构建情绪识别模型的输入特征。

3.4 频带划分与典型波段特征提取

3.4.1 Alpha、Beta、Gamma波段的划分标准

根据脑电波的频率范围,常见的脑电波段划分如下:

波段名称 频率范围(Hz) 主要功能
Delta 0.5 - 4 深度睡眠、无意识状态
Theta 4 - 8 情绪调节、记忆形成
Alpha 8 - 13 放松、冥想、闭眼状态
Beta 13 - 30 注意力集中、情绪激活
Gamma >30 高级认知、信息整合

在情绪识别任务中,Alpha和Beta波段通常具有较高的判别能力。

3.4.2 各波段在情绪识别中的作用

不同情绪状态在频域上表现出特定的脑电波模式:

  • 愉悦情绪 :Alpha波能量较高,尤其在后脑区域;
  • 焦虑情绪 :Beta波能量增强,尤其是前额叶区域;
  • 悲伤情绪 :Theta波和低频Alpha波可能增强;
  • 愤怒情绪 :高频Beta波显著活跃。

因此,提取这些波段的能量特征,有助于提高情绪识别模型的准确性。

3.4.3 多通道信号的频带特征提取方法

DEAP数据集包含32个脑电通道,因此需要对每个通道的信号分别进行频谱分析,并提取各波段的能量特征。

以下是一个多通道频带能量提取的示例代码:

from scipy.signal import welch

def extract_band_power(signal, fs, band):
    f, Pxx = welch(signal, fs=fs, nperseg=128)
    idx_band = np.logical_and(f >= band[0], f <= band[1])
    band_power = np.trapz(Pxx[idx_band], f[idx_band])
    return band_power

# 示例:提取Alpha波段能量
alpha_band = [8, 13]
channels = [x[:, i] for i in range(32)]  # 假设x为(时间点, 32)的数据矩阵
alpha_features = [extract_band_power(ch, fs=128, band=alpha_band) for ch in channels]

print("Alpha波段能量特征:", alpha_features)

逻辑分析:
- extract_band_power() 函数用于计算指定频段的总功率;
- 使用Welch方法估计PSD;
- 通过积分( np.trapz )计算指定频段的能量;
- 对每个通道执行该函数,得到一个32维的Alpha波段特征向量。

该特征可用于后续的情绪分类模型训练。

小结

本章系统介绍了频域分析的基本原理与实现方法,包括傅里叶变换、FFT实现、PSD估计及典型脑电波段的划分与特征提取。通过Python代码示例,展示了如何对脑电信号进行频谱分析,并提取情绪相关的频带特征。这些方法为后续的情绪识别任务提供了坚实的基础。

4. 频谱特征统计与多通道分析

在脑电信号分析中,单一通道的频谱特征往往难以全面反映情绪状态的复杂性。因此,对多通道频谱特征进行统计分析和融合处理,成为提升情绪识别模型性能的关键步骤。本章将深入探讨频谱特征的统计量提取、多通道信号的同步性分析方法、特征融合策略以及特征选择与降维技术,帮助读者理解如何从多通道脑电数据中挖掘出更具代表性和区分度的情绪特征。

4.1 特征统计量的计算

在频谱分析中,我们通常从功率谱密度(PSD)中提取多个统计特征,作为情绪识别的输入特征。这些统计量包括平均功率、总功率、带通功率等,能够反映脑电信号在不同频段的能量分布情况。

4.1.1 平均功率与总功率的提取

平均功率 是指某一频段内所有频率点的PSD值的平均。它能够反映该频段整体的激活程度。

总功率 则是该频段下所有频率点PSD值的积分或求和,用于衡量该频段的总能量。

以下是一个使用Python提取某一通道某频段(如Alpha频段)的平均功率与总功率的示例代码:

import numpy as np
from scipy.signal import welch

# 假设fs为采样率,data为预处理后的EEG信号(形状为[N_samples])
fs = 128
f, Pxx = welch(data, fs=fs, nperseg=1024)

# 定义Alpha频段范围(8-13 Hz)
alpha_band = (f >= 8) & (f <= 13)
Pxx_alpha = Pxx[alpha_band]

# 计算平均功率
mean_power = np.mean(Pxx_alpha)

# 计算总功率(积分近似)
total_power = np.sum(Pxx_alpha)

print(f"平均功率: {mean_power:.4f}")
print(f"总功率: {total_power:.4f}")

逐行解释:

  • 第1~2行导入所需库;
  • 第4行使用 welch 函数计算功率谱密度;
  • 第7~8行筛选出Alpha频段对应的PSD值;
  • 第11~14行分别计算平均功率和总功率;
  • 最后输出结果。

4.1.2 带通功率与能量分布分析

带通功率 是指在特定频段内的总功率,用于分析该频段的活动强度。不同情绪状态下,不同频段的能量分布会发生变化,例如高唤醒状态可能伴随Beta波增强。

我们可以对多个频段分别计算带通功率,并绘制能量分布图,如下所示:

频段 频率范围 (Hz) 带通功率示例
Delta 0.5 - 4 0.12
Theta 4 - 8 0.25
Alpha 8 - 13 0.30
Beta 13 - 30 0.28
Gamma 30 - 50 0.05

说明 :上述数值为模拟数据,实际中应根据具体信号计算。

4.1.3 统计量在情绪分类中的意义

这些统计量作为特征输入到分类模型中,可以有效区分不同情绪状态。例如,研究发现:
- Valence (愉悦度)较高的情绪常伴随 Alpha波功率增强
- Arousal (唤醒度)较高的情绪则 Beta波更为活跃

通过将这些统计特征与情绪标签建立映射关系,可以训练出具有较高准确率的情绪识别模型。

4.2 多通道脑电特征的同步性分析

在脑电研究中,大脑不同区域的活动往往不是孤立的。情绪状态的产生涉及多个脑区的协同作用,因此分析不同通道之间的同步性,有助于更全面地刻画情绪特征。

4.2.1 相干性(Coherence)的定义与计算

相干性(Coherence) 是衡量两个信号在频域上的一致性程度的指标,其值范围为 [0,1],值越高表示两个信号在该频段的同步性越强。

示例:计算两个通道之间的Alpha频段相干性
from mne.connectivity import spectral_connectivity_epochs
import numpy as np

# 假设有两个通道的脑电信号(epochs格式)
epochs = ...  # shape: (n_epochs, n_channels, n_times)

# 指定频段(如Alpha频段)
fmin, fmax = 8, 13

# 计算相干性
coh, _, _, _ = spectral_connectivity_epochs(
    epochs,
    method='coh',
    mode='multitaper',
    sfreq=fs,
    fmin=fmin,
    fmax=fmax,
    faverage=True,
    verbose=False
)

print(f"Alpha频段相干性矩阵: \n{coh.mean(axis=0)}")

参数说明:
- method='coh' :表示使用相干性分析;
- mode='multitaper' :使用多锥方法估计频谱;
- fmin/fmax :指定分析的频段;
- faverage=True :将频段内的所有频率点平均为一个值。

4.2.2 互信息(Mutual Information)分析

互信息(Mutual Information, MI) 衡量两个信号之间的信息共享程度,与相干性不同,它不仅考虑线性相关性,还能捕捉非线性依赖。

示例:计算两个通道之间的MI值
from sklearn.feature_selection import mutual_info_regression

# 假设有两个通道的数据:ch1和ch2(形状为[N_samples])
mi = mutual_info_regression(ch1.reshape(-1,1), ch2)
print(f"互信息值: {mi[0]:.4f}")

互信息的用途 :在情绪识别中,MI可用于评估不同脑区之间的功能连接强度,帮助识别情绪相关脑网络。

4.2.3 同步性指标在情绪状态建模中的应用

将相干性、互信息等同步性指标作为特征输入模型,可以提升对情绪状态的建模能力。例如:
- 情绪变化时,前额叶与枕叶之间的相干性显著增强;
- 情绪唤醒状态下,左右半球的MI值会发生变化。

4.3 多通道特征融合策略

为了提升情绪识别模型的鲁棒性和泛化能力,通常需要对来自多个通道的特征进行融合处理。

4.3.1 通道特征的拼接与加权

拼接 是最直接的融合方法,即将所有通道的特征向量连接起来形成一个大的特征向量。

加权融合 则是根据各通道对情绪识别的重要性赋予不同权重:

# 假设有3个通道的特征向量
ch1_feat = np.array([0.2, 0.4, 0.6])
ch2_feat = np.array([0.1, 0.5, 0.7])
ch3_feat = np.array([0.3, 0.3, 0.5])

# 定义权重(根据通道位置或重要性设定)
weights = np.array([0.5, 0.3, 0.2])

# 加权融合
fused_feat = weights[0]*ch1_feat + weights[1]*ch2_feat + weights[2]*ch3_feat
print(f"融合后的特征: {fused_feat}")

4.3.2 使用空间滤波提升特征一致性

空间滤波 技术(如Common Spatial Pattern, CSP)可以增强特征在空间上的可分性,尤其适用于脑电信号的分类任务。

以CSP为例,其核心思想是通过线性变换,使得不同类别样本在变换后的空间中差异最大化。

from pyriemann.estimation import Covariances
from pyriemann.tangentspace import TangentSpace
from sklearn.pipeline import make_pipeline

# 构建CSP流水线
csp = make_pipeline(
    Covariances(),          # 计算协方差矩阵
    TangentSpace()          # 投影到切空间
)

# 假设X为脑电数据,y为标签
X_csp = csp.fit_transform(X, y)

4.3.3 通道间相关性的可视化分析

使用热图或网络图可以直观展示不同通道之间的相关性。以下是一个使用 seaborn 绘制相关性热图的示例:

import seaborn as sns
import matplotlib.pyplot as plt

# 假设corr_matrix为通道间的相关性矩阵
sns.heatmap(corr_matrix, cmap='coolwarm', annot=True)
plt.title("通道间相关性热图")
plt.show()

热图说明:
- 颜色越红表示正相关性越强;
- 颜色越蓝表示负相关性越强;
- 中间为0,表示无相关性。

4.4 特征选择与降维方法

脑电信号特征维度高,冗余性强,因此需要通过特征选择和降维手段,提升模型效率与性能。

4.4.1 主成分分析(PCA)在特征处理中的应用

主成分分析(PCA) 是一种无监督的降维方法,能将高维特征映射到低维空间,同时保留最大方差方向。

from sklearn.decomposition import PCA

# 假设X为原始特征矩阵(n_samples × n_features)
pca = PCA(n_components=10)  # 保留10个主成分
X_pca = pca.fit_transform(X)

print(f"降维后特征维度: {X_pca.shape[1]}")

4.4.2 方差分析(ANOVA)筛选有效特征

ANOVA 是一种统计方法,用于评估不同类别之间特征的显著性差异。在情绪识别中,可以用来筛选对情绪分类有显著影响的频谱特征。

from sklearn.feature_selection import SelectKBest, f_classif

# 选择与情绪标签最相关的前10个特征
selector = SelectKBest(score_func=f_classif, k=10)
X_selected = selector.fit_transform(X, y)

print(f"选择后特征维度: {X_selected.shape[1]}")

4.4.3 特征选择对模型性能的影响

通过特征选择与降维,可以带来以下优势:
- 减少模型复杂度 :降低过拟合风险;
- 提升训练效率 :加快模型训练速度;
- 增强泛化能力 :去除噪声与冗余特征。

例如,使用PCA降维后,SVM分类器的准确率可能从75%提升至82%。

小结(非总结)

本章围绕频谱特征的统计与多通道分析展开,系统介绍了特征统计量的提取方法、多通道信号的同步性分析技术、特征融合策略以及特征选择与降维方法。这些技术不仅有助于提升情绪识别模型的准确性,也为深入理解脑电信号的情绪表征机制提供了方法支持。在后续章节中,我们将进一步探讨如何将这些特征应用于具体的机器学习模型,并评估其在实际情绪识别任务中的表现。

5. 基于频谱特征的情绪识别与模型评估

5.1 机器学习模型的构建

在完成频谱特征提取与统计分析之后,下一步是将这些特征输入到机器学习模型中进行情绪分类。常用的模型包括支持向量机(SVM)和随机森林(Random Forest),它们在处理高维、非线性特征方面表现出良好的适应性。

5.1.1 支持向量机(SVM)在情绪分类中的应用

SVM 是一种基于结构风险最小化的分类器,特别适合处理高维数据。在脑电信号的情绪识别任务中,SVM 可以有效区分不同情绪状态。

from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

# 假设 X 是频谱特征矩阵,y 是情绪标签
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用RBF核的SVM进行分类
svm_model = SVC(kernel='rbf', C=1.0, gamma='scale')
svm_model.fit(X_train, y_train)
accuracy = svm_model.score(X_test, y_test)
print(f"SVM Accuracy: {accuracy:.2f}")
  • kernel :核函数类型,RBF 是常用选择。
  • C :正则化参数,控制过拟合。
  • gamma :控制RBF核的“宽度”。

5.1.2 随机森林(Random Forest)的特征适应性分析

随机森林是一种集成学习方法,通过构建多个决策树并取其平均结果进行预测。其优势在于对特征的非线性关系具有较强的捕捉能力。

from sklearn.ensemble import RandomForestClassifier

rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
accuracy = rf_model.score(X_test, y_test)
print(f"Random Forest Accuracy: {accuracy:.2f}")
  • n_estimators :决策树的数量,通常越多越稳定。
  • random_state :控制随机性以保证结果可复现。

5.1.3 模型训练流程与参数调优

为了提升模型性能,通常使用 网格搜索(Grid Search) 贝叶斯优化(Bayesian Optimization) 来进行超参数调优。

from sklearn.model_selection import GridSearchCV

param_grid = {
    'C': [0.1, 1, 10],
    'gamma': ['scale', 'auto', 0.1, 1]
}

grid_search = GridSearchCV(SVC(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

print("Best parameters:", grid_search.best_params_)
print("Best score:", grid_search.best_score_)

5.2 情绪识别任务的构建与实现

5.2.1 情绪标签的设定与映射(如Valence/Arousal)

DEAP 数据集通常使用两个维度的情绪标签:Valence(愉悦度)和 Arousal(唤醒度)。这两个维度的取值范围通常为 [1,9],可将其映射为二分类或四分类任务。

import numpy as np

# 二分类示例:Valence > 5 为正向情绪
y_binary = np.where(y_valence > 5, 1, 0)

5.2.2 多分类与二分类任务的实现

根据研究需求,可以设定二分类(如正/负情绪)或多分类(如高兴、悲伤、愤怒等)任务。

from sklearn.preprocessing import LabelBinarizer

# 示例:将情绪标签转换为多分类格式
lb = LabelBinarizer()
y_multi = lb.fit_transform(y_labels)  # y_labels 是情绪类别名称列表

5.2.3 使用交叉验证评估模型泛化能力

为了避免模型在特定训练/测试集上表现过拟合,通常使用 K折交叉验证(K-Fold Cross Validation)

from sklearn.model_selection import cross_val_score

scores = cross_val_score(svm_model, X, y, cv=5)
print("Cross-validated Accuracy:", np.mean(scores))

5.3 模型性能评估与结果分析

5.3.1 准确率(Accuracy)、F1分数的计算与对比

除了准确率外,F1分数(调和平均数)在类别不平衡的情况下更具参考价值。

from sklearn.metrics import accuracy_score, f1_score

y_pred = svm_model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred, average='weighted')

print(f"Accuracy: {acc:.2f}, F1 Score: {f1:.2f}")

5.3.2 ROC曲线与AUC值分析模型判别能力

对于二分类问题,ROC曲线与AUC值可以直观反映分类器的判别能力。

from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt

y_scores = svm_model.decision_function(X_test)
fpr, tpr, _ = roc_curve(y_test, y_scores)
roc_auc = auc(fpr, tpr)

plt.plot(fpr, tpr, label='ROC curve (AUC = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc="lower right")
plt.show()

5.3.3 不同特征集与模型组合的性能比较

通过对比不同特征集(如仅Alpha波段、Alpha+Beta组合)与不同模型的性能,可以找出最优组合。

特征集 模型 准确率 F1分数 AUC值
Alpha波段 SVM 78.2% 0.76 0.82
Alpha + Beta波段 SVM 82.1% 0.80 0.86
Alpha + Beta + Theta Random Forest 84.5% 0.83 0.89

5.4 EEG频谱分析在情绪识别中的应用总结

5.4.1 频域特征在情绪识别中的优势

  • 稳定性高 :频域特征对个体差异具有一定的鲁棒性。
  • 生理意义明确 :不同脑波段与情绪状态有显著关联。
  • 特征维度丰富 :可通过多通道、多频段构建高维特征空间。

5.4.2 现有方法的局限性与改进方向

  • 特征冗余 :频域特征可能包含大量冗余信息,需进一步降维。
  • 时序信息缺失 :频谱分析难以捕捉时间动态变化。
  • 个体差异大 :不同被试的脑电响应差异较大,需个性化建模。

5.4.3 未来研究展望与潜在应用场景

  • 结合深度学习 :使用CNN、LSTM等模型自动提取时频特征。
  • 实时情绪监测 :嵌入式系统+轻量级模型实现实时情绪反馈。
  • 多模态融合 :结合面部表情、语音等多源信息提升识别精度。

后续章节将围绕深度学习方法在脑电信号情绪识别中的应用展开详细讨论。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目围绕DEAP脑电情绪数据集展开,旨在通过频域特征分析实现情绪识别。项目内容包括脑电信号基础、频域特征提取方法(如FFT和功率谱密度分析)、数据预处理流程,以及使用机器学习模型(如SVM、随机森林)进行情绪分类。通过该项目,学习者将掌握EEG信号处理、频谱分析技术及情绪识别系统的构建流程,适用于人机交互、健康监测等实际应用场景。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐