【脑电6】
脑电 6目录1. 为什么需要非线性分析2. 熵——信号不可预测性的度量3. 复杂度——信号中模式丰富度的量化4. 分形与自相似性5. 去趋势波动分析——长程相关性6. 非线性特征工具箱1. 为什么需要非线性分析1.1 脑电不是线性系统线性系统的典型特征输入和输出成比例不同频率成分互不干扰。但大脑是典型的非线性系统两个刺激同时呈现 ≠ 单独呈现的EEG响应之和α波和γ波之间存在跨频率耦合γ功率随α相位变化癫痫从正常→发作的转变是突然的相变非线性动力学中的分岔现象同一被试在相同状态下的EEG波形从不完全重复importnumpyasnpimportmatplotlib.pyplotaspltfromscipyimportsignal# 直观演示线性系统 vs 非线性系统tnp.linspace(0,4,500)xnp.sin(2*np.pi*2*t)0.5*np.sin(2*np.pi*8*t)# 线性系统y 2*x简单放大y_linear2*x# 非线性系统y x³输出不是输入的简单缩放y_nonlinearx**3fig,axesplt.subplots(2,2,figsize(14,7))axes[0,0].plot(t,x,b,lw1);axes[0,0].set_title(输入信号 x(t))axes[0,1].plot(t,y_linear,g,lw1);axes[0,1].set_title(线性系统输出 y2x\n(形状不变))axes[1,0].plot(t,y_nonlinear,r,lw1);axes[1,0].set_title(非线性系统输出 yx³\n(波形变形、高频增加))# 输入-输出散点图axes[1,1].scatter(x,y_linear,s2,alpha0.3,label线性(y2x))axes[1,1].scatter(x,y_nonlinear,s2,alpha0.3,label非线性(yx³))axes[1,1].set_xlabel(输入);axes[1,1].set_ylabel(输出)axes[1,1].legend();axes[1,1].set_title(输入-输出关系)plt.tight_layout();plt.show()print(线性输入×2 输出×2比例恒定)print(非线性输入和输出的关系不是直线——这就是非线性分析的动机)1.2 非线性指标能捕捉的东西线性指标非线性指标新增视角α功率样本熵α功率不变但熵降低→信号更有序了ERP峰值LZ复杂度峰值不变但复杂度降低→进入单一模式θ/β比值分形维度比值不变但D降低→信号更光滑规则频谱分布去趋势波动分析(DFA)频谱不变但长程相关性增强2. 熵——信号不可预测性的度量2.1 三种熵的对比熵类型含义冥想中的变化近似熵(ApEn)新模式出现的概率冥想加深→ApEn↓样本熵(SampEn)ApEn的改进版排除了自匹配比ApEn更稳定长度无关排列熵(PermEn)仅看大小排序模式计算极快对噪声鲁棒适合在线分析defsample_entropy(data,m2,r_factor0.2): 样本熵——衡量信号中新模式产生的概率 熵高信号不可预测混沌/警觉 熵低信号规律有序/冥想/麻醉 N,rlen(data),r_factor*np.std(data)defcount_matches(template_len):count0templatesnp.array([data[i:itemplate_len]foriinrange(N-template_len)])foriinrange(len(templates)):distsnp.max(np.abs(templates-templates[i]),axis1)countnp.sum(distsr)-1# 减1排除自身匹配returncount A,Bcount_matches(m1),count_matches(m)return-np.log(A/(B1e-10))ifB0elsefloat(inf)defpermutation_entropy(data,m3,delay1): 排列熵——只看数值大小排序模式 例窗口[1,5,3]→排序[0,2,1]→中-小-大模式 对所有窗口统计模式分布→算熵 fromitertoolsimportpermutations Nlen(data)patternslist(permutations(range(m)))pattern_count{p:0forpinpatterns}total0foriinrange(N-(m-1)*delay):windowdata[i:im*delay:delay]# 找到排序模式sorted_idxtuple(np.argsort(window))ifsorted_idxinpattern_count:pattern_count[sorted_idx]1total1# 计算熵pe0forcountinpattern_count.values():ifcount0:pcount/total pe-p*np.log(p)returnpe/np.log(len(patterns))# 归一化到[0,1]# 对比演示np.random.seed(42)noisenp.random.randn(1000)# 白噪声→高熵sinenp.sin(2*np.pi*np.arange(1000)/256*10)# 正弦→低熵mixednoise*0.6sine*0.4# 混合→中等print(信号类型对比:)forname,sigin[(白噪声(高熵),noise),(正弦波(低熵),sine),(混合(中熵),mixed)]:sesample_entropy(sig)pepermutation_entropy(sig[:500])print(f{name}: SampleEn{se:.3f}, PermEn{pe:.3f})3. 复杂度——信号中模式丰富度的量化3.1 Lempel-Ziv复杂度LZC衡量的不是信号有多乱而是信号中有多少种不同的子串模式——模式越多越复杂。deflempel_ziv_complexity(data):LZ复杂度——计算信号二值化后不同子串模式数量# 二值化大于中位数1小于0binary(datanp.median(data)).astype(int)nlen(binary)i,C,L0,1,1# C复杂度计数器, L当前窗口长度whileiLn:pattern.join(map(str,binary[i:iL]))history.join(map(str,binary[:iL-1]))ifpatterninhistory:L1# 模式出现过→扩大窗口else:C1# 新模式→复杂度1iL L1returnC/n# 归一化# 直观演示规则序列 vs 随机序列regularnp.tile([1,0,1,0],50)# 高度规则→低复杂度random_seqnp.random.randint(0,2,200)# 随机→高复杂度print(f规则序列(1010重复) LZC:{lempel_ziv_complexity(regular):.3f})print(f随机序列 LZC:{lempel_ziv_complexity(random_seq):.3f})print(→ 冥想深度↑ → 大脑活动模式趋于简单 → LZC↓)3.2 LZC在脑电中的应用麻醉深度监测LZC随麻醉加深而持续降低——比频谱指标更可靠冥想状态评估深度冥想时LZC显著低于静息状态癫痫预测发作前几分钟LZC异常降低——可用于预警意识障碍评估植物状态患者的LZC显著低于最小意识状态4. 分形与自相似性4.1 脑电是分形信号分形的核心特征自相似性——放大看局部和整体有相似的统计特性。EEG信号在毫秒到分钟的多个时间尺度上都呈现1/f频谱功率∝1/f^α这正是分形信号的特征。defhiguchi_fractal_dimension(data,kmax10): Higuchi分形维度——衡量信号的曲折程度 D范围1(光滑规则曲线) ~ 2(极其曲折填满平面) 冥想加深→D降低信号更光滑规则 麻醉加深→D降低 癫痫发作→D降低 Nlen(data)Lknp.zeros(kmax)forkinrange(1,kmax1):Lmknp.zeros(k)forminrange(k):idxsnp.arange(m,N-1,k)iflen(idxs)1:Lmk[m]np.sum(np.abs(np.diff(data[idxs])))Lmk[m]*(N-1)/((len(idxs)-1)*k)validLmk[Lmk0]Lk[k-1]np.mean(valid)iflen(valid)0else0# 最小二乘拟合: log(Lk) ~ log(1/k)xnp.log(1.0/np.arange(1,kmax1))ynp.log(Lk1e-10)D-np.polyfit(x,y,1)[0]returnDdefpetrosian_fractal_dimension(data):Petrosian分形维度——基于零交叉点计数计算极快# 零交叉信号穿过均值的次数zero_crossingsnp.sum(np.diff(datanp.mean(data))!0)Nlen(data)returnnp.log10(N)/(np.log10(N)np.log10(N/(N0.4*zero_crossings)))5. 去趋势波动分析——长程相关性5.1 DFA的原理DFADetrended Fluctuation Analysis衡量信号在不同时间尺度上的波动特征核心输出是一个指数αα ≈ 0.5白噪声——各时间尺度随机无长程相关α ≈ 1.01/f噪声粉红噪声——健康大脑的典型特征α 1.0存在长程正相关——前一刻的趋势延续到下一刻α 0.5反相关——涨落后倾向于被跌落跟随defdfa(data,scalesNone): 去趋势波动分析(DFA) 返回缩放指数α——衡量长程相关性强度 ifscalesisNone:scalesnp.unique(np.logspace(1,np.log10(len(data)//4),10).astype(int))# 1. 累积和积分ynp.cumsum(data-np.mean(data))# 2. 对每个尺度计算波动fluctuationsnp.zeros(len(scales))foridx,scaleinenumerate(scales):n_segmentslen(data)//scale rms_total0foriinrange(n_segments):segy[i*scale:(i1)*scale]# 用多项式拟合去趋势线性趋势DFA1xnp.arange(len(seg))trendnp.polyval(np.polyfit(x,seg,1),x)detrendedseg-trend rms_totalnp.mean(detrended**2)fluctuations[idx]np.sqrt(rms_total/n_segments)# 3. 拟合log(F) vs log(scale) → 斜率αvalid~np.isnan(fluctuations)(fluctuations0)alphanp.polyfit(np.log10(scales[valid]),np.log10(fluctuations[valid]),1)[0]returnalpha,scales,fluctuations# 演示不同α的对比np.random.seed(42)white_noisenp.random.randn(2000)# α≈0.5# 生成1/f噪声简化的Pink噪声pink_noisenp.cumsum(np.random.randn(2000))# α≈1.5布朗噪声forname,sigin[(白噪声(α≈0.5),white_noise),(布朗噪声(α≈1.5),pink_noise)]:alpha,_,_dfa(sig)print(f{name}: DFA α {alpha:.3f})print(健康静息EEG的DFA α通常在0.7-1.0之间)print(深度麻醉/昏迷时α可能下降到0.5左右)5.2 DFA在临床和研究中的应用应用DFA α的变化麻醉监测α从1.0(清醒)降到~0.6(深度麻醉)癫痫预测发作前α异常升高→长程相关性增强阿尔茨海默病α低于健康同龄人——脑信号失去长程组织冥想α略增——大脑维持稳定状态的能力增强睡眠分期NREM睡眠αREM睡眠α清醒α6.非线性特征工具箱classNonlinearEEGAnalyzer:非线性EEG特征提取工具箱def__init__(self,fs256):self.fsfsdefextract_all(self,eeg_segment):一键提取所有非线性特征features{}# 熵类features[sample_entropy]sample_entropy(eeg_segment)features[perm_entropy]permutation_entropy(eeg_segment,m3)# 复杂度features[lz_complexity]lempel_ziv_complexity(eeg_segment)# 分形features[higuchi_fd]higuchi_fractal_dimension(eeg_segment)features[petrosian_fd]petrosian_fractal_dimension(eeg_segment)# 长程相关alpha,_,_dfa(eeg_segment)features[dfa_alpha]alphareturnfeaturesdefcompare_states(self,eeg_segments,state_names):对比不同状态的非线性特征results[]forseg,nameinzip(eeg_segments,state_names):results.append(self.extract_all(seg))# 可视化feat_nameslist(results[0].keys())n_featlen(feat_names)fig,axesplt.subplots(1,n_feat,figsize(3*n_feat,4))fori,(feat,ax)inenumerate(zip(feat_names,axes)):values[r[feat]forrinresults]ax.bar(range(len(state_names)),values,color[steelblue,salmon,orange,green][:len(values)],edgecolorblack)ax.set_xticks(range(len(state_names)))ax.set_xticklabels(state_names,fontsize7)ax.set_title(feat,fontsize9);ax.grid(True,alpha0.3,axisy)plt.suptitle(不同脑状态下非线性特征对比,fontsize13)plt.tight_layout();plt.show()returnresults# 演示四种模拟状态analyzerNonlinearEEGAnalyzer(fs256)np.random.seed(42)tnp.arange(0,4,1/256)# 模拟四种状态rest20*np.sin(2*np.pi*10*t)np.random.randn(len(t))*3meditation25*np.sin(2*np.pi*10*t)np.random.randn(len(t))*1.5# 更干净规则drowsy10*np.sin(2*np.pi*5*t)np.random.randn(len(t))*5# 更多慢波噪声noise_signp.random.randn(len(t))*8# 纯噪声resultsanalyzer.compare_states([rest,meditation,drowsy,noise_sig],[静息,深度冥想,困倦,随机噪声])print(\n各状态特征汇总:)fori,(name,r)inenumerate(zip([静息,深度冥想,困倦,随机噪声],results)):print(f\n{name}:)fork,vinr.items():print(f{k}:{v:.4f})ifi1:print( → 深度冥想熵最低、复杂度最低、分形维最低最有序)

相关新闻

zed 2i相机坐标系与内参、外参

zed 2i相机坐标系与内参、外参

相应内外参如下:相机型号 : ZED 2i 序列号 : 31474187 固件版本 : 相机 1523 / 传感器 778 左相机 Left 内参 分辨率 : 1280 x 720焦距 fx, fy : 536.4066, 536.4066主点 cx, cy : 642.2694, 351.1544内参矩阵 K : [[536.40655518 …

2026/9/22 21:50:42 阅读更多 →
试用期自我总结撰写指南:从STAR-P模型到十大场景实战

试用期自我总结撰写指南:从STAR-P模型到十大场景实战

1. 项目概述:一份报告,十次成长又到试用期尾声,相信很多朋友和我一样,正对着电脑屏幕,为那份“试用期自我总结报告”绞尽脑汁。这玩意儿,说简单也简单,无非是回顾过去、总结现在、展望未来&…

2026/9/22 21:50:48 阅读更多 →
基于LLM与OpenClaw框架的自动化测试报告生成Skill设计与实践

基于LLM与OpenClaw框架的自动化测试报告生成Skill设计与实践

1. 项目概述:为什么我们需要一个“自动写测试报告”的 Skill?在软件开发和测试的日常里,写测试报告这件事,说大不大,说小不小,但绝对是个“脏活累活”。想象一下这个场景:你刚跑完一轮包含上百个…

2026/9/7 8:15:03 阅读更多 →

最新新闻

3个坑解决真假猫爪杯项目报错从入门到精通

3个坑解决真假猫爪杯项目报错从入门到精通

3个坑解决真假猫爪杯项目报错从入门到精通 复制来的代码跑不通,满屏红字报错,心里慌得一批?别急着删库重来。很多开发者卡在【真假猫爪杯】这个经典全栈Demo上,明明照着教程敲,环境也配了,为什么一运行就崩?问题往往不在代码逻辑,而在依赖冲突、…

2026/9/23 0:58:01 阅读更多 →
2017最美av女神排行数据清洗指南:新手避坑与代码实战

2017最美av女神排行数据清洗指南:新手避坑与代码实战

2017最美av女神排行数据清洗指南:新手避坑与代码实战 复制来的爬虫代码跑不通,控制台全是乱码或者空值,这种崩溃感我懂。很多初学者在掘金技术社区发帖问,为什么同一个脚本昨天能跑今天全报错?核心痛点往往不在网络,而在数据结构的隐蔽变更。这篇…

2026/9/23 0:58:01 阅读更多 →
开药店前端避坑:源码解析环境配置耗时半天的真相

开药店前端避坑:源码解析环境配置耗时半天的真相

开药店前端避坑:源码解析环境配置耗时半天的真相 配置环境就卡半天?我见过太多转行前端的新手,在【开药店】业务系统的项目里,光跑通本地开发环境就耗掉整整两天。不是代码难,是依赖管理、模块解析、版本锁定这些底层机制没搞懂,全靠猜。今天不讲虚的,…

2026/9/23 0:58:01 阅读更多 →
共享汽车有哪些功能前端实战项目面试避坑指南

共享汽车有哪些功能前端实战项目面试避坑指南

共享汽车有哪些功能前端实战项目面试避坑指南 面试时被问“共享汽车有哪些核心交互逻辑”答不上来,那种尴尬谁懂?很多应届生以为共享汽车只是租车App,其实背后是复杂的实时状态同步与权限控制。我做过一个完整的共享汽车前端实战项目,才发现这里面的坑…

2026/9/23 0:58:01 阅读更多 →
TowerMadness开发避坑指南: 5个新手必踩的崩溃陷阱与修复

TowerMadness开发避坑指南: 5个新手必踩的崩溃陷阱与修复

TowerMadness开发避坑指南: 5个新手必踩的崩溃陷阱与修复 官方文档那几万字的配置项,看完脑子还是浆糊?别慌,我也曾被那些复杂的JSON结构和异步回调折磨到脱发。这篇TowerMadness开发避坑指南,直接给你划重点,专治各种“…

2026/9/23 0:58:01 阅读更多 →
搞懂股票内盘外盘源码逻辑 3个实战项目避坑指南

搞懂股票内盘外盘源码逻辑 3个实战项目避坑指南

搞懂股票内盘外盘源码逻辑 3个实战项目避坑指南 刚学完 Python 或 JavaScript,代码能跑,项目却像无头苍蝇。这是不是你的现状?很多开发者卡在“从语法到工程”的鸿沟里,明明会写 if-else ,却不知道怎么把 股票内盘外盘…

2026/9/23 0:57:01 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →