基于VMD-SSA-LSTM的多维时序光伏功率预测

news2024/11/26 0:47:48

目录

1 主要内容

变分模态分解(VMD)

麻雀搜索算法SSA

长短期记忆网络LSTM

2 部分代码

3 程序结果

 4 下载链接


主要内容

之前分享了预测的程序基于LSTM的负荷和可再生能源出力预测【核心部分复现】,该程序预测效果比较好,并且结构比较清晰,但是仍然有同学咨询混合算法的预测,本次分享基于VMD-SSA-LSTM的多维时序光伏功率预测,本程序参考文章《基于VMD-SSA-LSSVM的短期风电预测》和《基于改进鲸鱼优化算法的微网系统能量优化管理》,采用不同方法混合嫁接的方式实现了光伏功率预测,对于预测而言,包括训练和测试,因此,该方法仍然可以用于风电、负荷等方面的预测。

  • 变分模态分解(VMD)

VMD于2014年由Dragomiretskiy和Zosso提出,它的优点在于能根据不同情况确定分解模态个数,并能根据每个 模态的最佳中心频率和有限带宽自适应和匹配,实现固有模
态分量的分解。相比EMD而言,VMD克服了EMD模态混叠和端点效应问题,并降低在复杂度高且非线性强的时间序 列的非平稳性。

  • 麻雀搜索算法SSA

  • 长短期记忆网络LSTM

长短期记忆网络(Long Short Term Memory, LSTM)作为一种特殊的循环神经网络(Recurrent neural network, RNN),主要用于解决长序列训练过程中的梯度消失和梯度爆炸问题。

LSTM预测过程主要包括三个阶段:遗忘阶段,选择记忆阶段和输出阶段。遗忘阶段主要是对上一个节点传过来的信息进行选择性剔除,通过读取上一节点的输出状态和本节点的输出状态,由激活函数决定上一时刻细胞状态信息被遗忘的比例;选择记忆阶段是对输入的信息有选择性的进行筛选,将重要的信息挑选出来输入到当前细胞。选择记忆阶段主要包括两个步骤:第一步是输入层的激活函数决定哪些信息需要更新,层生成一个备选的更新内容,然后接下来是更新细胞状态。根据遗忘阶段的输出状态和备选更新的细胞状态来得到当前细胞的状态;输出阶段将会利用激活函数决定输出细胞状态的比例,然后将经过层处理的细胞状态与输出的细胞状态相乘得到最终的输出结果。

部分代码

% 指标计算
disp('训练集误差指标')
[mae5,rmse5,mape5,error5]=calc_error(T_train5,T_sim5);
fprintf('\n')
​
disp('测试集误差指标')
[mae6,rmse6,mape6,error6]=calc_error(T_test6,T_sim6);
fprintf('\n')
toc
​
%% VMD-SSA-LSTM预测
tic
disp('…………………………………………………………………………………………………………………………')
disp('VMD-SSA-LSTM预测')
disp('…………………………………………………………………………………………………………………………')
​
% SSA参数设置
pop=30; % 种群数量
Max_iter=10; % 最大迭代次数
dim=3; % 优化LSTM的3个参数
lb = [50,50,0.001];%下边界
ub = [300,300,0.01];%上边界
numFeatures=f_;
numResponses=outdim;
fobj = @(x) fun(x,numFeatures,numResponses,X) ;
[Best_pos,Best_score,curve,BestNet]=SSA(pop,Max_iter,lb,ub,dim,fobj);
​
% 绘制进化曲线
figure
plot(curve,'r-','linewidth',3)
xlabel('进化代数')
ylabel('均方根误差RMSE')
legend('最佳适应度')
title('SSA-LSTM的进化收敛曲线')
​
disp('')
disp(['最优隐藏单元数目为   ',num2str(round(Best_pos(1)))]);
disp(['最优最大训练周期为   ',num2str(round(Best_pos(2)))]);
disp(['最优初始学习率为   ',num2str((Best_pos(3)))]);
​
%% 对每个分量建模
for d=1:c
disp(['第',num2str(d),'个分量建模'])
​
X_imf=[X(:,1:end-1) imf(d,:)'];
​
%  重构数据集
for i = 1: num_samples - kim - zim + 1
    res(i, :) = [reshape(X_imf(i: i + kim - 1,:), 1, kim*or_dim), X_imf(i + kim + zim - 1,:)];
end
​
​
% 训练集和测试集划分
outdim = 1;                                  % 最后一列为输出
num_size = 0.7;                              % 训练集占数据集比例
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim;                  % 输入特征维度
​
​
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);
​
P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);
​
%  数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
​
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
​
%  格式转换
for i = 1 : M 
    vp_train{i, 1} = p_train(:, i);
    vt_train{i, 1} = t_train(:, i);
end
​
for i = 1 : N 
    vp_test{i, 1} = p_test(:, i);
    vt_test{i, 1} = t_test(:, i);
end
​
% 最佳参数的LSTM预测
layers = [ ...
    sequenceInputLayer(f_)              % 输入层
    lstmLayer(round(Best_pos(1)))      % LSTM层
    reluLayer                           % Relu激活层
    fullyConnectedLayer(outdim)         % 回归层
    regressionLayer];
​
​
options = trainingOptions('adam', ...                 % 优化算法Adam
    'MaxEpochs', round(Best_pos(2)), ...                            % 最大训练次数
    'GradientThreshold', 1, ...                       % 梯度阈值
    'InitialLearnRate', Best_pos(3), ...         % 初始学习率
    'LearnRateSchedule', 'piecewise', ...             % 学习率调整
    'LearnRateDropPeriod', round(Best_pos(2)*0.9), ...                   % 训练850次后开始调整学习率
    'LearnRateDropFactor',0.2, ...                    % 学习率调整因子
    'L2Regularization', 0.001, ...          % 正则化参数
    'ExecutionEnvironment', 'cpu',...                 % 训练环境
    'Verbose', 0, ...                                 % 关闭优化过程
    'Plots', 'training-progress');                    % 画出曲线
​
%  训练
net = trainNetwork(vp_train, vt_train, layers, options);
%  预测
t_sim7 = predict(net, vp_train); 
t_sim8 = predict(net, vp_test); 
​
%  数据反归一化
T_sim7_imf = mapminmax('reverse', t_sim7, ps_output);
T_sim8_imf = mapminmax('reverse', t_sim8, ps_output);
​
%  数据格式转换
T_sim7(d,:) = cell2mat(T_sim7_imf);% cell2mat将cell元胞数组转换为普通数组
T_sim8(d,:) = cell2mat(T_sim8_imf);
T_train7(d,:)= T_train;
T_test8(d,:)= T_test;
end
​
% 各分量预测的结果相加
T_sim7=sum(T_sim7);
T_sim8=sum(T_sim8);
T_train7=sum(T_train7);
T_test8=sum(T_test8);
​
% 指标计算
disp('训练集误差指标')
[mae7,rmse7,mape7,error7]=calc_error(T_train7,T_sim7);
fprintf('\n')
​
disp('测试集误差指标')
[mae8,rmse8,mape8,error8]=calc_error(T_test8,T_sim8);
fprintf('\n')
toc
​
%% 四种模型测试集结果绘图对比
​
figure;
plot(T_test2,'k','LineWidth',3);
hold on;
plot(T_sim2,'y','linewidth',3);
plot(T_sim6,'g','linewidth',3);
plot(T_sim8,'r','linewidth',3);
legend('Target','LSTM','VMD-LSTM','VMD-SSA-LSTM');
title('三种模型预测结果对比图');
xlabel('Sample Index');
ylabel('Values');
grid on;
​
figure
plot(error2,'k','linewidth',3);
hold on
plot(error6,'g','linewidth',3);
hold on
plot(error8,'r','linewidth',3);
legend('LSTM','VMD-LSTM','VMD-SSA-LSTM');
title('三种模型预测误差对比图');
grid on;

3 程序结果

1.因为程序中存在智能算法,智能算法的种群数量和迭代次数使得计算时间和精确度不可兼得,因此,可以调整程序参数来达到更好的效果。
2.​该程序每个部分都可以进行替换从而形成新的混合算法:
信号分解方法VMD可以替换为EMD CEEMD CEEMDAN EEMD等分解算法;
SSA可以改为PSO GWO AOA GA NGO等等其他优化算法;
LSTM也可以换为GRU,BILSTM等。

 4 下载链接

点击直达!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.net 6.0图片转Base64部署到Linux系统上报The type initializer for ‘Gdip‘ threw an exception

在业务当中需要将图片文件转为Base64&#xff1a;windows上可以运行正常执行&#xff0c;部署到Linux系统上报The type initializer for ‘Gdip‘ threw an exception 图片转Base64代码如下 /// <summary> /// 图片转为base64编码的文本 /// </summary> /// <…

CMake深度解析:掌握add_custom_command,精通Makefile生成规则

CMake深度解析&#xff1a;掌握add_custom_command&#xff0c;精通Makefile生成规则 1. CMake简介与基础知识1.1 CMake的基本概念&#xff08;CMake Basic Concepts&#xff09;1.1.1 项目&#xff08;Project&#xff09;1.1.2 目标&#xff08;Target&#xff09;1.1.3 命令…

terminalworks ASP.NET Core PDF 浏览器-Crack

ASP.NET Core 的 PDF 查看器 terminalworks在 ASP.NET Core 网页或应用程序中添加可靠的 PDF 查看器的简单方法。 我们的 Web PDF 查看器基于经过验证和测试的 Mozilla PdfJS 解决方案&#xff0c;该解决方案在 Firefox 中用作默认 PDF 查看器。我们专门设计了我们的查看器&…

窄带高清技术之百万级并发下的演唱会直播细节修复

史无前例&#xff0c;高清又不卡。 5月&#xff0c;百视TV联合上海人民广播电台、时代峰峻共同出品的《东方风云榜》&#xff0c;绚烂呈现一场三十周年音乐分享会时代少年团《理想之途》。有人说&#xff0c;这是一场似梦非梦的记忆。 演唱会由“乐园”、“少年”、“乌托邦”三…

Pyside6-第四篇-QCheckBox复选框

今天是Pyside6的第四篇内容。一起来看复选框。 QCheckBox。 class QCheckBox(QAbstractButton):"""QCheckBox(self, parent: Optional[PySide6.QtWidgets.QWidget] None) -> NoneQCheckBox(self, text: str, parent: Optional[PySide6.QtWidgets.QWidget] …

爱尔眼科四川省区2023“集善扶困(贫)健康行”公益行动圆满收官

红原县地处青藏高原东部&#xff0c;位于四川省西北部、阿坝藏族羌族自治州中部&#xff0c;这里山原向丘状高原过渡&#xff0c;空气稀薄、气候偏冷、紫外线强&#xff0c;这里生活着大量藏族同胞。 这里地势出行不便医疗资源有限&#xff0c;青少年近视防控问题、中老年人的白…

CentOS的安装

Centos的安装 1.创建新的虚拟机2. 自定义3.下一步4.创建虚拟空白光盘5.安装Linux系统和Centos 7 发行版6.命名虚拟机名称和选择磁盘位置7.处理器配置 主要看自己的电脑的情况8.设置虚拟机内存9.网络设置 nat10.选择IO控制器类型11.选择磁盘类型12.创建新虚拟磁盘13.设置磁盘容量…

元宇宙 代价高昂的失败

一直以来我对GIS范围内3维及VR实用化持怀疑态度&#xff0c;觉得它就是个坑&#xff01;因此总被三维狂热者和同行批评。三维这种东西最大的优点是直观易于理解&#xff0c;但最大的坏处也是直观易于理解&#xff01;搞的很多外行也以为自己很了解这些技术&#xff0c;跟风起哄…

vue——实现数据懒加载(可视区域内才进行数据加载)——技能提升

昨天部门会议&#xff0c;领导提出一个需求&#xff0c;就是当一个前端页面有上百个图表或者其它元素&#xff0c;对应的接口有许多时&#xff0c;为了体验效果&#xff0c;不能一次性加载全部的数据&#xff0c;只有当元素滚动到可视区域内时&#xff0c;再进行相应接口的调用…

记录--Js基础练习题目

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 1.使用js&#xff0c;在页面中打印以下图案 提示&#xff1a; document.write可以在页面中打印内容<br>在html中代表换行, 在html中代码空格 for(var i0;i<7;i){// 空格部分for(var j7;j>…

chatgpt赋能python:Python代写群:帮你高效解决编程难题

Python代写群&#xff1a;帮你高效解决编程难题 Python代写群是一个专业的平台&#xff0c;为需要编程作业或项目的人提供高质量的服务。在这里&#xff0c;你可以找到有经验的Python工程师&#xff0c;帮你解决各种各样的编程难题。 为什么选择Python代写群&#xff1f; Py…

【JS】1699- 重学 JavaScript API - WebSockets API

❝ 前期回顾&#xff1a; 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API 7. Performance API 8. Web Storage API ❞ WebSockets API 提供了一种在客户端和服务器之间建立持久连接的机制&#xff0c;使…

基于轻量级YOLOv5n/s/m三款模型开发构建基于无人机视角的高空红外目标检测识别分析系统,对比测试分析性能

有关于无人机目标检测和红外场景下的目标检测的项目在我之前的文章中都有实践经历了&#xff0c;但是将无人机和红外场景结合的目标检测项目还是很少的&#xff0c;本文的核心想法就是基于高空无人机场景开发构建目标检测系统。 前面相关博文如下&#xff0c;感兴趣的话可以自…

Python潮流周刊#4:Python 2023 语言峰会

△点击上方“Python猫”关注 &#xff0c;回复“1”领取电子书 你好&#xff0c;我是猫哥。这里记录每周值得分享的 Python 及通用技术内容&#xff0c;本期是特别加更版&#xff0c;聚焦于 Python 官方 2023 年语言峰会的系列博客。 由于公众号不支持外链&#xff0c;文中大量…

JetBrains的PHP集成开发环境PhpStorm 2023版本在Win10系统的下载与安装配置教程

目录 前言一、PhpStorm 安装二、使用配置总结 前言 PhpStorm是一款专为PHP开发人员设计的集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地编写、调试和部署PHP应用程序。 PhpStorm的主要特点&#xff1a; ——代码…

硬件大熊原创合集(2023/04-05更新)

04-05月份更新篇章&#xff1a; NFC模块化设计方案 一款射频芯片的layout设计指导案例-篇章1 04月份娃出生&#xff0c;连续两个月需要处理的各种事情比之前多了很多&#xff0c;还好慢慢地适应了这种节奏&#xff0c;并且逐渐开始挖掘出属于个人的时间。 有天夜里抱着娃哄睡时…

NIO之Buffer解读

目录 Buffer 简介 Buffer 的基本用法 使用步骤 使用 Buffer 的例子 使用 IntBuffer 的例子 Buffer 的 capacity、position 和 limit capacity position limit Buffer 的类型 Buffer 分配和读写数据 Buffer 分配 向 Buffer 中写数据 flip()方法 从 Buffer 中读取数…

C++ Lambda 表达式:深入理解与应用

C Lambda 表达式是 C11 标准引入的一项强大功能&#xff0c;它允许开发者以简洁、优雅的方式创建匿名函数对象。 本文将深入探讨 C Lambda 表达式的原理、语法和应用场景&#xff0c;帮助读者更好地理解和使用这一功能。 1. Lambda 表达式简介 Lambda 表达式是一种创建匿名函数…

18. Vue-element-template白天黑夜模式动态切换

两套主题动态切换 1. 去官网生成两套主题拷贝到 resources/src/assets/theme https://element.eleme.cn/#/zh-CN/theme 2. 也可以本地修改 element-variables.scss 然后运行et生成 安装 &#xff08;注意Node版本&#xff09; ➜ Genes-Admin git:(ogenes) sudo n 10.16.…

【车载开发系列】Autosar DEM基本概念

【车载开发系列】Autosar DEM基本概念 Autosar DEM基本概念 【车载开发系列】Autosar DEM基本概念一. 诊断事件管理(DEM)概念二. DEM的主要作用1、汽车检修提供数据2、汽车错误状态处理提供依据 三. DEM模块及关联模块关系1. 功能禁止模块FIM2. SWC和BSW3. NvM非易失性存储4. 诊…