机器学习之MATLAB代码--LSTM+GRU+CNN+RNN(十四)_matlab gru特征学习代码-程序员宅基地

技术标签: matlab  rnn  

RNN代码

clc
close all
clear all

%%
%%%% 训练数据


XTrain = xlsread('train2016.xlsx',1,'B1:G5112');
YTrain = xlsread('train2016.xlsx',1,'H1:H5112');

XTrain = XTrain';
YTrain  = YTrain';

XrTrain = cell(size(XTrain,2),1);
YrTrain = zeros(size(YTrain,2),1);
for i=1:size(XTrain,2)
    XrTrain{
    i,1} = XTrain(:,i);
    YrTrain(i,1) = YTrain(:,i);
end

% 测试数据


XTest = xlsread('TestData2017.xlsx',1,'B1:G642');
YTest = xlsread('TestData2017.xlsx',1,'H1:H642');

XTest = XTest';
YTest  = YTest';

XrTest = cell(size(XTest,2),1);
YrTest = zeros(size(YTest,2),1);
for i=1:size(XTest,2)
    XrTest{
    i,1} = XTest(:,i);
    YrTest(i,1) = YTest(:,i);
end
%%
numFeatures = size(XTrain,1);% 特征维度=滑动窗长度
numResponses = 1;FiltZise = 5;

%%%% RNN 结构设计
    layers = [...
        sequenceInputLayer(numFeatures,'Name','input')
        % from here the RNN design. Feel free to add or remove layers
        gruLayer(128,'Name','gru1','RecurrentWeightsInitializer','He','InputWeightsInitializer','He')
        lstmLayer(64,'Name','gru2','RecurrentWeightsInitializer','He','InputWeightsInitializer','He')
        dropoutLayer(0.5,'Name','drop2')
        % this last part you must change the outputmode to last
        lstmLayer(32,'OutputMode','last','Name','bil4','RecurrentWeightsInitializer','He','InputWeightsInitializer','He')
        dropoutLayer(0.5,'Name','drop3')
        % here finish the RNN design
        % use a fully connected layer with one neuron because you will predict one step ahead
        fullyConnectedLayer(numResponses,'Name','fc')
        regressionLayer('Name','output')    ];

%%%%% 网络参数设置
if gpuDeviceCount>0
    mydevice = 'gpu';
else
    mydevice = 'cpu';
end

options = trainingOptions('adam', ...
        'MaxEpochs',150, ...
        'GradientThreshold',1, ...
        'InitialLearnRate',0.001, ...
        'LearnRateSchedule',"piecewise", ...
        'LearnRateDropPeriod',96, ...
        'LearnRateDropFactor',0.25, ...
        'MiniBatchSize',64,...
        'Verbose',false, ...
        'Shuffle',"every-epoch",...
        'ExecutionEnvironment',mydevice,...
        'Plots','training-progress');
net = trainNetwork(XrTrain,YrTrain,layers,options);

%% 利用模型对测试集进行预测

YPred_Train = predict(net,XrTrain, ...
        "ExecutionEnvironment",mydevice,"MiniBatchSize",numFeatures);
YPred_Train = YPred_Train';

YPred = predict(net,XrTest, ...
        "ExecutionEnvironment",mydevice,"MiniBatchSize",numFeatures);
YPred = YPred';

%%

figure;
hold on
plot(1:size(YrTrain,1), YPred_Train,'r-','LineWidth',1.5);
plot(1:size(YrTrain,1), YrTrain,'b-','LineWidth',1.5);
legend('预测值','实际值')
xlabel('训练集样本序号')

figure;
hold on
plot(1:size(YrTest,1), YPred,'r-','LineWidth',1.5);
plot(1:size(YrTest,1), YrTest,'b-','LineWidth',1.5);
legend('预测值','实际值')
xlabel('测试集样本序号')

 % % 评价
ae= abs(YPred - YTest);
rmse = (mean(ae.^2)).^0.5;
mse = mean(ae.^2);
mae = mean(ae);
mape = mean(ae./YPred);

disp('预测结果评价指标:')
disp(['RMSE = ', num2str(rmse)])
disp(['MSE  = ', num2str(mse)])
disp(['MAE  = ', num2str(mae)])
disp(['MAPE = ', num2str(mape)])


RNN数据

在这里插入图片描述
在这里插入图片描述

RNN结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

LSTM代码

clc
close all
clear all


%训练数据
XTrain = xlsread('train2016.xlsx',1,'B1:G5112');
YTrain = xlsread('train2016.xlsx',1,'H1:H5112');

mu = mean(XTrain,'ALL');
sig = std(XTrain,0,'ALL');
XTrain  = (XTrain - mu)/sig;
YTrain  = (YTrain - mu)/sig;

XTrain = XTrain';
YTrain  = YTrain';

XTest = xlsread('TestData2017.xlsx',1,'B1:G642');
YTest = xlsread('TestData2017.xlsx',1,'H1:H642');
XTest  = (XTest - mu)/sig;
YTest  = (YTest - mu)/sig;

XTest = XTest';
YTest  = YTest';





%% define the Deeper LSTM networks
%创建LSTM回归网络,指定LSTM层的隐含单元个数125
%序列预测,因此,输入一维,输出一维
numFeatures= 6;%输入特征的维度
numResponses = 1;%响应特征的维度
numHiddenUnits = 100;%隐藏单元个数


layers = [sequenceInputLayer(numFeatures) 
lstmLayer(numHiddenUnits)
dropoutLayer(0.5)%防止过拟合
fullyConnectedLayer(numResponses)
regressionLayer];


MaxEpochs=500;%最大迭代次数
InitialLearnRate=0.005;%初始学习率
%% back up to LSTM model
options = trainingOptions('adam', ...
'MaxEpochs',MaxEpochs,...%30用于训练的最大轮次数,迭代是梯度下降算法中使用小批处理来最小化损失函数的一个步骤。一个轮次是训练算法在整个训练集上的一次全部遍历。
 'MiniBatchSize',128, ... %128小批量大小,用于每个训练迭代的小批处理的大小,小批处理是用于评估损失函数梯度和更新权重的训练集的子集。
'GradientThreshold',1, ...%梯度下降阈值
'InitialLearnRate',InitialLearnRate, ...%全局学习率。默认率是0.01,但是如果网络训练不收敛,你可能希望选择一个更小的值。默认情况下,trainNetwork在整个训练过程中都会使用这个值,除非选择在每个特定的时间段内通过乘以一个因子来更改这个值。而不是使用一个小的固定学习速率在整个训练, 在训练开始时选择较大的学习率,并在优化过程中逐步降低学习率,可以帮助缩短训练时间,同时随着训练的进行,可以使更小的步骤达到最优值,从而在训练结束时进行更精细的搜索。
'LearnRateSchedule','piecewise', ...%在训练期间降低学习率的选项,默认学习率不变。'piecewise’表示在学习过程中降低学习率
 'LearnRateDropPeriod',100, ...% 10降低学习率的轮次数量,每次通过指定数量的epoch时,将全局学习率与学习率降低因子相乘
'LearnRateDropFactor',0.5, ...%学习下降因子
'ValidationData',{
    XTrain,YTrain}, ...% ValidationData用于验证网络性能的数据,即验证集
 'ValidationFrequency',1, ...%以迭代次数表示的网络验证频率,“ValidationFrequency”值是验证度量值之间的迭代次数。
'Verbose',1, ...%1指示符,用于在命令窗口中显示训练进度信息,显示的信息包括轮次数、迭代数、时间、小批量的损失、小批量的准确性和基本学习率。训练一个回归网络时,显示的是均方根误差(RMSE),而不是精度。如果在训练期间验证网络。
 'Plots','training-progress');
%% Train LSTM Network
net = trainNetwork(XTrain,YTrain,layers,options);
% net = predictAndUpdateState(net,XTrain);

numTimeStepsTrain = numel(XTrain(1,:));

for i = 1:numTimeStepsTrain
    [net,YPred_Train(i)] = predictAndUpdateState(net,XTrain(:,i),'ExecutionEnvironment','cpu');
end

YPred_Train = sig*YPred_Train + mu;
YTrain = sig*YTrain + mu;


numTimeStepsTest = numel(XTest(1,:));

for i = 1:numTimeStepsTest
    [net,YPred(i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');
end

YPred = sig*YPred + mu;
YTest = sig*YTest + mu;


figure
hold on 
plot(1:length(YPred_Train),YPred_Train,'r-','LineWidth',1.5);
plot(1:length(YTrain),YTrain,'b-','LineWidth',1.5);
legend('预测值','实际值')
xlabel('训练样本序号')


figure
hold on 
plot(1:length(YPred),YPred,'r-','LineWidth',1.5);
plot(1:length(YTest),YTest,'b-','LineWidth',1.5);
legend('预测值','实际值')
xlabel('测试样本序号')

 % % 评价
ae= abs(YPred - YTest);
RMSE = (mean(ae.^2)).^0.5;
MSE = mean(ae.^2);
MAE = mean(ae);
MAPE = mean(ae./YPred);

disp('预测结果评价指标:')
disp(['RMSE = ', num2str(RMSE)])
disp(['MSE  = ', num2str(MSE)])
disp(['MAE  = ', num2str(MAE)])
disp(['MAPE = ', num2str(MAPE)])
% 
% MSE = double(mse(YTest,YPred))
% RMSE = sqrt(MSE)


LSTM数据

在这里插入图片描述

LSTM结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GRU代码

clc
close all
clear all


%训练数据
XTrain = xlsread('train2016.xlsx',1,'B1:G5112');
YTrain = xlsread('train2016.xlsx',1,'H1:H5112');

mu = mean(XTrain,'ALL');
sig = std(XTrain,0,'ALL');
XTrain  = (XTrain - mu)/sig;
YTrain  = (YTrain - mu)/sig;

XTrain = XTrain';
YTrain  = YTrain';

XTest = xlsread('TestData2017.xlsx',1,'B1:G642');
YTest = xlsread('TestData2017.xlsx',1,'H1:H642');
XTest  = (XTest - mu)/sig;
YTest  = (YTest - mu)/sig;

XTest = XTest';
YTest  = YTest';





%% define the Deeper LSTM networks
%创建LSTM回归网络,指定LSTM层的隐含单元个数125
%序列预测,因此,输入一维,输出一维
numFeatures= 6;%输入特征的维度
numResponses = 1;%响应特征的维度
numHiddenUnits = 100;%隐藏单元个数


layers = [sequenceInputLayer(numFeatures) 
gruLayer(numHiddenUnits)
% dropoutLayer(0.5)%防止过拟合
fullyConnectedLayer(numResponses)
regressionLayer];


MaxEpochs=500;%最大迭代次数
InitialLearnRate=0.005;%初始学习率
%% back up to LSTM model
options = trainingOptions('adam', ...
'MaxEpochs',MaxEpochs,...%30用于训练的最大轮次数,迭代是梯度下降算法中使用小批处理来最小化损失函数的一个步骤。一个轮次是训练算法在整个训练集上的一次全部遍历。
 'MiniBatchSize',128, ... %128小批量大小,用于每个训练迭代的小批处理的大小,小批处理是用于评估损失函数梯度和更新权重的训练集的子集。
'GradientThreshold',1, ...%梯度下降阈值
'InitialLearnRate',InitialLearnRate, ...%全局学习率。默认率是0.01,但是如果网络训练不收敛,你可能希望选择一个更小的值。默认情况下,trainNetwork在整个训练过程中都会使用这个值,除非选择在每个特定的时间段内通过乘以一个因子来更改这个值。而不是使用一个小的固定学习速率在整个训练, 在训练开始时选择较大的学习率,并在优化过程中逐步降低学习率,可以帮助缩短训练时间,同时随着训练的进行,可以使更小的步骤达到最优值,从而在训练结束时进行更精细的搜索。
'LearnRateSchedule','piecewise', ...%在训练期间降低学习率的选项,默认学习率不变。'piecewise’表示在学习过程中降低学习率
 'LearnRateDropPeriod',100, ...% 10降低学习率的轮次数量,每次通过指定数量的epoch时,将全局学习率与学习率降低因子相乘
'LearnRateDropFactor',0.5, ...%学习下降因子
'ValidationData',{
    XTrain,YTrain}, ...% ValidationData用于验证网络性能的数据,即验证集
 'ValidationFrequency',1, ...%以迭代次数表示的网络验证频率,“ValidationFrequency”值是验证度量值之间的迭代次数。
'Verbose',1, ...%1指示符,用于在命令窗口中显示训练进度信息,显示的信息包括轮次数、迭代数、时间、小批量的损失、小批量的准确性和基本学习率。训练一个回归网络时,显示的是均方根误差(RMSE),而不是精度。如果在训练期间验证网络。
 'Plots','training-progress');
%% Train LSTM Network
net = trainNetwork(XTrain,YTrain,layers,options);
% net = predictAndUpdateState(net,XTrain);

numTimeStepsTrain = numel(XTrain(1,:));

for i = 1:numTimeStepsTrain
    [net,YPred_Train(i)] = predictAndUpdateState(net,XTrain(:,i),'ExecutionEnvironment','cpu');
end

YPred_Train = sig*YPred_Train + mu;
YTrain = sig*YTrain + mu;


numTimeStepsTest = numel(XTest(1,:));

for i = 1:numTimeStepsTest
    [net,YPred(i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');
end

YPred = sig*YPred + mu;
YTest = sig*YTest + mu;


figure
hold on 
plot(1:length(YPred_Train),YPred_Train,'r-','LineWidth',1.5);
plot(1:length(YTrain),YTrain,'b-','LineWidth',1.5);
legend('预测值','实际值')
xlabel('训练样本序号')


figure
hold on 
plot(1:length(YPred),YPred,'r-','LineWidth',1.5);
plot(1:length(YTest),YTest,'b-','LineWidth',1.5);
legend('预测值','实际值')
xlabel('测试样本序号')

 % % 评价
ae= abs(YPred - YTest);
rmse = (mean(ae.^2)).^0.5;
mse = mean(ae.^2);
mae = mean(ae);
mape = mean(ae./YPred);

disp('预测结果评价指标:')
disp(['RMSE = ', num2str(rmse)])
disp(['MSE  = ', num2str(mse)])
disp(['MAE  = ', num2str(mae)])
disp(['MAPE = ', num2str(mape)])


GRU数据

在这里插入图片描述

GRU结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CNN代码

clc;
clear all
close all



%训练数据
input_train = xlsread('train2016.xlsx',1,'B1:G5112');
output_train = xlsread('train2016.xlsx',1,'H1:H5112');
input_train = input_train';
output_train = output_train';
input_test = xlsread('TestData2017.xlsx',1,'B1:G642');
output_test = xlsread('TestData2017.xlsx',1,'H1:H642');
input_test = input_test';
output_test = output_test';

[inputn_train,inputps]=mapminmax(input_train);
[outputn_train,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps); 
outputn_test=mapminmax('apply',output_test,outputps); 

inputn =[inputn_train inputn_test]; 
outputn=[outputn_train outputn_test]; 

%训练集输入
trainD=reshape(inputn_train, [6,1,1,size(inputn_train,2)]);
%测试集输入
testD =reshape(inputn_test,  [6,1,1,size(inputn_test,2)]);

layers = [
    imageInputLayer([6 1 1])                        
    convolution2dLayer(3,16,'Padding','same')
    reluLayer                                      
    fullyConnectedLayer(100)      
    fullyConnectedLayer(100)      
    fullyConnectedLayer(1)          
    regressionLayer];                   
options = trainingOptions('adam', ...
    'MaxEpochs',100, ...
    'MiniBatchSize',128, ...
    'InitialLearnRate',0.005, ...
    'GradientThreshold',1, ...
    'Verbose',false,...
    'Plots','training-progress',...
    'ValidationData',{
    testD,outputn_test'});
CNNnet = trainNetwork(trainD,outputn_train',layers,options);

CNNoutputr_train = predict(CNNnet,trainD);
CNNoutputr_train = double(CNNoutputr_train');

CNNoutputr_test = predict(CNNnet,testD);
CNNoutputr_test = double(CNNoutputr_test');
%网络输出反归一化

CNNoutput_train= mapminmax('reverse',CNNoutputr_train,outputps);
CNNoutput_train=double(CNNoutput_train);

CNNoutput_test= mapminmax('reverse',CNNoutputr_test,outputps);
CNNoutput_test=double(CNNoutput_test);


figure
hold on
plot(CNNoutput_train,'r-','LineWidth',1.5)
plot(output_train,'b-','LineWidth',1.5)
legend('实际值','预测值');
xlabel('训练样本序号')

figure
hold on
plot(CNNoutput_test,'r-','LineWidth',1.5)
plot(output_test,'b-','LineWidth',1.5)
legend('实际值','预测值');
xlabel('测试样本序号')






ae= abs(CNNoutput_test - output_test);
rmse = (mean(ae.^2)).^0.5;
mse = mean(ae.^2);
mae = mean(ae);
mape = mean(ae./CNNoutput_test);

disp('预测结果评价指标:')
disp(['RMSE = ', num2str(rmse)])
disp(['MSE  = ', num2str(mse)])
disp(['MAE  = ', num2str(mae)])
disp(['MAPE = ', num2str(mape)])



CNN数据

在这里插入图片描述

CNN结果

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44312889/article/details/128116451

智能推荐

2024上半年软考别轻易尝试!先了未发布_计算机软考2024-程序员宅基地

文章浏览阅读431次,点赞7次,收藏5次。软考共设有27个不同的资格类别,按照方向划分为五大方向,包括计算机软件、计算机网络、计算机应用技术、信息系统和信息服务,同时还有三个不同的等级,即初级、中级和高级。只要遵守中华人民共和国的宪法和法律,并具备一定的计算机技术应用能力,任何人都可以根据自己的情况报名参加相应专业类别和级别的考试。1、2023年下半年起,软考已经从传统的纸笔考试改革为机考形式,这意味着备考2024年的考生需要调整答题方式。5、软考备考需要有老师的指导和学友的陪伴,才能保持良好的心态并坚持下去,否则很容易半途而废。_计算机软考2024

str计算机中代表什么,STR到底是待机还是休眠-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏16次。1。为什么需要待机、休眠尽管电脑硬件运行速度越来越快,但操作系统的体积也在不断膨胀,使得电脑开、关机时,启动、关闭的程序越来越多,花费时间也越来越漫长。因此如何让电脑能够快速启动、一开机就进入Windows,就成为用户关心的问题。于是,随着硬件和软件的升级,操作系统开始引入了高级电源管理,其作用就是在电脑闲置时关闭部分设备,将电脑进入等待休息状态,这样当需要重新使用电脑时,能够直接从等待休息状态尽..._str待机

Win7安装程序遇到错误代码0xc8000222的解决方法(亲测有效)-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏7次。升级安装win7系统后,经常需要安装程序软件,安装程序过程中难免遇到一些错误问题,比如最近有些用户在Win7旗舰版系统中遇到一个问题,安装程序失败遇到错误代码0xc8000222,也不知道怎么处理。今天小编就来和大家介绍在Win7系统中安装程序时遇到错误0xc8000222的处理方法,有需要的用户一起来看下具体操作吧。Win7安装程序遇到错误代码0xc8000222的解决方法 解决方法: 1、点击“开始”->”所有程序”->”命令提示符”右键以管理员身份运行,然后输入:net stop W_0xc8000222

centos7已有数据硬盘挂载_CentOS7挂载新数据盘的完整步骤-程序员宅基地

文章浏览阅读1.2k次。CentOS7挂载新数据盘的完整步骤前言刚刚买了一台新的VPS,新买的VPS的数据盘默认没有挂载到系统上,需要我们自己来挂载的。我们给服务器添加新的硬盘的时候都需要进行挂载操作,本文简要记录挂载操作过程。查看硬盘信息首先我们使用命令df -TH查看当前系统挂载的情况:我们看到并没有挂载新的数据盘,数据盘是200多G的。然后通过命令fdisk-l查看硬盘信息。可以看到有两块硬盘/dev/xvda和/..._已经装过centos7系统的硬盘如何挂载在新系统上

node 第十七天 使用rsa非对称加密 实现前后端加密通信 JSEncrypt和node-rsa_node rsa-程序员宅基地

文章浏览阅读749次。使用rsa非对称加密 实现前后端加密通信 JSEncrypt和node-rsa_node rsa

中国期货市场风险回顾之八(海南中商所F703咖啡事件)_海南咖啡事件认识和感悟-程序员宅基地

文章浏览阅读2.1k次。   期现脱节下的悲剧——再看海南中商所F703咖啡事件 1995年12月21日,海南中商所宣布自F605合约始咖啡期货合约放大交割限量(交割总量由象征性的1吨扩大为1万吨),交割限量以外的头寸全部按进入交割月至最后交易日全部成交的加权平均价实行强制平仓。自F605始,中商所的咖啡品种演出了既不同于纽约咖啡行情又有别于历次中国期货交易风波的多幕闹剧。   回首咖啡F703事件  _海南咖啡事件认识和感悟

随便推点

springboot+cxf框架 WebService_springboot cxf webservice-程序员宅基地

文章浏览阅读1.3k次。Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。_springboot cxf webservice

微信小程序通过web-view跳转到小程序页面_webview跳转微信小程序页面-程序员宅基地

文章浏览阅读1.4w次,点赞5次,收藏24次。一、背景 博主这边的小程序大部分都使用了web-view,众所周知,使用web-view最大的问题就是和小程序之间进行交互的问题。我这边主要是从web-view跳转回小程序的demo。二、通过web-view跳转到小程序页面1、微信官方文档微信web-view文档2、关于web-view页面的用法:Page({ data: { url: '你的we_webview跳转微信小程序页面

Eclipse配置Android开发环境_eclipse配置安卓开发环境-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏31次。Eclipse配置Android开发环境在eclipse中配置Android开发环境在eclipse中配置Android开发环境在配置好环境的eclipse中安装Android SDK(Software Development Kit)和ADT插件。SDK的安装过程主要参考这篇博客。_eclipse配置安卓开发环境

R730服务器做了raid的硬盘,插在R720上面可以用吗?-程序员宅基地

文章浏览阅读541次,点赞6次,收藏9次。戴尔R720戴尔R730。

计算机取证之Xplico ——合天网安实验室学习笔记-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏19次。实验链接Xplico是一款开源的网络取证分析工具,其分析与呈现的能力非常强大。Xplico可以捕获Internet网络应用层流量,通过流量解析,解析出网络包中的各种应用数据,还原网络数据发送现场。通过本实验学习掌握Xplico使用方法,学会利用Xplico对网络流量进行分析取证。链接:http://www.hetianlab.com/expc.do?ce=10748f62-5706-403d-..._xplico

Docker 入门 | 2 镜像的存储驱动与 Dockerfile 实战_doceker 镜像中增加驱动-程序员宅基地

文章浏览阅读119次。Dockerfile 实战,搭建在 centos 上的 httpd。_doceker 镜像中增加驱动