news 2026/4/23 12:36:41

MEMD 多元经验模态分解 Python代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MEMD 多元经验模态分解 Python代码

MEMD 多元经验模态分解 Python代码 MEMD是一种多元经验模态分解算法,是EMD从单个特征到任意数量特征的拓展,用于分析多变量信号并提取其本征模态函数(IMF)。 这段代码能够帮助您执行MEMD分解,并提取多个IMF,从而更好地理解您的多元时间序列数据。 代码功能: 实施MEMD算法,读取EXCEL并提取多元时间序列的IMFs。 可指导替换数据。 可视化分解结果,每个特征的分量用不用颜色表示,以便分析和进一步处理。

直接打开Python环境,先装个PyEMD库(别问为啥用这个库,问就是省事)。别被EMD和MEMD的名字吓到,本质上都是把复杂信号拆成不同频率的振动组合。咱们今天要玩的是多元版本的,适合处理比如股票多指标同步分析这类场景。

先上硬菜——核心分解代码:

from PyEMD import MEMD import pandas as pd import matplotlib.pyplot as plt data = pd.read_excel('你的数据.xlsx').values # 记得做归一化,不然不同量纲特征会打架 data = (data - data.mean(axis=0)) / data.std(axis=0) # 关键的三行代码来了 memd = MEMD() imfs = memd(data) # 这个返回结构有点怪,注意维度顺序 imfs = imfs.transpose(2, 0, 1) # 调整为(特征数, IMF数, 样本数)

这里有个坑:MEMD返回的维度是(样本数, IMF数, 特征数),咱们得转置成更符合直觉的(特征数, IMF数, 样本数)。转置后的imfs[0]就是第一个特征的各阶IMF分量。

可视化部分要玩点花样,用颜色区分不同特征的分量:

plt.figure(figsize=(15, 10)) colors = ['#2E75B6', '#ED7D31', '#70AD47'] # 微软经典三色 for feat_idx in range(imfs.shape[0]): for imf_idx in range(imfs.shape[1]): plt.subplot(imfs.shape[0], imfs.shape[1], feat_idx*imfs.shape[1]+imf_idx+1) plt.plot(imfs[feat_idx, imf_idx], color=colors[feat_idx % 3]) plt.title(f'Feature {feat_idx+1} - IMF {imf_idx+1}') plt.grid(alpha=0.3) plt.tight_layout() plt.show()

这个嵌套循环的绘图方式可能看着有点绕,但能确保每个特征的IMF分量按列排列,同色系表示同一特征的不同频率成分。建议数据特征别超过3个,不然颜色区分度会下降。

实际跑数据时如果遇到内存爆炸,试试把样本量砍半或者调整MEMD参数:

memd = MEMD(nbsym=4, # 镜像延拓的样本点数 spline_kind='akima', # 插值方法选akima更平滑 n_phases=16) # 投影方向数,越大越准但越慢

调整n_phases参数就像调节显微镜的焦距——数值越大分解越精细,但计算量指数级增长。个人经验是16-32之间性价比最高。

最后给个实用技巧:分解后的IMFs别直接用来建模,先做能量分析。用这个函数找出主要成分:

def energy_analysis(imfs): energy = np.sum(imfs**2, axis=-1) energy_ratio = energy / np.sum(energy, axis=1, keepdims=True) return energy_ratio energy_ratios = energy_analysis(imfs) print(f"各成分能量占比:\n{energy_ratios.round(3)}")

输出结果类似[[0.7, 0.2, 0.1], ...]这样的数组,每个子数组对应一个特征的各IMF能量分布。通常前两个IMF包含主要信息,后面的可以当噪声处理。

遇到分解结果出现模式混淆(比如高频成分混入低频IMF),可以试试对原始数据做滑动平均预处理,或者用这个后处理技巧:

# 用Butterworth滤波器二次过滤 from scipy.signal import butter, filtfilt b, a = butter(4, 0.2, 'highpass') refined_imfs = filtfilt(b, a, imfs, axis=-1)

别完全相信自动分解结果,多结合业务背景判断。曾经有个项目分解气温数据,结果发现第三IMF和当地工厂排班周期吻合——这种隐藏信息才是MEMD最有价值的部分。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:15:27

软硬件解耦驱动下的SDV变革:技术栈升级与安全验证

摘要 汽车行业正经历一场由软件定义汽车(SDV)驱动的根本性变革。在这一变革中,软件不仅协调车辆功能,还通过服务化重新定义价值主张,使服务成为关键差异化因素,而非物理产品本身。本文探讨了行业从硬件为中…

作者头像 李华
网站建设 2026/4/23 11:46:24

lidR包完全实战指南:激光雷达林业分析的8大核心技术

lidR包完全实战指南:激光雷达林业分析的8大核心技术 【免费下载链接】lidR Airborne LiDAR data manipulation and visualisation for forestry application 项目地址: https://gitcode.com/gh_mirrors/li/lidR 激光雷达技术正在彻底改变传统林业管理方式&am…

作者头像 李华
网站建设 2026/4/23 0:27:40

BDInfo实战指南:解锁蓝光光盘深层技术参数的终极武器

BDInfo实战指南:解锁蓝光光盘深层技术参数的终极武器 【免费下载链接】BDInfo BDInfo from http://www.cinemasquid.com/blu-ray/tools/bdinfo 项目地址: https://gitcode.com/gh_mirrors/bd/BDInfo 还在为无法准确获取蓝光光盘技术规格而烦恼吗?…

作者头像 李华
网站建设 2026/4/23 11:47:35

47、利用网络与邮件进行脚本操作

利用网络与邮件进行脚本操作 1. 使用 Lynx 访问网络数据 在进行 shell 脚本编程时,互联网可能并非首先会想到的元素。不过,有一些实用工具能让你在 shell 脚本中轻松访问网络及其他网络设备的数据。Lynx 就是这样一款工具,它是一个基于文本的浏览器,由堪萨斯大学的学生于…

作者头像 李华
网站建设 2026/4/19 23:43:48

49、每日励志名言脚本:获取与解析

每日励志名言脚本:获取与解析 在商业环境中,励志名言一直被广泛运用,或许此刻你的办公室墙上就挂着几句。下面为大家介绍一个有趣的脚本,它能帮助你每日获取励志名言,随你使用。 所需功能理解 有不少优质网站可提供每日励志名言,你只需打开常用的搜索引擎,就能找到众…

作者头像 李华
网站建设 2026/4/22 3:00:06

重新思考时间管理:从被动提醒到主动掌控的进化之路

重新思考时间管理:从被动提醒到主动掌控的进化之路 【免费下载链接】Simple-Clock Combination of a beautiful clock with widget, alarm, stopwatch & timer, no ads 项目地址: https://gitcode.com/gh_mirrors/si/Simple-Clock 在快节奏的现代生活中&…

作者头像 李华