机器学习之MATLAB代码--MATLAB量子粒子群优化LSTM超参数负荷预测(十三)

article/2025/8/26 18:01:55

机器学习之MATLAB代码--MATLAB量子粒子群优化LSTM超参数负荷预测(十三)

  • 代码
    • 数据
      • 结果

代码

代码按照下列顺序依次:
在这里插入图片描述
1、

function result(true_value,predict_value,type)
[m,n]=size(true_value);
true_value=reshape(true_value,[1,m*n]);
predict_value=reshape(predict_value,[1,m*n]);
disp(type)
rmse=sqrt(mean((true_value-predict_value).^2));
disp(['根均方差(RMSE):',num2str(rmse)])
mae=mean(abs(true_value-predict_value));
disp(['平均绝对误差(MAE):',num2str(mae)])
mape=mean(abs((true_value-predict_value)./true_value));
disp(['平均相对百分误差(MAPE):',num2str(mape*100),'%'])
R2 = 1 - norm(true_value-predict_value)^2/norm(true_value - mean(true_value))^2;
disp(['决定系数(R2):',num2str(R2)])fprintf('\n')

2、

function r2=R2(T_test,T_sim)
N = length(T_test);
r2 = (N*sum(T_sim.*T_test)-sum(T_sim)*sum(T_test))^2/((N*sum((T_sim).^2)-(sum(T_sim))^2)*(N*sum((T_test).^2)-(sum(T_test))^2));

3、

function  [y,trace,result]=qpsoforlstm(p_train,t_train,p_test,t_test)
PopNum=10;% 种群数
Maxstep=10;%最大寻优迭代数
dim=4;% 寻优维度xmin=[1    1  10 0.001];%分别对两个隐含层的节点 训练次数与学习率寻优
xmax=[200 200  100 0.01];%比如第一个隐含层节点的范围是1-200for i=1:PopNum%随机初始化速度,随机初始化位置for j=1:dimif j==dim% % 隐含层节点与训练次数是整数 学习率是浮点型pop(i,j)=(xmax(j)-xmin(j))*rand+xmin(j);elsepop(i,j)=round((xmax(j)-xmin(j))*rand+xmin(j));  %endend
end% calculate the fitness_value of Pop
pbest = pop;
gbest = zeros(1,dim);
data1 = zeros(Maxstep,PopNum,dim);
data2 = zeros(Maxstep,PopNum);
for i = 1:PopNumfit(i) = fitness(pop(i,:),p_train,t_train,p_test,t_test);f_pbest(i) = fit(i);
end
g = min(find(f_pbest == min(f_pbest(1:PopNum))));
gbest = pbest(g,:);
f_gbest = f_pbest(g);%-------- in the loop -------------
for step = 1:Maxstepmbest =sum(pbest(:))/PopNum;% linear weigh factorb = 1-step/Maxstep*0.5;data1(step,:,:) = pop;data2(step,:) = fit;for i = 1:PopNuma = rand(1,dim);u = rand(1,dim);p = a.*pbest(i,:)+(1-a).*gbest;pop(i,:) = p + b*abs(mbest-pop(i,:)).*...log(1./u).*(1-2*(u >= 0.5));% boundary detectionfor j=1:dimif j ==dimif pop(i,j)>xmax(j) | pop(i,j)<xmin(j)pop(i,j)=(xmax(j)-xmin(j))*rand+xmin(j);  %endelsepop(i,j)=round(pop(i,j));if pop(i,j)>xmax(j) | pop(i,j)<xmin(j)pop(i,j)=round((xmax(j)-xmin(j))*rand+xmin(j));  %endendendfit(i) = fitness(pop(i,:),p_train,t_train,p_test,t_test);if fit(i) < f_pbest(i)pbest(i,:) = pop(i,:);f_pbest(i) = fit(i);endif f_pbest(i) < f_gbestgbest = pbest(i,:);f_gbest = f_pbest(i);endendtrace(step)=f_gbest;step,f_gbest,gbestresult(step,:)=gbest;
end
y=gbest;end

4、

function [xm ,trace,result]=psoforlstm(p_train,t_train,p_test,t_test)N=5;
M=10;
c1=1.5;
c2=1.5;
w=0.8;
D=4;% 定义寻优边界
xmin=[1    1  10 0.001];%分别两个对隐含层节点 训练次数与学习率寻优
xmax=[200 200  100 0.01];%比如第一个隐含层节点的范围是1-200for i=1:N%随机初始化速度,随机初始化位置for j=1:Dif j==D% % 隐含层节点与训练次数是整数 学习率是浮点型x(i,j)=(xmax(j)-xmin(j))*rand+xmin(j);elsex(i,j)=round((xmax(j)-xmin(j))*rand+xmin(j));  %endendv(i,:)=rand(1,D);
end%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
for i=1:Np(i)=fitness(x(i,:),p_train,t_train,p_test,t_test);y(i,:)=x(i,:);end
[fg,index]=min(p);
pg = x(index,:);             %Pg为全局最优%------进入主要循环,按照公式依次迭代------------for t=1:Mfor i=1:Nv(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));x(i,:)=x(i,:)+v(i,:);for j=1:Dif j ~=Dx(i,j)=round(x(i,j));endif x(i,j)>xmax(j) | x(i,j)<xmin(j)if j==Dx(i,j)=(xmax(j)-xmin(j))*rand+xmin(j);  %elsex(i,j)=round((xmax(j)-xmin(j))*rand+xmin(j));  %endendendtemp=fitness(x(i,:),p_train,t_train,p_test,t_test);if temp<p(i)p(i)=temp;y(i,:)=x(i,:);endif p(i)<fgpg=y(i,:);fg=p(i);endendtrace(t)=fg;result(t,:)=pg;t,fg,pg
end
xm = pg;

5、

function huatu(fitness,process,type)
figure
plot(fitness)
grid on
title([type,'的适应度曲线'])
xlabel('迭代次数/次')
ylabel('适应度值/MSE')figure
subplot(2,2,1)
plot(process(:,1))
grid on
xlabel('迭代次数/次')
ylabel('L1/个')subplot(2,2,2)
plot(process(:,2))
grid on
xlabel('迭代次数/次')
ylabel('L2/个')subplot(2,2,3)
plot(process(:,3))
grid on
xlabel('迭代次数/次')
ylabel('K/次')subplot(2,2,4)
plot(process(:,4))
grid on
xlabel('迭代次数/次')
ylabel('lr')
suptitle([type,'的超参数随迭代次数的变化'])

6、

function y=fitness(x,p,t,pt,tt)
rng(0)
numFeatures = size(p,1);%输入节点数
numResponses = size(t,1);%输出节点数
miniBatchSize = 16; %batchsize 与main....m中保持一致
numHiddenUnits1 = x(1);
numHiddenUnits2 = x(2);
maxEpochs=x(3);
learning_rate=x(4);
layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits1)lstmLayer(numHiddenUnits2)fullyConnectedLayer(numResponses)regressionLayer];
options = trainingOptions('adam', ...'MaxEpochs',maxEpochs, ...'MiniBatchSize',miniBatchSize, ...'InitialLearnRate',learning_rate, ...'GradientThreshold',1, ...'Shuffle','every-epoch', ...'Verbose',false);net = trainNetwork(p,t,layers,options);YPred = predict(net,pt,'MiniBatchSize',1);YPred=double(YPred);
[m,n]=size(YPred);
YPred=reshape(YPred,[1,n*m]);
tt=reshape(tt,[1,n*m]);y =mse(YPred-tt);
% 以mse为适应度函数,优化算法目的就是找到一组超参数 使网络的mse最低
rng((100*sum(clock)))

7、

clc;clear;close
%%
lstm=load('result/lstm.mat');
result(lstm.true_value,lstm.predict_value,'LSTM');psolstm=load('result/pso_lstm.mat');
result(psolstm.true_value,psolstm.predict_value,'PSO-LSTM');qpsolstm=load('result/qpso_lstm.mat');
result(qpsolstm.true_value,qpsolstm.predict_value,'QPSO-LSTM');figure
plot(lstm.true_value(end,:),'-r')
hold on;grid on
plot(lstm.predict_value(end,:),'-b')
plot(psolstm.predict_value(end,:),'-k')
plot(qpsolstm.predict_value(end,:),'-k')
legend('真实值','LSTM网络模型','PSO-LSTM网络模型','QPSO-LSTM网络模型')
title('各算法结果')
xlabel('测试集样本')
ylabel('负荷')

8、

%% QPSO优化LSTM时间序列预测
clc;clear;close all;format compact
%%
load u789
n=10;m=2;
[x,y]=data_process(data,n,m);%前n个时刻 预测后m个时刻
method=@mapminmax;%归一化
% method=@mapstd;%标准化
[xs,mappingx]=method(x');x=xs';
[ys,mappingy]=method(y');y=ys';%划分数据
n=size(x,1);
m=round(n*0.7);%70%训练 后30%测试
XTrain=x(1:m,:)';
XTest=x(m+1:end,:)';
YTrain=y(1:m,:)';
YTest=y(m+1:end,:)';
%% 采用QPSO优化
optimization=1;%是否重新优化
if optimization==1[x ,fit_gen,process]=qpsoforlstm(XTrain,YTrain,XTest,YTest);%分别对隐含层节点 训练次数与学习率寻优save result/qpso_para_result x fit_gen process
elseload result/qpso_para_result
end
%% 画适应度曲线与4个参数的变化曲线
huatu(fit_gen,process,'QPSO')
disp('优化的超参数为:')
disp('L1:'),x(1)
disp('L2:'),x(2)
disp('K:'),x(3)
disp('lr:'),x(4)%% 利用优化得到的参数重新训练
train=1;%是否重新训练
if train==1rng(0)numFeatures = size(XTrain,1);%输入节点数numResponses = size(YTrain,1);%输出节点数miniBatchSize = 16; %batchsize 与fitness.m中保持一致numHiddenUnits1 = x(1);numHiddenUnits2 = x(2);maxEpochs=x(3);learning_rate=x(4);layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits1)lstmLayer(numHiddenUnits2)fullyConnectedLayer(numResponses)regressionLayer];options = trainingOptions('adam', ...'MaxEpochs',maxEpochs, ...'MiniBatchSize',miniBatchSize, ...'InitialLearnRate',learning_rate, ...'GradientThreshold',1, ...'Shuffle','every-epoch', ...'Verbose',true,...'Plots','training-progress');net = trainNetwork(XTrain,YTrain,layers,options);save model/qpsolstm net
elseload model/qpsolstm
end
% 预测
YPred = predict(net,XTest,'MiniBatchSize',1);YPred=double(YPred);
% 反归一化
predict_value=method('reverse',YPred,mappingy);
true_value=method('reverse',YTest,mappingy);
save result/qpso_lstm predict_value true_value
%%
load result/qpso_lstm
disp('结果分析')
result(true_value,predict_value,'QPSO-LSTM')fprintf('\n')%
figure
plot(true_value(end,:),'p-')
hold on
plot(predict_value(end,:),'-*')
grid on
title('QPSO-LSTM')
legend('真实值','预测值')
xlabel('预测样本点坐标')
ylabel('值')

9、

%% PSO优化LSTM时间序列预测
clc;clear;close all;format compact
%%
load u789
n=10;m=2;
[x,y]=data_process(data,n,m);%前n个时刻 预测后m个时刻
method=@mapminmax;%归一化
% method=@mapstd;%标准化
[xs,mappingx]=method(x');x=xs';
[ys,mappingy]=method(y');y=ys';%划分数据
n=size(x,1);
m=round(n*0.7);%70%训练 后30%测试
XTrain=x(1:m,:)';
XTest=x(m+1:end,:)';
YTrain=y(1:m,:)';
YTest=y(m+1:end,:)';
%% 采用PSO优化
optimization=1;%是否重新优化
if optimization==1[x ,fit_gen,process]=psoforlstm(XTrain,YTrain,XTest,YTest);%分别对隐含层节点 训练次数与学习率寻优save result/pso_para_result x fit_gen process
elseload result/pso_para_result
end
%% 画适应度曲线与4个参数的变化曲线
huatu(fit_gen,process,'PSO')
disp('优化的超参数为:')
disp('L1:'),x(1)
disp('L2:'),x(2)
disp('K:'),x(3)
disp('lr:'),x(4)%% 利用优化得到的参数重新训练
train=1;%是否重新训练
if train==1rng(0)numFeatures = size(XTrain,1);%输入节点数numResponses = size(YTrain,1);%输出节点数miniBatchSize = 16; %batchsize 与fitness.m中保持一致numHiddenUnits1 = x(1);numHiddenUnits2 = x(2);maxEpochs=x(3);learning_rate=x(4);layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits1)lstmLayer(numHiddenUnits2)fullyConnectedLayer(numResponses)regressionLayer];options = trainingOptions('adam', ...'MaxEpochs',maxEpochs, ...'MiniBatchSize',miniBatchSize, ...'InitialLearnRate',learning_rate, ...'GradientThreshold',1, ...'Shuffle','every-epoch', ...'Verbose',true,...'Plots','training-progress');net = trainNetwork(XTrain,YTrain,layers,options);save model/psolstm net
elseload model/psolstm
end
% 预测
YPred = predict(net,XTest,'MiniBatchSize',1);YPred=double(YPred);
% 反归一化
predict_value=method('reverse',YPred,mappingy);
true_value=method('reverse',YTest,mappingy);
save result/pso_lstm predict_value true_value
%%
load result/pso_lstm
disp('结果分析')
result(true_value,predict_value,'PSO-LSTM')fprintf('\n')%
figure
plot(true_value(end,:),'p-')
hold on
plot(predict_value(end,:),'-*')
grid on
title('PSO-LSTM')
legend('真实值','预测值')
xlabel('预测样本点坐标')
ylabel('值')

10、

%% LSTM时间序列预测
clc;clear;close all
%%
load u789
n=10;m=2;
[x,y]=data_process(data,n,m);%前n个时刻 预测后m个时刻method=@mapminmax;%归一化
% method=@mapstd;%标准化
[xs,mappingx]=method(x');x=xs';
[ys,mappingy]=method(y');y=ys';%划分数据
n=size(x,1);
m=round(n*0.7);%70%训练 后30%测试
XTrain=x(1:m,:)';
XTest=x(m+1:end,:)';
YTrain=y(1:m,:)';
YTest=y(m+1:end,:)';
%% 参数设置
train=1;%1就重新训练,否则加载训练好的模型进行预测
if train==1rng(0)numFeatures = size(XTrain,1);%输入节点数numResponses = size(YTrain,1);%输出节点数miniBatchSize = 16; %batchsizenumHiddenUnits1 = 20;numHiddenUnits2 = 20;maxEpochs=20;learning_rate=0.005;layers = [ ...sequenceInputLayer(numFeatures)lstmLayer(numHiddenUnits1)lstmLayer(numHiddenUnits2)fullyConnectedLayer(numResponses)regressionLayer];options = trainingOptions('adam', ...'MaxEpochs',maxEpochs, ...'MiniBatchSize',miniBatchSize, ...'InitialLearnRate',learning_rate, ...'GradientThreshold',1, ...'Shuffle','every-epoch', ...'Verbose',true,...'Plots','training-progress');net = trainNetwork(XTrain,YTrain,layers,options);save model/lstm net
elseload model/lstm
end
YPred = predict(net,XTest,'MiniBatchSize',1);YPred=double(YPred);
% 反归一化
predict_value=method('reverse',YPred,mappingy);
true_value=method('reverse',YTest,mappingy);
save result/lstm predict_value true_value
%%
load result/lstm
disp('结果分析')
result(true_value,predict_value,'LSTM')%
figure
plot(true_value(end,:),'p-')
hold on
plot(predict_value(end,:),'-*')
grid on
title('LSTM')
legend('真实值','预测值')
xlabel('预测样本点坐标')
ylabel('值')

11、

function [in,out]=data_process(data,num,mem)
% 采用1到num作为输入 第num到mem作为输出
n=length(data)-num-mem+1;
for i=1:nin(i,:)=data(i:i+num-1);out(i,:)=data(i+num:i+num+mem-1);
end

数据

在这里插入图片描述

结果

在这里插入图片描述
在这里插入图片描述
如有需要代码和数据的同学请在评论区发邮箱,一般一天之内会回复,请点赞+关注谢谢!!


http://chatgpt.dhexx.cn/article/oYwVSNXU.shtml

相关文章

Python机器学习、深度学习库总结(内含大量示例,建议收藏)

Python机器学习、深度学习库总结&#xff08;内含大量示例&#xff0c;建议收藏&#xff09; 前言python常用机器学习及深度学习库介绍总结与分类python 常用机器学习及深度学习库总结分类 更多 前言 目前&#xff0c;随着人工智能的大热&#xff0c;吸引了诸多行业对于人工智…

黑马程序员---三天快速入门Python机器学习(第一天)

机器学习入门 一、机器学习概述1.1 人工智能概述1.1.1 机器学习与人工智能、深度学习1.1.2 机器学习、深度学习能做什么1.1.3 人工智能阶段课程安排 1.2 什么是机器学习1.2.1 定义1.2.2 解释1.2.3 数据集构成 1.3 机器学习算法分类1.3.1 总结1.3.2 练习1.3.3 机器学习算法分类 …

机器学习入门好文,强烈推荐

转自 飞鸟各投林 史上最强----机器学习经典总结---入门必读----心血总结-----回味无穷 让我们从机器学习谈起 导读&#xff1a;在本篇文章中&#xff0c;将对机器学习做个概要的介绍。本文的目的是能让即便完全不了解机器学习的人也能了解机器学习&#xff0c;并且上手相关的实…

机器学习知识点全面总结

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;大数据专业硕士在读&#xff0c;CSDN人工智能领域博客专家&#xff0c;阿里云专家博主&#xff0c;专注大数据与人工智能知识分享&#xff0c;公众号&#xff1a;GoAI的学习小屋&#xff0c;免费分享书籍、简历、导图等资料&a…

《零基础数学建模》——最大最小化模型

目录 ​ 前言一、最大最小化模型概述二、模型标准型三、经典例题 ​ 前言 本文大部分是对于数学建模清风老师的课程学习总结归纳而来&#xff0c;我的理解可能有错误&#xff0c;大家发现错误可以在评论区批评指正&#xff0c;课程地址&#xff1a;《数学建模清风》 前置文章请…

数学建模 matlab 数据建模基础

一、数据的获取 1.从Excel中读取数据 &#xff08;1&#xff09;xlsread函数 &#xff1a;从EXCEL读入数据到MATLAB中。 例如&#xff1a; a xlsread(‘D:\adc.xlsx’,1,‘A1:D2’) 其中&#xff0c;‘D:\abc.xlsx’表示读入的EXCEL数据所在的路径以及EXCEL的文件名称&…

【数学建模】数学建模(一)——数学模型概述

一. 模型 1. 原型和模型 原型指人们在现实世界里关心、研究或从事生产、管理的实际对象。模型则指为了某个特定目的将原型的某一部分信息简缩、提炼而构造的原型替代物。 按照模型替代原型的方式&#xff0c;模型可以分为物质模型&#xff08;形象模型&#xff09;和理想模型&a…

数学建模——MATLAB基础知识

前言&#xff1a;MATLAB和我们平时学的C语言相类似&#xff0c;大体也是由于三部分组成的。任何的复杂的程序由顺序结构&#xff0c;选择结构&#xff0c;循环结构组成的。 一、顺序结构 1.数据的输入&#xff1a; input 用法&#xff1a;Ainput(字符串)-->>影响程序流…

数学建模竞赛基础知识

国际大学生数学建模 世界大学生数学建模 美国大学生数学建模竞赛&#xff0c;一个比赛多个称呼而已&#xff0c;美赛是一项面向高中生、大学本科层次的一个国际性比赛。 美赛可分为两种&#xff1a; The Mathematical Contest in Modeling (MCM): 俗称数学建模竞赛&#xf…

数学建模——基础

目录 第1章 MATLAB基础知识 1&#xff0c;矩阵的表示 1&#xff0c;数值矩阵的生成 2&#xff0c;符号矩阵的生成 3&#xff0c;特殊矩阵生成 4&#xff0c;一般矩阵运算 5&#xff0c;基本图形绘制 6&#xff0c;简单图像处理 7&#xff0c;建立函数文件/.M文件 8&a…

数据库除法理解

理解 给定关系R和关系S&#xff0c;求RS。 关系R和关系S拥有共同的属性A2、A3 &#xff0c; 首先确定得到的属性为A1。&#xff08;RS得到的属性是关系R包含而关系S不包含的属性&#xff0c;即A1&#xff09; 其次确定A1中符合条件的属性值为{a,d}。&#xff08;关系R中A1的…

数据库课程设计——MOOC学习平台

文章目录 1. 项目介绍&#xff1a;2.代码部分 1. 项目介绍&#xff1a; 采用JDBC接口连接数据库&#xff0c;简单实现Mooc学习平台相关功能。 2.代码部分 1.方法类 package com.mooc; import untlis.DButlis; import java.sql.PreparedStatement; import java.sql.ResultS…

oracle数据库怎么创建数据库 oracle数据库工作流程

oracle数据库怎么创建数据库 数据库用户的创建、权限的分配 数据库安装完成后&#xff0c;有两个系统级的用户&#xff1a; system 默认密码为&#xff1a;manager sys 默认密码为&#xff1a;change_on_install 在安装的数据库目录中找到 \oracle\product\9.2\bin 中的sq…

数据库复习--并发控制

1、并发控制:为了保证事务的隔离性和一致性&#xff0c;数据库管理系统需要对并发操作进行正确调度 并发控制的主要技术有:封锁、时间戳、乐观控制法、多版本并发控制等 并发操作带来的数据不一致性: 丢失修改:两个事务T1和T2读入同一数据并修改&#xff0c;T2提交的结果破坏了…

gbase 连接数据库

1.gbase客户端 gbase data studio 2.gbase数据源 #数据库驱动 spring.datasource.driver-class-namecom.informix.jdbc.IfxDriver #数据源地址 spring.datasource.urljdbc:informix-sqli://10.2.35.142:9088/mztj:INFORMIXSERVERgbaseserver;NEWCODESETUTF8,zh_cn.UTF8,573…

数据库使用率对比【CSDN指数】

所有数据来自【CSDN指数】 mysql、sqlserver、redis、oracle数据库使用率对比 从以下数据可得&#xff0c;最抢手的数据库依然是【mysql】&#xff0c;但是每年的【11】月份【oracle】的使用率会突然增高&#xff0c;说明很多国有企业年底查数据的时候都会对数据做一次大清洗。…

ClickHouse 数据库建库

1 创建数据库 create database test[ ENGINE Atomic] 库引擎 1 Atomic 2 其他库引擎 MySQL 注意大小写 实验性阶段&#xff0c;使用mysql binlog 日志复制

数据库原理

绪论 数据&#xff1a;描述事物的符号记录称为数据&#xff0c;数据的含义称为语义数据库&#xff08;DB&#xff09;&#xff1a;数据库是长期存储在计算机内&#xff0c;有组织的&#xff0c;可共享的大量数据的集合数据库管理系统&#xff08;DBMS&#xff09;&#xff1a;…

记录一下数据库大作业

查看服务器 select servername python语句增删减改数据但数据库未保存 connect.commit() 这句话一定要加上&#xff0c;是在我发现修改数据后发现数据库并没有保存才知道的 设置登录名安全性 新建登录名后设置各个表的插入、查询等权限&#xff0c;具体是在表的属性然后权…