时序预测|基于鹦鹉优化BP神经网络的时间序列预测Matlab程序PO-BP 单变量和多变量 含基础BP模型

时序预测|基于鹦鹉优化BP神经网络的时间序列预测Matlab程序PO-BP 单变量和多变量 含基础BP模型


前言

一、PO-BP流程

PO-BP鹦鹉优化BP神经网络是一种结合了鹦鹉优化(Parrot Optimization, PO)和反向传播(Backpropagation, BP)算法的时间序列预测模型。下面是这个组合模型的基本结构描述:

  1. 输入层

    • 接受时间序列数据作为输入。通常,时间序列数据会经过预处理,如归一化处理,以便在神经网络中更好地进行处理。
  2. 隐藏层

    • 包括多个神经元,每个神经元与输入层的每个节点连接。隐藏层的数量和每层神经元的数量可以根据问题的复杂性和数据特征进行调整。
  3. 输出层

    • 输出层通常只包含一个神经元,其输出是对时间序列下一个时间步的预测值。
  4. 鹦鹉优化算法

    • 这是PO-BP模型的特殊之处。鹦鹉优化算法类似于其他优化算法(如遗传算法或粒子群优化),其目标是在训练神经网络时优化权重和偏差参数。鹦鹉优化算法的核心思想是通过模仿鹦鹉的行为来寻找神经网络权重和偏差的最优组合。
  5. 反向传播算法

    • 反向传播算法用于计算神经网络中每个节点的误差梯度,并利用梯度下降法来更新权重和偏差,以最小化预测输出与实际输出之间的误差。

整个PO-BP鹦鹉优化BP神经网络的结构是一个典型的前馈神经网络结构,但在训练过程中,不仅使用了传统的反向传播算法来调整神经网络的权重和偏差,还利用鹦鹉优化算法来优化这些参数,以提高时间序列预测的准确性和效率。

二、数据

1.单列

在这里插入图片描述

2.多维

在这里插入图片描述

三、实验结果

PO-BP多变量时序预测结果

在这里插入图片描述

PO-BP单变量时序预测结果

在这里插入图片描述

四、核心代码

主函数核心代码



%%  导入数据
result = xlsread('数据集单变量.xlsx');     % 单变量和多变量只需修改这里

%%  数据分析
num_samples = length(result);                % 样本个数
or_dim = size(result, 2);                    % 原始特征+输出数目
kim = 12;                                    % 滑动窗口
zim =  1;                                    % 跨zim个时间点进行预测

%%  划分数据集
for i = 1: num_samples - kim - zim + 1
    res(i, :) = [reshape(result(i: i + kim - 1, :), 1, kim * or_dim), result(i + kim + zim - 1, :)];
end


%%  划分训练集和测试集
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);

%%  网络参数设置
inputnum = size(p_train, 1);          % 输入层维度
hiddennum = 6;                        % 隐藏层维度
outputnum = outdim;                   % 输出层维度
dim = (inputnum + 1) * hiddennum + (hiddennum + 1) * outputnum;    % 优化参数个数

%%  建立网络
net = newff(p_train, t_train, hiddennum);

%%  设置训练参数
net.trainParam.epochs     = 1000;      % 训练次数
net.trainParam.goal       = 1e-6;      % 目标误差
net.trainParam.lr         = 0.01;      % 学习率
net.trainParam.showWindow = 0;         % 关闭窗口

%%  网络赋值
net.Iw{1, 1} = reshape(w1, hiddennum, inputnum);
net.Lw{2, 1} = reshape(w2, outputnum, hiddennum);
net.b{1}     = reshape(B1, hiddennum, 1);
net.b{2}     = B2';

%%  打开训练窗口 
net.trainParam.showWindow = 1;        % 打开窗口

%%  网络训练
net = train(net, p_train, t_train);

%%  仿真预测
t_sim1 = sim(net, p_train);
t_sim2 = sim(net, p_test );

%%  数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);

%%  均方根误差
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2 - T_test ).^2) ./ N);

%%  适应度曲线
figure;
plot(1 : length(curve), curve, 'LineWidth', 1.5);
title('适应度曲线', 'FontSize', 13);
xlabel('迭代次数', 'FontSize', 10);
ylabel('适应度值', 'FontSize', 10);
xlim([1, length(curve)])
grid

%%  相关指标计算
%  R2
R1 = 1 - norm(T_train - T_sim1)^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test  - T_sim2)^2 / norm(T_test  - mean(T_test ))^2;

disp(['训练集数据的R2为:', num2str(R1)])
disp(['测试集数据的R2为:', num2str(R2)])

%  MAE
mae1 = sum(abs(T_sim1 - T_train)) ./ M ;
mae2 = sum(abs(T_sim2 - T_test )) ./ N ;

disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['测试集数据的MAE为:', num2str(mae2)])

%  MBE
mbe1 = sum(T_sim1 - T_train) ./ M ;
mbe2 = sum(T_sim2 - T_test ) ./ N ;

disp(['训练集数据的MBE为:', num2str(mbe1)])
disp(['测试集数据的MBE为:', num2str(mbe2)])

%% 均方误差 MSE
mse1 = sum((T_sim1 - T_train).^2)./M;
mse2 = sum((T_sim2 - T_test).^2)./N;
disp(['训练集数据的MSE为:', num2str(mse1)])
disp(['测试集数据的MSE为:', num2str(mse2)])

%%  RMSE
rmse1 =sqrt(sumsqr(T_sim1- T_train)/ M);
rmse2 = sqrt(sumsqr(T_sim2- T_test ) / N) ;

disp(['训练集数据的RMSE为:', num2str(rmse1)])
disp(['测试集数据的RMSE为:', num2str(rmse2)])

PO优化算法主函数

%%
% 由机器不会学习翻译
% 面包多链接: https://mbd.pub/o/curry/work
%%
function [ Best_score, Best_pos, curve] = PO(N, Max_iter, lb, ub, dim, fobj)

% BestF:某个迭代中的最佳值
% WorstF: 某次迭代中的最差值
% GBestF:全局最佳适配值
% AveF:每次迭代的平均值

if (max(size(ub)) == 1)
    ub = ub .* ones(1, dim);
    lb = lb .* ones(1, dim);
end

%% %% 初始化
X0 = initialization(N, dim, ub, lb);  
X = X0;

%% 计算初始适应度值
fitness = zeros(1, N);
for i = 1:N
    fitness(i) = fobj(X(i, :));
end

[fitness, index] = sort(fitness); % 排序
GBestF = fitness(1); %  全局最优
 
AveF = mean(fitness);
for i = 1:N
    X(i, :) = X0(index(i), :);
end
curve = zeros(1, Max_iter);
avg_fitness_curve = zeros(1, Max_iter);
GBestX = X(1, :); %  获取全局最优位置
X_new = X;
%% 设置记录适应度值的数组
search_history = zeros(N, Max_iter, dim);
fitness_history = zeros(N, Max_iter);

%% 开始迭代
for i = 1:Max_iter
    if mod(i,100) == 0
      display(['At iteration ', num2str(i), ' the fitness is ', num2str(curve(i-1))]);
    end
    avg_fitness_curve(i) = AveF;
    alpha = rand(1) / 5;
    sita = rand(1) * pi;
    for j = 1:size(X, 1)
        St = randi([1, 4]);  
        %% 对应论文中的四个步骤
        %% 觅食行为
        if St == 1
                X_new(j, :) = (X(j, :) - GBestX) .* Levy(dim) + rand(1) * mean(X(j, :)) * (1 - i / Max_iter) ^ (2 * i / Max_iter);

        %% 停留行为
        elseif St == 2
                X_new(j, :) = X(j, :) + GBestX .* Levy(dim) + randn() * (1 - i / Max_iter) * ones(1, dim);

        %% 交流行为
        elseif St == 3
                H = rand(1);
                if H < 0.5
                    X_new(j, :) = X(j, :) + alpha * (1 - i / Max_iter) * (X(j, :) - mean(X(j, :)));
                else
                    X_new(j, :) = X(j, :) + alpha * (1 - i / Max_iter) * exp(-j / (rand(1) * Max_iter));
                end
        %% 害怕陌生人的行为
        else
                X_new(j, :) = X(j, :) + rand() * cos((pi *i )/ (2 * Max_iter)) * (GBestX - X(j, :)) - cos(sita) * (i / Max_iter) ^ (2 / Max_iter) * (X(j, :) - GBestX);
        end

         %% 边界判断
        for j = 1:N
            for a = 1:dim
                if (X_new(j, a) > ub(a))
                    X_new(j, a) = ub(a);
                end
                if (X_new(j, a) < lb(a))
                    X_new(j, a) = lb(a);
                end
            end
        end

        %% 更新位置
        for j = 1:N
            fitness_new(j) = fobj(X_new(j, :));
        end
        for j = 1:N
            if (fitness_new(j) < GBestF)
                GBestF = fitness_new(j);
                GBestX = X_new(j, :);
            end
        end
        X = X_new;
        fitness = fitness_new;
        
        %% 排序和更新适应度
        [fitness, index] = sort(fitness); % sort
        for j = 1:N
            X(j, :) = X(index(j), :);
        end
        curve(i) = GBestF;

        
    end
    %% 迭代结束 获取返回参数
    Best_pos = GBestX;
    Best_score = curve(end);
    search_history(:, i, :) = X;
    fitness_history(:, i) = fitness;
    disp(['current iteration is: ',num2str(i), ', best fitness is: ', num2str(GBestF)]);
end

%%  Levy 搜索策略
function o = Levy(d)
    beta = 1.5;
    sigma = (gamma(1 + beta) *sin(pi * beta / 2) / (gamma((1 + beta) / 2) * beta * 2^((beta - 1) / 2)))^(1 / beta);
    u = randn(1, d) * sigma;
    v = randn(1, d);
    step = u ./ abs(v).^(1 / beta);
    o = step;
end   

end

总结

通过对比PO-BP、基础BP的时序预测结果,可以发现PO-BP算法在单变量和多变量预测中均表现出更高的精度和准确性。这是因为PO-BP算法结合了鹦鹉优化算法和BP神经网络,能够更好地寻找最优解并提高模型的预测能力。因此,PO-BP算法在时序预测领域具有广泛的应用前景。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值