背景
脑电图(EEG)和稳态视觉诱发电位(SSVEP)
脑电图(EEG)是一种测量大脑电活动的非侵入性方法,通过在头皮上放置电极来捕捉大脑神经元群体的电活动。这些信号可以提供关于大脑功能状态和响应的宝贵信息,例如认知过程、感知活动和注意力分配。
稳态视觉诱发电位(SSVEP)是一种常用的EEG应用,用于研究大脑对视觉刺激的响应。在SSVEP实验中,被试者注视屏幕上以不同频率闪烁的视觉刺激,例如灯闪烁的频率为6Hz、10Hz或15Hz。大脑的EEG信号将显示与这些频率相对应的振荡模式,这种现象对于研究注意力和视觉处理具有重要意义。
数据分析与Python
Python作为一种功能强大且灵活的编程语言,被广泛应用于神经科学领域的数据分析和处理。借助Python的丰富库和工具,如MNE(MNE-Python)和SciPy,研究人员能够有效地处理EEG数据、实施信号处理技术,并进行高级的统计分析和模型建立。
在本篇文章中,我们将利用Python和相关的库来分析和理解SSVEP数据,重点介绍了典型相关分析(CCA)在SSVEP数据集上的应用。CCA是一种多变量分析技术,用于找出不同频率下脑电信号与视觉刺激频率之间的关联,从而帮助解释和预测大脑对视觉刺激的响应模式。
通过本文的学习,读者将了解如何利用Python进行EEG信号的预处理、频谱分析和典型相关分析,进而深入探索脑-机接口技术和认知神经科学的前沿研究。
代码实现
1. 数据加载与预处理
我们首先从SSVEP数据集中加载数据,并准备进行后续的处理和分析。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import mne
from mne import create_info
from mne.io import RawArray
from mne.time_frequency import psd_welch
# 加载数据
df = pd.read_csv('data/ssvep-20trials-3s-chaky-bigsquare.csv')
df.rename(columns={'Unnamed: 1':'O1','Unnamed: 2':'Oz', 'Unnamed: 3':'O2'}, inplace=True)
df = df.drop(["timestamps", "Unnamed: 4", "Unnamed: 5", "Unnamed: 6", "Unnamed: 7", "Unnamed: 8"], axis=1)
2. 数据转换为MNE对象
将数据转换为MNE库的RawArray对象,以便进行后续的信号处理和频谱分析。
def df_to_raw(df):
sfreq = 125 # 我们的OpenBCI头戴设备采样率
ch_names = list(df.columns)
ch_types = ['eeg'] * (len(df.columns) - 1) + ['stim']
ten_twenty_montage = mne.channels.make_standard_montage('standard_1020')
df = df.T
df[:-1] *= 1e-6 # 将数据从微伏转换为伏特(MNE库默认单位)
info = create_info(ch_names=ch_names, ch_types=ch_types, sfreq=sfreq)
raw = mne.io.RawArray(df, info)
raw.set_montage(ten_twenty_montage)
return raw
raw = df_to_raw(df)
3. 预处理
带阻滤波器
去除50Hz电源线噪声及其谐波,并进行带通滤波以提取特定频率带的信号。
raw.notch_filter([25, 50], filter_length='auto', phase='zero')
raw.filter(4, 62, method='iir')
4. 时域分析和频谱分析
使用Epochs对象对数据进行切分,并进行频谱分析以探索不同刺激频率的特征。
from mne import Epochs, find_events
def getEpochs(raw, event_id, tmin, tmax, picks):
events = find_events(raw)
epochs = Epochs(raw, events=events, event_id=event_id,
tmin=tmin, tmax=tmax, baseline=None, preload=True, verbose=False, picks=picks)
print('样本丢失 %: ', (1 - len(epochs.events)/len(events)) * 100)
return epochs
event_id = {'6Hz': 1, '10Hz' : 2, '15Hz' : 3}
tmin=-0.5
tmax=3
eeg_channels = mne.pick_types(raw.info, eeg=True)
picks= eeg_channels
epochs = getEpochs(raw, event_id, tmin, tmax, picks=picks)
# 频谱分析
fig = plt.figure(figsize=(10, 4))
axes = fig.add_axes([0.1, 0.1, 0.8, 0.8])
psd1, freq1 = psd_welch(epochs['6Hz'], n_fft=1028, n_per_seg=256 * 3)
psd2, freq2 = psd_welch(epochs['10Hz'], n_fft=1028, n_per_seg=256 * 3)
psd3, freq3 = psd_welch(epochs['15Hz'], n_fft=1028, n_per_seg=256 * 3)
logpsd1 = 10 * np.log10(psd1)
logpsd2 = 10 * np.log10(psd2)
logpsd3 = 10 * np.log10(psd3)
log_psd1_mean = logpsd1.mean(0)
log_psd2_mean = logpsd2.mean(0)
log_psd3_mean = logpsd3.mean(0)
axes.plot(freq1, log_psd1_mean[[0,2], :].mean(0), color='b', label='6Hz')
axes.plot(freq2, log_psd2_mean[[0,2], :].mean(0), color='r', label='10Hz')
axes.plot(freq3, log_psd3_mean[[0,2], :].mean(0), color='g', label='15Hz')
axes.set_ylabel('Power Spectral Density (dB)')
axes.set_xlim(4, 30)
axes.set_ylim(-170, -100)
axes.legend()
plt.show()
5. 典型相关分析(CCA)
使用典型相关分析(CCA)技术对不同刺激频率的信号进行分类和分析。
from scipy.stats import pearsonr
from sklearn.cross_decomposition import CCA
def cca_analysis(epochs):
cca = CCA(n_components=1)
# 提取数据
X = epochs.get_data()
y = epochs.events[:, -1]
# 应用CCA
cca.fit(X, y)
return cca
# 执行CCA分析
X1 = epochs['6Hz'].get_data()
X2 = epochs['10Hz'].get_data()
X3 = epochs['15Hz'].get_data()
list_freqs = [6, 10, 15]
fs = 250
num_harms = 2
num_fbs = 3
def fbcca(eeg, list_freqs, fs, num_harms=3, num_fbs=5):
# 实现滤波器组和CCA参考信号的生成,以及CCA计算
# 省略具体实现细节以保持简洁
print("6Hz: =============================================")
fbcca(X1, list_freqs, fs, num_harms, num_fbs)
print("10Hz: ============================================")
fbcca(X2, list_freqs, fs, num_harms, num_fbs)
print("15Hz: ============================================")
fbcca(X3, list_freqs, fs, num_harms, num_fbs)
结语
通过本篇文章,我们深入探讨了如何使用Python和MNE库对脑电图(EEG)信号进行分析,特别是在SSVEP数据集上应用典型相关分析(CCA)的方法。我们从数据加载和预处理开始,到频谱分析和典型相关分析的实施,展示了如何利用计算工具深入研究神经科学中的信号处理问题。这些分析不仅有助于理解大脑在视觉刺激下的反应模式,还为未来基于EEG的脑机接口技术和认知神经科学研究提供了新的视角和方法。
通过这一系列的文章,我们逐步深入了解了EEG信号的复杂性及其在情感、认知和视觉处理中的应用潜力。未来的工作将继续探索更多先进的分析方法和模型,以提高对大脑活动模式理解的深度和准确性
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!