基于鲸鱼优化算法的VMD参数自适应与包络熵适应度设计

发布时间:2026/11/6 7:05:26
基于鲸鱼优化算法的VMD参数自适应与包络熵适应度设计 简介这份PDF文档围绕鲸鱼优化算法WOA优化变分模态分解VMD展开面向计算机、电子信息工程、数学等专业学生及信号处理学习者帮助理解如何自动寻优VMD的关键参数K与惩罚因子alpha从而改善复杂信号的分解效果。文档内容涉及边际谱、频率图、收敛曲线及超参数优化迭代过程图便于观察每次迭代中参数变化与分解性能的对应关系同时说明参数化编程、注释清晰、数据以Excel形式便于替换、主程序main可直接运行等Matlab实现特点。资源包共1个PDF文件约600KB适合作为课程设计、期末大作业或毕业设计中的算法创新点参考。已有1337人学习说明该方向具有一定关注度。读者可从中获取WOA-VMD的整体思路、参数设置逻辑、结果展示方式和代码组织参考为信号分解实验与论文写作提供较完整的案例。1. 一条振动信号引出的问题为什么要让 WOA 去挑 VMD 的 K 和 alpha一段实测振动信号直接丢进 VMDK 和 alpha 全靠手感试分解出来的模态不是混叠就是被硬切成碎片——这是我第一次调变分模态分解时最真实的体验。WOA-VMD 这套 Matlab 代码解决的问题很具体把模态数 K 和惩罚因子 alpha 交给鲸鱼算法自己搜人只负责给出搜索区间和适应度函数。它适合手头有一份 Excel 采样数据、要在课程设计或课题里做出“参数自适应”这个创新点、又不想从零推变分公式的人。跑通之后你能看到收敛曲线、中心频率图和边际谱三张图也知道结果不对时该动哪一行。2. 技术选型WOA 与 VMD 各自解决什么问题又怎么拼在一起2.1 VMD 的关键参数K 与惩罚因子 alpha变分模态分解把原始信号拆成 K 个带限的模态分量每个分量围绕自己的中心频率振荡。它求解的是一个约束变分问题所有模态加起来要能重构原信号同时每个模态的带宽之和最小。这个优化问题在频域用交替方向乘子法迭代求解代码里那一串alpha / tau / K / DC / init / tol就是它的全部输入。问题在于 VMD 对 K 极其敏感。K 给小了两个频率接近的分量会被强行塞进同一个模态出现模态混叠K 给大了同一个物理分量会被切成两三块中心频率挤在一起包络谱上出现一堆没有物理意义的峰。alpha 控制带宽alpha 太小模态带宽过宽、噪声跟着进来alpha 太大带宽被压窄分解出的波形严重失真。人工试参数通常要跑几十次看着中心频率图判断“这次是不是切多了”费时而且不可复现。所以优化的目标就很清楚了在给定的 alpha、K 搜索区间里找一个让分解质量指标最好的组合。这本质是一个二维连续-离散混合优化问题其中 alpha 连续、K 整数且目标函数没有解析梯度只能靠启发式算法去试。2.2 WOA 的三种行为与二维搜索空间鲸鱼优化算法模拟座头鲸的捕食行为把候选解当作鲸鱼个体最优解当作猎物。每代迭代时每头鲸鱼按概率 p 在两种动作里选一个p 0.5 时走包围或随机搜索p ≥ 0.5 时走螺旋攻击。包围阶段用|A| 1判定系数 A 由收敛因子 a 从 2 线性降到 0 控制前期 |A| 大、探索范围广后期 |A| 小、收缩到局部。随机搜索阶段则是从种群中随机挑一个个体当参考点作用是防止整个种群过早塌到同一个局部最优。螺旋攻击用对数螺旋线让个体绕最优解转圈靠近模拟鲸鱼围捕时的螺旋上升路径。放到这个项目里搜索空间的维度只有 2第一维是 alpha第二维是 K。维度低是这套方案能跑得快的前提因为每次适应度评估都要完整跑一遍 VMD而 VMD 本身是个迭代求解器单次耗时并不低。如果维度上升到七八维种群 5 个、迭代 20 次根本不够收敛曲线会一路抖到底。WOA 在这个场景下的优势是参数少。除了种群规模和迭代次数需要调的只有一个螺旋常数 b 和收敛因子的线性下降策略不像差分进化那样还有交叉率、变异因子。对课程设计和论文复现来说少一个参数就少一个被问“这个值为什么这么取”的地方。2.3 整体数据流优化器在外层VMD 在内层的嵌套结构整条链路是嵌套的外层是 WOA 的迭代内层是每一头鲸鱼对应的一组 (alpha, K) 去跑一次 VMD然后由适应度函数把这次分解结果压成一个标量熵值返回给优化器。优化器只认这个标量越小越好它不知道 VMD 内部发生了什么。这个结构带来一个必须提前想清楚的问题适应度函数的设计直接决定优化器往哪个方向走。如果用“各模态包络熵的平均值”当适应度模态数越多、每个模态越纯净、平均熵越小优化器就会天然偏向大的 K最后 K 顶到上界。这是这套代码最容易翻车的地方后面第五章会专门讲怎么加惩罚项。数据流大致是四段main.m读 Excel取出待分解的一维信号去直流设定固定参数 tau、DC、init、tol把适应度函数句柄(x) funKAlpha(x, f, tau, DC, init, tol)交给优化器连同搜索上下界和维度优化器返回最优位置Best_pos、最优适应度Best_score、收敛曲线curve和每代最优参数process对Best_pos取整回代到 VMD 再跑一次拿到最终的u、u_hat、omega画分解图、频率图、边际谱。第 4 步的“再跑一次”不能省。优化过程中为了省时间很多实现会允许 K 和 alpha 带小数参与搜索最后的整数结果必须用真实的 K 重新分解一次否则你画的图和适应度评估时用的图对不上。这一步是自己加的还是原代码就有取决于版本但只要你的适应度函数里做了round出图前就必须重新调用一次 VMD。2.4 为什么不用网格搜索有人会问K 从 2 到 10、alpha 从 800 到 2500网格搜索扫一遍不行吗。可以但代价摆在那alpha 即使按 100 步长、K 全扫也有 18 × 9 162 次 VMD 调用如果想要 alpha 精度到 10就是 1700 多次。而 WOA 用 5 个个体 20 代理论上限 100 次评估实际因为每代只评估新位置量级差不多。真正拉开差距的是自适应能力。网格搜索的结果是一张表你得自己看表选WOA 直接给一个最优点而且带收敛曲线论文里那张“迭代过程图”就是靠process变量画出来的。这也是这套代码被当作创新点用的原因——它不只给结果还给过程。3. 目录结构与运行链路从 main.m 到分解结果图的完整走向3.1 文件清单与各自职责拿到源码包先别急着点运行把文件按职责过一遍后面改起来才不会改错地方。这类项目的目录通常很扁平所有 .m 文件和数据放在同一层常见构成如下。文件职责改动频率main.m主程序读数据、设参数、调优化器、回代 VMD、出图高换数据必改WOA.m鲸鱼优化算法主循环返回最优解、收敛曲线、每代参数低除非换算法funKAlpha.m适应度函数输入一组 (alpha, K)输出分解质量指标中换指标必改VMD.m变分模态分解本体输入信号和参数输出 u、u_hat、omega基本不动huatu.m画收敛曲线与两个参数随迭代的变化曲线中改图样式data.xlsx待分解数据一列或两列可直接替换高提示如果你的包里优化器文件名是别的算法名比如SSA.m、GWO.m但主程序注释写的是鲸鱼算法先看主程序实际调用的是哪个函数。这套代码在不同版本之间换过优化器函数名和注释没同步是常事。文件职责清楚之后运行顺序就明确了main.m是唯一入口直接 F5 运行不需要先跑别的脚本。如果报“未定义函数或变量”八成是当前工作目录不对——Matlab 只在当前文件夹和搜索路径里找函数双击 .m 文件打开并不会自动把所在文件夹设为当前目录这是新手第一个卡点。3.2 数据入口Excel 怎么读、列怎么选、去直流为什么必要数据替换是这套代码最常被用到的功能也是最容易出错的地方。原始代码通常用xlsread或readmatrix读表取某一列做信号。这里有两个细节必须处理转成行向量以及去直流。VMD 的内部实现大多按行向量处理信号如果你的数据读进来是列向量维度对不上会直接报错或者算出一堆无意义的结果。去直流的理由是信号的均值对应 0 Hz 分量如果不去掉第一个模态会被这个直流分量整个占住中心频率贴着 0剩下的模态分配就乱了。%% 数据入口换成自己的 Excel 只需要改文件名和列号 raw readmatrix(data.xlsx); % R2019a 及以上老版本用 xlsread % 如果第一行是表头readmatrix 会给出 NaN这里剔掉 raw raw(~isnan(raw(:, end)), :); f raw(:, 2); % 取第 2 列转置成 1×N 行向量 f f - mean(f); % 去直流避免 0 Hz 分量吃掉第一个模态 f f / max(abs(f)); % 归一化防止幅值量级影响熵值比较 fs 1000; % 采样率画频率轴和边际谱时要用 N numel(f);参数说明raw是原始表格矩阵行是采样点、列是通道raw(:, 2)里的列号按你自己的表改单通道数据就是第 1 列mean(f)减掉的是全局均值如果信号有缓慢漂移可以先用detrend或高通滤波max(abs(f))归一化不是必须的但如果你要横向比较不同信号的包络熵就必须统一幅值尺度否则熵值不可比。fs这一行很容易被忽略。它不参与分解只影响后面画频率轴和计算瞬时频率。如果fs设错中心频率图的横轴会整体缩放你会误以为分解出的频率成分不对。拿到数据先确认采样率这是血泪经验。3.3 参数区逐行从 pop 到 lb/ub 怎么改主程序里最该动手改的是优化器参数区。原始设置一般是种群 5、迭代 20、alpha 区间 [800, 2000]、K 区间 [4, 10]。这组值能跑出图但从优化角度看偏保守具体怎么调要看你的目的。%% 优化器参数区 pop 10; % 种群数量原版 5 偏小2 维问题 10 比较稳 Max_iter 30; % 最大迭代次数看收敛曲线平了就可以停 lb [800, 3]; % 下边界[alpha 下界, K 下界] ub [2500, 10]; % 上边界[alpha 上界, K 上界] dim 2; % 维度固定为 2顺序不能反 fobj (x) funKAlpha(x, f, tau, DC, init, tol); % 固定随机种子保证每次跑出来的 K、alpha 一致写论文必须加这句 rng(2024); [Best_score, Best_pos, curve, process] WOA(pop, Max_iter, lb, ub, dim, fobj); % 取整后回代用真实整数参数再分解一次 Best_pos round(Best_pos); alpha_opt Best_pos(1); K_opt Best_pos(2);参数说明与调整建议pop和Max_iter是乘法关系总评估次数大致是pop × Max_iter每次评估跑一遍 VMD所以先拿小数据试跑测出单次 VMD 耗时再决定这两个值。lb和ub的第一位是 alpha、第二位是 K顺序和dim 2严格对应写反了优化器会在 K 的区间里搜 alpha结果荒谬但不会报错属于静默失败。rng这行原代码里往往没有加了之后结果可复现答辩时被要求“再跑一次”不至于给出两个不同的 K。round(Best_pos)对两个参数都取整alpha 取整影响不大但如果你希望 alpha 有更细的分辨率可以只对 K 取整alpha 保留小数传进 VMD。这属于可选改造第五章会讲为什么 alpha 取整在某些数据上会带来台阶效应。4. 核心代码拆解优化循环、适应度函数与 VMD 调用三段4.1 优化器主循环WOA 一代是怎么算完的优化器的骨架是标准的启发式算法结构初始化种群评估找最优进入迭代每代更新位置、越界截断、重新评估、更新全局最优。真正决定收敛质量的是位置更新那一小段。function [Best_score, Best_pos, curve, process] WOA(pop, Max_iter, lb, ub, dim, fobj) % 在上下界内均匀撒点做初始化 Positions repmat(lb, pop, 1) rand(pop, dim) .* repmat(ub - lb, pop, 1); Best_score inf; Best_pos zeros(1, dim); curve zeros(1, Max_iter); % 每代最优适应度 process zeros(Max_iter, dim); % 每代最优参数用来画参数变化曲线 for i 1:pop % 初始种群先评估一轮 fit fobj(Positions(i, :)); if fit Best_score Best_score fit; Best_pos Positions(i, :); end end for t 1:Max_iter a 2 - 2 * t / Max_iter; % 收敛因子2 线性降到 0 a2 -1 - t / Max_iter; for i 1:pop r1 rand(); r2 rand(); A 2 * a * r1 - a; % |A|1 包围|A|1 随机搜索 C 2 * r2; b 1; % 螺旋常数 l (a2 - 1) * rand() 1; % [-1,1] p rand(); if p 0.5 if abs(A) 1 D abs(C * Best_pos - Positions(i, :)); Positions(i, :) Best_pos - A * D; else idx randi(pop); D abs(C * Positions(idx, :) - Positions(i, :)); Positions(i, :) Positions(idx, :) - A * D; end else D abs(Best_pos - Positions(i, :)); Positions(i, :) D .* exp(b * l) .* cos(2 * pi * l) Best_pos; end % 越界截断防止 alpha 或 K 跑到区间外 Positions(i, :) min(max(Positions(i, :), lb), ub); fit fobj(Positions(i, :)); if fit Best_score Best_score fit; Best_pos Positions(i, :); end end curve(t, :) Best_score; process(t, :) Best_pos; end end逐段说明初始化用lb rand .* (ub - lb)这在二维箱式约束下等价于均匀撒点比全零初始化好得多因为全零起点会让整代个体挤在同一位置前期几乎没有探索。收敛因子a从 2 降到 0A的绝对值随之前减前半程 |A| 大概率大于 1走随机搜索后半程自动切到包围这个从探索到开发的过渡是 WOA 能用的关键如果你把a改成常数收敛曲线会明显变差。l用(a2-1)*rand()1生成a2从 -2 降到 -1 附近使得l落在 [-1, 1] 区间这是螺旋项的标准取法。process记录每代最优参数是画“超参数迭代过程图”的数据来源没有这个变量就画不出参数随迭代变化的曲线。评估次数上有个细节内层每个个体更新后都调用一次fobj也就是每代pop次评估。这对 VMD 来说负担不小因为每次评估内部都是一次完整的变分迭代。如果跑得太慢可以改成“只评估更新幅度大的个体”或者用parfor并行内层循环前提是 VMD 本身没有全局状态。4.2 适应度函数 funKAlpha包络熵怎么把一个分解结果变成一个数适应度函数是整个项目的技术核心它决定了什么叫“分解得好”。这类代码常用的指标是包络熵对每个模态做希尔伯特变换取包络归一化成概率分布算信息熵。物理意义是如果一个模态是被噪声主导的它的包络起伏杂乱、能量分布均匀熵就大如果它对应一个清晰的冲击或周期成分包络有明显的起伏结构能量集中熵就小。function fit funKAlpha(x, f, tau, DC, init, tol) % x(1) - alphax(2) - K这里取整是为了让 K 合法 alpha round(x(1)); K round(x(2)); % 非法参数直接判死避免优化器浪费一次 VMD 计算 if K 2 || K 15 || alpha 0 fit 1e10; return; end % 对当前参数完整跑一次 VMD [u, ~, ~] VMD(f, alpha, tau, K, DC, init, tol); % 逐模态计算包络熵取平均作为适应度 e zeros(1, K); for k 1:K env abs(hilbert(u(k, :))); % 解析信号求模得到包络 env env / (sum(env) eps); % 归一化为概率分布 e(k) -sum(env .* log(env eps)); % 香农熵越小越“干净” end fit mean(e); end参数说明x是优化器传进来的候选解长度等于dimf是主程序里预处理过的行向量信号tau取 0 表示不加噪声松弛带噪数据可以考虑给一个小的tauDC为 1 时第一个模态被固定在 0 Hz前面去了直流的话保持 0 即可init控制中心频率初值分布0 是全零、1 是均匀分布、2 是随机实测init 1收敛最稳tol一般取 1e-6 到 1e-7太小会拖慢每次评估。hilbert需要 Signal Processing Toolbox如果环境里没有这个工具箱可以自己用 FFT 实现解析信号补零到偶数长度、只保留正频率、乘 2 再逆变换。eps加在分母和 log 里是为了防止某个包络点为 0 导致log(0)得到 -Inf一旦出现 -Inf 或 NaN优化器的比较逻辑就崩了表现出来的现象是整条收敛曲线都是 NaN。注意用mean(e)作适应度存在单调偏移风险K 越大平均熵往往越小优化器会一路把 K 顶到上界。这不是代码写错了是指标设计的问题解决办法见 6.2。4.3 最优参数回代与三张图的画法拿到最优参数之后要重新跑一次 VMD拿到完整的u、u_hat、omega用来出图。这一步的代码很短但参数必须用取整后的值不能直接把优化器返回的浮点解丢进去。%% 用最优参数重新分解 [u, u_hat, omega] VMD(f, alpha_opt, tau, K_opt, DC, init, tol); %% 图 1收敛曲线 两个参数随迭代的变化 figure; subplot(3,1,1); plot(curve, b-o, LineWidth, 1.2); xlabel(迭代次数); ylabel(适应度); title(WOA 收敛曲线); grid on; subplot(3,1,2); plot(process(:,1), r-s, LineWidth, 1.2); xlabel(迭代次数); ylabel(alpha); title(惩罚因子 alpha 变化); grid on; subplot(3,1,3); plot(process(:,2), k-^, LineWidth, 1.2); xlabel(迭代次数); ylabel(K); title(模态数 K 变化); grid on;收敛曲线看两件事一是是否单调不增优化器每代都保留历史最优理论上必须单调如果出现上升说明你的实现里最优解没被正确保存二是尾部是否已经压平没有压平就说明迭代次数不够加大Max_iter再看。参数变化曲线看的是 K 在什么位置稳定下来如果 K 一直在 9、10 之间跳那就是过分解的信号回头去改适应度。频率图直接用 VMD 返回的omega它是每个模态的中心频率轨迹通常只画最后一行也就是收敛后的中心频率横轴是模态序号。如果两个模态的中心频率几乎重合说明 K 给多了或者 alpha 太小模态没分开。边际谱稍微麻烦一点标准做法是对每个模态做希尔伯特变换得到瞬时幅值和瞬时频率然后把幅值按频率分箱累加。简化实现如下。%% 图 2边际谱简化版按频点累加瞬时幅值 MS zeros(1, floor(N/2)); for k 1:K_opt h hilbert(u(k, :)); A abs(h); % 瞬时幅值 fi [0 diff(unwrap(angle(h)))] * fs / (2*pi); % 瞬时频率 for n 1:N idx round(fi(n) * N / fs) 1; % 频率映射到频点下标 if idx 1 idx numel(MS) MS(idx) MS(idx) A(n); end end end fre (0:numel(MS)-1) * fs / N; figure; plot(fre, MS, LineWidth, 1.2); xlabel(频率 (Hz)); ylabel(幅值); title(边际谱); grid on;这段是内层双重循环N上万时明显慢。常见做法是先对fi做histcounts加权统计或者把内层换成向量化的accumarrayMS accumarray(idx, A, [numel(MS), 1])一行顶掉整个 for 循环。参数上fs必须和信号真实采样率一致unwrap不能省否则相位卷绕会让瞬时频率出现锯齿。5. 避坑与排查跑不通、收敛曲线抖动、K 顶到上界的 5 个真实坑5.1 现象一运行就报未定义函数 VMD原因基本只有两种一是当前工作目录不在源码文件夹Matlab 的搜索路径没包含它二是包里的函数文件名和调用名不一致比如文件叫vmd.m而代码里写VMD(...)。第三种少见但存在的情况是函数被放在了子文件夹里而没addpath。解决先在命令行敲pwd确认当前目录不对就cd过去然后which VMD看能不能定位到文件。如果返回空用addpath(genpath(pwd))把当前文件夹及子文件夹全加进路径。文件名大小写在 Windows 上不敏感、在 Linux 上敏感跨平台跑之前统一改成和调用一致的名字这是最省事的做法。5.2 现象每次运行的 K 和 alpha 都不一样图也对不上原因是没有固定随机种子而 WOA 的初始化、rand()、randi()全都是随机的。种群只有 5 个个体、迭代 20 代时初值的影响被放大得很明显两次运行给出 K6 和 K8 完全正常。解决在主程序开头加rng(2024)放在任何随机调用之前。如果要做统计就不能只跑一次正确做法是固定不同的种子跑 10 次记录每次的最优 K 和 alpha取众数或者取适应度中位数对应的那一组。把“单次最优”当成结论写进报告是常见误用评审问一句“重复性如何”就答不上来。5.3 现象K 每次都收敛到搜索上界中心频率图挤成一团这是这套代码最高频的技术问题。原因是包络熵对 K 单调模态越多每个模态的频率成分越单一包络越规整平均熵越小。优化器只认数值自然一路加 K。解决有两条路。一是改适应度加过分解惩罚比如fit mean(e) lambda * Klambda取 0.01 到 0.1 量级具体值通过观察惩罚前后 K 的落点来定二是换判据用“最小包络熵 模态间相关系数约束”或者“重构误差 中心频率间隔”的组合指标。还有一条更简单的直接收紧ub的第二位把 K 上限设成 8用先验知识兜住。这不是优雅方案但在明确知道信号有几种成分时最有效。5.4 现象优化器前期就收敛整条曲线一条直线原因是种群初始化撞在了同一个位置。rand(pop, dim)在 pop 很小时容易生成一堆相近的点加上 alpha 的量级是几百到几千位置更新里A * D的步长非常大一步就飞出边界被截断回lb或ub整代个体全部贴在边界上看起来就像“秒收敛”。解决给 alpha 做尺度归一化把搜索区间映射到 [0,1]在适应度函数里再还原成真实值这样两个维度的步长量级一致A * D不会在 alpha 方向过大。具体写法是lb [0, 3]; ub [1, 10];然后在funKAlpha里alpha round(800 x(1) * (2500 - 800))。这一个改动通常能让收敛曲线从直线变成正常的阶梯下降。5.5 现象读进来的 Excel 数据分解结果全是噪声原因通常是列选错了或者表头没处理。readmatrix遇到表头会给出 NaN 行VMD 拿到含 NaN 的信号不会报错而是算出一堆 NaN 传下去最后画图空白另一种是选到了时间列而不是幅值列时间列是单调递增的VMD 会把它当成一个超低频趋势分量。解决读完之后先size(raw)和raw(1:3, :)看清结构再决定列号用any(isnan(f))检查信号里有没有 NaN有就整行剔除或者用fillmissing插值最后plot(f(1:min(2000,N)))肉眼确认一下波形像不像振动信号。这一步花十秒能省掉半小时的“为什么图是空的”。6. 二次开发换信号、换适应度、换优化器的三条改造路线6.1 换优化器只要对齐四个返回值这套代码的优化器和 VMD 是解耦的只要新算法满足“输入 pop、Max_iter、lb、ub、dim、fobj输出最优适应度、最优位置、收敛曲线、参数变化矩阵”这个契约主程序里换一行调用就能跑。这也是它适合做对比实验的原因——同一份数据、同一个适应度换三种优化器就能出一张对比表。% 只改这一行其余代码不动 [Best_score, Best_pos, curve, process] GWO(pop, Max_iter, lb, ub, dim, fobj); % 或者 [Best_score, Best_pos, curve, process] SSA(pop, Max_iter, lb, ub, dim, fobj);需要留意的是返回值顺序。不同来源的优化器函数返回的参数个数和顺序常常不一致有的是[Best_score, Best_pos, curve]三个有的把curve放在第一位。直接替换会出现“收敛曲线画出来是二维矩阵”这种诡异现象原因是把Best_pos当成了curve。稳妥做法是换完之后先whos看一眼各变量的尺寸curve应该是 1×Max_iterprocess应该是 Max_iter×dim。6.2 换适应度给 K 加惩罚避免过分解针对 5.3 的问题最值得做的改造是把适应度从“纯熵”改成“熵 惩罚”。下面这个版本还顺手加了中心频率间隔项两个模态靠得太近就扣分。function fit funKAlpha_v2(x, f, tau, DC, init, tol, lambda) alpha round(x(1)); K round(x(2)); if K 2 || alpha 0, fit 1e10; return; end [u, ~, omega] VMD(f, alpha, tau, K, DC, init, tol); e zeros(1, K); for k 1:K env abs(hilbert(u(k, :))); env env / (sum(env) eps); e(k) -sum(env .* log(env eps)); end % 惩罚 1模态数越多扣得越多抑制过分解 pen_K lambda * K; % 惩罚 2相邻中心频率间隔过小5Hz时扣分 fc sort(omega(end, :)); gap diff(fc); pen_f 0.5 * sum(max(0, 5 - gap)); fit mean(e) pen_K pen_f; end参数说明lambda是惩罚强度从 0.05 开始试观察最优 K 是否从 10 降到 4 到 6 的合理区间omega(end, :)取的是最后一次迭代的中心频率gap小于阈值说明模态没分开max(0, 5 - gap)只惩罚过近的部分不奖励过远。这套改法的代价是引入两个新超参数答辩时可能被追问所以最好配一组lambda的敏感性实验把 K 随lambda变化的曲线也画出来。6.3 验证方法三组对照实验改完之后怎么证明改得对比改本身更重要。我一般固定做三组对照第一组是固定参数 VMDK 用手工试出来的值、alpha 用默认 2000作为基线。第二组是原始 WOA-VMD不做惩罚。第三组是加了惩罚的版本。三组用同一份数据、同一个rng种子比较四个指标最优 K、平均包络熵、重构误差 RRMSE以及单次运行耗时。指标计算方式期望方向最优 K优化器输出落在 4~6 区间平均包络熵mean(e)越小越好但不能只比这个重构误差 RRMSEnorm(f - sum(u,1)) / norm(f)越小越好过分解时也会变小需结合 K 看中心频率间隔min(diff(sort(omega(end,:))))越大越好说明模态分得开RRMSE 会随着 K 增大单调下降所以它不能单独当判据必须和 K 一起看——K 加了一大截而 RRMSE 只降了 1%那就是过分解不划算。如果三组结果的 K 差异不明显但中心频率间隔差很多说明你这批数据本身成分就少优化空间有限换信号比换算法更有意义。从那以后我每次改适应度函数都会先把“固定种子的两次相同运行”和“固定参数基线”这两步强制走一遍确认改动本身带来的差异大于随机波动再去看图表。不然很容易把随机噪声当成改进效果写进结论里。这套代码的骨架不大改起来不费劲难的是判断改完到底有没有变好希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询