脑电非线性分析:熵与复杂度
大脑不是线性系统。熵衡量"多难预测",复杂度衡量"新模式有多少"—— 两个不依赖任何频段假设的指标,正在意识障碍与发育研究里大显身手。
🎯 本节学习目标
- 说清为什么脑电需要非线性指标:线性方法只是观察非线性动力学系统的一扇窗
- 理解相空间重构(Takens 嵌入)的直觉:从单通道录像"重建"系统轨迹
- 掌握样本熵的公式直觉与参数 m、r 的选择惯例
- 理解 LZC"数新模式"的思想与归一化方式,知道多维 LZC 衡量什么
- 能运行手写样本熵与 LZC 代码,并按规范报告参数
一、为什么脑电需要非线性分析
前面所有方法有个共同默契:把脑电近似成线性系统 + 平稳噪声。 这个近似在很多场景下够用,但大脑的真实身份是非线性动力学系统: 神经元发放有阈值、振荡来自极限环、皮层活动甚至带混沌特征。 只用尺子量一座山,永远得不到它的分形维数——线性方法只是观察大脑的一扇窗, 这一课我们打开另一扇。
非线性指标回答两类线性方法够不着的问题: "这段信号多难预测?"(熵家族)与 "这段信号含多少新模式?"(复杂度家族)。 它们不依赖任何频段假设——你可以对宽带的原始信号直接计算。
二、相空间重构:从一段录像推断三维运动
系统所有状态变量张成的空间;系统随时间演化在相空间里画出一条轨迹,长期盘踞的图形叫"吸引子"。相空间的维数与结构,刻画了动力学的复杂程度。
问题在于:我们只有一两个电极的记录,而系统的真实状态变量有亿万个。 Takens 嵌入定理给了个惊人的答案:把单通道信号按固定延迟 τ 复制成 m 列(x(t), x(t+τ), x(t+2τ), …),用它们当坐标, 重构出来的吸引子在拓扑意义上与真实系统等价。 类比:你只有一台固定机位的摄像机拍广场上跳舞的人(单通道录像), 却能从这盘录像重建出整个舞蹈的空间结构。
本课的熵与 LZC 其实不需要显式做相空间重构,但这个图景解释了一件根本的事: 单通道信号里确实藏着系统的高维结构,非线性指标就是在读它。 嵌入参数(τ 用互信息第一极小值、m 用伪最近邻法)的细节,等做真正的 非线性动力学分析(如关联维数、Lyapunov 指数)时再展开。
三、熵家族:从近似熵到样本熵
熵家族的核心问题:在一段信号里,找到"似曾相识"的短模板有多容易? 规律信号(正弦、周期波)里到处是相似片段 → 熵低;随机信号几乎找不到相似片段 → 熵高。 药物麻醉后的大脑更规律 → 熵下降,直觉完全对得上。
- 近似熵 ApEn:把信号切成所有长度 m 的小模板,数"任意两段足够相似"的概率 B, 以及"再多比一个点仍相似"的概率 A,ApEn ≈ −ln(A/B)。缺点:它把每段模板和自己也比了一遍(自匹配必然相似),系统性抬高了熵值;
- 样本熵 SampEn:同样的公式,但不与自己比、不重复计数,修正了自匹配偏差,对数据长度也更稳健——现在的默认选择;
- 模糊熵:把"像不像"的硬阈值换成连续的隶属函数,边界不再非黑即白,对噪声更稳定。
参数惯例:m = 2(模板长度), r = 0.1–0.25 × 信号标准差(相似容差)。 r 太小找不到相似模板、r 太大什么都相似——两个极端都会毁掉指标。
四、复杂度:Lempel-Ziv 与多维 LZC
LZC(Lempel-Ziv 复杂度)换个角度问问题:把信号按阈值二值化成一串 0/1, 从左到右读过去,出现了多少个"第一次见到的新片段"? 像读一本书时统计"没见过的词组"有多少——流水账的新词组很少(复杂度低), 好诗的新词组层出不穷(复杂度高)。
原始计数 c(n) 随长度增长,不同长度的数据没法直接比,所以用 c(n)·log₂(n)/n 归一化:纯随机序列趋于 1,完全规则序列趋于 0, 真实脑电落在中间——而且落点有生理意义。
多维 LZC(msLZC)把多个通道联合起来:每个通道按各自阈值二值化后, 每个时刻的多通道取值拼成一个符号(比如 4 通道 → 16 种符号), 再对这串符号数新模式。它衡量的是空间-时间的联合复杂性—— "不同脑区在同一时刻的组合方式有多丰富",这正是意识水平研究的核心变量。
五、Matlab 实现:样本熵
−ln(A/B):B 是"任意两段长度 m 的模板足够相似"的比例,A 是"它们再多比一个点仍相似"的比例。A/B 越接近 1(相似就一路相似下去),信号越规律,熵越低。
function se = sample_entropy(x, m, r)
% 样本熵 SampEn = -ln(A/B)
% B:任意两段长度 m 的子序列"足够像"的比例
% A:它们再多比一个点(长度 m+1)仍然"像"的比例
% 与 ApEn 的关键差别:不拿子序列与自己比(自匹配会给 ApEn 带来偏差)
x = x(:)';
n = numel(x);
if std(x) == 0, se = NaN; return; end % 平线信号无法定义熵
B = 0; A = 0;
for i = 1:(n - m)
for j = (i+1):(n - m) % 只数 i < j 的对:避免重复与自匹配
if max(abs(x(i:i+m-1) - x(j:j+m-1))) <= r
B = B + 1; % 长度 m 的模板对相似
if max(abs(x(i:i+m) - x(j:j+m))) <= r
A = A + 1; % 长度 m+1 仍相似
end
end
end
end
if B == 0 || A == 0
se = NaN; % 数据太短或容差太小:找不到相似模板
return;
end
se = -log(A / B);
end
% 用法(惯例参数 m=2, r=0.2 x SD):保存为 sample_entropy.m 后调用
seg = EEG.data(10, 10000:50000); % 某通道一段约 40 秒的数据
se = sample_entropy(seg, 2, 0.2 * std(seg));
fprintf('样本熵 = %.4f\n', se);
这份代码是 O(n²) 的双重循环,几万个点尚可接受;更长数据请用向量化版本或降采样。它换来的是每一行都能对应到公式——先读懂它,再换快的。
六、Matlab 实现:LZC
function lz = lempel_ziv_complexity(x)
% LZC:二值化 → 从左到右解析出"新模式"个数 → 归一化
% 直觉:把信号读成 0/1 串,统计"第一次出现的新片段"有多少
s = (x(:)' > median(x)); % 二值化:中位数阈值对幅值分布稳健
str = char(double(s) + '0'); % 转字符串,用 strfind 判断子串是否出现过
n = length(str);
c = 1; % 第一个字符必然是第一个模式
pos = 1; len = 1; % pos:已解析长度;len:当前测试段长度
while pos + len <= n
if ~isempty(strfind(str(1 : pos+len-1), str(pos+1 : pos+len)))
len = len + 1; % 测试段在历史中出现过 → 再延长一位
else
c = c + 1; % 新模式!
pos = pos + len; % 解析进度推进
len = 1;
end
end
if len > 1
c = c + 1; % 末尾未完成的段也计为一个模式
end
lz = c * log2(n) / n; % 归一化:随机序列趋于 1,规则序列趋于 0
end
% 快速自检:三种典型信号的复杂度应当拉开差距(保存函数后运行)
fs = 500; t = (0:1/fs:60)';
pure = sin(2*pi*10*t); % 规则正弦
mixed = sin(2*pi*10*t) + 0.5*sin(2*pi*40*t); % 两个规则成分叠加
noise = randn(size(t)); % 随机噪声
fprintf('正弦 LZC=%.3f 混合 LZC=%.3f 噪声 LZC=%.3f\n', ...
lempel_ziv_complexity(pure), ...
lempel_ziv_complexity(mixed), ...
lempel_ziv_complexity(noise));
% 预期顺序:正弦 < 混合 < 噪声(规则性越低,复杂度越高)
七、应用场景与临床价值
| 指标 | 衡量什么 | 关键参数 | 备注 |
|---|---|---|---|
| 近似熵 ApEn | 新模式出现的难度 | m、r | 有自匹配偏差 |
| 样本熵 SampEn | 同上(去偏差版) | m、r | 当前默认选择 |
| 模糊熵 FuzzyEn | 同上(连续隶属) | m、r、梯度 | 对噪声更稳 |
| LZC | 二值序列的新模式数量 | 二值化阈值 | 归一化后可跨长度比较 |
| 多维 LZC | 多通道联合复杂度 | 通道数、阈值 | 空间-时间联合刻画 |
- 意识障碍:植物状态 / 最小意识状态患者的静息态熵与复杂度显著低于健康人,多维 LZC 已被用于辅助诊断与预后判断——这是非线性指标最成功的临床故事;
- 麻醉深度:麻醉下熵持续下降,商业麻醉深度监测仪的思路与此同源;
- 发育与老化:儿童 EEG 熵随年龄增长而升高(大脑精细化),老年人大脑复杂度下降("去分化"假说);
- 精神疾病:精神分裂症、抑郁研究的常用结局指标之一。
健康清醒的大脑既不过分规则(癫痫样放电)也不过分随机(白噪声),而是处在两者之间的临界附近——信息传输效率最高的位置。多数病理与麻醉状态都表现为向两端偏移。非线性指标正是量化"离临界有多远"的尺子。
八、注意事项与报告规范
- 数据长度:SampEn 需要足够长才能找到相似模板(经验上数千点起步);LZC 也对长度敏感——组间比较必须等长;
- 采样率一致:不同采样率下的熵与复杂度不可直接比较;
- 频带要说明:宽带原始信号与窄带滤波后的熵含义不同,报告时写清楚用了什么滤波;
- 参数要报全:m、r(及是否按 SD 归一化)、二值化阈值、数据长度;
- 只在同一套参数内比较:非线性指标的绝对值没有跨研究的"正常值"。
不同参数、不同频带、不同数据长度下的熵值差异可能比病人与对照的差异还大。非线性指标是"同一实验内、同一套参数下"的比较工具——所有组用完全相同的处理,差异才有意义。
📌 本节小结
- 大脑是非线性动力学系统;熵衡量可预测性(越规律越低),复杂度衡量新模式数量(越随机越高)
- Takens 嵌入:单通道信号里藏着系统的高维结构,非线性指标就是在读它
- SampEn = −ln(A/B):A/B 是"相似模板再多比一个点仍相似"的条件概率;参数惯例 m=2、r=0.1–0.25×SD
- LZC 归一化后随机序列趋于 1、规则序列趋于 0;多维 LZC 衡量空间-时间联合复杂性
- 健康大脑靠近临界:意识障碍、麻醉、老化都表现为向过分规则或过分随机偏移
- 非线性指标只在同一套参数内可比:长度、采样率、频带、m/r 全部要报告
✏️ 课后练习
- 对同一段 EEG 分别计算 SampEn(m=2,r=0.1 / 0.2 / 0.25 × SD),画出熵随 r 变化的曲线并讨论参数敏感性。
- 比较同一名被试睁眼与闭眼两段数据的 LZC 与样本熵,用一句话解释方向差异的原因。
- 把 LZC 教学版改造成两通道的多维版:两通道各自二值化后按 2×b1+b2 拼成 4 符号串,再统计新模式数量。