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

news2024/12/27 6:56:40

目录

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 程序结果

4 下载链接

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

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

相关文章

VMware workstation安装Fedora-Server-39-1.5虚拟机并配置网络

VMware workstation安装Fedora-Server-39-1.5虚拟机并配置网络 Fedora包含的软件以自由及开放源码许可来发布,并旨在成为该技术领域的领先者。Fedora在专注创新、抢先集成新技术、与上游Linux社区紧密工作方面拥有良好名声。该文档适用于在VMware workstation平台安…

什么是CNV?

CNV(拷贝数变异)是基因组遗传学中的一个术语,指的是在个体的DNA序列中与参考基因组相比存在的基因或DNA片段的拷贝数增加或减少。 这些变异可以涉及很小的DNA片段,也可能涉及数百个基因。CNV是基因组多样性的一个重要组成部分&…

10万字208道软件测试经典面试题总结(附答案)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,获取《10万字208道软件测试经典面试总结(附答案)》pdf,背题更方便,一文在手&#xff0…

window系统安装MySQL -- MySQL(1)

第一步: 下载mysql安装包 1)打开MySQL官方链接:https://www.mysql.com 2)选择 DOWNLOADS 3)往下滑,点击社区版本下载 4)点击 MySQL installer for Windows 5)点击安装 第二步&#…

MySQL的单表查询

单表查询的素材: 一、单表查询 素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 floa…

​HDD回暖于2024,与SSD决战于2028--part2

东芝和西部数据在2023年的硬盘产品中都没有采用类似希捷的HAMR技术产品,而是采用了其他的技术方案用于提升存储容量。 东芝采用了MAMR技术,通过微波磁通控制现象来提高高密度区域的写入信号质量。根据厂商的测试数据发现,MAMR的磁头可靠性比H…

MySQL解决海量数据和并发性的方案——分库分表

分库分表其实是两个事情,为了解决的东西实际上也是两个,但是一定要注意,不到最后万不得已,不要用分库分表,因为这会对数据查询有极大限制。 数据量太大查询慢的问题。 这里面我们讲的「查询」其实 主要是事务中的查询…

【征服redis2】redis的事务与lua

1.redis事务介绍 在前面我们介绍了redis的几种典型数据结构和应用,本文我们来看一下redis的事务问题。事务也是数据库的重要主题,熟悉关系型数据库的读者应该对事务比较了解,简单地说,事务表示一组动作,要么全部执行&…

C# Cad2016二次开发选择文本信息导出(六)

//选文本信息导出 [CommandMethod("getdata")] public void getdata() {// 获取当前文档和数据库Document doc Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;Database db doc.Database;Editor ed doc.Editor;// 获取当前…

腾讯云主机价格表和优惠活动汇总(2024年更新)

腾讯云服务器租用价格表:轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年,540元三年、2核4G5M带宽218元一年,2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月,云服务器CVM S5实例2核2G配置280.8元一年…

【Python】使用tkinter设计开发Windows桌面程序记事本(3)

上一篇:【Python】使用tkinter设计开发Windows桌面程序记事本(2)-CSDN博客 下一篇:【Python】使用tkinter设计开发Windows桌面程序记事本(4)-CSDN博客 作者发炎 本文章与"记事本项目"的第一篇文…

STM32串口485通信如何控制收发管脚

要有效的控制485的收发管脚,首先要知道485通信发送命令完成的时间,我们执行发送命令结束并不代表硬件已经把数据发出去了,可能1ms以后才真正完成,如果我们控制管脚不当,可能导致数据不能完全发出去。导致串口通信异常。…

日志采集传输框架之 Flume,将监听端口数据发送至Kafka

1、简介 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传 输的系统。Flume 基于流式架构,主要有以下几个部分组成。 主要组件介绍: 1)、Flume Agent 是一个 JVM 进程&#xf…

数据结构队列实现(赋完整代码)

文章目录 1、定义及结构2、队列实现完整代码 1、定义及结构 1.一种特殊的线性表,只允许在一段进行插入,另一段进行删除; 2.进行插入操作的一端称为队尾,进行删除操作的一端称为队头; 3.队列具有先进先出的特性 FIFO…

Linux操作系统——重定向与缓冲区

1.理解一下struct file内核对象 上一篇文章(文件详解)我们一直在谈,一个文件要被访问就必须要先被打开,打开之前就必须要先把文件加载到内存,同时呢我们的操作系统为了管理文件也会为我们的文件创建相对应的struct fi…

C语言从入门到实战——结构体与位段

结构体与位段 前言一、结构体类型的声明1.1 结构体1.1.1 结构的声明1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明1.3 结构的自引用 二、 结构体内存对齐2.1 对齐规则2.2 为什么存在内存对齐2.3 修改默认对齐数 三、结构体传参四、 结构体实现位段4.1 什么是位段4.2 位段…

视频剪辑实例:探索画中画视频剪辑,创意无限可能,批量制作视频

随着社交媒体和视频平台的迅速发展,视频剪辑,作为视频创作的核心环节,对于呈现内容、传达情感和提升体验具有至关重要的作用。现在来看云炫AI智剪的视频剪辑实例,如何批量制作视频,提升工作效率。 画中画视频合并成功…

国产麒麟系统开机没有网络需要点一下这个设置

问题描述: 一台国产电脑网线连接正常,打开网页后显示无法访问,那么是什么原因无法上网呢?下面就告诉你一个小方法去解决一下这个问题; 检查故障: 检测交换机、网线、水晶头全都正常,同房间摆放的…

荣耀开发者大会 2023·一张图读懂服务分发分论坛

荣耀智慧服务,高效连接开发者与用户,构建主动服务全新体验! 2023年荣耀智慧服务总数已突破25000,帮助众多开发者提升业务增长~ 今年将会开放更多生态场景,配合多元服务分发,从应用到场景,从用…

闪存的基础知识1-Vt的定义

系列文章目录 本次系列文章主要分享与存储相关的知识 文章目录 目录 系列文章目录 前言 一、mos管 阈值电压是什么? 二、详细分析 1.通俗理解 2.读入数据 总结 前言 阈值电压(Vt) 阈值电压(Vt或Vth)的概念是从MOS管来的。 一、mos管 阈值电压是什么? …