经常有小伙伴后台留言,说优化VMD参数的程序为什么运行时间辣么长,有没有办法改善一下!

今天小淘就为大家带来了改善运行时间的方法:采用官方自带的vmd函数

0672ecc5d0ccd60ba999067c87654bb3.png

这是MATLAB官方自带的VMD函数截图,可以看到只有2020a版本以后的MATLAB才有vmd函数。

该函数用法也不是很难,大家可以直接在MATLAB官方文档搜索vmd函数的使用方法!或者直接在2020a版本以上的MATLAB输入vmd,然后把光标定位在vmd字符上,按"F1"键,即可出来该函数相关的用法!


这里插一段!浅浅说一下为什么优化VMD参数需要大量的时间!

作者认为,原因有三:

①有些小伙伴的数据量非常大,数据长度超过一万乃至十万的,即便单次调用vmd函数,都需要很长的时间,更何况用智能算法优化寻优,那时间就会更长!

②之前作者提供的VMD函数,是某位大佬根据vmd的定义手写的,相比于官方给出的vmd函数,肯定会有不足之处。以后大家可以以官方的vmd函数为准。之前购买过小淘关于vmd作品的小伙伴也不要着急,替换为官方vmd函数的方法,在这篇文章也会详细的告诉大家,包教包会!

③智能算法的复杂度也会影响运行时间,某些智能算法在运行过程中,需要多次调用适应度函数,本来计算的复杂度是:迭代次数*种群个数,但是一旦这个智能算法在迭代中多次调用了适应度函数,那计算时间就会蹭蹭上涨!所以,关于VMD参数优化的这个案例,并不是所有智能算法都适用,大家尽量选那些计算复杂度低的智能优化算法。当然,小淘之前为大家推荐的优化VMD参数的代码,都是选择的低复杂度的智能算法!


今天就采用这个官方自带的VMD函数,并采用前几期为大家带来的融合鱼鹰和柯西变异的麻雀优化算法来优化VMD参数,该算法也是作者力荐的一个算法,复杂度没有增加,且优化效率极高!

先说结果,替换为官方自带的VMD函数后,寻优速度真的大幅度提升!数据量大的小伙伴不妨都试试这个官方的VMD函数。当然要下载2020a以上的MATLAB才可以哦!

同样以西储大学数据集为例,选用105.mat中的X105_BA_time.mat数据中1000个数据点。没有数据的看这篇文章。西储大学轴承诊断数据处理,matlab免费代码获取

选取五种适应度函数进行优化,以此确定VMD的最佳k和α参数。四种适应度函数分别是:最小包络熵,最小样本熵,最小信息熵,最小排列熵,排列熵/互信息熵,代码中可以一键切换。至于应该选择哪种作为自己的适应度函数,大家可以看这篇文章。VMD为什么需要进行参数优化,最小包络熵/样本熵/排列熵/信息熵,适应度函数到底该选哪个

1.最小包络熵作为适应度函数

0a52a215f0af3745a832781ae00c1813.png

3b93e5878d84e7e8307692a8f7a01c1b.png

2.最小样本熵作为适应度函数

2b13831655c869c56b10d5d9ff6c485c.png

f1a04cf07944228745591ce0b39d52d1.png

3.最小信息熵作为适应度函数

19b1e5e3a783bbe6f848c60a82e30003.png

0a27bf2b592c28650a38f8952d09ad01.png

4.最小排列熵作为适应度函数

c321b12c06885406a6c8366ef51169cb.png

6338fe31e1e03f44a12b4d651562ca92.png

5.复合指标作为适应度函数

有关复合指标的介绍如下:

781eff5b5b999ee39277a3d4769aca1f.jpeg

结果图:

a008f1ac7ed5ec08c58bb2c9aeddbd4d.png

b7ea41547e19828445f5f30557603280.png

如何替换官方的VMD函数?

首先声明,之前的VMD函数肯定是没有错误的!之前购买过作者有关VMD作品的小伙伴也不要慌张,这个并非是非要替换不可的!如果大家嫌代码跑的太慢,可以把调用VMD的部分进行替换!

替换方法:

找到原先文件中调用VMD函数的位置,一般是在适应度函数中。原先的VMD调用是这样的:

[u, u_hat, omega] = VMD(X, alpha, tau, K, DC, init, tol);

现在要把VMD.m这个文件删除了,然后写成这样:

u= vmd(X,'PenaltyFactor', alpha,'NumIMF',K);
u=u';

记着给u加个转置,这是因为官方的vmd函数分解后,得到的IMF分量是以列为单位的。其他的参数如果大家没有特殊需求,使用默认的即可。

本文的部分代码:

%% 以最小包络熵、最小样本熵、最小信息熵、最小排列熵,排列熵/互信息熵,为目标函数(任选其一),采用OCSSA算法优化VMD,求取VMD最佳的两个参数
clear
clc
close all
xz = 1;  %xz, 选择1,以最小包络熵为适应度函数,
% 选择2,以最小样本熵为适应度函数,
% 选择3,以最小信息熵为适应度函数,
% 选择4,以最小排列熵为适应度函数,
% 选择5,以复合指标:排列熵/互信息熵为适应度函数。
if xz == 1  
    fobj=@EnvelopeEntropyCost;          %最小包络熵
elseif xz == 2
    fobj=@SampleEntropyCost;            %最小样本熵
elseif xz == 3  
    fobj=@infoEntropyCost;              %最小信息熵
elseif xz == 4
    fobj=@PermutationEntropyCost;       %最小排列熵
elseif xz == 5
    fobj=@compositeEntropyCost;       %复合指标:排列熵/互信息熵
end
%% 选取数据
load 105.mat
da = X105_DE_time(6001:7000); %这里选取105的DEtime数据,注意这里替换为自己的数据即可,数据形式为n行*1列,列数必须为1。
%% 设置参数
lb = [100 3];    %惩罚因子和K的下限
ub = [2500 10];  %惩罚因子和K的上限
dim = 2;            % 优化变量数目
Max_iter=20;       % 最大迭代数目
SearchAgents_no=30;       %种群规模


%% 调用OCSSA函数
[fMin , bestX, Convergence_curve ] = OCSSA(SearchAgents_no,Max_iter,lb,ub,dim,fobj,da);


%% 画适应度函数曲线图,并输出最佳参数
figure
plot(Convergence_curve,'Color',[0.9 0.5 0.1],'Marker','>','LineStyle','--','linewidth',1);
title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
legend('OCSSA优化VMD')
display(['The best solution obtained by OCSSA is : ', num2str(round(bestX))]);  %输出最佳位置
display(['The best optimal value of the objective funciton found by OCSSA is : ', num2str(fMin)]);  %输出最佳适应度值

大家注意看到xz这个变量,当选择1,以最小包络熵为适应度函数,选择2,以最小样本熵为适应度函数,选择3,以最小信息熵为适应度函数,选择4,以最小排列熵为适应度函数,选择5,以复合指标:排列熵/互信息熵为适应度函数。这样大家切换起来就很方便了。

代码包含融合鱼鹰和柯西变异的麻雀算法在CEC2005,CEC2021函数中的测试和OCSSA优化VMD。

f523d44ba3026c28577493c7d68ce679.png

   完整代码获取,后台回复关键词:

OCSSAVMD

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐