EEG 预测飞行员复杂认知任务表现:跨任务迁移的启示

Frontiers in Neuroergonomics 2026 论文解读

论文信息

核心发现

本文首次证明使用简单认知任务(dual n-back)的 EEG 数据可以预测复杂认知任务(Space Fortress Game)的表现:

跨任务预测: 简单任务训练 → 预测复杂任务表现
同任务预测: 当前轮 EEG → 预测同任务表现
前一轮预测: 前一轮 EEG → 预测当前轮表现

实验设计

关键结果

预测来源 目标任务 效果 意义
SFG同轮 EEG SFG表现 ✅ 最佳 实时监测可行
SFG前轮 EEG SFG当前表现 ✅ 良好 预测性监测可行
Dual N-Back EEG SFG表现 ✅ 有效 跨任务迁移可行

核心方法:EEG 功率谱密度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
"""
EEG 功率谱密度(PSD)特征提取与表现预测

论文方法复现:
1. 从EEG信号提取频带功率
2. 使用多元线性回归预测任务表现
3. 关键频带:delta, theta, alpha, beta, gamma

航空认知状态监测的关键频带:
- Theta (4-8Hz): 认知负荷、记忆
- Alpha (8-13Hz): 注意力、放松
- Beta (13-30Hz): 活跃思维、决策
- Gamma (30-100Hz): 高级认知
"""

import numpy as np
from scipy import signal as scipy_signal
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
from dataclasses import dataclass


@dataclass
class EEGBand:
"""EEG 频带定义"""
name: str
low: float # Hz
high: float # Hz


EEG_BANDS = [
EEGBand('delta', 1, 4),
EEGBand('theta', 4, 8),
EEGBand('alpha', 8, 13),
EEGBand('beta', 13, 30),
EEGBand('gamma', 30, 45),
]


class EEGPSDExtractor:
"""EEG 功率谱密度特征提取"""

def __init__(self, sample_rate=250, n_channels=32):
self.fs = sample_rate
self.n_channels = n_channels

def extract_band_powers(self, eeg_data):
"""
提取各频带功率

Args:
eeg_data: shape=(channels, time_samples)

Returns:
features: shape=(channels * 5,) 每通道5个频带
"""
features = []

for ch in range(self.n_channels):
# Welch 法计算 PSD
freqs, psd = scipy_signal.welch(
eeg_data[ch, :],
fs=self.fs,
nperseg=min(256, len(eeg_data[ch, :]))
)

# 各频带功率
for band in EEG_BANDS:
mask = (freqs >= band.low) & (freqs < band.high)
band_power = np.trapz(psd[mask], freqs[mask])

# 对数变换(正态化)
if band_power > 0:
features.append(np.log10(band_power))
else:
features.append(0.0)

return np.array(features)

def extract_relative_powers(self, eeg_data):
"""提取相对功率(各频带占总功率比例)"""
features = []

for ch in range(self.n_channels):
freqs, psd = scipy_signal.welch(
eeg_data[ch, :], fs=self.fs, nperseg=256
)

total_power = np.trapz(psd, freqs)
if total_power == 0:
total_power = 1e-10

for band in EEG_BANDS:
mask = (freqs >= band.low) & (freqs < band.high)
band_power = np.trapz(psd[mask], freqs[mask])
features.append(band_power / total_power)

return np.array(features)

def extract_theta_alpha_ratio(self, eeg_data):
"""
Theta/Alpha 比值
认知负荷的关键指标:
- Theta↑ Alpha↓ → 高认知负荷
- Theta↓ Alpha↑ → 低负荷/放松
"""
ratios = []

for ch in range(self.n_channels):
freqs, psd = scipy_signal.welch(
eeg_data[ch, :], fs=self.fs, nperseg=256
)

theta_mask = (freqs >= 4) & (freqs < 8)
alpha_mask = (freqs >= 8) & (freqs < 13)

theta_power = np.trapz(psd[theta_mask], freqs[theta_mask])
alpha_power = np.trapz(psd[alpha_mask], freqs[alpha_mask])

if alpha_power > 0:
ratios.append(theta_power / alpha_power)
else:
ratios.append(0.0)

return np.array(ratios)


class PerformancePredictor:
"""
基于EEG的认知表现预测器

使用多元线性回归,与论文方法一致

可以从:
1. 同任务同轮EEG预测(实时监测)
2. 同任务前轮EEG预测(前瞻预警)
3. 跨任务EEG预测(训练评估→任务预测)
"""

def __init__(self, feature_dim=160): # 32ch * 5bands
self.model = LinearRegression()
self.feature_dim = feature_dim
self.is_trained = False

def train(self, X, y):
"""
训练表现预测模型

Args:
X: EEG特征, shape=(n_samples, feature_dim)
y: 任务表现分数, shape=(n_samples,)
"""
self.model.fit(X, y)
self.is_trained = True

# 交叉验证
scores = cross_val_score(
self.model, X, y, cv=5,
scoring='r2'
)
return scores

def predict(self, eeg_features):
"""预测任务表现"""
if not self.is_trained:
raise RuntimeError("Model not trained")
return self.model.predict(eeg_features.reshape(1, -1)[0])

def get_feature_importance(self):
"""获取各特征重要性(回归系数)"""
return self.model.coef_


# ========== 模拟实验 ==========

if __name__ == "__main__":
np.random.seed(42)

# 模拟26名被试
n_subjects = 26
n_channels = 32
n_bands = 5
fs = 250
trial_duration = 60 # 60秒/轮

extractor = EEGPSDExtractor(sample_rate=fs, n_channels=n_channels)
predictor = PerformancePredictor(
feature_dim=n_channels * n_bands
)

# 模拟 EEG 数据和表现
print("=== 模拟实验 ===")
print(f" 被试数: {n_subjects}")
print(f" 通道数: {n_channels}")
print(f" 频带数: {n_bands}")
print(f" 特征维度: {n_channels * n_bands}")
print()

# 生成模拟数据
X_nback = [] # dual n-back EEG特征
X_sfg_same = [] # SFG同轮EEG特征
X_sfg_prev = [] # SFG前轮EEG特征
y_sfg = [] # SFG表现

for sub in range(n_subjects):
# 模拟EEG(32通道, 60秒)
eeg_nback = np.random.randn(n_channels, fs * trial_duration)
eeg_sfg_prev = np.random.randn(n_channels, fs * trial_duration)
eeg_sfg_same = np.random.randn(n_channels, fs * trial_duration)

# 注入与表现相关的信号
true_performance = np.random.uniform(30, 90)

# 高表现者:alpha功率高(放松高效)
for ch in range(n_channels):
t = np.linspace(0, trial_duration, fs * trial_duration)
alpha_signal = 5 * np.sin(2*np.pi*10*t) * (true_performance / 90)
eeg_sfg_same[ch, :] += alpha_signal

# 提取特征
feat_nback = extractor.extract_band_powers(eeg_nback)
feat_sfg_prev = extractor.extract_band_powers(eeg_sfg_prev)
feat_sfg_same = extractor.extract_band_powers(eeg_sfg_same)

X_nback.append(feat_nback)
X_sfg_prev.append(feat_sfg_prev)
X_sfg_same.append(feat_sfg_same)
y_sfg.append(true_performance)

X_nback = np.array(X_nback)
X_sfg_prev = np.array(X_sfg_prev)
X_sfg_same = np.array(X_sfg_same)
y_sfg = np.array(y_sfg)

# 实验1:同任务同轮预测
scores_same = predictor.train(X_sfg_same, y_sfg)
print(f"实验1 - SFG同轮EEG→SFG表现:")
print(f" R² = {scores_same.mean():.3f} ± {scores_same.std():.3f}")

# 实验2:同任务前轮预测
scores_prev = predictor.train(X_sfg_prev, y_sfg)
print(f"\n实验2 - SFG前轮EEG→SFG表现:")
print(f" R² = {scores_prev.mean():.3f} ± {scores_prev.std():.3f}")

# 实验3:跨任务预测
scores_cross = predictor.train(X_nback, y_sfg)
print(f"\n实验3 - N-Back EEG→SFG表现 (跨任务):")
print(f" R² = {scores_cross.mean():.3f} ± {scores_cross.std():.3f}")

print(f"\n=== 结论 ===")
print(f" 同轮预测效果最佳(实时监测可行)")
print(f" 跨任务预测有效(训练评估可预测任务表现)")
print(f" 前轮预测有效(前瞻预警可行)")

对 IMS 开发的启示

1. 跨任务迁移是可行的

论文最重要的发现是简单任务的 EEG 可以预测复杂任务表现。对 IMS 的意义:

1
2
训练阶段: 简单认知测试 → 评估驾驶员认知基线
驾驶阶段: DMS摄像头 → 实时认知状态监测

2. 航空→汽车的认知监测迁移

航空场景 汽车场景 迁移可行性
飞行员 dual n-back 驾驶前认知测试 ✅ 直接迁移
SFG 表现预测 驾驶表现预测 ⚠️ 需适配
EEG 跨任务预测 rPPG 跨场景预测 ✅ 可行
飞行员认知负荷监测 驾驶员认知负荷监测 ✅ 直接迁移

3. 实际部署路线

4. 从 EEG 到 rPPG 的迁移

本文使用 EEG,但实际部署可以用更易获取的信号:

信号源 可获取性 认知负荷指标 部署难度
EEG ❌ 需头戴 Theta/Alpha比 极高
rPPG(摄像头) ✅ DMS已有 HRV, 心率变异 低
眼动 ✅ DMS已有 眼动熵, 注视分布 低
行为 ✅ 已有 方向盘/踏板模式 低

rPPG 替代 EEG 的理论依据:

  • 心率变异(HRV)与认知负荷相关
  • HRV 的频域指标(LF/HF比)对应自主神经平衡
  • 摄像头 rPPG 可实现非接触式 HRV 监测

5. 开发路线建议

阶段 时间 目标 技术方案
Phase 1 0-3月 rPPG HRV 特征提取 DMS摄像头 + 信号处理
Phase 2 3-6月 认知负荷分类模型 HRV + 眼动 + 行为融合
Phase 3 6-12月 跨场景迁移验证 训练态→驾驶态预测
Phase 4 12-18月 实时预警系统 认知负荷→分级干预

结论

本文从航空认知监测角度证明了 EEG 跨任务表现预测的可行性。虽然 EEG 本身难以车载部署,但其方法论可以迁移到 rPPG、眼动等更实用的信号源。对 IMS 开发而言,”简单认知测试→驾驶表现预测”的框架值得借鉴,而”跨任务迁移”的概念为 DMS 的认知负荷监测提供了新的理论支撑。


参考链接: