【优化算法】VMD分解算法的16种优化,对K和alpha参数寻优,附MATLAB代码

在上一篇文章中,我们介绍了优化算法的基本原理和一些常见的生物启发式算法。另外我们封装了一个16合1的寻优函数。

不过在上一篇中,我们举了一个简单的数值模型作为适应度函数的演示案例,然而在实际的研究中,适应度函数往往要复杂得多。本篇我们就以VMD算法的优化为例,讲一讲这种较为复杂的算法的寻优该怎么做,此外我还提供了修改好的VMD寻优代码,供大家参考使用!

一、为什么要对VMD做参数寻优

在一众的类EMD算法中,对于EMD、EEMD、CEEMD等等这些无法指定分解模态数的算法,经常有同学问我该怎样指定模态数量;当我告诉大家需要使用VMD才能制定模态数量K时,更多的是问我K值该怎么取。人类就是这么的纠结。

今天这篇文章就可以解答这个疑问了。话说回来,K的选取确实比较重要,K 的取值直接决定了分解后的模态分量的数目,若 K 设置得过大,会造成欠分解产生虚假模态;若 K 设置得偏小,会造成欠分解不能充分提取时间序列隐含特征。

此外惩罚因子alpha对分解结果也有重要影响,alpha的取值影响了模态分量的带宽,与带宽成反比,若alpha设置较小,则会出现模态混叠影响特征提取;若alpha设置较大,虽然能避免模态混叠但又造成了局部信息丢失的问题。

在有些研究中,对K和alpha的取值问题,会采用多次实验选取预测/分类效果最优值,但是这十分依赖研究人员的主观判断,缺乏客观的评判标准。因此,对VMD的参数进行优化是十分必要的。

二、VMD寻优的参数和适应度函数

1.待优化参数

就像上边所说,分解模态数K和惩罚因子alpha是比较关键的两个参数。其实还有第三个常用参数tol,不过因为tol对分解结果的影响相对较小,所以在本文中,不将tol作为寻优对象参数。

2.适应度函数

对VMD参数选择优化的关键是适应度函数的设置,用来对分解效果制定量化指标来衡量参数选择的优劣。

纵观众多论文,VMD基本都是使用的信息熵作为适应度函数[1]。

在之前的文章中讲过,信息熵越大,代表不确定性越大,信号中包含的信息量越少。

所以为了最大程度地提取出有效信息,就需要让分解出的各个模态的平均信息熵最小。

至于“信息熵”的具体类型选择就比较多了,我们之前讲过的功率谱熵、奇异谱熵、能量熵、近似熵、样本熵、模糊熵、排列熵,都可以选择。

三、应用kOptimizationAlgorithm函数实现16种优化算法寻优

有了上述定义,我们就可以利用kOptimizationAlgorithm函数来实现对VMD参数的自动寻优了。具体步骤如下:

3.1 定义适应度函数

下边是改好的适应度函数,其中tol值指定为1*10-6。适应度函数主要就三步:

第一步进行VMD分解,这里调用了之前封装过的kVMD函数,当然这里直接用MATLAB的vmd函数也可以,但是需要注意转置,因为MATLAB官方vmd函数得到的imf是按列方向排列的。

第二步是提取各个imf分量的排列熵特征,这里也使用了之前封装的熵特征提取函数,只需要指定一下熵类型名称以及必要的参数设置就行,大家可以更换这一步的熵类型,但是需要注意option也需要对应调整,具体设置方式可以参考这里:(功率谱熵、奇异谱熵、能量熵、近似熵、样本熵、模糊熵、排列熵)

第三步是求各个imf分量的排列熵的均值,并将其作为适应度函数值。

%% 适应度函数,此代码需要根据应用场景做适应性修改
function [fitness] = funFitness(x,dataforFitness)
% 输入:
% x是待优化参数,为数组。x(1)是第一个待优化参数,x(2)是第二个,以此类推。
% dataforFitness为结构体,表示导入到适应度函数的参数,按照数据实际情况设置。可以没有
% 输出:
% fitness是适应度函数
%%
% 待寻优参数读取,注意此处可能有些参数必须为整型,需要取整
alpha = round(x(1)); %alpha 
K = round(x(2)); %K
% 导入数据读取
FsOrT = dataforFitness.fs;
data  = dataforFitness.data;
try
    % 定义目标函数
    tol = 1e-6;
    [imf,CenFs]  = kVMD(data,FsOrT, alpha, K, tol);


    % 设置排列熵参数,Pedim为排列熵模式维度,Pet为排列熵的时间延迟,如果不提取排列熵特征可以删除以下两行
    option.Pedim = 6;
    option.Pet   = 1;
    featureNamesCell = {'PeEn'}; %要进行特征提取的特征名称,可以根据实际需要进行删减,留下的特征注意拼写正确
    fea = genFeatureEn(imf,featureNamesCell,option);  %调用genFeature函数,完成特征提取,算出的特征值会保存在fea变量里
                                             
    fitness = mean(fea);

    
catch ME 
    fprintf('发生错误: %s\n', ME.message);
end
end

3.2 设置寻优相关参数

以下代码是写在主程序里的了,必要的参数我都将其作为可调参数抽取出来了,大家可以根据需要进行调整,每个参数的含义在注释里标明了,这里不再赘述。

%% 1.设置寻优相关参数
dim = 2;             % 优化参数的个数,这里设定为2,表示有两个需要寻优的参数
lb = [100,2];        % 定义每个优化参数的取值下限,这里的写法代表:alpha下限设置为100,K下限设置为2
ub = [10000,10];     % 定义每个优化参数的取值上限,这里的写法代表:alpha上限设置为10000,K上限设置为10
OAmethod = 'SSA';    % 选择使用的优化算法,这里使用'SSA'即麻雀搜索算法
pop = 3;             % 设置优化算法的种群大小
Max_iteration = 40;  % 设置优化算法的最大迭代次数

3.3 调用kOptimizationAlgorithm函数实现寻优

以下代码也是写在主程序里,dataforFitness作为结构体用于传递必要的数值,这样做大大提升了代码的灵活性和简洁性,采样频率要根据你的信号情况设置(长周期信号设置为1);dataforFitness.data则是要将你待分解信号的变量名赋值给他。最后一行直接调用即可实现寻优了。

%% 2.调用优化算法函数,传入上述定义的参数
dataforFitness.fs = 1000;  %设置采样频率
dataforFitness.data = x;   %设置待分解信号
% 返回最优位置Best_pos,最优适应度值Best_score,迭代过程的适应度曲线curve
[Best_pos,Best_score,curve] = kOptimizationAlgorithm(OAmethod, dataforFitness, lb, ub, dim, pop, Max_iteration);

3.4 运行结果

运行完上述程序,将会得到以下结果:

参数寻优结果分别为:2885,4
最佳适应度值为:0.19814
程序运行时间:23.471秒。

如果想尝试其他优化算法,只需要修改OAmethod参数即可。例如改为'GWO'就可以切换为灰狼优化算法。

在实际应用中,我们可以多试几种算法,比较它们的性能,选择最优的一种。同时也可以调整种群数量和迭代次数等参数,权衡计算效率和优化效果。

四、小结

以上是对上篇文章中一行代码实现16种优化算法在VMD算法上的演示,同时也是因为VMD寻优是大家比较常用的一种场景。大家在使用优化算法应用到其他场景时,希望上述文章对大家能有所启发。

当然了,上边VMD寻优的代码我也打包好了,同学们可以在公众号 khscience(看海的城堡)中回复“VMD优化”获取。

参考

  1. ^[1]晋孟雪.基于改进VMD和深度学习的风电功率预测研究[D].西安理工大学,2023.DOI:10.27398/d.cnki.gxalu.2023.002010.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/508498.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iOS移动应用实时查看运行日志的最佳实践

目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 📝 摘要: 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具,我们可以连接手机并方便地筛选我们自己App的日志。 &#x1f4…

『Apisix安全篇』APISIX 加密传输实践:SSL/TLS证书的配置与管理实战指南

📣读完这篇文章里你能收获到 🌟 了解SSL/TLS证书对于网络通信安全的重要性和基础概念。🔧 掌握在APISIX中配置SSL/TLS证书的基本步骤和方法。📝 学习如何通过修改监听端口,使HTTPS请求更加便捷。🛠️ 认识…

Redis开源协议调整,我们怎么办?

2024年3月20日, Redis官方宣布,从 Redis 7.4版本开始,Redis将获得源可用许可证 ( RSALv2 ) 和服务器端公共许可证 ( SSPLv1 ) 的双重许可,时间点恰逢刚刚完成最新一轮融资,宣布的时机耐人寻味。 Redis协议调整,对云计算…

FFmpeg 详解

FFmpeg 详解 FFmpeg 详解整体结构不同下载版本的区别常用库常用函数初始化封装格式解码器 版本对比组件注册方式对比FFmpeg 3.x 组件注册方式FFmpeg 4.x 组件注册方式 结构体比对函数对比avcodec_decode_video2()vcodec_encode_video2() 数据结构结构体分析AVFormatContextAVIn…

Day5-

Hive 窗口函数 案例 需求:连续三天登陆的用户数据 步骤: -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…

商场促销--策略模式

1.1 商场收银软件 package com.lhx.design.pattern.test;import java.util.Scanner;public class Test {public static void main(String[] args){System.out.println("**********************************************"); System.out.println("《大话设计模式…

聊聊测试用例评审流程

测试人员将需求熟悉完成后,开始编写相应的测试用例,待测试用例编写完成后只是测试用例完成前的第一步,后边的流程需要组织线上或线下评审会议等等。 首先要了解测试用例评审的最终目的是什么:提高测试用例的质量和覆盖率&#xff…

利用Node.js实现拉勾网数据爬取

引言 拉勾网作为中国领先的互联网招聘平台,汇集了丰富的职位信息,对于求职者和人力资源专业人士来说是一个宝贵的数据源。通过编写网络爬虫程序,我们可以自动化地收集这些信息,为求职决策和市场研究提供数据支持。Node.js以其非阻…

【Frida】【Android】08_爬虫之网络通信库okhttp3

🛫 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

【Spring】分别基于XML、注解和配置类实现Spring的IOC(控制反转)

目录 1、理解loC是什么 2、基于XML实现Spring的IOC(这种方式已经不怎么使用了) 3、基于注解实现Spring的IOC 4、基于javaConfig实现Spring的IOC 5、总结 1、理解loC是什么 lOC:lnversion of Control 控制反转,简称就是 IOC 控…

如何使用极狐GitLab Maven 仓库?

本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何使用极狐GitLa…

Yarn与Zookeeper的介绍

Yarn--三大调度策略 FIFO(先进先出): 目前几乎已经没有人使用了. 类似于: 单行道. 好处: 每个计算任务能独享集群100%的资源. 弊端: 不能并行执行, 如果大任务过多, 会导致小任务执行时间过长. Capacity(容量调度): 我们用…

入门教程:Windows搭建C语言和EasyX开发环境

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 如果对你…

【论文阅读】TimesNet: Temporal 2D-Variation Modeling for General Time Series Analysis

TimesNet: Temporal 2D-Variation Modeling for General Time Series Analysis 引用: Wu H, Hu T, Liu Y, et al. Timesnet: Temporal 2d-variation modeling for general time series analysis[C]//The eleventh international conference on learning representa…

学习 MongoDB:打开强大的数据库技术大门

一、基本概念 MongoDB 是一个基于分布式文件存储的文档数据库,由 C 语言编写。它旨在为 Web 应用提供可扩展的高性能数据存储解决方案。 相信MySQL我们非常的熟悉,那么MySQL的表结构与MongoDB的文档结构进行类比的话可能更好理解MongoDB。 MySQL的数据…

联通iccid 19转20 使用luhn 算法的计算公式

联通iccid 19转20 使用luhn 算法的计算公式 第一次对接iccid 才知道 使用的是luhn 算法 19转20位 文章来源于 文章来源 当时也是一脸懵逼 的状态,然后各种chatgpt 寻找,怎么找都发现不对,最后看到这片java的文章实验是正确的,因…

ubuntu生成core文件的设置方法

core文件可以很方便的帮助我们查找程序挂的问题,因此在程序挂后生成core文件的很有必要的。 1、查看ulimit参数 ulimit -a 如果core file size是0 需要设置其最大容量。按下面步骤操作 2、设置core文件大小,两种方法 临时生效,重启设备失…

WPF学习笔记-FlowDocument流文档基础知识和基本操作

文章目录 概述一、块元素和内联元素1.1 块元素(Block类)1.2 内联元素(Inline类)二、Paragraph元素2.1 基本属性设置2.2 将内联元素Inline添加到Inlines中2.3 设置中西文字体不一样 三、Table元素3.1 添加新的Table3.2 添加列3.3 添…

采用C#.net6.0+Vue,Ant-Design技术开发的一套大型医院手术麻醉信息系统源码,系统成熟,运行稳定

手术麻醉信息系统源码,C#手麻系统源码,自主版权应用案例(适合上项目) 手术麻醉信息系统可以实现手术室监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集,采集的数据能据如实准确地反映患者生命体征参数的变化&…

前端、后端上传文件到OSS,简明记录

前端、后端上传文件到OSS,简明记录 上传文件到oss的方式: **后端上传:**文件先要从页面上传到后端存起来,再通过后端发送到oss,然后后端将存起来的文件删除(当然可以不删)。 **前端上传&…