回归预测|基于HGS-CNN-BiGRU-Attention的数据回归预测Matlab程序 多特征输入单输出含基础模型

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

1.饥饿搜索的基本原理

智能优化算法中的饥饿搜索(Starvation Search)是一种启发式搜索算法,通常用于解决优化问题,尤其是游戏优化问题。它的设计灵感来自于动物世界中的饥饿行为,即倾向于专注于当前最优解周围的区域,以期望找到更好的解决方案。

  1. 初始解生成

    • 算法开始时,生成一个初始的解作为当前的最优解。
  2. 局部搜索

    • 在当前最优解的附近进行局部搜索,尝试找到更好的解。这个过程可以使用不同的搜索策略,例如邻域搜索、梯度下降等。
  3. 评估与更新

    • 对新发现的解进行评估,比较其优劣。如果找到更优的解,则更新当前的最优解。
  4. 迭代

    • 重复以上步骤,直到满足停止条件(如达到最大迭代次数或算法收敛)。

饥饿搜索的特点与优势:

  • 局部搜索特性:饥饿搜索通过局部搜索策略,可以在解空间中深入探索,逐步改进当前的解决方案。
  • 简单有效:相较于一些复杂的全局优化算法,如遗传算法或模拟退火,饥饿搜索算法通常更易于实现和理解。
  • 适用性广泛:由于其简单性和有效性,饥饿搜索算法在解决多种优化问题,尤其是游戏优化问题中得到了广泛应用。

应用举例:

  • 游戏中的策略优化:例如实时策略游戏中的单位移动路径优化、资源分配等问题。
  • 计算机网络中的资源分配优化:如最大化带宽利用或最小化延迟等问题。
  • 生产调度问题:优化生产线的流程,以最大化产出或最小化成本。

总体而言,饥饿搜索作为一种智能优化算法,能够有效地在复杂的解空间中寻找到合适的解决方案,特别适用于那些需要快速迭代和实时响应的优化问题。

2.卷积神经网络基本原理

卷积神经网络(Convolutional Neural Network, CNN)是一类专门用于处理具有类似网格结构数据的深度学习模型,例如图像和视频。它的设计灵感来自生物视觉皮层的工作方式,能够有效地学习和识别复杂的特征。

基本原理:

  1. 卷积层(Convolutional Layer)

    • CNN的核心是卷积层。卷积操作利用一个可学习的过滤器(或称为卷积核)在输入数据上滑动,通过对局部区域的加权求和来计算输出。这个过程可以有效地捕捉到输入数据的局部特征,如边缘、纹理等。
  2. 滤波器(Filter)

    • 滤波器是卷积层中的参数,它们的大小通常是正方形的(例如3x3、5x5等),并且在训练过程中学习得到。每个滤波器可以提取一种特定的特征,例如边缘检测、颜色检测等。
  3. 步幅(Stride)

    • 步幅指滤波器在输入数据上移动的步长。步幅大于1时,滤波器每次移动的距离更大,因此输出的尺寸会缩小;步幅为1时,滤波器每次移动一个像素。
  4. 填充(Padding)

    • 填充是在输入数据的边界周围添加额外的像素值(通常是0),以控制卷积操作输出的尺寸。常见的填充方式有"valid"(不填充)和"same"(保持输入输出尺寸相同)。
  5. 非线性激活函数

    • 在卷积层之后,通常会应用一个非线性激活函数,如ReLU(Rectified Linear Unit),以增加网络的非线性能力并使其能够学习更复杂的特征。
  6. 池化层(Pooling Layer)

    • 池化层用于进一步降低特征映射的空间维度,减少参数数量和计算量,同时保留重要的特征。常见的池化操作包括最大池化和平均池化。
  7. 全连接层(Fully Connected Layer)

    • 在卷积神经网络的末尾,通常会有一个或多个全连接层,将池化层输出的特征向量映射到目标类别的得分或概率上。

CNN的优势:

  • 参数共享:卷积操作中的滤波器参数在整个图像上是共享的,这样可以减少需要学习的参数数量,降低模型复杂度。

  • 局部感知:每个卷积核只关注输入数据的局部区域,能够有效地捕捉到局部特征,使得模型对输入数据的变换和扭曲具有一定的鲁棒性。

  • 层次化特征学习:通过堆叠多个卷积层和池化层,网络能够逐渐学习到更抽象、更复杂的特征表示,从而提高分类和识别的准确性。

卷积神经网络因其在图像处理和模式识别任务中的卓越表现而受到广泛关注和应用,是深度学习领域中的重要技术之一。

3.双向门控循环单元网络

双向门控循环单元网络(BiGRU,Bidirectional Gated Recurrent Unit)是一种结合了双向性和门控机制的循环神经网络(RNN)变体,用于处理序列数据,特别是在自然语言处理和时间序列分析中应用广泛。它的基本原理结合了两个主要的概念:双向性和门控机制。

基本原理:

  1. 双向性

    • BiGRU包括两个独立的GRU(门控循环单元)网络,一个用于正向(forward)处理输入序列,另一个用于反向(backward)处理。正向网络从序列的起始位置开始读取,而反向网络从序列的末尾开始读取。这样,每个时间步的输出是由两个方向的信息共同决定的,从而有效地捕捉到了整个序列的上下文信息。
  2. 门控机制

    • GRU是一种门控循环单元,类似于长短时记忆(LSTM),它包括更新门(update gate)和重置门(reset gate)。这些门控制着信息的流动和保留,使得网络可以学习长期依赖关系,并有效地处理梯度消失问题。

    • 更新门(Update Gate):决定了当前时间步旧状态如何被更新为新状态的程度。

    • 重置门(Reset Gate):决定了如何将当前输入与前一状态相结合以计算当前状态的候选值。

  3. 正向和反向计算

    • 正向GRU接受从序列开始到当前时间步的输入,并生成正向隐藏状态序列。
    • 反向GRU接受从序列末尾到当前时间步的输入,并生成反向隐藏状态序列。
    • 最终的输出通常是将正向和反向隐藏状态拼接在一起,这样每个时间步都包含了前后上下文的信息。
  4. 应用

    • BiGRU常用于需要全局序列信息的任务,如情感分析、命名实体识别、机器翻译等。它在处理序列数据时能够更全面地理解和利用上下文信息,从而提高模型的表现。

总结来说,BiGRU通过正向和反向两个方向的信息流动,结合门控机制来捕捉序列数据中的长期依赖关系和上下文信息,是一种有效的深度学习模型,特别适用于序列建模任务。

HGS-CNN-BiGRU-Attention 模型流程描述

  1. HGS(智能优化算法)

    • HGS用于优化模型的隐含层个数、学习率、卷积核大小等超参数。它可能基于遗传算法、粒子群优化等方法,通过自动调整这些参数来提升模型性能。
  2. CNN(卷积神经网络)

    • CNN用于处理输入数据的空间特征提取。它通过卷积层和池化层,有效地捕捉图像或序列数据中的局部特征,如边缘、纹理等。
  3. BiGRU(双向门控循环单元)

    • BiGRU是一种能够捕捉长期依赖关系的循环神经网络结构。它包含正向和反向两个方向的GRU单元,可以更全面地理解序列数据中的上下文信息。
  4. Attention(自注意力机制)

    • Attention机制用于增强模型对输入中重要部分的关注度。它使模型能够在处理长序列或大图像时,集中精力处理与任务相关的关键信息,提升模型的准确性和效率。

组合模型的优越性总结:

  • 多层次特征提取:CNN负责提取输入数据的局部特征,而BiGRU能够在全局范围内捕捉序列数据的长期依赖关系,两者结合能够充分挖掘数据的多层次信息。

  • 动态注意力调控:Attention机制增强了模型对不同部分的关注度,使其能够根据输入数据的具体内容动态调整处理方式,从而提高了模型的适应性和泛化能力。

  • 超参数优化:HGS作为智能优化算法,能够有效地调整模型的超参数,包括层次结构、学习率等,从而进一步提升模型的性能和收敛速度。

  • 适用广泛:这种组合模型适用于多种复杂数据处理任务,如自然语言处理中的文本分类、情感分析,图像处理中的物体识别、图像生成等,能够处理不同类型的输入数据并取得良好效果。

综上所述,HGS-CNN-BiGRU-Attention模型通过结合智能优化算法、卷积神经网络、双向门控循环单元和自注意力机制,能够有效地提升模型的表现,适用于处理各种复杂数据任务,表现出较传统模型更优越的性能和灵活性。

5.数据展示

在这里插入图片描述

6.实验结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7.核心代码


%%  导入数据
res = xlsread('数据集.xlsx');

%%  数据分析
num_size = 0.8;                              % 训练集占数据集比例
outdim = 1;                                  % 最后一列为输出
num_samples = size(res, 1);                  % 样本个数
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);

%%  数据平铺
P_train =  double(reshape(P_train, f_, 1, 1, M));
P_test  =  double(reshape(P_test , f_, 1, 1, N));

%%  数据格式转换
for i = 1 : M
    p_train{i, 1} = P_train(:, :, 1, i);
end

for i = 1 : N
    p_test{i, 1}  = P_test( :, :, 1, i);
end

%%  优化算法参数设置
fun = @fobj;                           % 目标函数
SearchAgents_no = 3;                   % 种群数量
Max_iteration = 3;                     % 最大迭代次数
dim = 3;                               % 优化参数个数
lb = [1e-4,8 ,1e-4];                   % 参数取值下界(学习率,隐藏层节点,正则化系数)
ub = [1e-3, 64,1e-3];                  % 参数取值上界(学习率,隐藏层节点,正则化系数)

[Best_score,Best_pos,curve] = HGS(SearchAgents_no,Max_iteration,lb ,ub,dim,fun);
Best_pos(1, 2) = round(Best_pos(1, 2));   

best_lr= Best_pos(1, 1);   % 最佳初始学习率
best_hd  = Best_pos(1, 2); % 最佳隐藏层节点数
best_l2 = Best_pos(1, 3);  % 最佳L2正则化系数
 
%% 网络搭建
lgraph = layerGraph();                                                   % 建立空白网络结构
tempLayers = [
    sequenceInputLayer([f_, 1, 1], "Name", "sequence")                   % 建立输入层,输入数据结构为[num_dim, 1, 1]
    ];                            
lgraph = addLayers(lgraph, tempLayers);                                  % 将上述网络结构加入空白结构中

tempLayers = [
    convolution2dLayer([3 1],32,"Name","conv","Padding","same")
    batchNormalizationLayer("Name","batchnorm")
    reluLayer("Name","relu")
    maxPooling2dLayer([2 1],"Name","maxpool","Padding","same")
    flattenLayer("Name","flatten_1")
    fullyConnectedLayer(64,"Name","fc_1")];
lgraph = addLayers(lgraph,tempLayers);

tempLayers = flattenLayer("Name","flatten");
lgraph = addLayers(lgraph,tempLayers);

tempLayers = gruLayer(best_hd,"Name","gru1");
lgraph = addLayers(lgraph,tempLayers);

tempLayers = [
    FlipLayer("flip3")
    gruLayer(best_hd,"Name","gru2")];
lgraph = addLayers(lgraph,tempLayers);

tempLayers = [
    concatenationLayer(1,3,"Name","concat")
    
    fullyConnectedLayer(outdim,"Name","fc")
    regressionLayer("Name","regressionoutput")];
lgraph = addLayers(lgraph,tempLayers);

% 清理辅助变量
clear tempLayers;

% 连接网络的所有分支以创建网络图。
lgraph = connectLayers(lgraph,"sequence","conv");
lgraph = connectLayers(lgraph,"sequence","flatten");
lgraph = connectLayers(lgraph,"flatten","gru1");
lgraph = connectLayers(lgraph,"flatten","flip3");


%% 参数设置
options = trainingOptions('adam', ...     % Adam 梯度下降算法
    'MaxEpochs', 100,...                  % 最大训练次数 
    'MiniBatchSize', 64, ...              % 批大小
    'InitialLearnRate', best_lr,...       % 初始学习率 
    'L2Regularization', best_l2,...       % L2正则化参数
    'ExecutionEnvironment','cpu',...      % 网络的执行环境 cpu
    'LearnRateSchedule', 'piecewise',...  % 学习率下降
    'LearnRateDropFactor', 0.1,...        % 学习率下降因子 0.1
    'LearnRateDropPeriod', 60,...        % 经过训练后 学习率 
    'Shuffle', 'every-epoch',...          % 每次训练打乱数据集
    'ValidationPatience', Inf,...         % 关闭验证
    'Plots', 'training-progress',...      % 画出曲线  可关闭
    'Verbose', false);

net = trainNetwork(p_train, t_train, lgraph, options);

%%  仿真测试
t_sim1 = predict(net, p_train); 
t_sim2 = predict(net , p_test); 



  • 28
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值