JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

特征:解码器真正看到的东西

在任何[[bci-classifier|分类器]]猜测你的意图之前,原始脑信号必须被浓缩成少量有意义的数字。本指南展示节律式 BCI 和[[event-related-potential|事件相关]]式 BCI 中这些数字是什么,以及为什么往往越少越好。

为什么不直接喂原始信号?

想象你递给朋友一段一小时的会议录音,然后问“他们到底决定了什么?”朋友得把整段都听完才能回答。一段原始脑电图窗口就像那段录音:每个通道有成千上万个采样点,大多是冗余的,还掺杂着伪迹,真正和你意图相关的只有极小一部分。

特征提取就是写摘要的过程。你不再保留每个采样点,而是计算出几个能抓住关键信息的数字:某种节律有多强,或者某个时刻出现了多大的波峰。分类器随后只处理这份简短的摘要——这更快、更稳定,也更容易从中学习。

频带功率特征

对于运动想象稳态视觉诱发电位(SSVEP)这类基于节律的 BCI,有用的信息藏在某个通道、某个频带里集中了多少能量。这个量就是频带功率。当你想象移动左手时,对侧头部的μ 节律(约 8 至 13 赫兹)会下降;频带功率把这种下降变成解码器能读取的一个数字。

一个简单的做法:先用带通滤波器只保留你关心的频率,再测量信号摆动得有多厉害。带通后信号的方差就是其功率的一个干净替代,因为功率本质上就是平均的幅度平方。

import numpy as np
from scipy.signal import butter, filtfilt

# x: one channel of a short EEG window; fs: sampling rate (Hz)
def band_power(x, fs, lo=8, hi=13):
    # design an 8-13 Hz bandpass (the mu band)
    b, a = butter(4, [lo, hi], btype="band", fs=fs)
    # filtfilt filters forward + backward (no phase shift)
    xf = filtfilt(b, a, x)
    # variance of the band = its power -> one number per window
    return np.var(xf)
把频带功率算作带通窗口的方差:每个通道、每个频带得到一个特征。

事件相关电位特征

P300 以及其他事件相关电位(ERP)式 BCI 的工作方式不同。这里信号不是靠持续的节律功率讲故事,而是靠在刺激之后固定延迟处出现的一种波形来表达。比如 P300,就是在某个出乎意料或相关的目标闪过之后约 300 毫秒达到顶点的一个正向电压波峰。

因此 ERP 特征不是某个频带里的功率,而是在选定时刻测得的幅度,以刺激为时间起点。常见做法是把窗口对齐到每个刺激,然后在若干时间点(比如从 0 到 600 毫秒每隔 50 毫秒取一次)跨通道采集电压值。把这些值堆叠起来,就得到了你的特征向量。这种特征的“形状”是时间,而不是频率。

保持精简

把每个通道、每个频带、每个时间点的东西全塞进去,听起来很诱人。请克制。当特征很多、而校准数据只有几分钟时,分类器会开始记住那些碰巧和你的标签对上的噪声:它在训练时看起来很出色,一到实时使用就崩溃。这个陷阱叫过拟合,下一篇指南将专门讲它。

有两种应对方法。特征选择只保留真正承载意图的通道和频带,丢掉其余的。降维则把许多原始通道组合成少数几个有信息量的混合。对于运动想象,这与共空间模式(CSP)天然契合——它能在你计算频带功率之前,先学出最能区分两种心理状态的通道混合方式。